声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1532|回复: 1

[经典算法] 用DWT实现二维小波变换

[复制链接]
发表于 2007-11-26 01:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
2维小波变换经典程序
2007-05-26 10:13
                    %   FWT_DB.M;
%         此示意程序用DWT实现二维小波变换
      %%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear;clc;
      T=256;        %         图像维数
SUB_T=T/2;    %   子图维数
      %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%         1.调原始图像矩阵
      load wbarb;   %         下载图像
f=X;                %   原始图像
      %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%         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的整数幂
      for i=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;
      for j=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);
colormap(map);
      subplot(2,1,1);
image(f);   %         原始图像   
title('original pic');
      subplot(2,1,2);
image(abs(decompose_pic));         %   分解后图像
title('decomposed pic');
      figure(2);
colormap(map);
      subplot(2,2,1);
image(abs(lt_pic));   %         左上方为低频分量--fi(x)*fi(y)
title('\Phi(x)*\Phi(y)');
      subplot(2,2,2);
image(abs(rt_pic));   %         矩阵右上为--fi(x)*psi(y)
title('\Phi(x)*\Psi(y)');
      subplot(2,2,3);
image(abs(lb_pic));   %         矩阵左下为--psi(x)*fi(y)
title('\Psi(x)*\Phi(y)');
      subplot(2,2,4);
image(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;
for i=1:T;   %         行插值低频
  
     if       (mod(i,2)==0)
               topll(i,:)=top_pic(t,:); %   偶数行保持
           else
               t=t+1;
               topll(i,:)=zeros(1,T);    %         奇数行为零
     end
end;
      for i=1:T;   %   列变换
           topcl_re(:,i)=ifft( fft(l_r).*fft(topll(:,i)') )';         %   圆周卷积<->FFT
end;
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bottom_pic=[lb_pic,rb_pic];         %   图像下半部分
      t=0;
for i=1:T;   %         行插值高频
     if       (mod(i,2)==0)
               bottomlh(i,:)=bottom_pic(t,:);   %         偶数行保持
           else
               bottomlh(i,:)=zeros(1,T);              %   奇数行为零
               t=t+1;
     end
end;
      for i=1:T; %   列变换
           bottomch_re(:,i)=ifft( fft(h_r).*fft(bottomlh(:,i)') )';         %   圆周卷积<->FFT
end;
            construct1=bottomch_re+topcl_re;   %         列变换重构完毕
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
left_pic=construct1(:,1:SUB_T);          %   图像左半部分
      t=0;
for i=1:T;   %         列插值低频
  
     if       (mod(i,2)==0)
               leftll(:,i)=left_pic(:,t); %   偶数列保持
           else
               t=t+1;
               leftll(:,i)=zeros(T,1);     %         奇数列为零
     end
end;
      for i=1:T;   %   行变换
           leftcl_re(i,:)=ifft( fft(l_r).*fft(leftll(i,:)) );         %   圆周卷积<->FFT
end;
                  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
right_pic=construct1(:,SUB_T+1:T);         %   图像右半部分
      
t=0;
for i=1:T;   %         列插值高频
     if       (mod(i,2)==0)
               rightlh(:,i)=right_pic(:,t);   %         偶数列保持
           else
               rightlh(:,i)=zeros(T,1);       %         奇数列为零
               t=t+1;
     end
end;
      for i=1:T; %   行变换
           rightch_re(i,:)=ifft( fft(h_r).*fft(rightlh(i,:)) );         %   圆周卷积<->FFT
end;
            
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
construct_pic=rightch_re+leftcl_re;         %   重建全部图像
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      %   结果显示
figure(3);
colormap(map);
      subplot(2,1,1);
image(f);   %         源图像显示
title('original pic');
      
subplot(2,1,2);
image(abs(construct_pic));          %   重构源图像显示
title('reconstructed pic');
      error=abs(construct_pic-f);   %         重构图形与原始图像误值
      figure(4);
mesh(error);   %         误差三维图像
title('absolute error display');

评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 2007-12-2 10:52 | 显示全部楼层
建议好好排一下版,太乱了
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-6-16 10:28 , Processed in 0.058239 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表