在本文中我会告诉你到底是如何从 URL 下载图像,然后将其转换为 OpenCV 格式(无需将其写入磁盘然后再读回),我们还将看到我们如何利用 scikit-image
从 URL 下载图像,以及可能会在此过程中您常见的“陷阱”。
1.方法1:OpenCV、NumPy 和 urllib
我们将探索的第一种方法是使用 OpenCV、NumPy 和 urllib 库将 URL 转换为图像。打开一个新文件,命名为 url_to_image.py
,让我们开始吧:
# 导入包
import numpy as np
import cv2
import ssl
ssl._create_default_https_context = ssl._create_unverified_context # 解决SSL 证书的验证问题
# 如果是Python2
if sys.version_info.major == 2:
from urllib import urlopen
# 如果是Python3
elif sys.version_info.major == 3:
from urllib.request import urlopen
# 方法1:OpenCV、NumPy 和 urllib
def url_to_image(url):
# 下载图像,将其转换为NumPy数组,然后将其读入OpenCV格式
resp = urlopen(url)
image = np.asarray(bytearray(resp.read()), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
# 返回图片
return image
我们要做的第一件事是导入必要的包。我们将使用 NumPy 将下载的字节序列转换为 NumPy 数组,使用 urllib 来执行实际请求,并使用 cv2 用于我们的 OpenCV 绑定。
然后定义我们的 url_to_image
函数。这个函数需要一个参数 url ,它是我们要下载的图像的 URL。
接下来,我们使用 urllib 库下载提供的 URL 连接。然后将来自请求的原始字节序列转换为 NumPy 数组。
此时 NumPy 数组是一个一维数组(即一长串像素)。为了将数组重塑为 2D 格式,假设每个像素有 3 个分量(即分别为红色、绿色和蓝色分量),我们调用 cv2.imdecode
。最后,我们将解码后的图像返回。
好的,是时候让这个函数发挥作用了:
# 初始化要下载的图像 URL 列表
urls = [
"https://pyimagesearch.com/wp-content/uploads/2015/01/opencv_logo.png",
"https://pyimagesearch.com/wp-content/uploads/2015/01/google_logo.png",
]
# 遍历图像 URL
for url in urls:
# 下载图片网址并显示
print "downloading %s" % (url)
image = url_to_image(url)
cv2.imshow("Image", image)
cv2.waitKey(0)
定义我们要下载并转换为 OpenCV 格式的图像 URL 列表。
我们开始遍历每一个URL ,调用 url_to_image
函数,然后将我们下载的图像显示到我们的屏幕上。
如果一切顺利,您应该首先看到 OpenCV 标志:
接下来是谷歌标志:
2.方法2:scikit-image
第二种方法假设您的系统上安装了 scikit-image 库。让我们来看看如何利用 scikit-image 从 URL 下载图像并将其转换为 OpenCV 格式:
# 方法2:scikit-image
from skimage import io
# 遍历图像 URL
for url in urls:
# 使用 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。
然而,有一个重要的问题可以真正绊倒你!
OpenCV以BGR顺序表示图像,而scikit-image
以RGB顺序表示图像。如果你使用scikit-image
的imread
函数,并且想在下载图像后使用OpenCV函数,你需要特别小心地将图像从RGB转换为BGR。
3.总结
在这篇博文中,我们学习了两种从 URL 下载图像并使用 Python 和 OpenCV 将其转换为 OpenCV 格式的方法。 第一种方法是使用 urllib
Python 包下载图像,使用 NumPy 将其转换为数组,最后使用 OpenCV 重构数组以构建我们的图像。 第二种方法是使用 scikit-image
的 io.imread
函数。 那么哪种方法更好呢? 这一切都取决于您的设置。 如果您已经安装了 scikit-image,我将使用 io.imread
函数(如果您使用 OpenCV 函数,请不要忘记从 RGB 转换为 BGR)。如果您没有安装 scikit-image
,我将使用本文开头详述的 url_to_image
函数。
参考目录
https://www.pyimagesearch.com/2015/03/02/convert-url-to-image-with-python-and-opencv/