删除白色像素OpenCV包围的像素

时间:2015-01-26 14:16:00

标签: python opencv

我的黑白图像有很多噪音。我想只删除完全被白色像素包围的黑色像素。我尝试使用Filter2d,但我无法实现它。

3 个答案:

答案 0 :(得分:2)

我使用卷积(再次) 1

>>> import numpy as np
>>> from scipy.signal import convolve2d
>>> 
>>> kernel = np.ones((3,3))
>>> kernel[1,1] = 0
>>> print(kernel)
[[ 1.  1.  1.]
 [ 1.  0.  1.]
 [ 1.  1.  1.]]
>>> # Create a decent test array that shows the features
... test = np.array(
...     [[0,1,1,0,1,1],
...      [1,1,1,1,1,0],
...      [1,0,1,1,0,1],
...      [1,1,1,0,0,0],
...      [1,1,1,0,1,0],
...      [1,1,1,0,0,0]])
>>> 
>>> mask = convolve2d(test, kernel, mode='same', fillvalue=1)
>>> print(mask)
[[ 8.  7.  7.  8.  6.  7.]
 [ 6.  6.  6.  6.  5.  7.]
 [ 7.  8.  6.  5.  4.  4.]
 [ 7.  7.  5.  5.  3.  5.]
 [ 8.  8.  5.  4.  0.  4.]
 [ 8.  8.  6.  6.  4.  6.]]
>>> result = test.copy()
>>> result[np.logical_and(mask==8, test==0)] = 1
>>> print(result)
[[1 1 1 1 1 1]
 [1 1 1 1 1 0]
 [1 1 1 1 0 1]
 [1 1 1 0 0 0]
 [1 1 1 0 1 0]
 [1 1 1 0 0 0]]

正如您所看到的,result数组已经改变了所有"黑色"在所有8个边上完全被白色(由1表示)包围的像素(此处由值0表示),即使在角落和边缘也是如此。

编辑:Hugo Rune的回答是更好的,但如果你有" pepper"噪音,这意味着您拥有黑色像素的小,这些黑色像素被白色像素包围,而不仅仅是单个像素。对于单个像素,这就是我解释你的问题的方法,上面的工作正常。

脚注:

1:实际上你需要correlation,但在这种情况下它是相同的,因为内核是对称的。

答案 1 :(得分:1)

您有两种可能性:

执行morphological closing

enter image description here

这将删除所有单个黑色像素,但它也会删除一些其他形状,例如一个像素厚的黑色线条或尖锐的黑色角落

这是消除“胡椒噪音”,嘈杂的单个黑色像素的标准方法。


另一种方式,它只会删除单个黑色像素:

  • 反转图像
  • 使用findContours查找倒置图像中的所有连接组件
  • 选择所有找到的面积为1的轮廓,并在原始图像中将其涂成白色

如果两个随机黑色像素偶然是邻居,那么这将无法工作,因此可能会覆盖所有大小为2或3的区域。

答案 2 :(得分:0)

4年后,我遇到了类似的任务,以消除单个像素的噪声。

“摄像机校准”模块中的OpenCV的filterspeckles函数对于该任务很有用。

代码:

import cv2
import numpy as np

data = np.array([[1, 1, 1, 1, 1, 1],
                 [1, 1, 1, 1, 1, 0],
                 [1, 0, 0, 0, 0, 1],
                 [1, 0, 1, 0, 0, 0],
                 [1, 0, 1, 0, 1, 0],
                 [1, 0, 0, 0, 0, 0]]).astype(np.uint8)

print('Input')
print(data)
cv2.filterSpeckles(data, 0, 1, 1)[0]

print('Output')
print(data)

控制台:

Input
[[1 1 1 1 1 1]
 [1 1 1 1 1 0]
 [1 0 0 0 0 1]
 [1 0 1 0 0 0]
 [1 0 1 0 1 0]
 [1 0 0 0 0 0]]
Output
[[1 1 1 1 1 1]
 [1 1 1 1 1 0]
 [1 0 0 0 0 0]
 [1 0 1 0 0 0]
 [1 0 1 0 0 0]
 [1 0 0 0 0 0]]