问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://blog.csdn.net/wyr1849089774/article/details/136462800

小波变换是一种强大的信号处理工具,广泛应用于信号去噪、信号降噪和图像降噪等领域。本文将详细介绍小波变换的基本原理,并通过MATLAB代码展示其在实际应用中的具体实现过程。

实验原理

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

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

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

小波变换的公式——

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

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

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

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

  1. 将原始图像进行分解,得到其低频和高频成分,其中低频成分表示图像的整体趋势,而高频成分则表示图像的细节信息。
  2. 对低频成分进行进一步分解,得到其更低频和更高频的成分,重复此过程直到达到所需的精度。
  3. 对高频成分进行阈值处理,将其小于某个阈值的部分置零,从而实现对图像噪声的去除。
  4. 将所有分解出来的成分进行重构,得到经过小波变换处理后的图像。

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

信号去噪

在此实验中,采用sin函数并取样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的高斯噪声所控制。

接下来,我们来看小波变换降噪的过程:
通过设置小波基函数为'wavelet'(db4小波)和分解层数为5,我们对带噪声的信号x进行小波分解,得到小波系数c和长度向量l。使用中值绝对偏差估计法,我们计算了噪声的标准差sigma。根据噪声标准差估计软阈值,软阈值参数threshold计算为sigma乘以sqrt(2 * log(numel(x))),其中numel(x)是信号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. 噪声残留:可以看出,第一次去噪没有完全去除所有的噪声,第二次去噪只是对剩余的细微噪声进行了处理,因此结果差异不大。

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号