是否可以在不创建临时文件的情况下从 URL 加载 skimage(numpy 矩阵)格式的图像?
skimage 本身使用临时文件:https ://github.com/scikit-image/scikit-image/blob/master/skimage/io/util.py#L23
有没有办法直接传递urlopen(url).read()
给imread.imread()
(或任何其他图像阅读库)?
是否可以在不创建临时文件的情况下从 URL 加载 skimage(numpy 矩阵)格式的图像?
skimage 本身使用临时文件:https ://github.com/scikit-image/scikit-image/blob/master/skimage/io/util.py#L23
有没有办法直接传递urlopen(url).read()
给imread.imread()
(或任何其他图像阅读库)?
从imread
文档:
图片文件名,例如 test.jpg或 URL
所以你可以直接传递你的 URL:
io.imread(url)
请注意,它仍会创建一个临时文件来处理图像...
编辑:
该库imread
还有一个imread_from_blob
接受字符串作为输入的方法。所以你可以将你的数据直接传递给这个函数。
from imread import imread_from_blob
img_data = imread_from_blob(data, 'jpg')
>>> img_data
array([[[ 23, 123, 149],
[ 22, 120, 147],
[ 22, 118, 143],
...,
第二个参数是通常与此 blob 关联的扩展名。如果没有给出,则detect_format
用于自动检测。
import matplotlib.pyplot as plt
from skimage import io
image=io.imread ('https://i.stack.imgur.com/yt0Xo.jpg')
plt.imshow(image)
plt.show()
有点棘手,但有效(在 Python 3.4 上)。似乎 skimage 本身无法解析缓冲区中的图像。但无论如何,它在任何情况下都隐含地使用枕头。
您需要用下载的数据填充 BytesIO 缓冲区,然后将其输入 PIL.Image,然后从中创建 skimage.io.Image。
from urllib.request import urlopen
from io import BytesIO
from PIL import Image
from skimage import io
url = 'http://www.musicnowsg.com/wp-content/uploads/2013/12/grumpy-jazz-cat.jpg'
response = urlopen(url)
buf = BytesIO(response.read())
im = Image.open(buf)
a = io.Image(im)
io.imshow(a)
io.show()