Matlab 图像小波变换

二维小波变换和一维小波变换十分类似,下面直接通过例子说明。

1. 读入原始图像并显示
I_noise = imread( 'coins.png');
figure, imshow(I_noise);
title( '原始图像' );
Matlab <wbr>图像小波变换

2. 对图像进行一层小波分解 dwt2
[cA1, cH1, cV1, cD1] dwt2(I_noise, 'bior3.7');
figure
subplot(221), imshow(cA1, []);
subplot(222), imshow(cH1, []);
subplot(223), imshow(cV1, []);
subplot(224), imshow(cD1, []);
Matlab <wbr>图像小波变换
可以看出,第一张图是图像的近似,相当于图像的低频部分,而其它三张图是图像的轮廓,也就是水平,垂直和对角三个方向的细节。是图像的高频部分。至此,各变量的维数如下所示。
Matlab <wbr>图像小波变换

3. 使用upcoef2 从系数中构建近似和细节
A1 upcoef2('a'cA1, 'bior3.7'1);
H1 upcoef2('d'cH1, 'bior3.7'1);
V1 upcoef2('v'cV1, 'bior3.7'1);
D1 upcoef2('d'cD1, 'bior3.7'1);
figure
subplot(221), imshow(A1, []);
subplot(222), imshow(H1, []);
subplot(223), imshow(V1, []);
subplot(224), imshow(D1, []);
Matlab <wbr>图像小波变换
从结果上看,似乎与小波分解得到的直接结果非常接近。但查看一下变量的大小,就会发现重构得到的结果,其维数与原始图像的维数基本一致(稍大一些),而小波分解得到的结果则近似是一个1/2 递减的过程。
Matlab <wbr>图像小波变换

4. 多重小波分解 wavedec2
[C, S] wavedec2(I_noise, 2, 'bior3.7');
C代表分解系数的组合,是一个向量
Matlab <wbr>图像小波变换
S表示每一层分解结果的维数,如果进行n层小波分解,S 的大小是(n+1)*2,最后一行表示的是原始图像的size
Matlab <wbr>图像小波变换

5. 利用 waverec2 进行小波重构
I_wrec waverec2(C, S, 'bior3.7');
figure, imshow(I_wrec, []);
Matlab <wbr>图像小波变换
可以看出,使用 waverec2 重构得到的结果不像使用 upcoef2 那样多出黑边,此外,通过查看变量维数可以发现,I_wrec 的维数与原图像相同。
Matlab <wbr>图像小波变换

6. 利用 appcoef2 抽取第一层低频近似系数和第二层低频近似系数。
wcA2 appcoef2(C, S, 'bior3.7'2);
figure, imshow(wcA2, []);
wcA1 appcoef2(C, S, 'bior3.7'1);
figure, imshow(wcA1, [])
Matlab <wbr>图像小波变换

可以看出,二者大小上存在差异,但显示内容大致相同。
Matlab <wbr>图像小波变换
对比还可发现,wcA1 的 size 与 dwt2 分解得到的 cA1 是相同的,事实上,二者基本是等价的。

7. 使用 upcoef 重构
I_wup2 upcoef2('a'wcA2, 'bior3.7'2)
figure, imshow( I_wup2, []);
I_wup1 upcoef2('a'wcA1, 'bior3.7'1);
figure, imshow(I_wup1, []); 这个结果与dwt2 部分得到的 A1 相同
Matlab <wbr>图像小波变换

这里为了简便,只重构了一层和二层的近似结果,如果需要对细节进行重构,只需将'a' 换成'h', 'v' 或者 'd' 即可。从图中可以发现,一层重构得到的图像要相对准确很多,这是因为二层小波近似所丢失的信息更多。

8. 抽取第一层细节 detcoef2
[chd1, cvd1, cdd1] detcoef2('all'C, S, 1);
figure
subplot(131), imshow(chd1, []);
subplot(132), imshow(cvd1, []);
subplot(133), imshow(cdd1, []);
Matlab <wbr>图像小波变换
同理,这个结果与 dwt2 得到的结果是一致的,所有变量的 size 如下图所示。
Matlab <wbr>图像小波变换

9. wrcoef2 对小波进行单支重构
Matlab help 中的例子如下
Matlab <wbr>图像小波变换
实际上,wrcoef2 的过程就相当于 appcoef2 或者 detcoef2 后再进行 upcoef2。其得到结果的 size 应该比原信号稍大一些。



小波变换图像处理%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');
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值