算法产品化---常见图片格式转换

目录

目录

1  图片展现形式

1.1 image file

1.2 base64

1.3 binary

1.4 MAT

1.5 numpy array

2 格式之间的相互转换

2.1 image_file & numpy

2.2  base64 & image file

2.3 base64 & Mat

2.4 base64 & numpy

2.5 binary & numpy

2.6 url & image file



     

在算法对图片进行处理的过程中,图片的展现形式一般有如下几种:

  •       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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值