高斯滤波算法在OpenCV中是如何工作的?

5
我编写的高斯滤波器速度非常慢。OpenCV的高斯算法比我的高斯滤波器快20倍。我想在我的项目中重写OpenCV的高斯算法,但是不想在我的项目中包含OpenCV。然而,有人能给我算法描述吗?OpenCV的源代码似乎太难理解了。
5个回答

13
高斯滤波器具有一个特性,使其非常容易加速:滤波器可以在两个维度上独立应用。您可以定义一个垂直操作的一维滤波器,另一个水平操作的一维滤波器,并同时应用它们;这产生的效果与在两个维度上应用单个滤波器相同。
此外,您可能需要查看可用于处理器的SIMD指令,例如SSE3

2
这是一种快速简便的方法,可以将直接卷积与大小为PxP的内核从P^2个操作加速到2P个操作。 - las3rjock
我的高斯函数在两个维度上应用,其时间复杂度为2 * p * M * N,比OpenCV慢20倍。 - user25749

4
为了回答你问题的第二部分,高斯模糊就是将一个三维高斯曲面作为卷积核应用于图像上。在维基百科上有关于算法本身的很好的参考资料,但基本上,你需要取高斯曲线的值并将其转换为一个方形矩阵,然后将其与图像中的每个像素相乘,例如:
Kernel:               
[0 1 2 0 0
1 4 6 4 1      X   Iterate over every single pixel in the image
2 6 10 6 2
1 4 6 4 1
0 1 2 1 0]

(请注意,这只是一个示例核心算法,根据高斯变量的不同,你会得到不同的结果)
回答你的问题中关于性能的部分,这个算法的整体速度取决于一些因素,假设图像大小是NxM像素,卷积核大小为PxP像素。对于给定的图像,你将需要执行PPN*M次操作。 P越大,对于同样的图像,你需要执行的操作就越多。在这里,你可以使用巧妙的算法,进行特定的行或列内基础数学计算。
实现也非常重要。如果你想要极其高效,你应该使用你的架构提供的最先进的指令。如果你使用的是英特尔x86芯片,你可能想要获取Intel性能原语(IPP)的许可证,并直接调用这些指令。我记得,OpenCV在可用时确实会使用IPP...
如果你的架构上浮点性能较差,你也可以使用所有缩放的整数进行智能处理。这可能会加快速度,但在尝试这种方法之前,我建议先看看其他选项。

2

1
如果你的卷积核相对较大,且正在实现直接卷积,性能差异可能是因为OpenCV正在使用快速傅里叶变换(FFT)来实现卷积。

-1

我不想显得过于苛刻,但你正在寻求一种算法,也就是完成任务所需的精确步骤序列。你已经有了高斯算法。因此,你问题的关键点在于你要求更快的东西,这与要求算法并不相同。

回答“更快”的问题——你想知道OpenCV如何优化其代码,这是一个高度技术性和广泛的主题。我猜它使用汇编语言和GPU特定函数进行优化。我建议你从学习汇编语言开始,并研究CUDA包以利用你的GPU。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接