如何通過URL打開圖片(Python)

不論是用opencv還是PIL,skimage等庫,在之前做圖像處理的時候,幾乎都是讀取本地的圖片。最近嘗試爬蟲爬取圖片,在保存之前,我希望能先快速瀏覽一遍圖片,然後有選擇性的保存。這裏就需要從url讀取圖片了。查了很多資料,發現有這麼幾種方法,這裏做個記錄。

本文用到的圖片URL如下:

img_src = 'http://wx2.sinaimg.cn/mw690/ac38503ely1fesz8m0ov6j20qo140dix.jpg'

1.用OpenCV

OpenCV的imread()只能加載本地的圖片,並不能通過網址加載圖片。但是,opencv的VideoCapture類可以從url加載視頻。如果只用opencv的話,我們可以一個迂迴的方式:先用VideoCapure加載網址下的圖片,然後再傳給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返回 一個類文件對象,它提供瞭如下方法:
read() , readline() , readlines() , fileno() , close() :這些方法的使用方式與文件對象完全一樣。然後把返回的類文件對象重新編碼,轉換爲圖片傳給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能以字節的方式訪問請求響應體,以上就是以請求返回的二進制數據創建一張圖片的代碼。

4. skimage

from skimage import io
image = io.imread(img_src)
io.imshow(image)
io.show()

相對來說,這種方式應該是最簡單的,因爲skimage可以直接以imread()函數來讀取網頁圖片,而不需要其他的輔助,也不需要迂迴。


公衆號CVPy,分享OpenCV和Python的實戰內容。每一篇都會放出完整的代碼。歡迎關注。

公衆號CVPy

發佈了83 篇原創文章 · 獲贊 354 · 訪問量 79萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章