如何使用 MATLAB 从图像中去除椒盐噪声?
脉冲噪声是一种独特的 可以有许多不同来源的噪音形式。由于传输错误,图像经常因脉冲噪声而损坏,有缺陷 记忆 模数转换中的位置或时序错误。椒盐噪声是一种可以破坏图像的脉冲噪声,其中噪声像素只能取动态范围内的最大值和最小值。由于线性过滤策略 不是 非线性滤波策略在去除脉冲噪声方面具有强大的功能,广泛用于 恢复 方法。标准中值滤波器 (SMF) 是最流行的非线性滤波器之一,用于去除椒盐噪声,因为它具有良好的去噪能力和计算效率。
然而,SMF 的主要缺点是滤波器仅对低噪声密度有效,此外,如果窗口大小较大,则会出现模糊,如果窗口大小较小,则会导致噪声抑制不足。当噪声水平超过 50% 时,中值滤波器将无法保留原始图像的边缘细节。尽管如此,重要的是在处理过程中必须保留边缘细节,而不会丢失图像边缘的高频分量。
理想的方法是仅将过滤技术应用于噪声像素,而不更改未损坏的像素值。非线性滤波器如自适应中值滤波器 (AMF)、基于决策的或切换中值滤波器可用于区分损坏和未损坏的像素,然后应用滤波技术。嘈杂的像素将被中值替换,未损坏的像素将保持不变。 AMF 在低噪声密度下表现良好,因为被中值替换的损坏像素非常少。在较高的噪声密度下,必须增加窗口大小以获得更好的噪声去除,这将导致损坏的像素值和替换的中值像素值之间的相关性降低。
什么是椒盐噪声?
顾名思义,像素的颜色要么完全变成黑色,要么完全变成白色。白叫盐,黑叫胡椒,故名。
这是在图像中随机创建纯白色或黑色(高/低)像素的结果。这在尖端图像传感器中不太常见,尽管在相机传感器故障形式中通常可以看到最大值(热像素通常可能在最大深度,或者坏像素通常可能是黑色的)。这种噪声也称为脉冲噪声。
中值滤波器有效地去除了这种噪声。白色或黑色像素表现为异常值。选择大小为 [mn] 的邻域窗口并在图像上滑动。窗口悬停的图像像素按升序排序,然后白色和深色像素分别位于排序列表的右侧和左侧,因此不影响输出像素的选择。我们从排序列表中选择中间像素,因此盐和胡椒可以有效地减少 100%,尽管会出现一些模糊,这很好。
使用的功能:
- imread( ) 内置函数用于读取图像。
- imtool( ) 内置函数用于显示图像。
- size( ) 内置函数用于获取图像的大小。
- rgb2gray( ) 内置函数用于将 RGB 转换为灰度图像。
- imnoise( ) 内置函数用于向图像添加噪声。
- medfilt2( ) 内置函数用于对噪声图像执行中值滤波。
- pause( ) 内置函数用于停止执行指定的秒数。
例子:
Matlab
% MATLAB Code for removal of Salt and
% Pepper noise from image.
k=imread("gfglogo.png");
RemoveSaltAndPepperNoise(k);
function RemoveSaltAndPepperNoise(k)
% Convert to grayscale if not.
[M,N,D]=size(k);
if(D==3)
k=rgb2gray(k);
end
% Add noise to image.
kn=imnoise(k,'salt & pepper',0.03);
% Display original and noisy image.
imtool(k,[]);
imtool(kn,[]);
% Denoising.
dn=medfilt2(kn,[5,5]);
% Display denoised image.
imtool(dn,[]);
% Pause and close img windows.
pause(10);
imtool close all;
end
输出:
代码说明:
- [M,N,D]=尺寸(k);此行获取输入图像的大小。
- kn=imnoise(k,'盐和胡椒',0.03);这条线在图像中增加了 3% 的噪点。
- dn=medfilt2(kn,[5,5]);此行对噪声图像应用中值滤波器。
- k=imread(“cameraman.png”);此行读取输入图像。
- RemoveSaltAndPepperNoise(k);此行通过将输入图像传递给用户定义的函数来调用它。
中值滤波器是去除椒盐噪声的最佳选择,尽管它会在图像中在滑动邻域窗口下方捕获非均匀区域的区域中引入一些模糊。在这种情况下,排序列表的中位数并不完全来自实际的底层像素值。该方法可将噪声降低 100%。