Python 图像编解码
Python中的图像编解码过程
OpenCV图像解码
在openCV中常见的编码格式有png , webp, jpg,bmp等常见的数据编码方式也有avif等非常见的数据格式。这里主要介绍前三种。图像编码格式的应用。下面我将以python代码段来介绍Opencv中的图像编码过程。
import cv2
import numpy as np
# 读取图像
im = cv2.imread("./example.png")
# 当路径中存在中文时采用imread方法返回为None
# 采用nunpy读取数据
data = np.fromfile("./例子.png", dtype=np.uint8)
# 这里我们获取了图像的原始数据,并将其转换成了numpy的一维的array对象,采用opencv将其解码成与imread一致的数据
im = cv2.imdecode(data, cv2.IMREAD_COLOR)
# 第二个参数为标志未指定转换的格式,也可以采用cv2.IMREAD_UNCHANGED替代
# 实际上图形的存储是采用二进制的方式进行存储的,因此对于含有中文路径的文件我们还能以文件的形式打开
with open("./例子.png", "rb") as f:
data = f.read()
# 这里读取的数据类型为bytes, 即以二进制的方式读取的数据
data = np.asarray(bytearray(data), dtype='uint8')
# 到这里即转换成了np.fromfile()读取的数据类型,之后的解码就和上述过程一致了解码成一个(h, w, c)的numpy数组
至此采用opencv和numpy解码图像数据的过程就完成了,上述代码解释了从磁盘文件解析图像数据的过程。对网络数据其实解析过程也大同小异通过urllib库去请求。
from urllib import request
response = request.urlopen(url_path)
data = response.read()
# 这里读取的数据即为二进制的图像的文件,后续的解析方式可以按照上述的二进制文件的解析方式转换成numpy数组
注:上述过程只能解析OpenCV支持解码的数据格式,如avif的数据格式的图像数据是无法正常解析的。这类数据的解析我将在之后提到。
OpenCV编码numpy图像数据以及保存
import cv2
import numpy as np
# 创建图像
im = np.zeros((256, 256, 3),np.uint8)
# 采用webp编码数据
_, out = cv2.imencode('.webp', im, [cv2.IMWRITE_WEBP_QUALITY, 100]])
# imencode有三个参数,第一个是指定编码图像的编码格式,第二个是输入的BGR图像数组, 第三个参数指定压缩等级如webp图像是[0,100].数值越小压缩等级越高。画质越差,占用的磁盘空间越小。
# 返回为一个列表,第一位为标志符即一个布尔值。第二位是编码后的数据,实际上与np.fromfile()读取的数据类型一致
out = cv2.imencode('.jpeg'

本文介绍了Python中使用OpenCV和Pillow进行图像编解码的过程。首先,通过OpenCV的imread和imdecode函数读取和解码PNG、JPEG、BMP等格式的图像,然后展示了如何用numpy处理图像数据并保存。接着,讲解了OpenCV的imencode功能,用于编码图像为webp、jpeg、png等格式,并保存图像。此外,还提到了如何在PNG图像中插入DPI信息。最后,文章讨论了Pillow库在解析图像数据、获取图像信息以及保存图像方面的优势,包括对AVIF格式的支持。

2401

被折叠的 条评论
为什么被折叠?



