matlab 二维小波变换程序

本文介绍了一个使用MATLAB实现的二维小波变换程序。该程序采用db10小波基,通过快速傅里叶变换(FFT)实现了图像的分解与重构,并展示了分解后的图像频域特征。
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');
 
f1=50; % 频率1 f2=100; % 频率2 fs=2*(f1+f2); % 采样频率 Ts=1/fs; % 采样间隔 N=120; % 采样点数 n=1:N; y=sin(2*pi*f1*n*Ts)+sin(2*pi*f2*n*Ts); % 正弦波混合 figure(1) plot(y); title('两个正弦信号') figure(2) stem(abs(fft(y))); title('两信号频谱') %% 2.小波滤波器谱分析 h=wfilters('db30','l'); % 低通 g=wfilters('db30','h'); % 高通 h=[h,zeros(1,N-length(h))]; % 补零(圆周卷积,且增大分辨率变于观察) g=[g,zeros(1,N-length(g))]; % 补零(圆周卷积,且增大分辨率变于观察) figure(3); stem(abs(fft(h))); title('低通滤波器图'); figure(4); stem(abs(fft(g))); title('高通滤波器图') %% 3.MALLET分解算法(圆周卷积的快速傅里叶变换实现) sig1=ifft(fft(y).*fft(h)); % 低通(低频分量) sig2=ifft(fft(y).*fft(g)); % 高通(高频分量) figure(5); % 信号图 subplot(2,1,1) plot(real(sig1)); title('分解信号1') subplot(2,1,2) plot(real(sig2)); title('分解信号2') figure(6); % 频谱图 subplot(2,1,1) stem(abs(fft(sig1))); title('分解信号1频谱') subplot(2,1,2) stem(abs(fft(sig2))); title('分解信号2频谱') %% 4.MALLET重构算法 sig1=dyaddown(sig1); % 2抽取 sig2=dyaddown(sig2); % 2抽取 sig1=dyadup(sig1); % 2插值 sig2=dyadup(sig2); % 2插值 sig1=sig1(1,[1:N]); % 去掉最后一个零 sig2=sig2(1,[1:N]); % 去掉最后一个零 hr=h(end:-1:1); % 重构低通 gr=g(end:-1:1); % 重构高通 hr=circshift(hr',1)'; % 位置调整圆周右移一位 gr=circshift(gr',1)'; % 位置调整圆周右移一位 sig1=ifft(fft(hr).*fft(sig1)); % 低频 sig2=ifft(fft(gr).*fft(sig2)); % 高频 sig=sig1+sig2; % 源信号 %% 5.比较 figure(7); subplot(2,1,1) plot(real(sig1)); title('重构低频信号'); subplot(2,1,2) plot(real(sig2)); title('重构高频信号'); figure(8); subplot(2,1,1) stem(abs(fft(sig1))); title('重构低频信号频谱'); subplot(2,1,2) stem(abs(fft(sig2))); title('重构高频信号频谱'); figure(9) plot(real(sig),'r','linewidth',2); hold on; plot(y); legend('重构信号','原始信号') title('重构信号与原始信号比较') f1=50; % 频率1 f2=100; % 频率2 fs=2*(f1+f2); % 采样频率 Ts=1/fs; % 采样间隔 N=120; % 采样点数 n=1:N; y=sin(2*pi*f1*n*Ts)+sin(2*pi*f2*n*Ts); % 正弦波混合 figure(1) plot(y); title('两个正弦信号') figure(2) stem(abs(fft(y))); title('两信号频谱') %% 2.小波滤波器谱分析 h=wfilters('db30','l'); % 低通 g=wfilters('db30','h'); % 高通 h=[h,zeros(1,N-length(h))]; % 补零(圆周卷积,且增大分辨率变于观察) g=[g,zeros(1,N-length(g))]; % 补零(圆周卷积,且增大分辨率变于观察) figure(3); stem(abs(fft(h))); title('低通滤波器图'); figure(4); stem(abs(fft(g))); title('高通滤波器图') %% 3.MALLET分解算法(圆周卷积的快速傅里叶变换实现) sig1=ifft(fft(y).*fft(h)); % 低通(低频分量) sig2=ifft(fft(y).*fft(g)); % 高通(高频分量) figure(5); % 信号图 subplot(2,1,1) plot(real(sig1)); title('分解信号1') subplot(2,1,2) plot(real(sig2)); title('分解信号2') figure(6); % 频谱图 subplot(2,1,1) stem(abs(fft(sig1))); title('分解信号1频谱') subplot(2,1,2) stem(abs(fft(sig2))); title('分解信号2频谱') %% 4.MALLET重构算法 sig1=dyaddown(sig1); % 2抽取 sig2=dyaddown(sig2); % 2抽取 sig1=dyadup(sig1); % 2插值 sig2=dyadup(sig2); % 2插值 sig1=sig1(1,[1:N]); % 去掉最后一个零 sig2=sig2(1,[1:N]); % 去掉最后一个零 hr=h(end:-1:1); % 重构低通 gr=g(end:-1:1); % 重构高通 hr=circshift(hr',1)'; % 位置调整圆周右移一位 gr=circshift(gr',1)'; % 位置调整圆周右移一位 sig1=ifft(fft(hr).*fft(sig1)); % 低频 sig2=ifft(fft(gr).*fft(sig2)); % 高频 sig=sig1+sig2; % 源信号 %% 5.比较 figure(7); subplot(2,1,1) plot(real(sig1)); title('重构低频信号'); subplot(2,1,2) plot(real(sig2)); title('重构高频信号'); figure(8); subplot(2,1,1) stem(abs(fft(sig1))); title('重构低频信号频谱'); subplot(2,1,2) stem(abs(fft(sig2))); title('重构高频信号频谱'); figure(9) plot(real(sig),'r','linewidth',2); hold on; plot(y); legend('重构信号','原始信号') title('重构信号与原始信号比较')
### 二维小波变换概述 二维小波变换是一种用于分析图像或多维信号的强大工具。它通过分解信号到不同尺度和平移下的基函数来提取局部化特征[^1]。这种技术广泛应用于图像压缩、去噪以及边缘检测等领域。 #### 概念 二维小波变换可以看作是一维小波变换的扩展形式。其核心思想是对输入数据(通常是矩阵表示的图像)分别沿水平方向和垂直方向执行一维小波变换操作。这一过程会产生四个子带:近似系数 (LL),水平细节系数 (LH),垂直细节系数 (HL) 和对角线细节系数 (HH)[^2]。 #### 实现方法 以下是基于 Python 的 PyWavelets 库实现二维离散小波变换的一个简单例子: ```python import pywt import numpy as np from matplotlib import pyplot as plt # 创建一个简单的测试图像 image = np.array([[0, 0, 0], [1, 1, 1], [0, 0, 0]], dtype=float) # 使用 'haar' 小波进行二维 DWT 变换 coeffs = pywt.dwt2(image, 'haar') ll, (lh, hl, hh) = coeffs # 显示结果 fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8, 8)) axes[0][0].imshow(ll, cmap='gray', interpolation="nearest") axes[0][0].set_title('Approximation LL') axes[0][1].imshow(lh, cmap='gray', interpolation="nearest") axes[0][1].set_title('Horizontal Detail LH') axes[1][0].imshow(hl, cmap='gray', interpolation="nearest") axes[1][0].set_title('Vertical Detail HL') axes[1][1].imshow(hh, cmap='gray', interpolation="nearest") axes[1][1].set_title('Diagonal Detail HH') plt.tight_layout() plt.show() ``` 此代码片段展示了如何利用 `pywt` 进行基本的小波变换并可视化各个分量的结果[^3]。 #### 应用场景 - **图像压缩**: 利用小波变换能够有效去除冗余信息,从而达到较高的压缩率而不显著降低视觉质量。 - **噪声抑制**: 对于含噪图片,可以通过阈值处理高频部分后再重构得到更清晰的画面效果。 - **边界探测与增强**: 特定类型的滤波器可以帮助识别物体轮廓或者加强某些特定区域内的对比度变化情况。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值