利用Python和OpenCV库将URL转换为OpenCV格式的方法


Posted in Python onMarch 27, 2015

利用Python和OpenCV库将URL转换为OpenCV格式的方法

今天的博客是直接来源于我自己的个人工具函数库。

过去几个月,有些PyImageSearch读者电邮问我:“如何获取URL指向的图片并将其转换成OpenCV格式(不用将其写入磁盘再读回)”。这篇文章我将展示一下怎么实现这个功能。

额外的,我们也会看到如何利用scikit-image从URL下载一幅图像。当然前行之路也会有一个常见的错误,它可能让你跌个跟头。

继续往下阅读,学习如何利用利用Python和OpenCV将URL转换为图像

方法1:OpenCV、NumPy、urllib

第一个方法:我们使用OpenCV、NumPy、urllib库从URL获取图像,并将其转换为图像。打开并新建一个文件,取名url_to_image.py,我们开始吧:

# import the necessary packages
import numpy as np
import urllib
import cv2
 
# METHOD #1: OpenCV, NumPy, and urllib
def url_to_image(url):
  # download the image, convert it to a NumPy array, and then read
  # it into OpenCV format
  resp = urllib.urlopen(url)
  image = np.asarray(bytearray(resp.read()), dtype="uint8")
  image = cv2.imdecode(image, cv2.IMREAD_COLOR)
 
  # return the image
  return image

首先要做的就是导入我们必需的包。我们将使用NumPy转换下载的字节序为NumPy数组,使用urllib来执行实际的网络请求,使用cv2来绑定OpenCV接口。
在第7行,我们定义了我们的url_to_image函数。这个函数带一个url参数,也就是我们想要下载的图像地址。

接下来,在第10行,我们使用urllib库来打开这个图像链接。11行则将这个下载下来的字节序转换为NumPy数组。

至此,NumPy数组还是一个1维数组(也就是一个长长的像素链表)。为了将其转换为2维格式,假设每个像素3个通道(意即分别为红,绿,蓝通道),在12行我们使用cv.imdecode函数。最后,在15行我们返回解码出来的图像给调用函数。

一切就绪,该到让它工作的时候了:

# initialize the list of image URLs to download
urls = [
  "http://www.pyimagesearch.com/wp-content/uploads/2015/01/opencv_logo.png",
  "http://www.pyimagesearch.com/wp-content/uploads/2015/01/google_logo.png",
  "http://www.pyimagesearch.com/wp-content/uploads/2014/12/adrian_face_detection_sidebar.png",
]
 
# loop over the image URLs
for url in urls:
  # download the image URL and display it
  print "downloading %s" % (url)
  image = url_to_image(url)
  cv2.imshow("Image", image)
  cv2.waitKey(0)

3-5行定义了我们将要下载和转换为OpenCV格式的图像地址列表。

第9行我们遍历这个列表,13行则调用url_to_image函数,然后在14行和15行将获取的图像显示到屏幕上。到此呢,我们就可以像正常情况下一样,使用OpenCV来操作和处理这些图像了。

眼见为实,打开终端,执行如下指令:

$ python url_to_image.py 

如果一切顺利的话,你会看到OpenCV的logo:

利用Python和OpenCV库将URL转换为OpenCV格式的方法

图1:从URL下载OpenCV logo并转换为OpenCV格式

接下来是Google的logo:

利用Python和OpenCV库将URL转换为OpenCV格式的方法

图2:从URL下载Gooogle并转换为OpenCV格式

这里也有在我书中验证人脸检测的例子,《Practical Python and OpenCV》:

利用Python和OpenCV库将URL转换为OpenCV格式的方法

图3:转换一个URL图像为OpenCV格式

现在,我们来看另一种获取图像并转换为OpenCV格式的方法。

方法2:使用scikit-image

第二种方法假定你已经在你计算机上安装好了scikit-image库。让我们看看怎样采用scikit-image从URL获取图像并将其转换为OpenCV格式:

# METHOD #2: scikit-image
from skimage import io
 
# loop over the image URLs
for url in urls:
  # download the image using scikit-image
  print "downloading %s" % (url)
  image = io.imread(url)
  cv2.imshow("Incorrect", image)
  cv2.imshow("Correct", cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
  cv2.waitKey(0)

scikit-image库中做得很漂亮的一点是:io子库中的imread函数能够区分图像路径到底在磁盘上还是一个URL(第9行)。

尽管这样,这里有一个很严重的错误可能让你跌一个跟头!

OpenCV以BGR顺序表达一幅图像,然而scikit-image则是RGB顺序。如果你使用scikit-iamge的imread函数,而且还想在下载完成后使用OpenCV的函数,那么你要小心了。如41行所述,你需要将图像从RBG转换为BGR。

如果你没有这一步,那么你可能得到错误的结果:

利用Python和OpenCV库将URL转换为OpenCV格式的方法

图4:在用scikit-image时,需要特别注意将RGB转换为BGR。左边的图像就是不正确的RGB顺序,右边的则是将RGB转换为BGR,所以能正常显示。

看看Google的logo就更明显了

利用Python和OpenCV库将URL转换为OpenCV格式的方法

图5:顺序很重要。确保将RGB转换为BGR,否则就留下了一个很难发现的bug。

到此为止,你明白了吧!这两种方法分别使用Python、OpenCV、urllib,和scikit-image来将URL指向的图片转换为图像。

总结

本文中,我们学会了如何从URL获取图像,且使用Python和OpenCV将其转换为OpenCV格式。

第一种方法使用urllib包获取图像,使用Numpy转换为数组,最后使用OpenCV重新构建数组产生我们的图像。

第二种方式使用scikit-image中的io.imread函数。

所以,哪种更好呢?

这完全取决于你的安装。

如果你已经安装scikit-image,那么我可能就用io.imread(只是不要忘记如果要用OpenCV函数的话,要将RGB转换为BGR)。

如果你没有安装scikit-image,那么url_to_image就是手边现成的工具。具体细节参考本文开始处。

我很快会在Github上将这个函数添加到imutils库中。

Python 相关文章推荐
Python数据类型详解(四)字典:dict
May 12 Python
python如何获取服务器硬件信息
May 11 Python
Python中read()、readline()和readlines()三者间的区别和用法
Jul 30 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
Sep 28 Python
理想高通滤波实现Python opencv示例
Jan 30 Python
python多线程分块读取文件
Aug 29 Python
python实现将一维列表转换为多维列表(numpy+reshape)
Nov 29 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
May 18 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
python 实现汉诺塔游戏
Nov 28 Python
python中Mako库实例用法
Dec 31 Python
Python实现疫情地图可视化
Feb 05 Python
python根据出生年份简单计算生肖的方法
Mar 27 #Python
python实现根据月份和日期得到星座的方法
Mar 27 #Python
python根据给定文件返回文件名和扩展名的方法
Mar 27 #Python
python中使用mysql数据库详细介绍
Mar 27 #Python
python获得两个数组交集、并集、差集的方法
Mar 27 #Python
Flask入门教程实例:搭建一个静态博客
Mar 27 #Python
Python中的高级数据结构详解
Mar 27 #Python
You might like
用PHP连接Oracle数据库
2006/10/09 PHP
php 404错误页面实现代码
2009/06/22 PHP
ThinkPHP中的create方法与自动令牌验证实例教程
2014/08/22 PHP
解决php-fpm.service not found问题的办法
2017/06/06 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
Js 获取Gridview选中行的内容操作步骤
2013/02/05 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
JavaScript如何一次性展示几万条数据
2017/03/30 Javascript
详解nodejs微信公众号开发——3.封装消息响应模块
2017/04/10 NodeJs
JavaScript实现的斑马线表格效果【隔行变色】
2017/09/18 Javascript
webpack构建换肤功能的思路详解
2017/11/27 Javascript
vue组件与复用详解
2018/04/08 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
2019/05/14 jQuery
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
jQuery AJAX应用实例总结
2020/05/19 jQuery
Vue 封装防刷新考试倒计时组件的实现
2020/06/05 Javascript
python发送邮件接收邮件示例分享
2014/01/21 Python
python fabric使用笔记
2015/05/09 Python
pycharm激活码有效到2020年11月底
2020/09/18 Python
Python多线程获取返回值代码实例
2020/02/17 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
Mysql数据库反向生成Django里面的models指令方式
2020/05/18 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
HTML5在IE10、火狐下中文乱码问题的解决方法
2013/11/18 HTML / CSS
巴西购物网站:Submarino
2020/01/19 全球购物
新手上路标语
2014/06/20 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
感谢信格式范文
2015/01/22 职场文书
客户经理岗位职责大全
2015/04/09 职场文书
通讯稿格式及范文
2015/07/22 职场文书
大学生,三分钟即兴演讲稿
2019/07/22 职场文书