2017-05-18 33 views
1

我試圖從網上獲取JPEG圖像資源,並將其轉換爲與scipy.misc.imread返回的數組類似的NumPy數組圖像。而不是將圖像保存到磁盤,如下例所示:將圖像資源加載到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

既然您提到了scipy.misc.imread,我們可以用它來隱藏Image.open的部分。因此,實施應該是這樣的 -

from scipy import misc 

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

性能方面似乎比得上轉換的四個階段中的其他職務上市。

+0

'misc.imread'接受一個字符串,它是一個文件名,而不是一個字節流 –

+0

@NikhilShinday所以,發佈的解決方案不適合你?爲我工作得很好。什麼是您的Scipy版本? – Divakar

+0

@NikhilShinday任何更新? – Divakar

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

是否有更好的性能的方式做它?