Python如何以C速度循环遍历numpy中的数组并存储一些位置

标签 python arrays opencv numpy

我是 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.wherenp.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/

相关文章:

python - 在 Debian 上安装 scikit-learn 需要哪些软件包

C - 尝试访问数组成员时出现 "Invalid use of void expression"

opencv - 检测国民身份证并获取详细信息

c++ - 查找从轮廓到点 opencv C++ 的距离

python - 使用 SLIM 使用 Python 编写 Fitnesse 测试

python - Django session : changing session key when modified

python - 从用户的输入中确定最常见的词。 [Python]

javascript - 如果嵌套数组包含空值或仅包含空值,如何将其转换为字符串?

arrays - 为什么我的原始数组被改变了?

opencv深度图精度