首页 > 解决方案 > 如何检测噪声类型并将其从图像矩阵中删除

问题描述

我有一个图像矩阵,我想要一种检测噪声类型的方法,然后使用 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

在此处输入图像描述

在此处输入图像描述

标签: matlabimage-processingfilteringnoise

解决方案


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

这可以在 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 像素粗线,但两者都不会删除任何线。因此,我们取两个结果中的最大值:如果两个过滤器都删除了像素,它将保持被删除,但如果只有一个过滤器删除了它,我们希望保留这个像素(它属于一条线)。

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


推荐阅读