利用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中的元类(metaclass)
Feb 14 Python
Python socket网络编程TCP/IP服务器与客户端通信
Jan 05 Python
老生常谈Python之装饰器、迭代器和生成器
Jul 26 Python
Python 判断是否为质数或素数的实例
Oct 30 Python
python正则表达式面试题解答
Apr 28 Python
浅谈python配置与使用OpenCV踩的一些坑
Apr 02 Python
python检索特定内容的文本文件实例
Jun 05 Python
python里 super类的工作原理详解
Jun 19 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
python socket 聊天室实例代码详解
Nov 14 Python
python 基于DDT实现数据驱动测试
Feb 18 Python
教你用python实现一个无界面的小型图书管理系统
May 21 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
不用mod_rewrite直接用php实现伪静态化页面代码
2008/10/04 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
PHP统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
2011/10/29 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
php生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
Document 对象的常用方法
2009/07/31 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
JQuery获取浏览器窗口内容部分高度的代码
2012/02/24 Javascript
简易js代码实现计算器操作
2013/04/15 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
利用浮层使select不可选的实现方法
2016/12/03 Javascript
bootstrap栅格系统示例代码分享
2017/05/22 Javascript
nodejs使用express获取get和post传值及session验证的方法
2017/11/09 NodeJs
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
2019/06/28 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
python实现多进程通信实例分析
2019/09/01 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
基于python traceback实现异常的获取与处理
2019/12/13 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
YSL圣罗兰美妆俄罗斯官网:Yves Saint Lauret RU
2020/09/23 全球购物
介绍一下.NET构架下remoting和webservice
2014/05/08 面试题
创业大赛策划书
2014/03/01 职场文书
《金子》教学反思
2014/04/13 职场文书
家长通知书家长评语
2014/04/17 职场文书
2014年教师工作总结
2014/11/10 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
门面租赁合同范文
2019/08/06 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书