如何在图像中检测盐和胡椒噪声点?

4

我已经花费了数周时间研究如何检测由机器生成的坏点,但仍然无法找到最佳解决方案。我想知道是否有人可以提供一些关于此问题的线索。

以下是受损图像的示例。坏点非常明显,通常为亮或暗点。这些点具有以下特征:

  1. 相对较大或较小的强度。

  2. 它们大多是一个或两个相邻的像素。

enter image description here

我尝试过:

  1. 将它们视为Harris Conner,并使用更大的梯度来检测它们。但是,边缘上的某些点也具有较大的梯度。此外,梯度阈值不易固定。较小的阈值会引入假阳性,而较大的阈值则引入假阴性。

  2. 由于坏点与其局部区域相比具有较大或较小的强度,因此我计算中心点以外的平均强度,并将其与中心点进行比较。但是,一些具有较大或较小强度的正常点可能会被此方法错误分类。同时,平均值和中心点之间差异的阈值也很难固定。

  3. 我还尝试提取一些特征来对点进行分类,并将它们分类为坏点或好点。虽然我的分类器达到了96%的准确率,但由于图像中的点数量众多(6000,000),这可能会导致许多点被错误分类。

  4. 我想知道是否有一些深度学习点检测模式?我想尝试使用它们以查看是否可以实现99.99 ...%的准确率。

    此外,以下示例是受损图像和正常图像。虽然它们在人类眼中非常明显,但我无法想出一个完美的方法来让计算机区分它们。

    带有一些亮像素的正常图像:

enter image description here

带有两个坏点的受损图像:

enter image description here

如果您能提供一些关于此问题的线索,我将不胜感激。非常感谢!


无法访问的图片,请勿使用远程服务器。 - user1196549
“bad points” 似乎是 盐和胡椒噪声。同时,你是如何计算分类器的准确性的? - Masoud
@Masoud 谢谢您的回复!是的,我也这么认为。我标记了几千个点,并将它们分为训练集和验证集。我根据标签在验证集上进行计算。当然,在测试时我平衡了负样本和正样本。 - 李悦城
如何估计相邻像素的像素强度差,并为其设置阈值,将像素分类为噪声或正常?您可以根据需要检查4个相邻像素或8个相邻像素。我建议这样做是因为像素强度之间存在明显差异。与深度学习模型(如果您打算尝试)相比,这并不会增加计算负担。 - venkata krishnan
您应该能够上传图片,它们将只是链接而不是内联显示。但是,它们将位于SO的图像服务器上,其他用户将能够为您内联它们。 - Cris Luengo
2个回答

1

您可以尝试使用小半径(3x3或5x5)的中值滤波器。然后检测与原始图像差异较大的椒盐噪声。


@李悦城:你试过了吗?不,你没有。 - user1196549
实际上,我确实这样做了。我在我的分类器中使用了它作为一个特征。虽然它很有用,但还不够。 - 李悦城
@李悦城:你的意思是将噪声输入到分类器中吗? - user1196549
@李悦城:你真的在训练那个差异吗? - user1196549
是的,我还使用了像素值等其他功能。 - 李悦城

0
利用Numpy检测像素强度范围在[0,255]内,设定最小/最大阈值可能会起作用。思路是创建一个掩码,其中所有像素大于某个亮点阈值和小于另一个暗点阈值。检测到的点将被着色为绿色。

enter image description here

import cv2
import numpy as np

image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
mask = ((gray >= 200) | (gray <= 100))
image[mask] = [36,255,12]

cv2.imshow('image', image)
cv2.waitKey()

这对于像盐和胡椒噪声一样像素值全局大或小的情况很好。然而,我的问题与脉冲噪声有关,其像素值在局部上很大或很小。 - 李悦城

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