目录
目录
在算法对图片进行处理的过程中,图片的展现形式一般有如下几种:
- 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_str = encoded_image.decode('utf-8')
import os,base64
strs= image_base64_str
imgdata=base64.b64decode(strs)
file=open('1.jpg','wb')
file.write(imgdata)
file.close()
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()
2.6 url & image file
res = requests.get('{}/images/{}'.format(API_URL,ori_image_id),verify=False)
image_data1 = res.content
file1 = open(str(save_path1),'wb')
file1.write(image_data1)
file1.close()
参考文献:
【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