我编写自己的高斯滤波器,但速度很慢。
OpenCV的高斯算法比我的高斯滤波器快20倍。 我想在我的项目中重写OpenCV的高斯算法,我不想在我的项目中包含opencv。
然而,
任何人都可以给我算法描述,opencv的源代码 好像难以理解?
答案 0 :(得分:12)
高斯滤波器具有易于加速的特性:滤波器可以独立应用于两个维度。您可以定义一个垂直操作的一维过滤器,另一个水平操作的过滤器,并将它们应用于两者;这产生与在二维中应用的单个过滤器相同的效果。
除此之外,您可能需要查看SIMD instructions,例如SSE3可用于您的处理器。
答案 1 :(得分:4)
要回答问题的第二部分,高斯模糊只是在图像上作为卷积核应用的3维高斯曲面。 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像素。你将不得不做P P N * M操作。 P越大,您对给定图像的操作就越多。您可以使用此处使用的算法变得狡猾,进行非常特定的基于行或列的数学运算。
实施也很重要。如果您想要非常高效,您可能希望使用架构提供的最高级指令。如果您使用的是英特尔x86芯片,您可能希望获得英特尔性能原语(IPP)的许可并直接调用这些指令。 IIRC,OpenCV确实可以利用IPP ......
如果给定体系结构上的浮点性能较差,您还可以执行非常智能的操作并使用所有缩放的整数。这可能会加快一些速度,但在走这条路之前我会首先考虑其他选择。
答案 2 :(得分:2)
尝试检查here。你想提前弄清楚离散高斯矩阵,然后将其与图像进行卷积。
答案 3 :(得分:1)
如果您的卷积核心相对较大并且您正在实施直接卷积,那么性能差异可能是因为OpenCV正在使用快速傅里叶变换(FFT)实现卷积。
答案 4 :(得分:-1)
我讨厌迂腐,但你要求的算法,即完成任务所需的精确步骤序列。你已经有了高斯算法。因此,问题的关键点是当你要求更快时,这与要求算法不同。
要回答更快的问题 - 您想知道OpenCV如何优化其代码,这是一个技术性很强且广泛的主题。我会说它使用汇编语言和特定于GPU的函数。我首先学习汇编,然后研究CUDA包以利用你的GPU。