SIFT算法系列之匹配

简述

  说实话,SIFT算法系列博客已经过去很久了,SIFT算法也是读研期间研究最多的局部特征匹配框架。之前写过SIFT算法系列框架的理解,相关博客链接如下:

SIFT算法系列之尺度空间

SIFT算法系列之特征点检测

SIFT算法系列之描述符

  时间很快,距离我写SIFT算法系列已经过去一年多了,最近想把SIFT算法最后一部分匹配方式写完。算是对该系列算法的一个总结与结束吧,深度学习的今天很少关注传统算法,局部特征在04年后将近被学术界追了10年。今天已经很少在有研究的了,之所以这么久没有更新,主要是我也投入到深度学习的学习中,这篇SIFT算法之匹配算作最后一篇局部特征的个人总结。好了,废话不多说,下面介绍一下SIFT算法框架所用的相关匹配算法,是如何根据描述符来进行点集匹配的。

相关匹配算法

粗匹配

  粗匹配其实就是在两个未知的点集A与B,通过某一种规则来建立起来的联系进行匹配。局部特征通常采取的就是对每个特征点建立描述符,通过每个点的描述符与待匹配的点描述符计算欧式距离来判别。欧式距离就是一个判别准则,描述符就是提供的信息。至于粗匹配叫法:一是可以看出经过欧式距离匹配之后,还会存在大量的错误匹配点对,二是后面还会根据其它的规则进一步筛选,它是第一步所以有了粗匹配的名称。下面贴出经典的SIFT算法第一步匹配结果图如下:可以看出存在些许错误匹配点对。

SIFT算法系列之匹配_第1张图片
最近邻kNN匹配

  说到最近邻匹配,其实就是将特征点的描述符来计算欧式距离,然后对齐排序选取最小的距离点。下面将会使用图像来进行简单说明:

SIFT算法系列之匹配_第2张图片

得出图像 i m g 1 img_1 img1的特征点与 i m g 2 img_2 img2的特征点,进行欧式距离的计算,计算公式为:
d i s = ( d 1 − f 1 ) 2 + ( d 2 − f 2 ) 2 + . . . + ( d n − f n ) 2 dis=\sqrt{(d_1-f_1)^2+(d_2-f_2)^2+...+(d_n-f_n)^2} dis=(d1f1)2+(d2f2)2+...+(dnfn)2
图像 i m g 1 img_1 img1中的特征点分别于图像 i m g 2 img_2 img2的所有特征点进行距离计算,找出最近的距离,认为是初步的匹配点对。

近邻(distance < 0.8)匹配
  关于distance < 0.8的匹配策略,是最早的SIFT算法原作者采取的策略。主要思想是这样:假设待匹配的图像对分别为 I m g a Img_a Imga I m g b Img_b Imgb,对 I m g a Img_a Imga提取特征点 p o i n t s a points_a pointsa,对 I m g b Img_b Imgb提取特征点 p o i n t s b points_b pointsb。从 p o i n t s a points_a pointsa中任意一个点 p a p_a pa查找到特征点 p o i n t s b points_b pointsb最近的特征点 p b p_b pb,假设点 p a p_a pa p b p_b pb之间的距离为 d i s 1 dis_1 dis1。从 p o i n t s a points_a pointsa中任意一个点 p a p_a pa查找到特征点 p o i n t s b points_b pointsb次近的特征点 p c p_c pc。假设点 p a p_a pa p c p_c pc之间的距离为 d i s 2 dis_2 dis2。因此, d i s t a n c e = d i s 1 d i s 2 。 distance=\frac{dis_1}{dis_2}。 distance=dis2dis1如果 d i s t a n c e < 0.8 distance<0.8 distance<0.8,那么将其认为是正确的匹配点对,否则就剔除。

暴力 / 双向匹配

  暴力匹配法:一句话来说就是枚举来进行匹配筛选。之所以会有这个名称,是因为暴力匹配采取的策略是枚举所有的点集进行匹配,找到的是最佳点对,缺点就是计算效率比较低。随之对应的就是改变枚举的策略,进行快速搜索方式,有(Fast Library for Approximate Nearest Neighbors, FLANN)进行快速最近邻搜索,或者kd树搜索的方式。

  双向匹配:举例说明,假设存在点集A与B,a与b分别为A和B的点集对应的描述子。那么首先进行A–>B的匹配得到匹配点对 C A B C_{AB} CAB,然后进行B–>A的匹配得到匹配点对 C B A C_{BA} CBA最后取两个匹配点集的交集 D = ( C A B ∩ C B A ) D=(C_{AB}∩C_{BA}) D=(CABCBA),这个过程就是双向匹配。双向匹配能够有效的抑制错误匹配点对,缺点就是耗时比较大,曾经被用作SAR图像匹配算法上。具体可参考BFSIFT算法分析。

精匹配点集提纯算法:RANSAC & VFC
SIFT算法系列之匹配_第3张图片
  说到精确匹配点集,其实就是在粗匹配的基础上来去除由于粗匹配规则的缺陷带来的错误匹配点对,进行第二次筛选。类似于你在面试过程中按照不同的规则来筛选你最后想要去的公司一样。当然,精匹配的规则也并不是只有一种,所以才会存在不同的精匹配算法,如果你要问那个算法最佳,只能说各有千秋。具体RANSAC及其相关改进算法可以参考如下几篇:

浅谈随机采样一致性(RANSAC)算法实现
随机抽样一致RANSAC
RANSAC算法详解(附Python拟合直线模型代码)

  说到VFC算法主要是通过向量场流学习策略来进行点集的剔除错误点对,VFC不需要建立局部特征描述符,主要就是对点集的内部向量场构建的流来学习。具体VFC算法的部分建议参考原作者github:VFC代码说到VFC还有前两年提出的GMS的匹配,具体可以参考我的博客:OpenCV实践之GMS网格运动统计策略的特征匹配算法。

小结

  局部特征的兴起带来计算机视觉的快速应用,匹配策略有很多种模式。例如:相位信息、梯度信息、灰度信息等等。由于图像的特殊性,梯度信息使用最为广泛,主要是梯度信息基本不受光照变化的影响。匹配策略大概有上述几种模式,光学图像使用最多的就是knn+ransac来进行提取最终的匹配点集。对于匹配点难度较大的图像(雷达图像),一般匹配策略会偏向鲁棒性一些,例如BFSIFT就使用双向匹配。对于实时性要求较高的,一般会采取优化搜索匹配策略,例如FLANN、VFC等等。具体的应用来筛选不同的匹配策略,增加算法的灵活性。

  到这里,SIFT算法基本写完了。其实以SIFT为代表的局部特征匹配算法可以当作是一个框架来进行理解。拆解SIFT算法整个流程如下:尺度空间构建 + 特征点检测 + 描述符建立 + 特征点匹配;这个算法框架中的每个环节都有大量的科研工作成果,你可以随意进行组合来满足你的需求。最后,局部特征的视觉信息到此就结束了,希望对大家在入门视觉方面有所帮助。

参考文献

https://zhuanlan.zhihu.com/p/62238520
https://zhuanlan.zhihu.com/p/79386524
https://zhuanlan.zhihu.com/p/36301702
https://zhuanlan.zhihu.com/p/62238520
https://github.com/jiayi-ma/VFC

你可能感兴趣的:(图像处理)