一、引入SURF算法
在上一节中我们学习了使用 SIFT 算法进行关键点检测和描述。但是这种算法运算量及其大,执行速度慢,人们需要速度更快的算法。在 2006 年Bay,H.,Tuytelaars,T. 和 Van Gool,L 共同提出了 SURF(加速稳健特征)算法,并发表在ECCV大会上。SURF算法可以说是SIFT(尺度不变特征变换)算法的改进版。SURF它被设计为SIFT算法的优化改进版本,提供了更快的处理速度和更好的性能。SURF算法同样能够提取图像中的关键点,并生成对旋转、缩放和部分亮度变化具有不变性的描述符。
但SURF的专利期还没解除,因此OpenCV官方用 OPENCV_ENABLE_NONFREE 在源代码中对其编译进行了限制,但是其suft算法的具体源码在OpenCV 4中还是存在的,只是没有编译而已,因此如果实在需要在OpenCV 4中调用这些函数,只能重新自己编译,而不能直接使用Release已编译好的二进制文件。
具体方法可以参考如下两个链接:
[1]. https://github.com/skvark/opencv-python/issues/126
[2]. https://zhuanlan.zhihu.com/p/161990279
二、SURF算法优化了SIFT的哪些地方?
那么SURF与SIFT相比牛在哪里?接下来我们回顾SIFT的主体流程,看看SURF是如何将每一个步骤进行优化的。如果不了解熟悉SIFT的详细流程,可以参考我前一篇文章 SIFT特征检测
1、图像金字塔的提速
SIFT的第一步是构建图像金字塔。计算金字塔的时候,在处理每个尺度的图像时需要多次计算高斯模糊和梯度,这产生了大量的复杂计算。SURF使用BoxFilter盒子滤波(也就是均值模糊)来取代高斯模糊的计算,下图显示了这种近似。在进行卷积计算时可以利用 积分图像 (积分图像的一大特点是:计算图像中某个窗口内所有像素和时,计算量的大小与窗口大小无关),是盒子滤波器的一大优点。而且这种计算可以在不同尺度空间同时进行。(也就是说可以并行!!!)
2、关键点定位的优化
接下来看看定位关键点这一步骤是如何进行优化。在原始SIFT的算法中是利用DoG金字塔,在上下相邻的两个尺度空间内,进行固定窗口大小的(9x9)的非极大信号抑制的处理。初步得到关键