性能优化:numpy

4

我正在使用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 语句进行合并。 - ebarr
你的担忧是正确的。如果你发现数组性能变慢了,检查一下你是否使用了快速排序来迭代方向。建议阅读以下链接中的排序文档:http://docs.scipy.org/doc/numpy/reference/internals.html - Frames Catherine White
1个回答

2
你的程序可能因为循环而变慢,这不是Python的强项。我怀疑内存访问也与此无关。你可以对处理过程进行向量化,一次性完成所有操作,让numpy在值上进行内部循环。以下三行代码:
b1 = np.all(frame < NSigma2, axis=-1)
b2 = np.all(frame > PSigma2, axis=-1)
frame[~(b1 | b2)] = 0

可以替换您的2个嵌套循环。但是,您将无法像现在一样逐像素地查看图像处理的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接