5

我写了自己的高斯滤波器,但它真的很慢。

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

然而,

谁能给我算法描述,opencv的源码好像太难懂了?

4

5 回答 5

13

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

除此之外,您可能需要查看适用于您的处理器的SIMD 指令,例如SSE3 。

于 2009-06-01T05:09:12.023 回答
4

要回答您问题的第二部分,高斯模糊只是在图像上作为卷积核应用的 3-d 高斯表面。维基百科对算法本身有很好的参考,但基本上,你取高斯曲线的值并将其转换为方阵,并将其乘以图像中的每个像素,例如:

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 像素。您将不得不进行 P P N*M 操作。P 越大,对给定图像执行的操作就越多。您可以巧妙地使用此处使用的算法,进行非常具体的基于行或列的数学运算。

实施也很重要。如果您想变得非常高效,您可能需要使用您的架构提供的最高级指令。如果您使用的是 Intel x86 芯片,您可能希望获得 Intel 性能原语 (IPP) 的许可证并直接调用这些指令。IIRC,OpenCV 在可用时确实使用了 IPP...

如果给定架构上的浮点性能很差,您还可以做一些非常聪明的事情并使用所有缩放的整数。这可能会加快速度,但在走这条路之前,我会先看看其他选择。

于 2009-06-01T04:46:49.447 回答
2

试试看这里。您想提前计算出离散高斯矩阵,然后将其与图像进行卷积。

于 2009-06-01T04:47:52.830 回答
1

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

于 2009-06-01T05:12:14.767 回答
-1

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

要回答更快的问题 - 您想知道 OpenCV 如何优化其代码,这是一个技术性很强且范围广泛的主题。我会冒险猜测它使用汇编语言和特定于 GPU 的功能。我将从学习汇编开始,然后研究 CUDA 包以利用您的 GPU。

于 2012-12-19T23:58:48.167 回答