二维卷积的计算复杂度

计算科学 复杂 图像处理
2021-12-11 09:21:00

我正在为我正在开发的图像处理算法使用图像过滤。我正在使用预定义的 Matlab 函数进行卷积,但我想知道这个算法的计算复杂度是多少。

简单的思考方式是M×N(灰度)图像和m×n过滤器,每个像素需要O(mn)计算,因此 2D 卷积的复杂度约为O(MNmn). (当然重要的是你是否填充图像的侧面,但假设mn比较小MN,它不应该有太大的不同。)

我的问题是:这是真的吗?是2D卷积的复杂度O(MNmn),或者是否有减少它的优化?

4个回答

有很多方法可以加速卷积是专门的上下文,例如:

  • 如果您的过滤器是可分离的,即h=h1h2h1Rn×1h2R1×m, 计算(uh1)h2u(h1h2).
  • h=[1  1](对于任何长度)可以递归地完成,每个像素基本上有两个操作。将这一点与前一点结合起来,可以大大加快矩形移动平均线的速度。
  • 有时因式分解过滤器是有益的:例如,与[14 12 14]可以通过与[1 1]两次,然后除以 4。后一个卷积只需要加法(没有乘法)和位移,在某些环境中可能要快得多。
  • 将前一点与第一点结合起来,通过卷积得到很好的与高斯卷积的近似值n次与[1 1]n次与[1 1]T(具有适当的位移)。
  • 当使用 FFT(如 Wolfgang Bangerth 提到的)对带有小滤波器的大图像进行卷积时,重叠相加方法进一步提高了速度。

然而,在实践中实际观察到多少加速取决于具体的架构和语言。

如果在傅里叶空间中应用卷积,它就会变成乘积,因此您可以表达运算Im(I作为形象,m作为您过滤的面具)作为Im=F1(F(I)F(m))(在哪里F是傅里叶变换)这将花费你O(MNlog(MN))操作。这是否比您所拥有的更便宜取决于您的滤镜蒙版的大小:对于小型滤镜,直接应用更便宜,但如果滤镜将蒙版应用于图像的重要子集的区域,则傅里叶变换可能会变得更便宜。

您可以使用可分离定理优化卷积。让我举个例子。

图片 (M×N): 1024, 768 (灰度) 卷积蒙版 (k×k): 7x7

计算复杂度:卷积->O(MNkk)

计算复杂度:可分离卷积 ->O(2MNk)

k = 内核大小。

使用普通卷积,您得到 O(1024*768*7*7) = 38535168 次操作。

使用可分离卷积得到(2*1024*768*7) = 11010048 次操作。

这里有一个真实例子。

对于一些 2D 卷积操作(例如均值滤波器),可以使用积分图像(又名求和面积表)来显着加快计算速度。特别是,将滤波器应用于积分图像而不是原始图像可以允许使用非常大的内核大小进行卷积,因为性能变得独立于内核大小,即执行 100 x 100 卷积所需的计算量与3 x 3 卷积。它易于实施并且非常有效。