我是 python、numpy 和 opencv 的新手。我正在玩 here 中的哈里斯角检测器的第一个示例。我的目标是获得所有角落的有序列表。通过这个简单的代码,我可以获得角点的 X 和 Y 坐标及其值:
height, width, depth = img.shape
print height, width
for i in range(0, height): #looping at python speed
for j in range(0, (width)):
if dst[i,j] > 0.9*dst.max():
print i, j, dst[i,j]
但是,速度非常慢。我不知道这是如何调用的,但显然使用 numpy 可以以 C 速度循环遍历数组,甚至赋值,例如:
img[0:height, 0:width, 0:depth] = 0
我可以循环遍历数组并在另一个变量中分配感兴趣值的位置吗? IE。我可以在我的代码中使用它来加快速度吗?
最佳答案
您可以获得将通过 IF 条件语句的元素掩码。接下来,如果您需要通过条件的索引,请使用 np.where
或np.argwhere
在面具上。对于有效的 dst
元素,使用相同掩码索引 dst
,从而使用 boolean indexing
。实现看起来像这样 -
mask = dst > 0.9*dst.max()
out = np.column_stack((np.argwhere(mask),dst[mask]))
如果您想分别获得这三个打印输出,您可以这样做 -
I,J = np.where(mask)
valid_dst = dst[mask]
最后,如果您想根据 2D
mask
编辑 3D 数组 img
,您可以这样做 -
img[mask] = 0
这样,您就可以一次性更改所有 channel 中 img
中的相应元素。
关于Python如何以C速度循环遍历numpy中的数组并存储一些位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33453748/