如何在MATLAB中去除图像中的高斯噪声?

6

我正在尝试从图像中去除高斯噪声。我使用以下方法添加了噪声:

nImg = imnoise(img,'gaussian',0,0.01);

我现在需要使用自己的滤波器去除噪音,或者至少减少它。理论上,我了解到使用一个卷积矩阵ones(3)/9应该有帮助,使用高斯卷积矩阵像[1 2 1; 2 4 2; 1 2 1]/9fspecial('gaussian',3)更好。然而,它们真的不能很好地处理问题: enter image description here 我是否缺少重要的东西?顺便说一句,我需要使用卷积。

3
平均滤波器(你所说的“ones”滤波器)是一种效果不好的低通滤波器。高斯滤波器是更好的低通滤波器。之所以在1 2 1; 2 4 2; 1 2 1滤波器上出现失真,是因为它没有正确地进行归一化处理。 - Jim Clay
1
关于 1 2 1;2 4 2;1 2 1,你是正确的。我应该除以16而不是9。即便如此,它仍然不能很好地工作:链接 - shwartz
3个回答

10

你没有错过任何东西!显然,你无法完全消除噪声。你可以尝试不同的滤波器,但它们都会有一个权衡:

更多噪声+更少模糊VS更少噪声+更多模糊

如果你以以下方式思考,这将变得更加明显:

任何基于卷积的方法都假设所有邻居具有相同的颜色。

但在现实生活中,图像中有许多物体。因此,当你应用卷积时,你会通过混合来自不同相邻物体的像素来引起模糊。

还有更复杂的去噪方法:

  • 中值去噪
  • 双边滤波器
  • 基于模式匹配的去噪

它们不仅使用卷积。顺便说一下,即使它们也不能创造魔法。


谢谢。我在实现过程中看到了这种权衡,并且我还实现了中值去噪,对于椒盐噪声效果很好,但对于高斯噪声效果不太好。不过,我该如何找到图像过于嘈杂但清晰和图像过于模糊但有少量噪声之间的细微界限呢?我有一些参数可以玩耍:矩阵维度(小、大、正方形、矩形)和矩阵值(高斯、均匀、其他一些奇怪的设置)。那么,仅通过卷积真的没有什么好的方法吗? - shwartz
1
@shwartz,很遗憾,不行。您至少需要一些能够检测边缘、角落等并相应处理它们的逻辑。这并不仅仅是卷积的定义。 - Andrey Rubshtein
实际上,这有点鼓舞人心,因为我的任务是仅使用卷积(就我所知)解决问题。唯一的问题是找到一个“好”的方法以及如何知道哪个结果最佳。有没有办法量化结果的质量?例如,从原始无噪声图像计算出某种矩阵距离是否是确定结果质量的好方法?或者还有其他常见的方法吗? - shwartz
1
我建议您在这个主题上提出另一个问题 :) 您可以放置一个链接到这个问题。 - Andrey Rubshtein
@Andrey,我对你所说的很感兴趣...我是否应该在堆栈交换上提出一个全新的问题?我想要理解的是在消除噪音但不消除边缘之间的权衡,也许可以总结一些技术。 (例如,我已经遇到了“各向异性扩散”)...这些技术是如何工作的?有什么改变吗?谢谢。 - Spacey

1

你可以使用wiener2,它在噪声为定值功率(“白”)加性噪声时效果最好,例如高斯噪声。


0

你在高斯卷积矩阵上犯了一个错误。你需要将它除以16,而不是9,这样它的总和才等于1。这就是为什么使用那个矩阵得到的图像如此亮。


谢谢,我知道了。有人已经在原帖下面发表了评论。 - shwartz

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