imutils基础(6)使用 Python 和 OpenCV 将 URL 转换为图像

在本文中我会告诉你到底是如何从 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-imageimread函数,并且想在下载图像后使用OpenCV函数,你需要特别小心地将图像从RGB转换为BGR。

3.总结

在这篇博文中,我们学习了两种从 URL 下载图像并使用 Python 和 OpenCV 将其转换为 OpenCV 格式的方法。 第一种方法是使用 urllib Python 包下载图像,使用 NumPy 将其转换为数组,最后使用 OpenCV 重构数组以构建我们的图像。 第二种方法是使用 scikit-imageio.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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值