MATLAB小波变换图像处理简单示例

前言

  从傅里叶变换到短时傅里叶变换再到小波变换,这些分析问题的方法是一代一代人的探索和积累得来的宝贵知识财富。比较常见的还有脊波变换,曲波变换,轮廓波变换。感觉一种方法弄懂了,在以后很有可能会再次用到。就像这次,本来本科毕设已经用到了小波变换和轮廓波变换,但是自己并没有把它完全弄懂,结果这次课程作业还是要重新看。。。虽然这一次也还是没搞懂。。这里主要记录MATLAB小波包中的函数的用法而已,也只记录了二维离散小波在图像分解和重构上的应用,小波变换好多基本概念自己还是没理解。

正题

图1图1
  二维离散小波变换最常见的应该是上面的图了。首先要明白,进行小波分解后得到的是一个低频分量和3个高频分量。其中LL1代表低频分量,HL1、HH1和LH1代表高频分量,后面的1代表是第一级分解。也经常用A(低频分量)、H(水平方向高频分量)、V(垂直方向高频分量)、D(对角线方向高频分量)来表示。

wavedec2(X,N,‘wname’)

例:[c,s]=wavedec2(X,2,'haar');
  这个函数就是将一幅图像X分解成小波系数存入c中,其中N代表分解的级数,wname代表所用的小波基函数。s 记录了每一级分解时各个小波系数的size,如下图,size记录的其实就是最开始那个图上,HH1,HH2,HH3…的边长,也就是像素大小。s最后一行是原始图像的大小。
在这里插入图片描述

detcoef2(O,C,S,N)

例:[H1,V1,D1] = detcoef2('all',c,s,1);
  将c里面的高频系数重组成矩阵形式,参数N代表对第N级的分解系数进行操作。此函数只能重组高频系数,H1为水平方向,V1为垂直方向,D1为对角线方向。

appcoef2(C,S,‘wname’,N)

例:A2 = appcoef2(c,s,'haar',2);
  将c里面的低频系数重组成矩阵形式,N代表第几级分解。

wrcoef2(‘type’,C,S,‘wname’,N)

例:X_A2 = wrcoef2('a',c,s,'sym5',1)
  通过第N级分解的低频系数或高频系数重构图像。其中type是代表选择的是系数A,V,H,D中的哪一个进行重构。

X = waverec2(C,S,‘wname’)

例:waverec2(c_Recon1,s,'haar')
  直接通过c里面的所有系数来重构图像,但这里一般会将c里面部分系数置0,然后再重构图像。如果不置0的话,不就相当于重构回来的就是原来一模一样的图像了吗。
下面是一个简单的图像重构的程序,先看一下部分图像
在这里插入图片描述在这里插入图片描述在这里插入图片描述下面是代码

%% 小波分解与重构
clear;clc;close all;
X = imread('standard_lena.bmp');
% figure,imshow(X);
[c,s]=wavedec2(X,2,'haar');%对图像X进行4级小波分解,分解得到的系数存到c,s是记录各个级系数的size
%其实感觉这里可以把排序,从大到小,当然是H,D,A,V各排各的。在重构时,丢系数时从后面往前丢。

[H1,V1,D1] = detcoef2('all',c,s,1);%将c里面的系数重组成矩阵形式,参数1代表对第一级的分解系数进行操作。都是高频系数,代表边缘
% A1 = appcoef2(c,s,'haar',1);%一级分解低频系数
[H2,V2,D2] = detcoef2('all',c,s,2);%将c里面的系数重组成矩阵形式,参数1代表对第一级的分解系数进行操作。都是高频系数,代表边缘
A2 = appcoef2(c,s,'haar',2);%二级分解低频系数

X_A2 = wrcoef2('a',c,s,'sym5',1); %通过二级分解后的低频系数重构图
X_H1 = wrcoef2('h',c,s,'sym5',1); 
X_V1 = wrcoef2('v',c,s,'sym5',1); 
X_D1 = wrcoef2('d',c,s,'sym5',1); 
X_H2 = wrcoef2('h',c,s,'sym5',2); 
X_V2 = wrcoef2('v',c,s,'sym5',2); 
X_D2 = wrcoef2('d',c,s,'sym5',2); 

%% 保存各级分解重构图片
figure(1);imshow(X_A2,[]);saveas(1,'picture/lena_A2.bmp');
figure(2);imshow(X_H1,[]);saveas(2,'picture/lena_H1.bmp');
figure(3);imshow(X_V1,[]);saveas(3,'picture/lena_V1.bmp');
figure(4);imshow(X_D1,[]);saveas(4,'picture/lena_D1.bmp');
figure(5);imshow(X_H2,[]);saveas(5,'picture/lena_H2.bmp');
figure(6);imshow(X_V2,[]);saveas(6,'picture/lena_V2.bmp');
figure(7);imshow(X_D2,[]);saveas(7,'picture/lena_D2.bmp');
%% 图像重构
c_RemainPortion = 0.05;%保留字带的系数所占百分比
c_end = s(1,1)^2+round((length(c)-  s(1,1)^2)*c_RemainPortion);%在将系数c的后面部分设为0时,要考虑c的最前面是低频分量,是不可以去掉的;
c_Recon1 =zeros(1,length(c));
c_Recon1(1:c_end) = c(1:c_end);
X_Recon1 = uint8(waverec2(c_Recon1,s,'haar'));
figure(8);imshow(X_Recon1,[]);title('保留系数5%');saveas(8,'picture/lena_Recon1.bmp');

c_RemainPortion = 0.1;%保留字带的系数所占百分比
c_end = s(1,1)^2+round((length(c)-  s(1,1)^2)*c_RemainPortion);%在将系数c的后面部分设为0时,要考虑c的最前面是低频分量,是不可以去掉的;
c_Recon2 =zeros(1,length(c));
c_Recon2(1:c_end) = c(1:c_end);
X_Recon2 = uint8(waverec2(c_Recon2,s,'haar'));
figure(9);imshow(X_Recon2,[]);title('保留系数10%');saveas(9,'picture/lena_Recon2.bmp');

c_RemainPortion = 0.2;%保留字带的系数所占百分比
c_end = s(1,1)^2+round((length(c)-  s(1,1)^2)*c_RemainPortion);%在将系数c的后面部分设为0时,要考虑c的最前面是低频分量,是不可以去掉的;
c_Recon3 =zeros(1,length(c));
c_Recon3(1:c_end) = c(1:c_end);
figure(10);X_Recon3 = uint8(waverec2(c_Recon3,s,'haar'));
figure(9);imshow(X_Recon3,[]);title('保留系数20%');saveas(9,'picture/lena_Recon3.bmp');

%% 计算熵和信噪比
entropy(X);
entropy(X_Recon1)
MSE1 = mean(mean(X-X_Recon1).^2);
PSNR1 = 20*log10(double(255/MSE1))
entropy(X_Recon2)
MSE2 = mean(mean(X-X_Recon2).^2);
PSNR2 = 20*log10(double(255/MSE2))
entropy(X_Recon3)
MSE3 = mean(mean(X-X_Recon3).^2);
PSNR3 = 20*log10(double(255/MSE3))


小波变换图像处理%MATLAB2维小波变换经典程序 % FWT_DB.M; % 此示意程序用DWT实现二维小波变换 % 编程时间2004-4-10,编程人沙威 %%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%% 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');
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值