6.3 Python图像处理之图像编码技术和标准-小波变换编码
1 算法原理
所谓的小波的小是针对傅里叶波而言,傅里叶波指的是在时域空间无穷震荡的正弦(或余弦波)。相对而言,小波指的是一种能量在时域非常集中的波,它的能量有限,都集中在某一点附近,而且积分的值为零,这说明它与傅里叶波一样是正交波。小波变换步骤如下:
1)把小波 w(t)和原函数 f(t)的开始部分进行比较,计算系数 C。系数 C 表示该部分函数与小波的相似程度;
2)把小波向右移 k 单位,得到小波 w(t-k),重复 1。重复该步骤直至函数 f 结束;
3)扩展小波 w(t),得到小波 w(t/2),重复步骤 1,2;
不断扩展小波,重复 1,2,3。
图像的二维离散小波分解和重构过程如下图所示,
分解过程可描述为:首先对图像的每一行进行 1D-DWT,获得原始图像在水平方向上的低频分量 L 和高频分量 H,然后对变换所得数据的每一列进行 1D-DWT,获得原始图像在水平和垂直方向上的低频分量 LL、水平方向上的低频和垂直方向上的高频 LH、水平方向上的高频和垂直方向上的低频 HL 以及水平和垂直方向上的的高频分量 HH。
重构过程可描述为:首先对变换结果的每一列进行以为离散小波逆变换,再对变换所得数据的每一行进行一维离散小波逆变换,即可获得重构图像。由上述过程可以看出,图像的小波分解是一个将信号按照低频和有向高频进行分离的过程,分解过程中还可以根据需要对得到的 LL 分量进行进一步的小波分解,直至达到要求。
2 代码
运行代码说明
1.要改变代码中的图片地址(地址不能有中文)
更改
put(path)
函数中的路径put(r'../image/image1.jpg')
2.注意最后的
plt.savefig('1.new.jpg')
是保存plt图像,如果不使用可以注释掉代码依赖包:
matplotlib 3.4.2 numpy 1.20.3 opencv-python 4.1.2.30 PyWavelets 1.1.1
# pip安装 pip install matplotlib numpy opencv-python PyWavelets
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 需要安装python小波分析库PyWavelets
from pywt import dwt2, idwt2
def put(path):
# 0是表示直接读取灰度图
img = cv2.imread(path, 0)
# 对img进行haar小波变换:,haar小波
cA, (cH, cV, cD) = dwt2(img, 'haar')
# 小波变换之后,低频分量对应的图像:
a = np.uint8(cA / np.max(cA) * 255)
# 小波变换之后,水平方向高频分量对应的图像:
b = np.uint8(cH / np.max(cH) * 255)
# 小波变换之后,垂直平方向高频分量对应的图像:
c = np.uint8(cV / np.max(cV) * 255)
# 小波变换之后,对角线方向高频分量对应的图像:
d = np.uint8(cD / np.max(cD) * 255)
# 根据小波系数重构回去的图像
rimg = idwt2((cA, (cH, cV, cD)), 'haar')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.subplot(231), plt.imshow(img, 'gray'), plt.title('原始图像'), plt.axis('off')
plt.subplot(232), plt.imshow(a, 'gray'), plt.title('低频分量'), plt.axis('off')
plt.subplot(233), plt.imshow(b, 'gray'), plt.title('水平方向高频分量'), plt.axis('off')
plt.subplot(234), plt.imshow(c, 'gray'), plt.title('垂直平方向高频分量'), plt.axis('off')
plt.subplot(235), plt.imshow(d, 'gray'), plt.title('对角线方向高频分量'), plt.axis('off')
plt.subplot(236), plt.imshow(rimg, 'gray'), plt.title('重构图像'), plt.axis('off')
# plt.savefig('3.new-img.jpg')
plt.show()
# 图像处理函数,要传入路径
put(r'../image/image1.jpg')