使用 MATLAB
小波工具箱进行小波分析
如上图所示的小波分解过程,可以调用 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
可指定为db1、db2、......db45、haar中的任意一种小波,直接调用
[Lo_D,Hi_D,Lo_R,Hi_R] = wfilters('wname')
会返回分滤波器系数Lo_D,Hi_D,Lo_R,Hi_R
其中:
Lo_D:低通分解滤波器系数
Hi_D:高通分解滤波器系数
Lo_R:低通重构滤波器系数
Hi_R:高通重构滤波器系数
如果只想返回其中的一些而不是全部,可以调用
[F1,F2] = wfilters('wname','type')
其中'type’可指定为4种类型,每种类型的具体意义:
‘d’:返回:Lo_D,Hi_D 即返回分解滤波器系数
‘r’:返回:Lo_R,Hi_R 即返回重构滤波器系数
‘l’:返回:Lo_D,Lo_R 即返回低通滤波器系数
‘h’:返回:Hi_D,Hi_R 即返回高通滤波器系数
************************************************************
查看具体小波的信息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.
for i = 1:iter
[phi,psi,xval] = wavefun(wav,i);
plot(xval,psi);
hold on
end
title(['Approximations of the wavelet
',wav,
...
' for 1 to
',num2str(iter),' iterations']);
hold
off
如果已知小波分解滤波器系数,计算小波变换的最简单方法就是
[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)
%
图片的小波分解
clear
all
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,colormap
gray
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
clear
all
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是实数图像矩阵,由于计算误差,可能需要经过一些处理才能正常显示。
%
小波综合
clear
all
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);