clear;clc;
%%%%%%%%%%测试图像只能是方形图像,长宽像素一样.
f=imread('Lena.bmp');%%读取图像数据,图像只能保存在m文件所在的路径下
d=size(f);
iflength(d)>2
f=rgb2gray((f));%%%%%%%%如果是彩色图像则转化为灰度图
end
T=d(1);
SUB_T=T/2;
%2.进行二维小波分解
l=wfilters('db10','l');%db10(消失矩为10)低通分解滤波器冲击响应(长度为20)
L=T-length(l);
l_zeros=[l,zeros(1,L)];%矩阵行数与输入图像一致,为2的整数幂
h=wfilters('db10','h');%db10(消失矩为10)高通分解滤波器冲击响应(长度为20)
h_zeros=[h,zeros(1,L)];%矩阵行数与输入图像一致,为2的整数幂
fori=1:T;%列变换
row(1:SUB_T,i)=dyaddown(ifft(fft(l_zeros).*fft(f(:,i)'))).';%圆周卷积FFT
row(SUB_T+1:T,i)=dyaddown(ifft(fft(h_zeros).*fft(f(:,i)'))).';%圆周卷积FFT
end;
forj=1:T;%行变换
line(j,1:SUB_T)=dyaddown(ifft(fft(l_zeros).*fft(row(j,:))));%圆周卷积FFT
line(j,SUB_T+1:T)=dyaddown(ifft(fft(h_zeros).*fft(row(j,:))));%圆周卷积FFT
end;
decompose_pic=line;%分解矩阵
%图像分为四块
lt_pic=decompose_pic(1:SUB_T,1:SUB_T);%在矩阵左上方为低频分量--fi(x)*fi(y)
rt_pic=decompose_pic(1:SUB_T,SUB_T+1:T);%矩阵右上为--fi(x)*psi(y)
lb_pic=decompose_pic(SUB_T+1:T,1:SUB_T);%矩阵左下为--psi(x)*fi(y)
rb_pic=decompose_pic(SUB_T+1:T,SUB_T+1:T);%右下方为高频分量--psi(x)*psi(y)
%3.分解结果显示
figure(1);
subplot(2,1,1);
imshow(f,[]);%原始图像
title('originalpic');
subplot(2,1,2);
image(abs(decompose_pic));%分解后图像
title('decomposedpic');
figure(2);
%colormap(map);
subplot(2,2,1);
imshow(abs(lt_pic),[]);%左上方为低频分量--fi(x)*fi(y)
title('Phi(x)*Phi(y)');
subplot(2,2,2);
imshow(abs(rt_pic),[]);%矩阵右上为--fi(x)*psi(y)
title('Phi(x)*Psi(y)');
subplot(2,2,3);
imshow(abs(lb_pic),[]);%矩阵左下为--psi(x)*fi(y)
title('Psi(x)*Phi(y)');
subplot(2,2,4);
imshow(abs(rb_pic),[]);%右下方为高频分量--psi(x)*psi(y)
title('Psi(x)*Psi(y)');
%5.重构源图像及结果显示
%construct_pic=decompose_matrix'*decompose_pic*decompose_matrix;
l_re=l_zeros(end:-1:1);%重构低通滤波
l_r=circshift(l_re',1)';%位置调整
h_re=h_zeros(end:-1:1);%重构高通滤波
h_r=circshift(h_re',1)';%位置调整
top_pic=[lt_pic,rt_pic];%图像上半部分
t=0;
fori=1:T;%行插值低频
if(mod(i,2)==0)
topll(i,:)=top_pic(t,:);%偶数行保持
else
t=t+1;
topll(i,:)=zeros(1,T);%奇数行为零
end
end;
fori=1:T;%列变换
topcl_re(:,i)=ifft(fft(l_r).*fft(topll(:,i)'))';%圆周卷积FFT
end;
bottom_pic=[lb_pic,rb_pic];%图像下半部分
t=0;
fori=1:T;%行插值高频
if(mod(i,2)==0)
bottomlh(i,:)=bottom_pic(t,:);%偶数行保持
else
bottomlh(i,:)=zeros(1,T);%奇数行为零
t=t+1;
end
end
这个只是一级分解,matlab自带的函数可以实现多级分解,级数由编程者自己确定.