如何将蒙版区域 (True) 扩展 1 或 2 个像素?

How to extend mask region (True) by 1 or 2 pixels?

我有一个 True 和 False 值的 numpy 掩码,用于检测图像中的黑色区域。

我想将 True 区域扩展 1 或 2 个像素。

例如,考虑这个面具:

[[False False False False False]
 [False False TRUE  False False]
 [False TRUE  TRUE  TRUE  False]
 [False False TRUE  False False]
 [False False False False False]

我想要:

[[False False TRUE  False False]
 [False TRUE  TRUE  TRUE  False]
 [TRUE  TRUE  TRUE  TRUE  TRUE ]
 [False TRUE  TRUE  TRUE  False]
 [False False TRUE  False False]

实际上我可以做一个 for 循环,但从大的角度来看它太慢了。

有什么想法吗?

谢谢!

您可以使用布尔求和:

new_mask = mask.copy()
new_mask[:,1:] = mask[:,1:]+mask[:,:-1]
new_mask[1:,:] = new_mask[1:,:]+mask[:-1,:]

new_mask 现在是:

array([[False, False, False, False, False],
       [False, False,  True, False, False],
       [False,  True,  True,  True, True],
       [False,  True,  True,  True, False],
       [False, False,  True, False, False]])

两个布尔值之间的和作为逻辑或,所以在前面的代码行中你说:new_mask[i,j] = (mask[i,j] or mask[i,j-1] or mask[i-1,j])

扩张是扩展“真实”区域的最简单方法。

考虑数组:

a = np.array([[False, False, False, False, False],
              [False, False,  True, False, False],
              [False,  True,  True,  True, False],
              [False, False,  True, False, False],
              [False, False, False, False, False]])

转换为整数数据类型

a = a.astype(np.uint8)     

你得到:

array([[0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 1, 1, 1, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0]], dtype=uint8)

使用大小为 3x3 的椭圆核执行膨胀:

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
dilate = cv2.dilate(a, kernel, iterations=1)

dilate:

array([[0, 0, 1, 0, 0],
       [0, 1, 1, 1, 0],
       [1, 1, 1, 1, 1],
       [0, 1, 1, 1, 0],
       [0, 0, 1, 0, 0]], dtype=uint8)

将结果转换为布尔数据类型:

d = np.array(dilate, dtype=bool)

结果数组:

array([[False, False,  True, False, False],
       [False,  True,  True,  True, False],
       [ True,  True,  True,  True,  True],
       [False,  True,  True,  True, False],
       [False, False,  True, False, False]])

要进一步扩展 True 区域:

  • 增加内核大小
  • 使用iteration
  • 重复扩张操作

注意: 布尔数组不能用作 cv2.dilate() 的输入,否则会抛出 error: (-5:Bad argument) .因此我们将其转换为 int 数据类型,执行操作并将其转换回 bool 数据类型。

好像