过去几个月,有些PyImageSearch读者电邮问我:“如何获取URL指向的图片并将其转换成OpenCV格式(不用将其写入磁盘再读回)”。这篇文章我将展示一下怎么实现这个功能。额外的,我们也会看到如何利用scikit-image从URL下载一幅图像。当然前行之路也会有一个常见的错误,它可能让你跌个跟头。
继续往下阅读,学习如何利用利用Python和OpenCV将URL转换为图像。
方法1:OpenCV、NumPy、urllib
第一个方法:我们使用OpenCV、NumPy、urllib库从URL获取图像,并将其转换为图像。打开并新建一个文件,取名url_to_image.py,我们开始吧:
NumPy
转换下载的字节序为NumPy数组,使用urllib
来执行实际的网络请求,使用cv2
来绑定OpenCV接口。在第7行,我们定义了我们的url_to_image
函数。这个函数带一个url
参数,也就是我们想要下载的图像地址。接下来,在第10行,我们使用urllib
库来打开这个图像链接。11行则将这个下载下来的字节序转换为NumPy数组。12行我们使用cv.imdecode
函数。最后,在15行我们返回解码出来的图像给调用函数。
一切就绪,该到让它工作的时候了:
3-5行定义了我们将要下载和转换为OpenCV格式的图像地址列表。
第9行我们遍历这个列表,13行则调用url_to_image
函数,然后在14行和15行将获取的图像显示到屏幕上。到此呢,我们就可以像正常情况下一样,使用OpenCV来操作和处理这些图像了。
运行程序,就可以看到想要的结果了。
方法2:使用scikit-image
第二种方法假定你已经在你计算机上安装好了scikit-image库。让我们看看怎样采用scikit-image从URL获取图像并将其转换为OpenCV格式:
io
子库中的imread
函数能够区分图像路径到底在磁盘上还是一个URL(第9行)。尽管这样,这里有一个很严重的错误可能让你跌一个跟头!OpenCV以BGR顺序表达一幅图像,然而scikit-image则是RGB顺序。如果你使用scikit-iamge的imread函数,而且还想在下载完成后使用OpenCV的函数
,那么你要小心了。如41行所述,你需要将图像从RBG转换为BGR。