如何检测图像中的椒盐点?

时间:2019-07-23 13:12:32

标签: image-processing deep-learning object-detection

我已经在一个项目上进行了几周的检测,以发现机器产生的不良点,但找不到任何好的解决方案。我想知道你们能否给我一些线索。

损坏的图像如下所示。坏点是非常亮或暗的点。这些要点具有以下特征:

  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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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()