1. 二维小波的分解(dwt2)
二维小波分解原理,采用行列分别一维处理。行处理:每一行为一维信号,通过一维的高低通滤波器dwt分解;列处理:将上述结果的每一列当成一维信号,通过一维的高低通滤波器dwt分解;得到近似分量、水平细节分量、垂直细节分量和对角细节分量四组分量。
1.1 仿写的dwt22.m函数
% 二维小波分解
% 行处理:每一行为一维信号,通过一维的高低通滤波器dwt分解
% 列处理:将上述结果的每一列当成一维信号,通过一维的高低通滤波器dwt分解
% 得到近似分量、水平细节分量、垂直细节分量和对角细节分量四组分量;
function [a,h,v,d] = dwt22(x,wname)
% 获取原始信号的尺寸
[row,col]=size(x);
% 行处理
for i =1: row
[aa(i,:),dd(i,:)]=dwt(x(i,:),wname);
end
% 获取变换后信号的尺寸
[row,col]=size(aa);
% 列处理
for i =1: col
[a(:,i),h(:,i)]=dwt(aa(:,i),wname);
[v(:,i),d(:,i)]=dwt(dd(:,i),wname);
end
end
1.2 对比dwt22_test.m程序
%%
% dwt2函数
% 功能:二维离散小波变换
clc;clear;
load woman;
nbcol = size(map,1);%返回矩阵的行数和列数
[cA1,cH1,cV1,cD1] = dwt2(X,'db1');
[cA11,cH11,cV11,cD11] = dwt22(X,'db1');
cod_x=wcodemat(X,nbcol);%返回矩阵X的编码矩阵,nbcol为编码的最大值
cod_cA1=wcodemat(cA1,nbcol);
cod_cH1=wcodemat(cH1,nbcol);
cod_cV1=wcodemat(cV1,nbcol);
cod_cD1=wcodemat(cD1,nbcol);
cod_cA11=wcodemat(cA11,nbcol);
cod_cH11=wcodemat(cH11,nbcol);
cod_cV11=wcodemat(cV11,nbcol);
cod_cD11=wcodemat(cD11,nbcol);
dec2d=[cod_cA1,cod_cH1;cod_cV1,cod_cD1];
dec22d=[cod_cA11,cod_cH11;cod_cV11,cod_cD11];
figure(1);
subplot(1,2,1),imshow(cod_x,[]);
title('量化后的图像');
subplot(1,2,2),imshow(dec2d,[]);
title('二维离散小波分解后的图像');
figure(2);
subplot(1,2,1),imshow(cod_x,[]);
title('量化后的图像');
subplot(1,2,2),imshow(dec22d,[]);
title('二维离散小波分解后的图像');
1.3 效果:
2. 二维小波的重构(idwt2)
二维小波分解原理,与分解相似,采用列行分别一维处理。列处理:近似分量和水平细节分量每一列当成一维信号,垂直细节分量和对角细节分量同理,通过一维的高低通滤波器idwt重构得到两组信号行处理:将上述两组信号结果的每一行为一维信号,再通过一维的高低通滤波器idwt重构得到原始信号。
2.1 仿写的idwt22.m函数
% 二维小波重构
% 列处理:近似分量和水平细节分量每一列当成一维信号,垂直细节分量和对角细节分量同理,通过一维的高低通滤波器idwt重构得到两组信号
% 行处理:将上述两组信号结果的每一行为一维信号,再通过一维的高低通滤波器idwt重构得到原始信号。
function x = idwt22(a,h,v,d,wname)
% 获取分解的尺寸
[row,col]=size(a);
% 列处理:
for i =1: col
aa(:,i)=idwt(a(:,i),h(:,i),wname);
dd(:,i)=idwt(v(:,i),d(:,i),wname);
end
% 获取重构的尺寸
[row,col]=size(aa);
% 行处理:
for i =1: row
x(i,:)=idwt(aa(i,:),dd(i,:),wname);
end
end
2.2 对比idwt22_test.m程序
%%
%%
% idwt2函数
% 功能:二维离散小波反变换
clc;clear;
load woman;
sX=size(X);
[cA1,cH1,cV1,cD1]=dwt2(X,'db4');
A0=idwt2(cA1,cH1,cV1,cD1,'db4');
A1=idwt22(cA1,cH1,cV1,cD1,'db4');
subplot(1,3,1),imshow(X,[])
title('原始图像');
subplot(1,3,2),imshow(A0,[])
title('由二维小波分解重构后的图像');
subplot(1,3,3),imshow(A1,[])
title('二维小波自定义重构后的图像');
2.3 效果:
通过自定义分解和重构加深小波变换的认识,与matalb自带函数表现基本一致,达到对应效果。
参考文献:二维小波变换MATLAB实现
|