兴趣点的图像分析,我们需要构建多种表征方式,精确地描述每个关键点。这些描述子通常是二值类型、整数型或浮点数型组成的向量。好的描述子要具有足够的独特性和鲁棒性,能唯一地表示图像中的每个特征点,并且在亮度和视角变化时仍能提取出同一批点集。此外,尽量能够简洁,以减少计算资源的占用。
SIFT算法提出者 David Lowe
1.Harris、FAST
这两个特征检测算子不具有尺度不变等特性,所以使用这两个算子进行检测并匹配的效果一般不会很好。常见的方案是通过比较特征点附近的一个方块的像素集合的相似度,算法使用差的平方和(SSD),效果如下,这里不进行代码演示。可以看到,即使在视角差别不大的情况下,就已经有非常多的错误匹配项。
FAST & SSD
2.SIFT、SURF
so,尺度不变检测算子的优势就体现出来了。SIFT、SURF在检测出特征点之后,可以生成相应的描述子(Descriptor)。这些描述子具有的信息量比单纯地比较像素块的SSD多得多,于是能够更好地进行图像的匹配。至于描述子的数据结构,上一篇文章中提到过,这里不再赘述。其中SIFT是128维的向量,SURF则是检测Haar小波特征。
SIFT
SURF
直接进行匹配的话,也会有很多的错误匹配项,比上面那两位好不到哪里去。那么,算法研究员们想出了一些匹配策略,能够在一定程度上减少错误项。主要有:交叉检查匹配项
交叉检查是指在第一幅图像匹配到第二幅图像后,再用第二幅图像的关键点再逐个跟第一幅的图像进行比较,只有在两个方向都匹配了同一个关键点时,才认为是一个有效的匹配项。比率检测法
我们为每个关键点找到两个最佳的匹配项,方法是使用kNN最近邻(可以看我的这篇文章,其实在这里只是用了欧氏距离)。接下来计算排名第二的匹配项与排名第一的匹配项的差值之比(如果两个匹配项近乎相等,则结果接近为1)。比率过高的匹配项作为模糊匹配项,从结果中被排除。匹配差值的阈值化
很简单,就是将差值过大的匹配项排除掉。
上面的一些匹配策略可以结合使用来提升匹配效果。代码实现如下/******************************************************
* Created by 杨帮杰 on 10/5/18
* Right to use this code in any way you want without
* warranty, support or any guarantee of it working
* E-mail: yangbangjie1998@qq.com
* Association: SCAU 华南农业大学
******************************************************/#include #include #include #include #include #include #include #include #define IMAGE1_PATH "/home/jacob/下载/church01.jpg"#define IMAGE2_PATH "/home/jacob/下载/church02.jpg"#define IMAGE3_PATH "/home/jacob/下载/church03.jpg"using namespace cv;using namespace std;int main(){ /*******************SIFT、SURF