小波学习笔记(图像的分解与重构)——MATLAB

MATLAB实现图像的分解和重构命令有两种:

第一种是一层小波分解dwt2

[CA,CH,CV,CD]=dwt2(X,'wname');

其中,dwt2表示离散小波变换;X为输入参数,是图像;'wname'是小波名字;输出变量CA为低低频分解信息,刻画原始图像的逼近信息;CH为低高频分解信息,刻画原始图像的横向细节;CV为高低频分解信息,刻画原始图像的垂直细节;CD为高高频分解信息,刻画原始图像的对角线上的细节。

[CA,CH,CV,CD]=dwt2(X,Lo_D,Hi_D);

输入参数还可以是低通滤波器和高通滤波器

对应的重构命令为:

X=idwt2(CA,CH,CV,CD,'wname');

X=idwt2(CA,CH,CV,CD,Lo_D,Hi_D);

X=idwt2(CA,CH,CV,CD,Lo_D,Hi_D,'mode',MODE);

第二种是多层小波分解wavedec2

[C,S]=wavedec2(X,N,'wname');

其中,wavedec2为多层小波分解函数;X为输入参数,是图像;N为分解层数;'wname'是小波名字;输出变量C为所有分解信息的组合,具体为C=[A(N)|H(N)|V(N)|D(N)....H(N-1)|V(N-1)|D(N-1)|...|H(1)|V(1)|D(1)],C为行向量;S为分解后各个频段图像的尺寸大小。

[C,S]=wavedec2(X,N,Lo_D,Hi_D);

输入参数还可以是低通滤波器和高通滤波器

由于C表达的是行向量,函数appcoef2和detcoef2分别能够返回二维表达的逼近图像的系数和高频各通道的图像系数,具体形式为

A=appcoef2(C,S,'wname',N);

D=detcoef2(O,C,S,N);

O可以取'h','v','d','all',返回分解的水平高频,垂直高频和对角高频图像系数。

当O参数选all时,返回值是三个高频图像系数,即

[H,V,D]=detcoef2('all',C,S,N);

小波的多层重构命令分为两种,一种是完全重构命令waverec2,另一种是部分重构命令wrcoef2,具体为:

X=waverec2(C,S,N,'wname');

X=waverec2(C,S,N,Lo_R,Hi_R);

X=waverec2('type',C,S,'wname',N);

X=waverec2('type',C,S,Lo_R,Hi_R,N);

X=waverec2('type',C,S,'wname');

X=waverec2('type',C,S,Lo_R,Hi_R);

wrcoef2用于实现由二维小波分解提取出的不同频段的信息重构图像。

'type'为a,h,v,d分别对应的是低频信息、水平高频、垂直高频和对角高频信息

 

clc,close all,clear all
%-------一维信号分解和重构---------%
% load sumsin.mat
% [LO_D,HI_D,LO_R,HI_R]=wfilters('db3');%db3小波滤波器的提取
% [CA,CD]=dwt(sumsin,'db3');%一维信号一层分解dwt函数
% [C,L]=wavedec(sumsin,3,'db3');%一维信号的多层分解wavedec,分层细节数据的获取函数detcoef和appco
% [CD1,CD2,CD3]=detcoef(C,L,[1 2 3]);
% CA3=appcoef(C,L,'db3',3);
% CA2=appcoef(C,L,'db3',2);
% CA1=appcoef(C,L,LO_R,HI_R,1);
% figure(1),
% subplot(3,1,1),plot(sumsin),title('原始信号'),xlabel('t'),ylabel('X(t)');
% subplot(3,1,2),plot(CA),title('db3分解低频信号'),xlabel('t'),ylabel('CA(t)');
% subplot(3,1,3),plot(CD),title('db3分解高频信号'),xlabel('t'),ylabel('CD(t)');
% figure(2),
% subplot(3,2,1),plot(CA3),title('三层分解后的逼近信号'),xlabel('t'),ylabel('CA3(t)');
% subplot(3,2,2),plot(CD3),title('三层分解后的高频信号'),xlabel('t'),ylabel('CD3(t)');
% subplot(3,2,3),plot(CA2),title('二层分解后的逼近信号'),xlabel('t'),ylabel('CA2(t)');
% subplot(3,2,4),plot(CD2),title('二层分解后的高频信号'),xlabel('t'),ylabel('CD2(t)');
% subplot(3,2,5),plot(CA1),title('一层分解后的逼近信号'),xlabel('t'),ylabel('CA1(t)');
% subplot(3,2,6),plot(CD1),title('一层分解后的高频信号'),xlabel('t'),ylabel('CD1(t)');
% 
% Y=idwt(CA,CD,'db3','zpd');%原始信号重构
% figure(3),
% subplot(3,1,1),plot(sumsin),title('原始信号'),xlabel('t'),ylabel('X(t)');
% subplot(3,1,2),plot(Y),title('重构信号'),xlabel('t'),ylabel('Y(t)');
% subplot(3,1,3),plot(Y-sumsin),title('原始与重构的误差信号'),xlabel('t'),ylabel('EX(t)');
% 
% YA=idwt(CA,[],'db3','zpd');%只有低通信息的重构信号
% YD=idwt([],CD,'db3','zpd');%只有高通信息的重构信号
% 
% CCD1=C;%CCD1中去掉低通信号,CCD2中去掉了所有高通信号,进而进行重构
% CCD2=C;
% CCD1(1:L(1))=0;
% CCD2(L(1)+1:end)=0;
% YA3=waverec(CCD2,L,LO_R,HI_R);
% YD3=waverec(CCD1,L,'db3');
% figure(4)
% subplot(5,1,1),plot(sumsin),title('原始信号'),xlabel('t'),ylabel('X(t)');
% subplot(5,1,2),plot(YA),title('只由低通信息的重构信号'),xlabel('t'),ylabel('YA(t)');
% subplot(5,1,3),plot(YD),title('只由高通信息的重构信号'),xlabel('t'),ylabel('YD(t)');
% subplot(5,1,4),plot(YA3),title('只由三层分解后的低通信息来重构信号'),xlabel('t'),ylabel('YA3(t)');
% subplot(5,1,5),plot(YD3),title('只由三层分解后的所有高通信息来重构信号'),xlabel('t'),ylabel('YD3(t)');


%---------图像的分解和重构-------------%
load woman
[CA,CH,CV,CD]=dwt2(X,'haar');%一层小波分解二维图像信号
[C,S]=wavedec2(X,2,'haar');%多层小波分解二维图像信号,此处为分解成两层,N=2
CA2=appcoef2(C,S,'haar',2);%提取第二层分解的低频系数
%提取第二层分解的各个方向的高频系数
CH2=detcoef2('h',C,S,2);%水平高频
CV2=detcoef2('v',C,S,2);%垂直高频
CD2=detcoef2('d',C,S,2);%对角线高频

CA1=appcoef2(C,S,'haar',1);%提取第一层分解的低频系数
[CH1,CV1,CD1]=detcoef2('all',C,S,1);%一次提取第一层分解后的高频系数
PCH=[CA2 CH2;CV2 CD2];%将分解的系数拼接到一个矩阵,PCH存放第二层分解后的系数,PCH1存放两层分解的系数
PCH1=[PCH CH1;CV1 CD1];


%显示dwt2分解第一层得到的低频和高频系数
figure(1),
subplot(2,2,1),imshow(CA,[]),title('逼近信息CA');
subplot(2,2,2),imshow(CH,[]),title('横向细节信息CH');
subplot(2,2,3),imshow(CV,[]),title('垂直细节信息CV');
subplot(2,2,4),imshow(CD,[]),title('对角线细节信息CD');

%显示第二层分解得到的低频和高频系数
figure(2),
subplot(2,2,1),imshow(CA2,[]),title('第二层逼近信息CA2');
subplot(2,2,2),imshow(CH2,[]),title('第二层横向细节信息CH2');
subplot(2,2,3),imshow(CV2,[]),title('第二层垂直细节信息CV2');
subplot(2,2,4),imshow(CD2,[]),title('第二层对角线细节信息CD2');

%显示第二层拼接后的图像和第一层分解的高频信息
figure(3)
subplot(2,2,1),imshow(PCH,[]),title('第二层拼接图像');
subplot(2,2,2),imshow(CH1,[]),title('第一层横向细节信息CH1');
subplot(2,2,3),imshow(CV1,[]),title('第一层垂直细节信息CV1');
subplot(2,2,4),imshow(CD1,[]),title('第一层对角线细节信息CD1');

%分解后的所有系数图像和原始图像的对比
figure(4)
subplot(1,2,1),imshow(X,[]),title('原始图像');
subplot(1,2,2),imshow(PCH1,[]),title('所有系数拼接图像');

%小波的部分重构命令wrcoef2('type',C,S,'wname')
A2=wrcoef2('a',C,S,'haar',2);%重构第二层的低频信号
H2=wrcoef2('h',C,S,'haar',2);%重构第二层的水平高频信号
V2=wrcoef2('v',C,S,'haar',2);%重构第二层的垂直高频信号
D2=wrcoef2('d',C,S,'haar',2);%重构第二层的对角线高频信号


A1=wrcoef2('a',C,S,'haar',1);%重构第一层的低频信号
H1=wrcoef2('h',C,S,'haar',1);%重构第一层的水平高频信号
V1=wrcoef2('v',C,S,'haar',1);%重构第一层的垂直高频信号
D1=wrcoef2('d',C,S,'haar',1);%重构第一层的对角线高频信号


%小波的完全重构命令waverec2(C,S,N,'wname')
CCA=zeros(size(C));
CCH=zeros(size(C));
CCV=zeros(size(C));
CCD=zeros(size(C));
CCA(1:S(1,1)*S(1,2))=C(1:S(1,1)*S(1,2));
CCH(S(1,1)*S(1,2)+1:S(1,1)*S(1,2)*2)=C(S(1,1)*S(1,2)+1:S(1,1)*S(1,2)*2);
CCV(S(1,1)*S(1,2)*2+1:S(1,1)*S(1,2)*3)=C(S(1,1)*S(1,2)*2+1:S(1,1)*S(1,2)*3);
CCD(S(1,1)*S(1,2)*3+1:S(1,1)*S(1,2)*4)=C(S(1,1)*S(1,2)*3+1:S(1,1)*S(1,2)*4);
YA2=waverec2(CCA,S,'haar');
YH2=waverec2(CCH,S,'haar');
YV2=waverec2(CCV,S,'haar');
YD2=waverec2(CCD,S,'haar');


%idwt2重构
YA=idwt2(CA,[],[],[],'haar');
YH=idwt2([],CH,[],[],'haar');
YV=idwt2([],[],CV,[],'haar');
YD=idwt2([],[],[],CD,'haar');
YA11D=idwt2([],CH,CV,CD,'haar');

figure(5),
subplot(2,3,1),imshow(X,[]),title('原始图像')
subplot(2,3,2),imshow(YA,[]),title('第一层逼近信息重构的图像')
subplot(2,3,3),imshow(YH,[]),title('第一层横向细节信息重构的图像')
subplot(2,3,4),imshow(YV,[]),title('第一层纵向细节信息重构的图像')
subplot(2,3,5),imshow(YV,[]),title('第一层对角线细节信息重构的图像')
subplot(2,3,6),imshow(YA11D,[]),title('第一层所有细节信息重构的图像')
figure(6)
subplot(2,2,1),imshow(YA2,[]),title('完全重构命令下第二层逼近信息重构的图像')
subplot(2,2,2),imshow(YH2,[]),title('完全重构命令下第二层横向细节信息重构的图像')
subplot(2,2,3),imshow(YV2,[]),title('完全重构命令下第二层纵向细节信息重构的图像')
subplot(2,2,4),imshow(YD2,[]),title('完全重构命令下第二层对角线细节信息重构的图像')
figure(7)
subplot(2,2,1),imshow(A2,[]),title('部分重构命令下第二层逼近信息重构的图像')
subplot(2,2,2),imshow(H2,[]),title('部分重构命令下第二层横向细节信息重构的图像')
subplot(2,2,3),imshow(V2,[]),title('部分重构命令下第二层纵向细节信息重构的图像')
subplot(2,2,4),imshow(D2,[]),title('部分重构命令下第二层对角线细节信息重构的图像')





%------用工具包验证----------%
%wavemenu

 

你可能感兴趣的:(matlab)