python – numpy中的性能

我在
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,这是正常的,可以预期如此缓慢的表现?

最佳答案 什么在减慢你的速度很可能是循环,这不是Python的优势之一.我怀疑内存访问是否相关.您可以对您的处理进行矢量化,并立即完成所有操作,让numpy在内部循环遍历值.这三行:

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

可以替换你的2个嵌套循环.但是,您现在无法像往常一样逐像素地看到图像.

点赞