算法產品化---常見圖片格式轉換

目錄

1  圖片展現形式

1.1 image file

1.2 base64

1.3 binary

1.4 MAT

1.5 numpy array


     

在算法對圖片進行處理的過程中,圖片的展現形式一般有如下幾種:

  •       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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章