【小波变换】使用小波变换完成信号去噪、信号降噪、图像降噪

        本实验使用小波变换完成信号去噪、信号降噪、图像降噪操作,根据信号波形和实验图像分析实验结果。代码含有详细注释,希望帮助大家理解。

        以下将从信号去噪、信号降噪、图像降噪三个块题进行详细的讲解与阐述。

实验原理

        小波变换($wavelet transform$$WT$)是一种新的变换分析方法,它继承和发展了短时傅立叶变换局部化的思想,同时又克服了窗口大小不随频率变化等缺点,能够提供一个随频率改变的“时间-频率”窗口,是进行信号时频分析和处理的理想工具。

        它的主要特点是通过变换能够充分突出问题某些方面的特征,能对时间(空间)频率的局部化分析,通过伸缩平移运算对信号(函数)逐步进行多尺度细化,最终达到高频处时间细分,低频处频率细分,能自动适应时频信号分析的要求,从而可聚焦到信号的任意细节,解决了$Fourier$变换的困难问题,成为继$Fourier$变换以来在科学方法上的重大突破。

        与傅里叶变换相比,小波做的改变就在于,将无限长的三角函数基换成了有限长的会衰减的小波基,如下图所示。

        小波变换的公式——

W T(a, \tau)=\frac{1}{\sqrt{a}} \int_{-\infty}^{\infty} f(t) * \psi\left(\frac{t-\tau}{a}\right) d t

        从公式可以看出,不同于傅里叶变换,变量只有频率$\omega$,小波变换有两个变量:尺度$a$$scale$)和平移量$\tau$$translation$)。尺度$a$控制小波函数的伸缩,平移量$\tau$控制小波函数的平移。尺度就对应于频率(反比),平移量$\tau$就对应于时间。

        如上图所示,当伸缩、平移到这么一种重合情况时,也会相乘得到一个大的值。这时候和傅里叶变换不同的是,这不仅可以知道信号有这样频率的成分,而且知道它在时域上存在的具体位置。

        而当我们在每个尺度下都平移着和信号乘过一遍后,我们就知道信号在每个位置都包含哪些频率成分。

        图像小波变换的实验原理主要包括以下几个步骤:

        1.将原始图像进行分解,得到其低频和高频成分,其中低频成分表示图像的整体趋势,而高频成分则表示图像的细节信息。

        2.对低频成分进行进一步分解,得到其更低频和更高频的成分,重复此过程直到达到所需的精度。

        3.对高频成分进行阈值处理,将其小于某个阈值的部分置零,从而实现对图像噪声的去除。

        4.将所有分解出来的成分进行重构,得到经过小波变换处理后的图像。

        通过这些步骤,可以实现对图像的压缩、去噪等处理,同时保留图像的主要特征。

信号去噪

        在此实验中,本小组采用$sin(3t)$函数并取样$t$$[1,1000]$的整数点,所得原始图像如下图所示。

        在此原始图像的基础上,小组添加噪声信息并额外附加随机数噪声,用作待处理信号,可以从下图中看到,噪声处理后的函数与原始信号具有极大的差别,信号非常杂乱。

        采用小波变换对上图所示噪声图像做处理,MATLAB代码如下所示。

load noissin; %加载noissin函数信号
t = 1:1000;
e0 = sin(0.03*t);%原始信号
e1 = noissin + rand(size(noissin)); %添加随机噪声后的待处理信号

% 使用db4对信号进行小波变换4层分解
[c_db4,l_db4] = wavedec(e1, 4, "db4");
subplot(5,2,1);
plot(e1);
%提取第一层低频图像实现信号去噪
image1 = wrcoef('a', c_db4, l_db4, "db4", 1);
subplot(5,2,3);
plot(image1);
%提取第二层低频图像实现信号去噪
image2 = wrcoef('a', c_db4, l_db4, "db4", 2);
subplot(5,2,5);
plot(image2);
%提取第三层低频图像实现信号去噪
image3 = wrcoef('a', c_db4, l_db4, "db4", 3);
subplot(5,2,7);
plot(image3);
%提取第四层低频图像实现信号去噪
image4 = wrcoef('a', c_db4, l_db4, "db4", 4);
subplot(5,2,9);
plot(image4);

% 使用sym8对信号进行小波变换4层分解
[c_sym8,l_sym8] = wavedec(e1, 4, "sym8");
subplot(5,2,2);
plot(e1);
%提取第一层低频图像实现信号去噪
image1 = wrcoef('a', c_sym8, l_sym8, "sym8", 1);
subplot(5,2,4);
plot(image1);
%提取第二层低频图像实现信号去噪
image2 = wrcoef('a', c_sym8, l_sym8, "sym8", 2);
subplot(5,2,6);
plot(image2);
%提取第三层低频图像实现信号去噪
image3 = wrcoef('a', c_sym8, l_sym8, "sym8", 3);
subplot(5,2,8);
plot(image3);
%提取第四层低频图像实现信号去噪
image4 = wrcoef('a', c_sym8, l_sym8, "sym8", 4);
subplot(5,2,10);
plot(image4);

        该段代码分别使用db4和sym8对信号进行4层分解的降噪处理,提取每一层的低频值转化为图像。

        使用db4的结果如下图所示。

        

        使用sym8的结果如下图所示。 

        可以看出,利用db4和sym8小波降噪后的信号基本上恢复了原始信号,去噪效果明显。但是滤波后的信号与原始信号也有不同,从图中可以很直观地看到采用阈值消噪后信号特征值较少无法准确还原原始信号。这是由于为降噪过程中所用的分析小波和细节系数的阈值不恰当所致,如需要更好的恢复信号,还可以采用其它种类小波对其进行分析,通过选取不同的阈值,分析结果,得到一个合适的阈值。

        除此之外,还可以对高频信号进行重构,以获得高频函数噪声的图像。以下MATLAB代码实现了用db4对信号进行4层分解,然后分别对分解的第4层到第1层的高频系数进行重构得到高频噪声函数图像的功能。

load noissin; %加载noissin函数信号
t = 1:1000;
e0 = sin(0.03*t);%原始信号
e1 = noissin + rand(size(noissin)); %添加随机噪声后的待处理信号

% 使用db4对信号进行小波变换4层分解
[c_db4,l_db4] = wavedec(e1, 4, "db4");
subplot(5,1,1);
plot(e1);

%提取第一层高频图像
image1 = wrcoef('d', c_db4, l_db4, "db4", 1);
subplot(5,1,2);
plot(image1);
%提取第二层高频图像
image2 = wrcoef('d', c_db4, l_db4, "db4", 2);
subplot(5,1,3);
plot(image2);
%提取第三层高频图像
image3 = wrcoef('d', c_db4, l_db4, "db4", 3);
subplot(5,1,4);
plot(image3);
%提取第四层高频图像
image4 = wrcoef('d', c_db4, l_db4, "db4", 4);
subplot(5,1,5);
plot(image4);

        所得高频噪声信号参见下图:

信号降噪 

信号降噪的MATLAB代码展示如下。

% 假设待降噪的信号为x
% 生成正弦信号
fs = 1000; % 采样率
t = 0:1/fs:1; % 时间向量,从0到1秒
f = 50; % 正弦信号频率
x_origin = sin(2*pi*f*t); % 生成正弦信号
% 添加高斯噪声
noise = 0.5 * randn(size(x_origin)); % 生成高斯噪声,标准差为0.5
x = x_origin + noise; % 添加噪声
% 小波变换参数设置
wavelet = 'db4'; % 小波基函数选择,这里选择db4小波
level = 5; % 小波分解的层数
% 进行小波分解
[c, l] = wavedec(x, level, wavelet);
% 噪声估计
sigma = median(abs(c)) / 0.6745; % 估计噪声标准差
% 设置软阈值参数
threshold = sigma * sqrt(2 * log(numel(x))); % 根据噪声标准差估计软阈值
% 进行软阈值处理
c_thresh = wthresh(c, 's', threshold); % 软阈值处理
% 进行小波重构
x_denoised = waverec(c_thresh, l, wavelet); % 小波重构
% 绘制结果
subplot(3, 1, 1);
plot(x_origin);
title('原始信号');
subplot(3, 1, 2);
plot(x);
title('噪声信号');
subplot(3, 1, 3);
plot(x_denoised);
title('降噪后的信号');

        所得实验结果展示如下图所示。

首先,让我们观察生成的信号情况:

        第一个子图(subplot)显示了原始信号$x\_origin$,这是一个频率为$50Hz$的正弦信号,没有噪声成分。第二个子图显示了带噪声的信号$x$,这是将高斯噪声添加到原始信号$x\_origin$中得到的结果。噪声的强度由标准差为$0.5$的高斯噪声所控制。

接下来,我们来看小波变换降噪的过程:

        通过设置小波基函数为$'db4'$$Daubechies 4$小波)和分解层数为$5$,我们对带噪声的信号$x$进行小波分解,得到小波系数$c$和长度向量$l$。使用中值绝对偏差估计法,我们计算了噪声的标准差$\sigma$。根据噪声标准差估计软阈值,软阈值参数$threshold$计算为$sigma$乘以$sqrt(2 * log(N))$,其中$N$是信号$x$的元素数量。我们使用软阈值函数$wthresh$对小波系数$c$进行软阈值处理,得到$c\_thresh$,这是对噪声进行去除的步骤。最后,我们使用小波重构函数$waverec$以及小波系数$c\_thresh$和长度向量$l$,对降噪后的小波系数进行重构,得到降噪后的信号$x\_denoised$

        在绘制结果的第三个子图中,我们可以观察到降噪后的信号$x\_denoised$。通过与带噪声的信号$x$进行对比,我们可以进行以下结果分析:

        降噪后的信号$x\_denoised$显示出明显的噪声去除效果。噪声成分得到了有效的减少,信号更接近于原始信号$x\_origin$。降噪后的信号$x\_denoised$仍保留了原始信号的频率特征,且噪声成分被较好地去除。

        小波变换降噪方法在该实验中表现出良好的效果。通过选择合适的小波基函数、分解层数和软阈值参数,我们成功地去除了信号中的高斯噪声成分,提高了信号质量。

图像去噪

        图像去噪的MATLAB代码展示如下。

[A,map]=imread('regulars.png');                
I=rgb2gray(A);  
%画出原始图像  
figure(1);
subplot(1,2,1);imshow(I);
title('原始图像');  
%产生含噪图像  
i=imnoise(I ,'gaussian',0,0.12); 
subplot(1,2,2);imshow(i);  
title('含噪声图像');  
%下面进行图像的去噪处理  
%用小波函数sym4对i进行2层小波分解  
[c,s]=wavedec2(i,2,'sym4');  
%提取小波分解中第一层的低频图像,即实现了低通滤波去噪  
a1=wrcoef2('a',c,s,'sym4');  % a1为 double 型数据;
%画出去噪后的图像  
figure(2); imshow(uint8(a1)); title('第一次去噪图像');
%提取小波分解中第二层的低频图像,即实现了低通滤波去噪  
%相当于把第一层的低频图像经过再一次的低频滤波处理  
a2=wrcoef2('a',c,s,'sym4',2);  
%画出去噪后的图像  
figure(3); imshow(uint8(a2)); title('第二次去噪图像');

        所得实验结果如下图所示。

        首先,程序使用了$'sym4'$小波基函数,并对图像进行了两层小波分解:,通过提取小波分解的第一层的低频系数,我们可以得到一个去噪后的版本。随后提取第二部分的低频系数获取第二次去噪的结果。 

        分析结果:

        第一次去噪——通过提取第一层小波分解的低频系数,通常能够保留图像的主要信息,同时去除高频噪声。这个过程实际上是将图像的粗略结构进行平滑处理,去除较粗糙的噪声成分。

        第二次去噪——提取第二层小波分解的低频系数。在这个阶段,已经进行了一次去噪处理,因此这一次的低频系数更加平滑,可能会包含更少的细节信息和更多的整体趋势。因此,第二次去噪可能只对残留的噪声有所影响,而对图像整体的变化可能不太明显。

        我们发现,两次去噪结果差不多。可能有几个原因:

        1.信息丢失:第一次去噪已经移除了许多高频噪声,第二次去噪可能会导致进一步的信息丢失,使得图像变化不太显著。

        2.低频系数的平滑性:第二次的低频系数相对于第一次更加平滑,因此去噪效果可能不太明显。

        3.噪声残留:可以看出,第一次去噪没有完全去除所有的噪声,第二次去噪只是对剩余的细微噪声进行了处理,因此结果差异不大。


以上为本篇博客的全部内容,希望对大家有所帮助🌹

  • 28
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
小波变换是一种常用的信号处理技术,可以用于降噪。在Python中,可以使用PyWavelets库来进行小波变换降噪。 首先,你需要安装PyWavelets库,可以使用以下命令进行安装: ```python pip install PyWavelets ``` 接下来,你可以使用以下代码示例来实现小波变换降噪: ```python import pywt import numpy as np # 生成有噪声的信号 t = np.linspace(0, 1, 1000) signal = np.sin(2 * np.pi * 10 * t) + np.sin(2 * np.pi * 20 * t) + np.random.randn(len(t)) * 0.2 # 进行小波变换降噪 coeffs = pywt.wavedec(signal, 'db4', level=6) threshold = np.std(coeffs[-1]) * np.sqrt(2 * np.log(len(signal))) coeffs[1:] = (pywt.threshold(c, threshold) for c in coeffs[1:]) reconstructed_signal = pywt.waverec(coeffs, 'db4') # 绘制原始信号降噪后的信号 import matplotlib.pyplot as plt plt.subplot(2, 1, 1) plt.plot(t, signal) plt.title('Original Signal') plt.subplot(2, 1, 2) plt.plot(t, reconstructed_signal) plt.title('Denoised Signal') plt.tight_layout() plt.show() ``` 在这个例子中,我们首先生成了一个噪声的信号。然后,使用`pywt.wavedec`函数对信号进行小波变换,得到小波系数。接着,通过计算阈值来确定需要保留的小波系数,并将其余系数置零。最后,使用`pywt.waverec`函数将处理后的小波系数进行重构,得到降噪后的信号。 你可以根据自己的需求选择不同的小波基和阈值计算方法。这里的示例使用了db4小波基和基于标准差的阈值计算方法。你可以根据实际情况进行调整和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值