基于小波变换的图像去噪
前言
信号的产生、处理及传输都不可避免地要受到噪声的干扰,此外,由于有限字长影响,在数字信号处理中又普遍地存在着模拟信号抽样时的量化噪声和计算时的舍入噪声,因此去噪是信号处理中的永恒的话题。信号处理中的许多理论都和去噪紧密相关,如滤波器设计、最优估计、奇异值分解(SVD)、独立分量分析(ICA)、相干平均以及信号建模等。
传统的滤波方法是假定信号和噪声处在不同的频带,但实际上噪声(特别是作为噪声模型的白噪声)的频带往往分布在整个频率轴上,且等幅度,因此,滤波的方法有其局限性。上述方法尽管在某些方面有自己的特点,但作为信号处理中的去噪问题,其理论和方法都还远远没有解决。
正交小波变换是通过 Mallat的多分辨率分解来实现的H0(z)。通过低通滤波器H0(z)和高通滤波器H1(z)将信号的频谱分解到不同的频率范围,从而得到一个个的子带信号;又由于正交变换具有去除信号中的相关性和信号能量集中的功能,因此,通过小波变换就把信号的能量集中到某些频带的少数系数上这样,通过将其他频带上的小波系数置零或是给予小的权重,即可达到有效抑制噪声的目的。因此,小波去噪随着小波变换理论的发展也不断丰富起来,并取得了良好的效果。其中,以 Donoho的阈值去噪法最为突出,本文的小波去噪法即为阈值去噪法。
提示:以下是本篇文章正文内容,下面案例可供完整代码参考如下:
链接:https://pan.baidu.com/s/1gOiCBfkVrNwDJj8SfhOaLQ
提取码:qmwz
一、小波变换的发展
传统的信号理论,是建立在Fourier分析基础上的,而Fourier变换作为一种全局性的变化,有一定的局限性,如不具备局部化分析能力、不能分析非平稳信号等。在实际应用中人们开始对Fourier变换进行各种改进,以改善这种局限性,如STFT(短时傅立叶变换)。由于STFT采用的的滑动窗函数一经选定就固定不变,故决定了其时频分辨率固定不变,不具备自适应能力,而小波分析很好的解决了这个问题。小波变换(wavelet transform,WT)是一种新的变换分析方法,它继承和发展了短时傅立叶变换局部化的思想,同时又克服了窗口大小不随频率变化等缺点,能够提供一个随频率改变的“时间-频率”窗口,是进行信号时频分析和处理的理想工具。它的主要特点是通过变换能够充分突出问题某些方面的特征,解决了Fourier变换的困难问题,成为继Fourier变换以来在科学方法上的重大突破。
二、阈值去噪法的介绍
2.1. 基本原理
小波阈值去噪的基本思想是先设置一个临界阈值λ,若小波系数小于λ,认为该系数主要由噪声引起,去除这部分系数;若小波系数大于λ,则认为此系数主要是由信号引起,保留这部分系数,然后对处理后的小波系数进行小波逆变换得到去噪后的信号。
2.2. 流程图
2.3. 阈值函数的选取
硬阈值是一种简单的置零的方法,而软阈值对于大于阈值的小波系数作了"收缩",即都减去阈值,从而使输入-输出曲线变成连续的。在阈值选选取上,人们普遍使用软阈值。改进的阈值是硬阈值和软阈值之间的一个折中,即当小波系数小于阈值时,不是简单地置为零,而是平滑地减小为零,当大于阈值时,小波系数幅度都减去阈值。这样,既保证了大的小波系数,又保证了加阈值后系数的平滑过渡。
本次设计自定义了一个折中阈值,当小波系数等于阈值时,在阈值上加了一个折中系数α,实现阈值从硬阈值到软阈值的平缓过渡。折中系数的范围是0-100,即α=0时为硬阈值,α=100时为软阈值,α在0到100的范围之间为折中阈值。
2.4. 阈值的选取
小波阈值选取方法有固定阈值(Sqtwolog阈值),风险阈值(Rigrsure阈值),启发式阈值(Heursure阈值),极大极小阈值。这些阈值选取方法中都没有涉及噪声的方差,这与我们的实验理念相违背,在MATLAB中我们对噪声方差进行了单独的处理。取小波系数在各个尺度下绝对值的中值,然后将该中值除以常数0.6745作为该尺度下小波系数中噪声强度的估计,即


2.5. 分解函数和重构函数
在MARTLAB中,wavedec2()可以实现图像的多级分解,其格式为


2.6. 峰值信噪比(PSNR)
峰值信噪比经常用作图像压缩和去噪等领域中信号重建质量的测量方法,它常简单地通过均方差(MSE)进行定义。两个m×n单色图像I和K,如果一个为另外一个的噪声近似,那么它们的的均方差定义为


2.7. 实验参数的设计
该设计是在MATLAB2018b环境下编程实现的,经过多次的仿真,我们所选的噪声参数为:均值为0,方差0.02、0.04以及0.06的高斯白噪声。阈值函数用了硬阈值、软阈值和改进的阈值三种方法,阈值选取方式为全局阈值。小波基为db2,它是dbN小波的一种,小波分解级数为3级。所用的图片是自己拍摄的博物馆图片,大小为512x512的灰度图。
三、部分代码
3.1. 主函数
代码如下(main.c):
lc,clf,clear
%输入一幅图像
image=imread('Photo.bmp');
%加入不同程度的高斯噪声
image1= imnoise(image, 'gaussian', 0,0.02);
image2= imnoise(image, 'gaussian', 0,0.04);
image3= imnoise(image, 'gaussian', 0,0.06);
figure('NumberTitle', 'off', 'Name', '原图像和噪声图像')
subplot(221);imshow(image);title('原图像');
subplot(222);imshow(image1);title('均值为0,方差为0.02的噪声图像');
subplot(223);imshow(image2);title('均值为0,方差为0.04的噪声图像');
subplot(224);imshow(image3);title('均值为0,方差为0.06的噪声图像');
disp('0.02噪声图像的峰值信噪比:'),psnr(image,image1)
disp('0.04噪声图像的峰值信噪比:'),psnr(image,image2)
disp('0.06噪声图像的峰值信噪比:'),psnr(image,image3)
test_num=randi([1,99],1,1);%随机生成一个数作为折中系数
wname='db2';n=3;input=image1;
subplot(221);
[img1,psn1]=WaveletDenoising(input,n,wname,image,0);
imshow(img1,[]);title('硬阈值去噪后的图像'),
disp('硬阈值去噪后的峰值去噪比:'),psn1
subplot(222);
[img2,psn2]=WaveletDenoising(input,n,wname,image,100)