如何使用掩模去除图像中的噪点

3

前几天我问了一个类似的问题,最后解决了那个部分,但现在又卡住了。

我想创建一个噪声过滤器,从图像中消除噪声,避免边缘和边界。我的输入是一个图像文件,过滤器是平滑线性FIR。

但是我希望结果与原始内容混合后写入输出,按照以下方程式:

result(x,y) = original(x,y)*mask(x,y) + filter_output(x,y)*(1-mask(x,y))

在这里:original(x,y)是输入,带有高斯噪声的图像(例如这个)。 mask(x,y)是基于图像边缘的系数矩阵(已完成), 而filter_ouput(x,y)应该是线性FIR之后的图像。

我的问题是:我尝试了很多滤波器和噪声类型(高斯、椒盐...),但都没有得到好的结果。我得到的结果(x,y)与带噪声的图像相同!无论怎么改变都是这样奇怪。

哪种滤波器才是正确的?我不知道我的错误是在滤波器还是代码中。但是一些实现上的问题。这是代码。

filter = ones(5,5) / 25;
a2 = imfilter(a,filter); % a is the image with noise, a2 is the filtered image (output)

%The equation. G is the mask.

result=uint8(a).*uint8(G) + uint8(a2).*uint8(1-G);
imshow(result);

提示:有没有任何想法?非常感谢!这是未经处理的图片


你的掩膜G的取值范围是多少? [min(G), max(G)]的输出是什么?G的数据类型是什么?是double还是uint8 - Shai
G的范围是[0,1],512x512,双精度。 - Dedrawde
1个回答

1
应用均值滤波器后,a2 变得更加平滑。我试图理解您希望在结果图像中展示什么。实际上,您通过 Sobel 算子获得的 G 也是一张范围从0到255的uint8图像。所以我猜想您的...
result=uint8(a).*uint8(G) + uint8(a2).*uint8(1-G);

应该是 result=a.*uint8(G1) + a2.*uint8(1-G1);,其中G1 =im2bw(G,thresh),使用您预设的thresh值。

编辑

回复您的建议:使用以下内容如何?

result=a2+(255-G);

你好。我希望在平坦区域获得一张没有噪点的图像,避免边缘和边界。我按照你说的做了,但是我仍然有同样的问题。结果,我在平坦区域得到了一个嘈杂的图像。我会继续尝试。 - Dedrawde
我不知道我是否解释清楚了,抱歉。只使用过滤器(a->a2),我可以得到一张平滑的图像,没有噪点,但是边缘模糊了。使用这个方程式的目标是获得没有噪点的图像,同时保持原始边缘,即不模糊。 - Dedrawde
使用result=a2+(255-G)怎么样? - lennon310
不是@lennon310,我明白你想做什么,但是我得到了黑色的背景。无论如何,谢谢你! :) 我会继续寻找错误。 - Dedrawde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接