目錄
在算法對圖片進行處理的過程中,圖片的展現形式一般有如下幾種:
- image file
- base64
- binary
- MAT
- numpy array
本文主要討論這幾種常見的文件格式之間的相互轉換,供大家學習參考。
1 圖片展現形式
1.1 image file
這裏是指以文件的形式存在的,一般在代碼的實現過程中,會通過指定一個路徑來表示,常見的文件格式有jpg,png,bmp等,這個比較常見,不特別說明。
1.2 base64
base64本質上是一種編碼方式,是網絡上最常見的用於傳輸8Bit字節碼的編碼方式之一,Base64就是一種基於64個可打印字符來表示二進制數據的方法,可用於在HTTP環境下傳遞較長的標識信息。因此在網絡環境下面的圖片傳輸,就常常使用base64的方式,在發送段進行編碼,然後在接收端進行解碼。圖片的base64編碼就是可以將一副圖片數據編碼成一串字符串,使用該字符串代碼圖像信息。
在網絡中傳輸base64圖片的好處在於可以節省一個http請求,原理就是將圖片轉換爲string,嵌入到css中,減少再次請求圖片的操作,而帶來的問題就是css樹變複雜,解析需要耗費額外的時間。
1.3 binary
binary可以理解爲直接將文件的圖片加載到內存中形成的字節集合。常見於網絡http請求中,直接使用字節流在網絡中傳輸。好處是簡單方便,弱點是需要知道文件的格式,而且如果網絡不穩定的話,接收方常常無法正常復原該圖片。
1.4 MAT
MAT本質上是openCV2.x之後引進的Mat類(Matrix的縮寫),是OpenCV用於處理圖像的封裝類。Mat對於圖片的存儲比較靈活,可以有不同的編碼方式(RGB,YCrCb,CIE L*b*a等),還可以指定存儲的chanel數量等。
1.5 numpy array
相信對於深度學習的同學來說,numpy一定不會陌生。圖片在進入到網絡之前,一般都會被轉換爲numpy array格式,以張量的方式存在。
題外話:阿里推出了一個Mars,聽說可以70%替代numpy,而且功能強大,支持並行處理。https://mp.weixin.qq.com/s?__biz=MzIzOTU0NTQ0MA==&mid=2247489338&idx=1&sn=f85acb433b68956525105efc4c8bc484&chksm=e9292a35de5ea32355dc73e3f9f3143762ada1f24d304763ccf32f73ab77476052bb284eebd9&mpshare=1&scene=1&srcid=#rd
2 格式之間的相互轉換
既然上面提到了,圖片處理最終的目標是numpy,那麼我們就重點關注各種格式怎麼走到numpy的。本文中的環境採用python 3.5
import numpy as np
import cv2
import base64
2.1 image_file & numpy
這裏可以借用PIL模塊輕鬆實現。
from PIL import Image
import numpy as np
im = Image.open("/home/lw/a.jpg")
im.show()
img = np.array(im) # image類 轉 numpy
img = img[:,:,0] #第1通道
im=Image.fromarray(img) # numpy 轉 image類
im.show()
2.2 base64 & image file
import base64
import cv2
from numpy as np
with open("/home/11.jpg","rb") as image_file:
encoded_image = base64.base64encode(image_file.read())
image_base64 = encoded_image.decode('utf-8')
2.3 base64 & Mat
import cv2
import base64
from numpy as np
image = cv2.imread("/home/11.jpg)
retval,buffer = cv2.imencode('.jpg',image)
image_base64 = base64.b64encode(buffer).decode("utf-8")
2.4 base64 & numpy
import base64
from numpy as np
image_string = request_data['image']
img_data = base64.b64decode(image_string)
nparr = np.fromstring(img_data,np.uint8) // np格式
image_mat = cv2.imdecode(nparr,cv2.IMREAD_COLOR) // np轉cv2 mat格式
s = base64.b64encode(t)
r = base64.decodestring(s)
q = np.frombuffer(r,dtype=np.float64)
2.5 binary & numpy
import base64
from numpy as np
import cv2
image_binary = request.files.get('image_binary',None)
image_binary = image_binary.read()
參考文獻:
【1】圖像base64與numpy array之間的轉換https://blog.csdn.net/qian1122221/article/details/84567715
【2】https://baike.baidu.com/item/base64/8545775?fr=aladdin
【3】圖片base64編碼的利弊分析https://www.imooc.com/article/27804
【4】opencv中的mat詳細解析https://blog.csdn.net/u010248552/article/details/79962132
【5】opencv Mat類詳解和用戶https://blog.csdn.net/guyuealian/article/details/70159660