将 JPEG 从 URL 加载到无临时文件的 skimage

Load JPEG from URL to skimage without temporary file

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

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

有什么方法可以直接将urlopen(url).read()传递给imread.imread()(或任何其他图像阅读库)?

来自imread documentation

Image file name, e.g. test.jpg or 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 关联的扩展名。如果给出 None,则 detect_format 用于自动检测。

有点棘手,但有效(在 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()
import matplotlib.pyplot  as plt
from skimage import io

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

plt.imshow(image)
plt.show()