OpenCV Python SURF (Speeded-Up Robust Features) 介绍
【目标】
- SURF的基础
【理论】
SURF 是 SIFT 的提速版本;
在SIFT中,Lowe用 DoG 近似 LoG;SURF 走的更远一点,用 box filter 近似 LoG 。下图显示了这种近似的演示。这种近似的一个很大的优点是,在积分图像的帮助下,可以很容易地计算 box filter 的卷积。它可以在不同的尺度上并行进行。此外,SURF还依赖于海森矩阵的行列式来确定尺度和位置。
SURF在水平方向和垂直方向上对大小为6的邻域使用小波响应进行方向分配。充分的高斯权值也应用于它。然后他们被绘制在一个空间,如下图所示。通过计算60度滑动方向窗口内所有响应的和来估计主方向。有趣的是,小波响应可以很容易地在任何尺度上用积分图像求出来。对于许多应用程序,旋转不变性是不需要的,因此不需要找到这个方向,这加快了过程。SURF提供了这样的功能,称为 Upright-SURF 或 U-SURF。它提高了速度,并且在±15最大限度下都是有效的。OpenCV支持这两种,取决于标志,upright。如果是0,则计算方向。如果是1,则不计算方向,速度更快。
对于特征描述,SURF使用水平和垂直方向上的小波响应(同样,使用积分图像使事情更容易)。大小为20sx20的邻域以关键点为中心,其中s为尺寸。它被分为4x4个子区域。对每个子区域分别取水平方向和垂直方向的小波响应,向量形式为 v = ( ∑ d x , ∑ d y , ∑ ∣ d x ∣ , ∑ ∣ d y ∣ ) v=(∑dx,∑dy,∑|dx|,∑|dy|) v=(∑dx,∑dy,∑∣dx∣,∑∣dy∣)。当表示为向量时,给出了总共64维的SURF特征描述符。降低了维数,提高了计算和匹配的速度,但提供了更好的特征显著性。
为了更加有区分性,SURF 特征描述符有一个扩展的128维版本。当 d y < 0 dy<0 dy<0和 d y ≥ 0 dy≥0 dy≥0时, d x dx dx和 ∣ d x ∣ |dx| ∣dx∣分别计算。类似地, d y dy dy和 ∣ d y ∣ |dy| ∣dy∣的和根据 d x dx dx的符号被分割,从而使特征的数量翻倍。它不会增加太多的计算复杂度。OpenCV通过分别为 64-dim 和 128-dim 设置 0 和 1 扩展的标志值来支持这两种情况(默认是 128-dim )
另一个重要的改进是使用拉普拉斯符号(黑森矩阵迹)来表示潜在的兴趣点。它不会增加计算成本,因为它在检测时已经计算过了。拉普拉斯符号将黑暗背景上的明亮斑点与相反的情况区分开来。在匹配阶段,我们只比较具有相同类型对比度的特征(如下图所示)。这种最小的信息允许更快的匹配,而不会降低描述符的性能。
总之,SURF 在每一步中都增加了很多功能来提高速度。分析表明,它比SIFT快3倍,而性能与SIFT相当。SURF 擅长处理有模糊和旋转的图像,但不擅长处理仿射变化和光照变化。
【代码】
4.5.5 版本 暂不提供
【参考】
- OpenCV官方文档
- SURF: Speeded Up Robust Features