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

过去几个月,有些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:

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

接下来是Google的logo:

图2:从URL下载Gooogle并转换为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。

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

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

看看Google的logo就更明显了

图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连接opencv库_利用Python和OpenCV库将URL转换为OpenCV格式的方法相关推荐

  1. python分析pcap文件_利用Python库Scapy解析pcap文件的方法

    每次写博客都是源于纳闷,python解析pcap这么常用的例子网上竟然没有,全是一堆命令行执行的python,能用吗?玩呢? pip安装scapy,然后解析pcap: import scapy fro ...

  2. python实现邮件客户端_利用python实现简单的邮件发送客户端示例

    脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...

  3. python制作图片墙_利用python生成照片墙的示例代码

    PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了.其官方主页为:PIL. PIL历 ...

  4. python如何收集数据库_利用Python操作mysql数据库

    本文主要讲解如何利用python中的pymysql库来对mysql数据库进行操作 大家在转行项目中也可以加入这一步操作,提高逼格的同时还能简化流程 正文开始: 先看一下最常见的操作:从数据库中sele ...

  5. python读取sas数据集_利用Python获取SAS和R自带数据集

    图:北京-奥森公园-2018年4月 无论是SAS.R还是Python,本身都自带一些数据集,对于初学者来说,可以通过这些自带的小数据集进行编程练习,无疑是非常方便的.SAS.R作为统计分析软件,本身自 ...

  6. python制作电脑软件_利用PYTHON制作桌面版爬虫软件(一)

    抱歉,对长沙房地产数据的挖掘与分析[三],想了蛮久,觉得对自己的分析结果不是很理想.等我完善好了,我再发出来吧.今天继续开启新的一专题.主要讲解如何用PYTHON实现简单的桌面软件的制作. 题外话,我 ...

  7. python逐步回归筛选变量_利用python实现逐步回归

    逐步回归的基本思想是将变量逐个引入模型,每引入一个解释变量后都要进行F检验,并对已经选入的解释变量逐个进行t检验,当原来引入的解释变量由于后面解释变量的引入变得不再显著时,则将其删除.以确保每次引入新 ...

  8. 用python画动态樱花_利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白...

    利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白 此处感谢知乎大佬 小白练手 练习一下比较流行的turtle(海龟库) 画一棵漂亮的樱花树,效果如下: ps: 是动态 ...

  9. python post请求 上传图片_利用python模拟实现POST请求提交图片的方法

    本文主要给大家介绍的是关于利用python模拟实现POST请求提交图片的方法,分享出来供大家参考学习,下面来一看看详细的介绍: 使用requests来模拟HTTP请求本来是一件非常轻松的事情,比如上传 ...

最新文章

  1. 独家 | 浅谈Python/Pandas中管道的用法
  2. [HAOI2009]毛毛虫
  3. FPGA之道(12)FPGA芯片的配置方式
  4. 每天60秒读懂世界20211127
  5. Vue使用Vuex一步步封装并使用store
  6. 你注意到 .Net Framework 和 .Net Core 中使用 Session 的区别了吗?
  7. Java德才论宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之 小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若
  8. Python学习札记(十七) 高级特性3 列表生成式
  9. springboot整合activiti报错[processes/]不存在解决方案
  10. matlab for循环不覆盖,Matlab for 多个变量循环能不能这样啊 ,求教高手!!!!...
  11. c语言中万年历公历农历转换,公历农历转换,教你切换阳历和阴历生日
  12. 505错误:Invalid bound statement (not found): com.pc.dao.BookMapper.queryAllBook错误解决
  13. oracle18c shard技术分享-安装部署
  14. 值得珍藏!生生世世受用的译文 《心经》
  15. try语句的基本用法
  16. Ubuntu 16G内存在android系统 10/11/12/13编译 framework时候经常oom内存不足,电脑卡死解决办法stubs-docs-non-updatable metalava
  17. 50个开机进BIOS按键查询
  18. C指针与指针之间的相减操作
  19. 图床程序 php,开源免费PHP图床程序–Qchan
  20. git提交代码时出现Everything up-to-date的解决办法

热门文章

  1. 求你别自己瞎写工具类了,Spring自带的这些他不香吗?
  2. linux操作系统下部署Javaweb项目教程
  3. html5与css3是互联网发展趋势,五大主流浏览器CSS3和HTML5兼容性比拼
  4. java 5 线程 睡眠,Java线程之线程的调度-休眠
  5. mysql 10048 linux_解决Can't connect to MySQL server on 'localhost' (10048)
  6. Memory存储引擎
  7. 2019.8.13节点的选取
  8. 浅入深出Vue:环境搭建
  9. http协议中的响应代码从 1xx ~ 5xx,一共有41种
  10. UOJ#450. 【集训队作业2018】复读机 排列组合 生成函数 单位根反演