如何检测噪声类型并将其从图像矩阵中移除
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 像素粗的线条,但两者都不会删除任何线条。因此,我们取两个结果中的最大值:如果两个过滤器都删除了该像素,它将保持删除状态,但如果只有一个删除它,我们希望保留该像素(它属于一条线)。
还有其他识别孤立像素的方法,但这种方法基于工具箱中的现有函数实现起来非常简单。
我有一个图像矩阵,我想要一种方法来检测噪声类型,然后使用 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 像素粗的线条,但两者都不会删除任何线条。因此,我们取两个结果中的最大值:如果两个过滤器都删除了该像素,它将保持删除状态,但如果只有一个删除它,我们希望保留该像素(它属于一条线)。
还有其他识别孤立像素的方法,但这种方法基于工具箱中的现有函数实现起来非常简单。