我写了自己的高斯滤波器,但它真的很慢。
OpenCV 的高斯算法要快得多,比我的高斯滤波器快 20 倍。我想在我的项目中重写OpenCV的高斯算法,我不想在我的项目中包含opencv。
然而,
谁能给我算法描述,opencv的源码好像太难懂了?
要回答您问题的第二部分,高斯模糊只是在图像上作为卷积核应用的 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...
如果给定架构上的浮点性能很差,您还可以做一些非常聪明的事情并使用所有缩放的整数。这可能会加快速度,但在走这条路之前,我会先看看其他选择。
试试看这里。您想提前计算出离散高斯矩阵,然后将其与图像进行卷积。
如果您的卷积核相对较大并且您正在实现直接卷积,则性能差异可能是因为 OpenCV 正在使用快速傅里叶变换 (FFT) 实现卷积。
我讨厌迂腐,但您要求的是算法,即完成任务所需的精确步骤序列。你已经有了高斯算法。所以你问题的关键是当你要求更快的东西时,这与要求算法不同。
要回答更快的问题 - 您想知道 OpenCV 如何优化其代码,这是一个技术性很强且范围广泛的主题。我会冒险猜测它使用汇编语言和特定于 GPU 的功能。我将从学习汇编开始,然后研究 CUDA 包以利用您的 GPU。