小波变换二之Haar变换
Haar变换
这是小波变换的第二篇,我们继续谈Haar变换。在第一篇中,我们介绍了一位情况下的Haar变换,这篇博文中主要介绍二维Haar变换。最后,通过一个图像压缩的案例说明二维Haar变换的应用。
原理说明
给定一个二维信号,我们这里假设是一个的图片,
如何进行二维的哈尔变换呢?
步骤是这样的:(1)首先,沿着矩阵的每一行做一维的Haar变换;(2)然后,沿着矩阵的每一列做一维的哈尔变换;(3)对于每个低频分量矩阵(近似信息)重复步骤(1)和(2)直到完成指定的等级划分。下图给出了两级划分的示意图:
这里的A表示近似信息(approximation coefficients),H表示水平细节信息(horizontal detail coefficients),V表示垂直细节信息(vertical detail coefficients),D表示对角线细节信息(diagonal detail coefficients)。很多数学软件中是这样称呼的,了解了这个可以帮助我们快速上手软件进行实际操作。
行分解和列分解的顺序是可以互换的,保持一致即可。
明白了基本原理,下面我们来进行实际计算,对于,(如果不清楚如何做一维高频和低频分解,可参看博文《小波变换一之Haar变换》)
第一次行分解得到低频信息
第一次列分解得到高频信息
对进行列高频分解得到
对进行列低频分解得到
对进行列高频分解得到
对进行列低频分解得到
我们还可以对继续进行二层分解,这里就不做演示了。
实例演示
这里我们通过对一张图片做Haar变换,然后我们去掉其高频信息部分,实现对图像的压缩。
下面是进行了三次分解,然后分别过了到第一层的高频信息和第一层兼第二层的高频信息的效果!过滤掉第一层的高频信息,图像压缩为原来的四分之一,可以看到图像还是基本清晰的。过滤掉第二层和第二层的高频信息以后,可以看到图片稍微有点模糊了。
MATLAB实现
下面是使用MATLAB实现上面变换的代码,有兴趣的童鞋可以参考一下。
clear, clc;
% 读取原始图像
X = rgb2gray(imread('http://www.lenna.org/lena_std.tif'));
% 进行小波分解
[C, S] = wavedec2(X, 3, 'haar');
% 获得分解以后的低频近似信息
L = appcoef2(C, S, 'haar', 3);
% 分别获得各层级的高频细节信息
[H3, V3, D3] = detcoef2('all', C, S, 3);
[H2, V2, D2] = detcoef2('all', C, S, 2);
[H1, V1, D1] = detcoef2('all', C, S, 1);
% 去掉第一层的高频信息(替换成0),然后进行小波重建
% 注意这里乘以3是有HVD三种高频信息
D = [C(1: end - 3*size(H1, 1)*size(H1, 2)), zeros(1, 3*size(H1, 1)*size(H1, 2))];
CD1 = waverec2(D, S, 'haar');
% 去掉第一和第二层的高频信息,然后进行小波重建
D = [C(1: end - 3*size(H1, 1)*size(H1, 2) - 3*size(H2, 1)*size(H2, 2)), ...
zeros(1, 3*size(H1, 1)*size(H1, 2) + 3*size(H2, 1)*size(H2, 2))];
CD2 = waverec2(D, S, 'haar');
%按照分解层级将分解系数排列拼接为一副图像
DD1 = [L, H3; V3, D3];
DD2 = [DD1, H2; V2, D2];
DD3 = [DD2, H1; V1, D1];
% 结果显示
subplot(2, 2, 1), imshow(X, []), title('原始图像');
subplot(2, 2, 2), imshow(DD3, []), title('小波分解系数');
subplot(2, 2, 3), imshow(CD1, []), title('压缩一(去掉第一层高频信息)');
subplot(2, 2, 4), imshow(CD2, []), title('压缩二(去掉第二层高频信息)');