不論是用opencv還是PIL,skimage等庫(kù),在之前做圖像處理的時(shí)候,幾乎都是讀取本地的圖片。最近嘗試爬蟲(chóng)爬取圖片,在保存之前,我希望能先快速瀏覽一遍圖片,然后有選擇性的保存。這里就需要從url讀取圖片了。查了很多資料,發(fā)現(xiàn)有這么幾種方法,這里做個(gè)記錄。
本文用到的圖片URL如下:
img_src = 'http://wx2.sinaimg.cn/mw690/ac38503ely1fesz8m0ov6j20qo140dix.jpg'

1.用OpenCV
OpenCV的imread()只能加載本地的圖片,并不能通過(guò)網(wǎng)址加載圖片。但是,opencv的VideoCapture類(lèi)可以從url加載視頻。如果只用opencv的話,我們可以一個(gè)迂回的方式:先用VideoCapure加載網(wǎng)址下的圖片,然后再傳給Mat。
import cv2
cap = cv2.VideoCapture(img_src)
if( cap.isOpened() ) :
ret,img = cap.read()
cv2.imshow("image",img)
cv2.waitKey()
2. OpenCV+Numpy+urllib
import numpy as np
import urllib
import cv2
resp = urllib.urlopen(img_src)
image = np.asarray(bytearray(resp.read()), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
cv2.imshow("Image", image)
cv2.waitKey(0)
urlopen返回 一個(gè)類(lèi)文件對(duì)象,它提供了如下方法:
read() , readline() , readlines() , fileno() , close() :這些方法的使用方式與文件對(duì)象完全一樣。然后把返回的類(lèi)文件對(duì)象重新編碼,轉(zhuǎn)換為圖片傳給Mat。
3.PIL+requests
import requests as req
from PIL import Image
from io import BytesIO
response = req.get(img_src)
image = Image.open(BytesIO(response.content))
image.show()
requests能以字節(jié)的方式訪問(wèn)請(qǐng)求響應(yīng)體,以上就是以請(qǐng)求返回的二進(jìn)制數(shù)據(jù)創(chuàng)建一張圖片的代碼。
4. skimage
from skimage import io
image = io.imread(img_src)
io.imshow(image)
io.show()
相對(duì)來(lái)說(shuō),這種方式應(yīng)該是最簡(jiǎn)單的,因?yàn)閟kimage可以直接以imread()函數(shù)來(lái)讀取網(wǎng)頁(yè)圖片,而不需要其他的輔助,也不需要迂回。
公眾號(hào)CVPy,分享OpenCV和Python的實(shí)戰(zhàn)內(nèi)容。每一篇都會(huì)放出完整的代碼。歡迎關(guān)注。
