5

是否可以在不创建临时文件的情况下从 URL 加载 skimage(numpy 矩阵)格式的图像?

skimage 本身使用临时文件:https ://github.com/scikit-image/scikit-image/blob/master/skimage/io/util.py#L23

有没有办法直接传递urlopen(url).read()imread.imread()(或任何其他图像阅读库)?

4

3 回答 3

11

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用于自动检测。

于 2015-08-27T09:01:22.070 回答
4
import matplotlib.pyplot  as plt
from skimage import io

image=io.imread ('https://i.stack.imgur.com/yt0Xo.jpg')

plt.imshow(image)
plt.show()
于 2019-11-16T19:21:02.787 回答
0

有点棘手,但有效(在 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()
于 2015-08-27T14:51:05.467 回答