
利用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:
图1:从URL下载OpenCV logo并转换为OpenCV格式
接下来是Google的logo:
图2:从URL下载Gooogle并转换为OpenCV格式
这里也有在我书中验证人脸检测的例子,《Practical Python and 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库中。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
R 语言:数据科学与科研领域的核心工具及优势解析 一、引言 在数据驱动决策的时代,无论是科研人员验证实验假设(如前文中的 T ...
2025-09-08T 检验在假设检验中的应用与实践 一、引言 在科研数据分析、医学实验验证、经济指标对比等领域,常常需要判断 “样本间的差异是 ...
2025-09-08在商业竞争日益激烈的当下,“用数据说话” 已从企业的 “加分项” 变为 “生存必需”。然而,零散的数据分析无法持续为业务赋能 ...
2025-09-08随机森林算法的核心特点:原理、优势与应用解析 在机器学习领域,随机森林(Random Forest)作为集成学习(Ensemble Learning) ...
2025-09-05Excel 区域名定义:从基础到进阶的高效应用指南 在 Excel 数据处理中,频繁引用单元格区域(如A2:A100、B3:D20)不仅容易出错, ...
2025-09-05CDA 数据分析师:以六大分析方法构建数据驱动业务的核心能力 在数据驱动决策成为企业共识的当下,CDA(Certified Data Analyst) ...
2025-09-05SQL 日期截取:从基础方法到业务实战的全维度解析 在数据处理与业务分析中,日期数据是连接 “业务行为” 与 “时间维度” 的核 ...
2025-09-04在卷积神经网络(CNN)的发展历程中,解决 “梯度消失”“特征复用不足”“模型参数冗余” 一直是核心命题。2017 年提出的密集连 ...
2025-09-04CDA 数据分析师:驾驭数据范式,释放数据价值 在数字化转型浪潮席卷全球的当下,数据已成为企业核心生产要素。而 CDA(Certified ...
2025-09-04K-Means 聚类:无监督学习中数据分群的核心算法 在数据分析领域,当我们面对海量无标签数据(如用户行为记录、商品属性数据、图 ...
2025-09-03特征值、特征向量与主成分:数据降维背后的线性代数逻辑 在机器学习、数据分析与信号处理领域,“降维” 是破解高维数据复杂性的 ...
2025-09-03CDA 数据分析师与数据分析:解锁数据价值的关键 在数字经济高速发展的今天,数据已成为企业核心资产与社会发展的重要驱动力。无 ...
2025-09-03解析 loss.backward ():深度学习中梯度汇总与同步的自动触发核心 在深度学习模型训练流程中,loss.backward()是连接 “前向计算 ...
2025-09-02要解答 “画 K-S 图时横轴是等距还是等频” 的问题,需先明确 K-S 图的核心用途(检验样本分布与理论分布的一致性),再结合横轴 ...
2025-09-02CDA 数据分析师:助力企业破解数据需求与数据分析需求难题 在数字化浪潮席卷全球的当下,数据已成为企业核心战略资产。无论是市 ...
2025-09-02Power BI 度量值实战:基于每月收入与税金占比计算累计税金分摊金额 在企业财务分析中,税金分摊是成本核算与利润统计的核心环节 ...
2025-09-01巧用 ALTER TABLE rent ADD INDEX:租房系统数据库性能优化实践 在租房管理系统中,rent表是核心业务表之一,通常存储租赁订单信 ...
2025-09-01CDA 数据分析师:企业数字化转型的核心引擎 —— 从能力落地到价值跃迁 当数字化转型从 “选择题” 变为企业生存的 “必答题”, ...
2025-09-01数据清洗工具全景指南:从入门到进阶的实操路径 在数据驱动决策的链条中,“数据清洗” 是决定后续分析与建模有效性的 “第一道 ...
2025-08-29机器学习中的参数优化:以预测结果为核心的闭环调优路径 在机器学习模型落地中,“参数” 是连接 “数据” 与 “预测结果” 的关 ...
2025-08-29