小波分解的matlab实践以及相关内置函数

参考:
http://maiqiuzhizhu.blog.sohu.com/110325150.html
http://ww2.mathworks.cn/help/wavelet/ref/wrcoef2.html
http://ww2.mathworks.cn/help/wavelet/ref/appcoef2.html
http://ww2.mathworks.cn/help/wavelet/ref/detcoef2.html
http://ww2.mathworks.cn/help/wavelet/ref/waverec2.html?searchHighlight=waverec2&s_tid=doc_srchtitle
由于接触到的小波变换很少,所以打算一步一步将自己所接触到的小波变换记录下来。本文旨在在matlab下运行一个小波变换的例子,并对小波变换的结果进行重构。

1 小波变换的内置函数

1.1 wavedec2函数

wavedec2是多层二维离散小波变换函数,用来对图像img进行多级小波分解。经过小波分解之后得到的所有图像都被称为小波系数,有近似系数,水平细节系数,垂直细节系数,对角细节系数。其调用形式为:
(1) [c,s] = wavedec2(img,N,’wname’);
(2) [c,s] = wavedec2(X,N,Lo_D,Hi_D)
这里只对第一种形式进行说明,后面一种好像和滤波器有关,不知。
参数说明:
输入:
img:要进行小波分解的图像;
N :指定分解的层数;
wname:指定用什么小波基进行分解。
输出:
c:为各层分解系数;
s: 各层分解系数长度,也就是大小。

详细解释输出c和s

这里对输出详细说明一下,c是一个行向量,该行向量的组成为
c = [A(N)|H(N)|V(N)|D(N)|H(N-1)|V(D-1)|D(N-1)|H(N-2)|V(N-2)|D(N-2)|…|H(1)|V(1)|D(1)]
其大小为 [1,img_height×img_width];A(N)是图像第N层的近似表示,尺度最小,在金字塔中就是每层的下采样的图像,而H、V、D分别表示图像的水平高频分量,垂直高频分量,对角高频分量。正如我们在金字塔概念中所了解的,在第N-1层下采样到N层,N层的图像维度(尺度)是变小了,也就意味着在下采样过程中丢失了信息,而这些丢失的信息实质是高频信息,那么这些信息在小波分解中可以通过HVD这些高频分量来保存。
这里贴上小波分解之后的结果图,直观地感受一下。这里对原始图像进行三层小波分解。红框a表示的就是近似图像。
这里写图片描述
需要指出的是,每一次的小波分解都是在近似图像上进行分解。
s是储存各层分解系数长度的,即第一行是A(N)的长度,第二行是H(N)|V(N)|D(N)|的长度,第三行是
H(N-1)|V(N-1)|D(N-1)的长度,倒数第二行是H(1)|V(1)|D(1)长度,最后一行是原始图像img的长度(大小)。
这里我的原始图像是512×512,并进行了3层的小波分解。对应的s内容如下图:
这里写图片描述
那么输出c和s之间的关系就如下所示:
这里写图片描述
这里多说一句,cAn 的大小为32×32,cH1的大小就为256×256。而且图像的长宽未必就是相等的,在该例中确实是512×512。

1.2 wrcoef2 函数

wrcoef2函数是用来重建一幅图像的系数,其实就是根据小波分解之后的系数c来重建其对应的图像。重建好的图像的尺度与原始图像一致。即无论你要重构哪个层的系数,最终它的维度都是和原始图像的尺度一致。其调用形式如下:
(1) X = wrcoef2(‘type’,c,s,’wname’,N)
(2) X = wrcoef2(‘type’,c,s,Lo_R,Hi_R,N)
(3) X = wrcoef2(‘type’,c,s,’wname’)
(4) X = wrcoef2(‘type’,c,s,Lo_R,Hi_R)

其中第一种调用形式的参数说明:
type :指定要进行重构的小波系数,如a –近似图像 ;h – 水平高频分量;v – 垂直高频分量;d–对角高
频分量;
c: 是小波分解函数wavedec2分解的小波系数;
s: 是wavedec2分解形成的尺度;
wname :指定小波基;
N :指定重构的小波系数所在的层。
而形式(3)则是默认重构最大层的系数,N = size(S,1)-2。
对于形式(2)Lo_R是重建低通滤波器,Hi_R是重建高通滤波器,形式(4)的默认层数同上面所述一样。
下面通过一段程序体会一下。这里有一点疑惑在于,N所指的层数是如何表示的?比如将图像小波分解成3层,那么N = 3是代表256×256那一层,还是64×64那一层?通过后面的低频高频信息提取就可以看出,N=3 代表的是64×64那一层

clear;
close all;

file = 'lena_gray_512.tif';
img  = imread(file);
img = double(img);
% 对图像进行3层的小波分解
N = 3; % 设置分解层数
[c,s] = wavedec2(img,N,'db1');

% 对各层的近似图像a进行重构
a1 = wrcoef2('a',c,s,'db1',1);
a2 = wrcoef2('a',c,s,'db1',2);
a3 = wrcoef2('a',c,s,'db1',3);

1.3 提取低频分量和高频分量

上面我们使用wavedec2对图像进行了多尺度分解,如果你想提取对应层数的高频或者低频分量就可以使用下面的2个函数。

appcoef2 函数

appcoef2适用于2维图像,其主要是为了提取小波分解中形成的近似图像,即低频分量。
(1) A = appcoef2(c,s,’wname’,N)
(2) A = appcoef2(c,s,’wname’)
(3) A = appcoef2(c,s,Lo_R,Hi_R)
(4) A = appcoef2(c,s,Lo_R,Hi_R,N)
形式(1)的参数说明:
c:小波分解的小波系数
s:小波分解的对应尺度
wname :指定小波基
N :指定小波系数所在的层数
形式(2)提取层数为N = size(s,1) -2;即最大层数。

detcoef2 函数

detcoef2 用来对二维离散小波变换的高频部分系数进行提取。
其调用形式为:
D = detcoef2(O,c,s,N)
参数说明:
O:指定提取哪个高频分量,取值分别为:’h’ –水平高频 or ‘v’ – 垂直高频 or ‘d’ – 对角高频;
c:小波系数矩阵;
s:尺度矩阵;

重构函数 waverec2

waverec2函数是wavedec2的反函数,返回的结果X就是原始图像。其基于小波分解结构[c,s]对矩阵X进行多级小波重构,其中[c,s]是wavedec2函数的返回值。其调用格式如下:
(1) X = waverec2(c,s,’wname’)
(2) X = waverec2(c,s,Lo_R,Hi_R)
(3) X = waverec2(c,s,’wname’)
(4) X = appcoef2(c,s,’wname’,0)
形式(1)的参数说明:
c: 系数矩阵
s: 尺度矩阵
wname : 指定小波基
值得注意的是,X = waverec2(c,s,’wname’) 相当于 X = appcoef2(c,s,’wname’,0)。
为了便于应用,这里给出一小段示例程序:

% X contains the loaded image.
% Perform decomposition at level 2 
% of X using sym4. 
[c,s] = wavedec2(X,2,'sym4');
% Reconstruct X from the wavelet 
% decomposition structure [c,s]. 
a0 = waverec2(c,s,'sym4');

matlab程序

在介绍完了前面的一些内置函数,其实我们就可以利用这些函数对一幅二维图像进行小波分解了。
下面是对应的程序:

clear;
close all;

file = 'lena_gray_512.tif';
img  = imread(file);
figure(10);imshow(img);title('原始图像');
% % =================================================
% 进行小波分解
% % =================================================

% 对图像进行2层的小波分解
N = 2 ;
[c,s] = wavedec2(img,N,'db1');

% % =================================================
% 提取各层对应的低频和高频系数
% % =================================================

% 对于原始图像512×512 ,其小波分解第1层维度为256×256,第2层维度为128×128
% 提取小波分解中第1层低频系数和高频系数
a_ca1 = appcoef2(c,s,'db1',1);
a_ch1 = detcoef2('h',c,s,1);
a_cv1 = detcoef2('v',c,s,1);
a_cd1 = detcoef2('d',c,s,1);
% 显示第1层的各分量
figure(1);
subplot(4,4,[3,4,7,8]);imshow(a_ch1,[]);
subplot(4,4,[9,10,13,14]);imshow(a_cv1,[]);
subplot(4,4,[11,12,15,16]);imshow(a_cd1,[]);

% 提取第2层的低频系数和高频系数
ca2 = appcoef2(c,s,'db1',2);
ch2 = detcoef2('h',c,s,2);
cv2 = detcoef2('v',c,s,2);
cd2 = detcoef2('d',c,s,2);
% % 显示第2层的各分量
subplot(4,4,1);imshow(ca2,[]);
subplot(4,4,2);imshow(ch2,[]);
subplot(4,4,5);imshow(cv2,[]);
subplot(4,4,6);imshow(cd2,[]);


% % =================================================
% 分别对各频率成分进行重构
% % =================================================

% 使用第2层进行重构
recon_a1 = wrcoef2('a',c,s,'db1',2);
recon_h1 = wrcoef2('h',c,s,'db1',2);
recon_v1 = wrcoef2('v',c,s,'db1',2);
recon_d1 = wrcoef2('d',c,s,'db1',2);
% 显示各重构的成分 维度都在512×512
recon_set = [recon_a1,recon_h1;recon_v1,recon_d1];  
figure(2);imshow(recon_set,[]);title('第2层小波系数的重构');

% % =================================================
% 重构出原始图像
% % =================================================

recon_img = recon_a1+recon_h1+recon_v1+recon_d1;
recon_img = mat2gray(recon_img );
figure(3);imshow(recon_img );title('重构出的原始图像');

程序运行结果

这里写图片描述
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/chaolei3/article/details/80940459
今日推荐