我有一个图像矩阵,我想要一种方法来检测噪声类型,然后使用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
答案 0 :(得分:2)
中值滤镜会像这样切掉图像的角落。鉴于您的图像或多或少是二进制的,在这种情况下消除噪声的一种简单方法是除去孤立的像素:像素周围的值远低于其自身。
在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像素粗的线,但是两者都不会删除任何线。因此,我们采用了两个结果中的最大值:如果两个滤镜都删除了该像素,则它将保持删除状态,但是如果只有一个删除该像素,则我们希望保留该像素(它属于一行)。
还有其他识别孤立像素的方法,但是基于工具箱中的现有功能,该方法非常容易实现。