【问题标题】:Load JPEG from URL to skimage without temporary file将 JPEG 从 URL 加载到没有临时文件的 skimage
【发布时间】:2015-11-21 13:14:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: python scikit-learn urllib2 scikit-image imread


    【解决方案1】:

    来自imread documentation:

    图像文件名,例如test.jpg 或网址

    所以你可以直接传递你的网址:

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

    【讨论】:

    • 嗯,这正是我要避免的事情,这就是为什么我附上了 github 的链接,它显示了在 skimage 中通过创建临时文件处理 URL 的代码。
    • 但是你为什么要避免这种情况呢?
    • @user1263702:我编辑了我的答案并添加了一个适合您需求的解决方案。
    • @Cybril 我对工作机器有一些限制,例如即使在 /tmp/ 中,我也无权创建文件。顺便说一句,imread_from_blob 正是我要找的东西。
    【解决方案2】:
    import matplotlib.pyplot  as plt
    from skimage import io
    
    image=io.imread ('https://i.stack.imgur.com/yt0Xo.jpg')
    
    plt.imshow(image)
    plt.show()
    

    【讨论】:

    • 嘿@Mahmoud,欢迎来到SO!通常,我们希望看到对问题的一些解释以及代码。另外,我刚刚试了一下,得到了HttpError: Forbidden。
    • 嘿@AleksanderLidtke。谢谢!我认为代码非常简单且不言自明,请尝试提供您自己的图片 URL。
    • 添加了一个工作 URL 只是为了让用户阅读更轻松。
    【解决方案3】:

    有点棘手,但可以工作(在 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()
    

    【讨论】:

    • 那么你仍然需要通过机器发送它以获得一个numpy数组。 PIL 插件可以从类文件对象中读取。
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多