如何将蒙版区域 (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
数据类型。
好像
我有一个 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
数据类型。
好像