如下所示,我想通过NumPy只快速提取掩码值为零的部分。
有没有一种快速的方法可以用NumPy处理它?
import numpy as np
mask = np.array([[0, 0, 0, 255, 255],
[0, 0, 0, 0, 255],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[255, 255, 0, 0, 0]])
pts0 = np.array([[1, 1], [1, 4], [0, 4], [2, 2], [3, 3]])
def cond_func(pt):
return mask[pt[1]][pt[0]] == 0
bloom = np.array(list(map(cond_func, pts0)))
pts0 = pts0[bloom]
print(pts0) # [[1,1], [2,2], [3,3]]
Numpy索引是最好的方法:
# zeros = mask[pts0[:, 0], pts0[:, 1]]
zeros = mask[tuple(pts0.T)]
# [ 0 255 255 0 0]
pts0 = pts0[zeros == 0]
# [[1 1]
# [2 2]
# [3 3]]
试试这个:
valid_indices = (np.take(mask, pts0[:, 0] + len(mask) * pts0[:, 1])) == 0
pts0 = pts0[valid_indices, :]
这样做的目的是将pts0中的索引转换为平坦矩阵中的条目(在本例中,pts0[:, 0] + len(mask) * pts0[:, 1]
的值为0到24(。
然后,对于每个点,它会检查该点的遮罩值是否等于0。
最后,它取掩码等于0的点的子集。
编辑:在KimBomm发表评论后,我修复了一个错误,即我乘以len(pts0)
而不是len(mask)
。
您可以尝试以下操作吗:
import numpy as np
mask = np.array([[0, 0, 0, 255, 255],
[0, 0, 0, 0, 255],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[255, 255, 0, 0, 0]])
pts0 = np.array([[1, 1], [1, 4], [0, 4], [2, 2], [3, 3]])
# get indexes of 0
ind_zeros = np.asarray(np.where(mask == 0)).T
# get similiar index from pts0
results = ind_zeros[(ind_zeros[:, None] == pts0).all(-1).any(1)]
print(results)
输出:
array([[1, 1],
[2, 2],
[3, 3]])