【问题标题】:Performance in numpynumpy 中的性能
【发布时间】:2014-03-27 10:46:06
【问题描述】:

我正在用 Python 编写一个方法,它通过 OpenCV 处理来自相机的一些图像,并将该图像与某些参数逐个像素地进行比较,并根据这些参数将该像素设置为零。执行此操作的代码如下:

while True:
ret, frame = cap.read()                      # retrieve image from the camera
for row in range(rows):
  for col in range(cols):
    b1 = (frame[row][col][:] < Nsigma2[row][col][:]).all();
    b2 = (frame[row][col][:] > Psigma2[row][col][:]).all();
    if not b1 and not b2:
      frame[row][col][:] = [0,0,0];
    cv.imshow('frame',frame)                   #show the processed image
    if cv.waitKey(15) & 0xFF == ord('q'):
      break

除了算法本身的正确性与否之外,这是遍历和访问numpy 矩阵的正确方法吗?但这非常慢。我认为最慢的方向是矩阵的第三个组成部分,我在内部循环中访问它,但我没有找到更好的方法来做到这一点。我对 Python 不是很习惯,所以性能这么慢是正常的和意料之中的吗?

【问题讨论】:

  • 可以使用numpy.where 语句合并比较操作。
  • 您的担心是对的。如果您发现数组性能很慢,请检查您是否使用快速排序作为迭代方向。阅读来自docs.scipy.org/doc/numpy/reference/internals.html 的订购文档

标签: python opencv numpy


【解决方案1】:

让你慢下来的最有可能是循环,这不是 Python 的优势之一。我怀疑内存访问是否与此相关。您可以矢量化您的处理,并立即完成所有工作,让 numpy 在内部循环这些值。这三行:

b1 = np.all(frame < NSigma2, axis=-1)
b2 = np.all(frame > PSigma2, axis=-1)
frame[~(b1 | b2)] = 0

可以替换您的 2 个嵌套循环。不过,您将无法像现在一样看到逐像素处理的图像。

【讨论】:

    猜你喜欢
    • 2018-07-07
    • 1970-01-01
    • 2017-07-30
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多