如何使用Matlab进行基于小波的图像去噪

548 阅读8分钟

使用Matlab对图像进行基于小波的去噪处理

基于小波的去噪是一种分析方法,它利用时间频率,根据信号的特点选择合适的频段。

一个信号描述了随时间变化的各种物理量。而噪声是一种不需要的信号,它干扰了携带原始信息的信号。这导致信号信息的参数发生变化。去噪是去除信号中的噪声的过程。

小波分析可以应用于日常生活中的活动,如特征提取、人脸识别、数据分析和预测、语音识别、数字分析等等。

摆脱信号传输过程中污染的图像噪声,是非常具有挑战性的。一些算法正在被发现,但它仍然是一个挑战。

在这篇文章中,我们将讨论一种叫做基于小波的图像去噪的方法,它是最有效的方法之一。

前提条件

  1. 安装了[Matlab]。
  2. 对[Matlab]语言的正确理解。

简介

在信号的远距离传输过程中,有可能会受到噪声的污染。这里的目标是使用小波技术去除图像信号中的噪声。

信号通过加法获得噪声,其一般形式为。

f'(x,y) = f(x,y) + n(x,y)

其中f'(x,y) 是被噪声污染的信号,f(x,y) 是原始信号,n(x,y) 是噪声信号。

噪声信号n(x,y) ,对于所提出的方案,其基本假设是:

  • 噪声是加性的
  • 噪声是一个随机信号(均值为零的白高斯信号)
  • 噪声具有高频率。

要了解更多关于噪声信号和方程式的信息,可以阅读篇文章。

在这里,我们的目标是使用小波技术将噪声n(x,y) ,从噪声图像f'(x,y)

基于小波的去噪方案

去噪方案包括将信号通过一个分解器,利用离散小波变换(DWT)将其分解为各种小波系数。

离散小波变换是一种用于将图像像素转换为小波的方法,用于基于小波的压缩和编码。

然后对系数进行阈值处理并重建以形成原始图像。这个重建的过程被称为逆向离散小波变换(IDWT)。

在这里,图像阈值化是对前景和背景信号的分离。它是一种图像分割方法,通过将灰度图像转换为二进制图像,将其隔离。

灰度图像是只包含一种颜色的图像,有两种可能的强度值,就是黑色和白色。这些值通常为0代表黑色,1代表白色。

使用反离散小波变换(IDWT)来获得去噪图像。反离散小波变换用于寻找阈值标签。我们可以使用其他方法,如通用阈值、Bayes、SURE、MinMax等。

Matlab的WaveletAnalyzer工具

这是一个在Matlab中找到的内置工具,不需要安装。

它主要用于图像去噪。要访问它,在命令提示符上输入wavelet analyzer 。我们会得到一个新的窗口,如下图所示。

WaveletAnalyzer tool WaveletAnalyzer工具

访问该工具后,我们找到Wavelet 2-D ,因为要去噪的图像是二维的。当你点击它时,一个新的窗口打开了。

wavelet 2-D WaveletAnalyzer工作区

点击File -> Load -> Image ,导入要去噪的图像。并且,选择要去噪的图像。

imported image 在WaveletAnalyzer中打开一个有噪声的图像

在上面窗口的左上角,选择小波(去噪方法),如:bior 2.2 ,作为它的协同效率,以及分解的级别。

请注意,Db,haar,sym, 和coif 是正交小波,具有紧凑的支持(较小的支持)。

  • bior,rbior 是双正交小波,具有紧凑的支持。
  • mey,dmey 是正交小波,具有非紧凑支持。

这些方法是以发明他们的人命名的。

正交小波是一个单一的缩放函数。当一个小波是双正交的,它产生一个单一的缩放函数,一个小波用于分解,另一个用于重建。缩放函数可以用来缩小或放大函数。

水平分解涉及到将信号通过低通和高通滤波器,从而使结果信号被降频2次。

我们得到一个高频信号,高通滤波器有详细的系数,低通滤波器有低频的近似系数。这就是一级分解(第一级)。

当这个过程从低通滤波器开始继续进行时,层次会增加。分解的最大数量通过以下方式计算。

max.分解数=log_2Nlog\_2N

其中N 代表信号长度。

上面描述的整个分解是离散小波变换(DWT),而相反的则是IDWT。

当按下Analyzer 按钮时,我们的图像就被去噪了。这给了我们一个带有小波系数图的窗口。

Plot of wavelet co-efficient

图像去噪

在一级(l_1l\_1),我们对图像的水平线、对角线和垂直线的细节进行处理。这也适用于第2级(l_2l\_2)。

在窗口的左侧,选择Threshold 方法,也选择噪声结构。在这种情况下,我们选择scaled white noise ,因为它是高斯白噪声。

使用滚动条,我们可以修改阈值,然后点击denoise 按钮。

Denoised image 去噪

我们得到的去噪图像如上图所示。这就是你如何使用小波分析器工具对图像进行去噪的方法。

小波去噪中使用的函数

wdencmp - 它可以用来对一维和二维信号进行去噪。这意味着它既可以用于音频,也可以用于图像。

语法。

imgden = wdencmp('gbl_or_Ivd', img, 'wname', N, THR, SORH, KEEPAPP)

其中

  • img是我们输入的噪声图像。
  • imgden是去噪后的输出图像。
  • gbl_or_ivd:使用gbl 为单一阈值,或使用Ivd 为依赖水平的阈值(或者使用gblIvd )。
  • wname是使用的小波的类型。
  • N代表分解级别。
  • thr: 阈值水平。
  • sorh s 或 分别对应于软阈值和硬阈值。h
  • keepapp阈值:它是0或1。当近似系数不能被阈值化时,它为0,如果可以,则为1。

当前景和背景的物体之间的强度分布非常明显时,就会使用单一阈值法。

在水平阈值法中,每一级的阈值都被重新标定,以得出与每一级的小波系数的标准差相对应的新的阈值。

硬阈值是指将绝对值低于阈值的系数设置为零的过程。

软阈值是指首先将绝对值低于阈值的系数设置为零,然后将非零系数向零收缩的方法。

用于寻找去噪默认值的函数(THR、SORH、KEEPAPP)

默认值是用ddencmp 自动找到的。该函数的语法是。

[THR, SORH, KEEPAPP] = ddencmp('den', 'wv', img)

我们传递输入的噪声图像(img),定义的去噪方法和小波(WV)。执行这个函数,我们得到这些常数的值。

显示wdencmp和ddencmp使用的代码示例

我们首先从PC上加载原始图像。

[filename, pathname] = uigetfile('*.*', 'select input image');
fileWithPath = strcat(pathname, filename);  
img = imread(fileWithPath); % assigning the image to this variable fileWithPath.

我们使用imread 函数读取图像。图像img 是原始图像。我们手动添加噪音,使图像产生噪音。

imgn = imnoise(img, 'gaussian', 0, 0.005);  %add noise

请注意,我们添加的gaussian 噪声的平均值为0,方差为0.005。

然后,我们定义信号扩展模式dwtmode ,这是信号的周期性扩展。这是用下面的代码完成的。

dwtmode('per'); %signal extension mode

我们首先执行ddencmp 函数。因此,当我们执行这个函数时,我们将得到thr,sorh,keepapp ,这些将被用于wdencmp

[thr, sorh, keepapp] = ddencmp('den', 'wv', imgn); %finding default values

在定义了thr,sorh,keepapp 之后,我们将它们传递给wdencmp 函数,如下图所示。

% Denoise image using global thresholding.
imgden = wdencmp('gbl', double(imgn), 'sym4', 2, thr, sorh, keepapp);

这样做是为了使用图像阈值对图像进行去噪。

注意,小波和阈值处理方法不能重命名。这是Matlab中识别它们的方式,任何改变都会导致错误。

gbl 代表单阈值方法。 用于小波的分解, 是分解级别。sym4 2

当我们执行该代码时,我们得到imgden 作为输出。这就是去噪后的图像。我们显示图像以看到差异,我们使用下面的代码。

subplot(131), imshow(img), title('Original Image')
subplot(132), imshow(img), title('Noisy Image')
subplot(133), imshow(uint8(imgden), []), title('denoised image')

我们找到SNR(信噪比)。

%Finding SNR
Orig_vs_Noisy_SNR = 20*log10(norm(double(img(:)))/norm(double(img(:))-double(imgn(:))));   % This gives the value of ratio between the original image and the noisy image.
Origin_vs_denoised = 20*log10(norm(double(img(:)))/norm(double(img(:))-double(imgden(:))));   % This gives the value of ratio between the original image and the denoised image.

信噪比有助于我们理解去噪的效果。前者帮助我们理解原始图像与噪声图像之间的差异,而后者代表原始图像与去噪图像。

下面是执行该代码后得到的图像。

Output after denoising

总结

对于处理图像或音频的工程师来说,小波变换是一个重要的功能。这是因为它有助于对信号的分析,并对信号进行分解以便进一步分析。

正如我们在这里学到的,小波变换适用于图像处理等各个领域。它们也可以应用于音频信号分析领域和其他许多领域。

Matlab是一种非常重要的语言,使理解小波更加容易。它有许多内置的特点和功能,使这种分析更容易。