matlab实现图像小波变换

1.基本概念

        小波变换是一种基于函数的数学变换,将信号分解成多个不同比例和频率的波的加权和,从而实现对信号的分析和处理。与傅里叶变换不同,小波变换具有时域和频域两个维度的分析能力,可以更好地理解信号的局部特征和结构信息。

        在小波变换中,信号通过与不同尺度的小波函数(小波基)进行卷积和内积运算,得到不同尺度和频率的小波系数。这个过程可以通过分解滤波器和重构滤波器来实现,其中分解滤波器用来提取高频小波系数,重构滤波器用来提取低频小波系数,从而实现信号的逐层分解。最后合成所有的小波系数,就可以获得原始信号。

        小波变换具有多尺度、多分辨率的特点,能够提取信号的时空分布特征,并且具有良好的局部分析能力。因此,在信号处理、图像处理、音频处理等领域都有广泛应用。常见的小波变换包括Haar小波、Daubechies小波、Symlet小波、Coiflet小波等,不同的小波基适合处理不同类型的信号和图像。

        在实际应用中,小波变换常用于信号去噪、压缩、特征提取、图像增强等方面。为了获得理想的效果,通常需要选择合适的小波基、分解层数和阈值等参数,并根据具体情况进行预处理和后处理。

2.单层小波分解

clear all;
close all;
clc;
I=imread('lena.bmp');
I=rgb2gray(I);
[cal,chd1,cvd1,cdd1]=dwt2(I,'bior3.7');
cal=uint8(cal);
figure;
subplot(221),imshow(cal),title('近似分量');
subplot(222),imshow(chd1),title('细节水平分量');
subplot(223),imshow(cvd1),title('细节垂直分量');
subplot(224),imshow(cdd1),title('细节对角分量');

 

3.单层小波重构

clear all;
close all;
clc;
load woman;
nbcol=size(map,1);
[cA,cH,cV,cD]=dwt2(X,'db1');%利用db1小波,进行单层图像分解
sX=size(X);
A0=idwt2(cA,cH,cV,cD,'db4',sX);%用小波分解的第一层系数进行重构
figure;
subplot(131),imshow(uint8(X)),title('原图');
subplot(132),imshow(uint8(A0)),title('重构图');
subplot(133),imshow(uint8(X-A0)),title('差异图像');

4.多层小波分解

clear all;
close all;
clc;
load woman;
nbcol=size(map,1);
[c,s]=wavedec2(X,2,'db2');%采用db2小波进行2层图像分解
siz=s(size(s,1),:);
ca2=appcoef2(c,s,'db2',2);%提取多层小波分解结构C和S的第2层小波交换的近似系数
chd2=detcoef2('h',c,s,2);%利用多层小波分解结构C和S来提取图像第2层的水平分量
cvd2=detcoef2('v',c,s,2);%利用多层小波分解结构C和S来提取图像第2层的垂直分量
cdd2=detcoef2('d',c,s,2);%利用多层小波分解结构C和S来提取图像第2层的对角分量
chd1=detcoef2('h',c,s,1);%利用多层小波分解结构C和S来提取图像第1层的水平分量
cvd1=detcoef2('v',c,s,1);%利用多层小波分解结构C和S来提取图像第1层的垂直分量
cdd1=detcoef2('d',c,s,1);%利用多层小波分解结构C和S来提取图像第1层的对角分量
cal1=ca2+chd2+cvd2+cdd2;%叠加重构近似图像
cal=appcoef2(c,s,'db4',1);%提取多层小波分解结构C和S的第1层小波交换的近似系数
figure;
subplot(141),imshow(uint8(wcodemat(ca2,nbcol)));%wcodemat:对图像数据进行伪彩色编码
title('2层分解的各分量')
subplot(142),imshow(uint8(wcodemat(chd2,nbcol)));
subplot(143),imshow(uint8(wcodemat(cvd2,nbcol)));
subplot(144),imshow(uint8(wcodemat(cdd2,nbcol)));
figure;
subplot(141),imshow(uint8(wcodemat(cal1,nbcol)));
title('1层分解的各分量')
subplot(142),imshow(uint8(wcodemat(chd1,nbcol)));
subplot(143),imshow(uint8(wcodemat(cvd1,nbcol)));
subplot(144),imshow(uint8(wcodemat(cdd1,nbcol)));

 

5.多层小波重构

clear all;
close all;
clc;
X=imread('lena.bmp');
X=rgb2gray(X);
[c,s]=wavedec2(X,2,'db2');%采用db2小波进行2层图像分解
siz=s(size(s,1),:);
ca2=appcoef2(c,s,'db2',2);%提取多层小波分解结构C和S的第2层小波交换的近似系数
chd2=detcoef2('h',c,s,2);%利用多层小波分解结构C和S来提取图像第2层的水平分量
cvd2=detcoef2('v',c,s,2);%利用多层小波分解结构C和S来提取图像第2层的垂直分量
cdd2=detcoef2('d',c,s,2);%利用多层小波分解结构C和S来提取图像第2层的对角分量
a2=upcoef2('a',ca2,'db4',2,siz);%利用upcoef2进行重构
hd2=upcoef2('h',chd2,'db4',2,siz);
vd2=upcoef2('v',cvd2,'db4',2,siz);
dd2=upcoef2('d',cdd2,'db4',2,siz);
A1=a2+hd2+vd2+dd2;
[cal,ch1,cv1,cd1]=dwt2(X,'db4');
a1=upcoef2('a',cal,'db4',2,siz);%利用upcoef2进行重构
hd1=upcoef2('h',ch1,'db4',2,siz);
vd1=upcoef2('v',cv1,'db4',2,siz);
dd1=upcoef2('d',cd1,'db4',2,siz);
A0=a1+hd1+vd1+dd1;

figure;
subplot(141),imshow(uint8(a2)),title('2层分解重构后的近似分量');
subplot(142),imshow(hd2),title('细节水平分量');
subplot(143),imshow(vd2),title('细节垂直分量');
subplot(144),imshow(dd2),title('细节对角分量');


figure;
subplot(141),imshow(uint8(a1)),title('单层分解重构后的近似分量');
subplot(142),imshow(hd1),title('细节水平分量');
subplot(143),imshow(vd1),title('细节垂直分量');
subplot(144),imshow(dd1),title('细节对角分量');

figure;
subplot(131),imshow(X),title('原图');
subplot(132),imshow(uint8(A1)),title('2层分解重构的近似图形');
subplot(133),imshow(uint8(A0)),title('单层分解重构的近似图形');

 

小波变换图像处理%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
发出的红包

打赏作者

安心不心安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值