从网页链接直接将图像加载到NumPy数组中(Python)

5

我正在尝试从网络获取一个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

我想直接将图片加载到内存中,有什么办法可以做到吗?

3个回答

6

既然您提到了scipy.misc.imread,我们可以使用它来隐藏Image.open的部分。 因此,实现将如下所示 -

from scipy import misc

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

从性能上看,它似乎与其他帖子中列出的四个转换阶段相当。


misc.imread 接受一个文件名字符串,而不是字节流。 - Nikhil Shinday
@NikhilShinday 那么,发布的解决方案对你没用吗?我用得很好。你的Scipy版本是多少? - Divakar
2
模块'scipy.misc'没有属性'imread'。 - ABCD
看起来他们从scipy中删除了imread。这里有一些替代方案 - https://dev59.com/imUp5IYBdhLWcg3wVWev#47865626 - Callum

4
我找到了一个解决方案,可以规避写入磁盘的问题:
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。是否有更高效的方法?

0
由于scipy.misc.imread()已被弃用,更好的方法是使用cv2:
import cv2,requests
import numpy as np
from fake_useragent import UserAgent

ua = UserAgent()
img_data = requests.get(YOUR_URL_HERE,verify=False,timeout=1,
        headers={"Content-Type":ua.random}).content
img = cv2.imdecode(np.frombuffer(img_data,np.uint8),-1)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接