2009-06-01 44 views
5

我自己写高斯滤波器,但速度很慢。高斯滤波器算法在OpenCV中的工作方式

的OpenCV的高斯算法快很多,比我高斯滤波器的20倍。 我想在我的项目中重写OpenCV的高斯算法,并且我不想在我的项目中包含opencv。

然而,

谁能给我的算法描述,OpenCV的源代码 也不难理解?

回答

12

高斯滤波器具有,使得它很容易加速的属性:所述过滤器可以在两个维度上独立地应用。您可以定义垂直操作的一维过滤器,以及另一个水平操作的过滤器,并将它们应用于两者;这产生与在二维中应用的单个滤波器相同的效果。

除此之外,你可能需要看看SIMD instructions例如SSE3可用于您的处理器。

+2

这是一个快速简便的方法与P 1 2个操作的PXP内核2P操作,以加快直接卷积。 – las3rjock 2009-06-01 05:18:44

4

要回答你的问题的第二部分,高斯模糊就是一个三维高斯曲面,它被用作图像上的卷积核。 Wikipedia对算法本身就是一个很好的参考,但基本上,你把高斯曲线的价值和转换是成方阵,并在图像的每一个像素相乘,如:

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] 

(请注意,这只是一个示例内核,有非常具体的eqns,这取决于你的高斯变量,你会得到不同的结果)

要回答你的问题的性能部分,这个算法的总体速度将取决于在几件事情上,假设一个大小不变的图像。可以说图像是NxM像素,卷积内核是PxP像素。你将不得不做N * M个操作。 P越大,对于给定的图像您将需要执行的操作越多。你可以用你在这里使用的算法很狡猾,做非常特定的行或列的数学计算。

实现也很重要。如果你想要非常高效,你可能会想要使用你的架构提供的最先进的指令。如果您使用的是英特尔x86芯片,那么您可能需要考虑获取英特尔性能原语(IPP)的许可证并直接调用这些指令。 IIRC,OpenCV中确实使用IPP时,其提供的...

你也可以做一些非常聪明,并与所有比例整数的工作,如果你的既定体系浮点性能较差。这可能会加速一点,但在走这条路之前,我会首先考虑其他选项。

2

尝试检查here。您想提前计算离散高斯矩阵,然后将其与图像进行卷积。

+0

非常感谢你,rlbond – user25749 2009-06-01 06:19:04

1

如果您的卷积核较大,要实现直接卷积,性能差异可能是因为OpenCV的是使用快速傅立叶变换(FFT)实现卷积。

-1

我讨厌被迂腐,但你所要求的算法,也就是完成任务所需步骤的精确序列。你已经有了高斯算法。所以你的问题的关键是,当你问的东西更快,这是不一样的要求的算法。

要回答更快问题 - 您想知道OpenCV如何优化其代码,这是一个高度技术性和广泛的主题。我会说,它使用汇编语言和GPU专用功能妄自揣测。我想通过学习组装,和研究CUDA包把你的GPU的优势开始。