在python的图像处理中使用for循环的替代方案?



我是图像处理的新手。我必须一次又一次地对图像的所有像素进行操作(如矩阵乘法(。由于我不是专业程序员,我总是通过编写两个内部循环来循环图像的每个像素来做到这一点,并且通常需要很长时间才能运行。有人告诉我,通常可以使用向量而不是for循环来做到这一点,并且使用for循环效率低下。我也 100% 确定 for 循环不是最好的方法,因为像 OpenCV 这样的库可以在不到 5 秒的时间内完成同样的事情,而我的代码需要更长的时间。

所以,我的问题是:当我需要将矩阵转换应用于图像的每个像素时,使用 for 循环的替代方案是什么?(例如,考虑单应性变换(

我同意你的评论,即人们不应该对真正寻求帮助的人的问题投反对票。无论如何:

简单的答案是尝试使用numpy。因此,例如,您可能会填充这样的数组:

import numpy as np
x = np.zeros((100, 100), dtype=np.uint8)
for i in range(100):
for j in range(100):
x[i][j] = 10

但是你可以像这样更干净、更快速地完成此操作:

import numpy as np
x = np.zeros((100, 100), dtype=np.uint8)
x += 10

或:

import numpy as np
x = 10*np.ones((100, 100), dtype=np.uint8)

等。

如果您需要对所有像素应用通用操作,那么 numpy 广播操作是一种快速简便的方法。numpy,scipy和其他地方有许多常见的图像处理操作可用(去看看OpenCV的python功能,它们很棒(,它们允许你使用像上面这样的简单语法,并且运行速度比2个Python循环快很多个数量级。使用切片将操作应用于图像子集也很容易

如果你有一些复杂的操作,不容易卸载到 numpy 或 scipy 函数,那么我建议看看 Numba 模块。它允许您使用循环编写函数(这是您的直觉(,然后编译它们,然后这些循环执行得非常快。这可能需要一些计划和深谋远虑,因为当您在最内层循环中组合多个操作时,您会获得最佳速度,但您还希望尽可能多地使用基元,而不应该只是编译所有内容。

最新更新