将图像资源加载到Numpy数组中

时间:2017-05-18 20:22:56

标签: python numpy scipy python-requests

我正在尝试将来自Web的JPEG图像资源转换为类似于scipy.misc.imread返回的数组的NumPy数组图像表示。而不是将图像保存到磁盘,如下例所示:

import requests
from scipy import misc
def load_image(url):
    res = requests.get(url) 
    if res == 200 and 'jpeg' in res.headers['content-type']: 
        with open('image.jpg', 'wb') as fp: 
            for chunk in res: 
                fp.write(chunk)
        img_arr = misc.imread('image.jpg') 
        return img_arr
    else: 
        return None

我想将图像直接加载到内存中。有办法吗?

2 个答案:

答案 0 :(得分:3)

由于您提到scipy.misc.imread,我们可以使用它隐藏Image.open的部分。因此,实现看起来像这样 -

from scipy import misc

res = requests.get(url)
img_arr = misc.imread(BytesIO(res.content))

在性能方面,它似乎与另一篇文章中列出的四个转换阶段相当。

答案 1 :(得分:1)

我找到了一种避免写入磁盘的解决方案:

from io import BytesIO
import requests
import numpy as np 
from PIL import Image
def load_image(url): 
    res = requests.get(url)
    if res == 200 and 'jpeg' in res.headers['content-type']:
        img_arr = np.array(Image.open(BytesIO(res.content)))
        return img_arr
    else: 
        return None

据我所知,我正在三种不同的陈述之间进行转换:bytes -> BytesIO -> PIL.Image -> np.array

有更高效的方法吗?