我有一個 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 回圈,但在大影像中它會變慢。
有任何想法嗎 ?
謝謝 !
uj5u.com熱心網友回復:
擴張是擴展“真實”區域的最簡單方法。
考慮陣列:
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資料型別。
它似乎
uj5u.com熱心網友回復:
您可以使用布爾總和:
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])
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/472810.html
