如何检测噪声类型并将其从图像矩阵中移除

How to detect the noise type and remove it from image matrix

我有一个图像矩阵,我想要一种方法来检测噪声类型,然后使用 MATLAB 找到一个滤波器来消除该噪声。

我的问题:我绘制了图像的直方图,它看起来与盐和纸噪声的直方图相同(我的图像只有三个像素的噪声)。我尝试使用中值滤波器去除噪声,但它改变的不仅仅是去除噪声。

1   1   1   1   1   1   1   1   1 
1  100 100 100 100 100  1   1   1
1  100 100 100 100 100 100  1   1
1  100 100  1   1  100 100  1  100
1  100 100  1   1  100 100  1   1
1  100 100 100 100 100 100  1   1
1  100 100 100 100 100 100  1   1
1  100 100  1   1   1   1   1   1
1  100 100  1   80  1   1   1   90

中值滤波器会像那样切断图像的角。鉴于您的图像或多或少是二进制的,在这种情况下去除噪声的一种简单方法是去除孤立的像素:被比自身低得多的值包围的像素。

这可以在 MATLAB 中使用图像处理工具箱使用形态学开运算 (imopen) 轻松完成:

img = [1   1   1   1   1   1   1   1   1
       1  100 100 100 100 100  1   1   1
       1  100 100 100 100 100 100  1   1
       1  100 100  1   1  100 100  1  100
       1  100 100  1   1  100 100  1   1
       1  100 100 100 100 100 100  1   1
       1  100 100 100 100 100 100  1   1
       1  100 100  1   1   1   1   1   1
       1  100 100  1   80  1   1   1   90];
img = padarray(img,[1,1]); % proper boundary conditions needed
img = max(imopen(img,[1,1]),imopen(img,[1;1]));
img = img(2:end-1,2:end-1); % remove padding again

我们使用两个开口:一个带有 SE [1,1],一个带有 SE [1;1]。它们中的任何一个都可能删除 1 像素粗的线条,但两者都不会删除任何线条。因此,我们取两个结果中的最大值:如果两个过滤器都删除了该像素,它将保持删除状态,但如果只有一个删除它,我们希望保留该像素(它属于一条线)。

还有其他识别孤立像素的方法,但这种方法基于工具箱中的现有函数实现起来非常简单。