我是图像处理的新手。我不得不一次又一次地对图像的所有像素执行操作(如矩阵乘法)。由于我不是专业程序员,因此我总是通过编写两个内部循环来遍历图像的每个像素来执行此操作,并且通常需要很长时间才能运行。有人告诉我,通常可以使用向量代替for循环来执行此操作,并且使用for循环效率低下。我也100%确信for循环不是执行此操作的最佳方法,因为像OpenCV这样的库可以在不到5秒的时间内完成相同的操作,而我的代码则花费更长的时间。
所以,我的问题是:当我需要对图像的每个像素应用矩阵变换时,使用for循环的替代方法是什么? (例如,考虑单应变换)
答案 0 :(得分:2)
我同意您的意见,即人们不应该拒绝真正寻求帮助的人的提问。无论如何:
简单的答案是尝试使用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模块。它使您可以使用循环来编写函数(这是您的本能),然后对其进行编译,然后这些循环可以非常快速地执行。这可能需要一些计划和周全的工作,因为当您在最内层的循环中组合多个操作时,您可以获得最快的速度,但是您也希望尽可能多地使用原语,而不仅仅是编译所有内容。