通过掩码过滤二维坐标numpy数组



如下所示,我想通过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]])

最新更新