如上图所示的小波分解过程,可以调用wfilters来获得指定小波的分解和综合滤波器系数,例如:
% Set wavelet name.
wname ='db5';
% Compute the four filters associated with wavelet name given
% by the input string wname.
[Lo_D,Hi_D,Lo_R,Hi_R] = wfilters(wname);
subplot(221); stem(Lo_D);
title('Decomposition low-pass filter');
subplot(222); stem(Hi_D);
title('Decomposition high-pass filter');
subplot(223); stem(Lo_R);
title('Reconstruction low-pass filter');
subplot(224); stem(Hi_R);
title('Reconstruction high-pass filter');
xlabel('The four filters for db5')
% Editing some graphical properties,
% the following figure is generated.
以上例子,得到’db5’小波的分解和综合滤波器系数,并显示出来。下面是wfilters的具体用法:
Wname可指定为列表中的任意一种小波,直接调用
[Lo_D,Hi_D,Lo_R,Hi_R] = wfilters('wname')
会返回分解和综合滤波器系数。如果只想返回其中的一些而不是全部,可以调用
[F1,F2] = wfilters('wname','type')
其中’type’可指定为4种类型,每种类型的具体意义详见matlab wfilters帮助。
查看具体小波的信息
waveinfo(‘wname’)
获得一个标准的正交变换/双正交变换 的尺度和小波函数(数字近似值)
[PHI,PSI,XVAL] = wavefun('wname',ITER)
[PHI1,PSI1,PHI2,PSI2,XVAL] = wavefun('wname',ITER)
例如
% Set number of iterations and wavelet name.
iter = 10;
wav ='sym4';
% Compute approximations of the wavelet function using the
% cascade algorithm.
fori = 1:iter
[phi,psi,xval] = wavefun(wav,i);
plot(xval,psi);
holdon
end
title(['Approximations of the wavelet ',wav,...
' for 1 to ',num2str(iter),' iterations']);
holdoff
如果已知小波分解滤波器系数,计算小波变换的最简单方法就是
[C,S] = wavedec2(X,N,'wname')
[C,S] = wavedec2(X,N,Lo_D,Hi_D)
反过来,已知小波综合滤波器系数,计算反小波变换,只需
X = waverec2(C,S,'wname')
X = waverec2(C,S,Lo_R,Hi_R)
%图片的小波分解
clearall
clc
im = imread('../../std_images/lena.bmp');%灰度
im = double(im);
[Lo_D,Hi_D] = wfilters('haar','d');
[C,S] = wavedec2(im,1,Lo_D,Hi_D);
isize = prod(S(1,:));
%
cA= C(1:isize);
cH = C(isize+(1:isize));
cV = C(2*isize+(1:isize));
cD = C(3*isize+(1:isize));
%
cA = reshape(cA,S(1,1),S(1,2));
cH = reshape(cH,S(2,1),S(2,2));
cV = reshape(cV,S(2,1),S(2,2));
cD = reshape(cD,S(2,1),S(2,2));
%
figure,colormapgray
subplot(221),imagesc(cA);
subplot(222),imagesc(cH);
subplot(223),imagesc(cV);
subplot(224),imagesc(cD);
其中C是小波变换后的结果数据,以一维矢量的形式组织,S是二维数组,记录了C中数据的分布形式,详见matlab的帮助文档。此外,dwtmode可以设定输入的边界处理方式。
提取小波的系数。前面使用的wavedec2得到的[C,S]不是非常的直观,可以利用小波工具箱中的函数appcoef2和detcoef2来提取近似矩阵和的n级的某一个细节矩阵。
A = appcoef2(C,S,'wname',N)
A = appcoef2(C,S,'wname')
D = detcoef2(O,C,S,N)
针对特定的小波系数矩阵进行阈值化处理
NC = wthcoef2('type',C,S,N,T,SORH)
NC = wthcoef2('type',C,S,N)
NC = wthcoef2('a',C,S)
NC = wthcoef2('t',C,S,N,T,SORH)
使用wave2gray来显示小波分解的结果
%使用wave2gray显示小波分解的结果,来自dipum_1.1.4 toolbox
clearall
clc
im = imread('../../std_images/lena.bmp');%灰度
im = double(im);
[Lo_D,Hi_D] = wfilters('haar','d');
[C,S] = wavedec2(im,2,Lo_D,Hi_D);
wave2gray(C,S);
关于wave2gray更多用法详见dipum_1.1.4 toolbox的说明文档[官方网站]。
小波综合(重建):waverec2
X = waverec2(C,S,'wname')
X = waverec2(C,S,Lo_R,Hi_R)
[C,S]是使用小波分解函数wavedec2得到的小波矢量和矢量描述矩阵,或者符合这种规定形式的数据。返回X是实数图像矩阵,由于计算误差,可能需要经过一些处理才能正常显示。
%小波综合
clearall
clc
im = imread('../../std_images/lena.bmp');%灰度
im = double(im);
[Lo_D,Hi_D] = wfilters('haar','d');
[C,S] = wavedec2(im,2,Lo_D,Hi_D);
X = waverec2(C,S,'haar');
%或者
% [Lo_R,Hi_R] = wfilters('haar','r');
% X = waverec2(C,S,Lo_D,Hi_D);
X = (X-min(X(:)))/(max(X(:))-min(X(:)));
figure,imshow(X);