我正在为我正在开发的图像处理算法使用图像过滤。我正在使用预定义的 Matlab 函数进行卷积,但我想知道这个算法的计算复杂度是多少。
简单的思考方式是(灰度)图像和过滤器,每个像素需要计算,因此 2D 卷积的复杂度约为. (当然重要的是你是否填充图像的侧面,但假设和比较小和,它不应该有太大的不同。)
我的问题是:这是真的吗?是2D卷积的复杂度,或者是否有减少它的优化?
我正在为我正在开发的图像处理算法使用图像过滤。我正在使用预定义的 Matlab 函数进行卷积,但我想知道这个算法的计算复杂度是多少。
简单的思考方式是(灰度)图像和过滤器,每个像素需要计算,因此 2D 卷积的复杂度约为. (当然重要的是你是否填充图像的侧面,但假设和比较小和,它不应该有太大的不同。)
我的问题是:这是真的吗?是2D卷积的复杂度,或者是否有减少它的优化?
有很多方法可以加速卷积是专门的上下文,例如:
然而,在实践中实际观察到多少加速取决于具体的架构和语言。
如果在傅里叶空间中应用卷积,它就会变成乘积,因此您可以表达运算(作为形象,作为您过滤的面具)作为(在哪里是傅里叶变换)这将花费你操作。这是否比您所拥有的更便宜取决于您的滤镜蒙版的大小:对于小型滤镜,直接应用更便宜,但如果滤镜将蒙版应用于图像的重要子集的区域,则傅里叶变换可能会变得更便宜。
您可以使用可分离定理优化卷积。让我举个例子。
图片 (): 1024, 768 (灰度) 卷积蒙版 (): 7x7
计算复杂度:卷积->
计算复杂度:可分离卷积 ->
k = 内核大小。
使用普通卷积,您得到 O(1024*768*7*7) = 38535168 次操作。
使用可分离卷积得到(2*1024*768*7) = 11010048 次操作。
这里有一个真实的例子。