https://www.zhihu.com/question/23371175

我需要把一张照片和训练集中的图片进行匹配。我把一张照片提取特征值并建立kd树,然后把训练集的图片依次读进来,然后把图片的特征点依次放进kd树里面找最近的点,第一个问题就是这2个点的距离,方向之比,长度之比在什么范围内算是匹配的?第二个问题是匹配的特征点与总共的特征点之比达到什么范围就可以认为2幅图片是匹配的?第三个问题是我们是需要找到一幅匹配的图片就结束还是遍历所有图片以后找到最匹配的图片再结束?
关注者
180
 
被浏览
21452
添加评论
分享

邀请回答

 
收起
关注问题写回答
 

3 个回答

默认排序
图像检索/计算机视觉
70 人赞同了该回答

题主应该是如果只是想知道SIFT是怎么在两幅图像间进行匹配的话,下面是我总结的四种匹配方法,希望对题主了解SIFT匹配过程有帮助。

一般在词袋模型中,为了提高检索的精度,你可以通过很多的trick来提高其精度(mAP),其中一个广泛使用的技巧就是对返回的图像进行重排,重排有很多种方法,比如对多特征在分数层(决策层)进行融合也是一种重排方式,不过这里要做的是通过剔除查询图像与候选图像错配点对的方式进行重排,剔除错配点一般采用的是RANSAC算法,关于RANSAC原理可以阅读RANSAC算法做直线拟合这篇文章,或者采用类RANSAC算法。作为初级阶段的实践,这里从两幅图像的匹配逐步深入。

代码下载:下面贴图的结果的代码都可以sift(asift)-match-with-ransac-cpp下载。

1NN匹配

“1NN匹配”(勿wiki,自创的一个词汇),讲起来比较顺口,而且从字面也应该可以猜测出点意思来,所以就这么写在这里了。所谓的“1NN”匹配,即是对于图像im1中的某个SIFT特征点point1,通过在im2图像上所有SIFT关键点查找到与point1最近的SIFT关键点,重复这个过程,即可得到图像im1中所有的特征点在im2中的匹配点(最近邻,1NN)。这种匹配方法,会出现很多的错配点,下面是采用1NN匹配的结果:

从上图可以看到,1NN匹配的方法出现了很多的错配点,而这些错配点对无论是对图像检索中的重排,还是图像拼接等,都是不希望看到的,所以得进一步对其中的错配点对进行剔除,下面采用“1NN/2NN<0.8”的方法进行错配点对剔除。

1NN/2NN<0.8

"1NN/2NN<0.8",不要诧异你未见过这样一种说法,没错,自己瞎创的一种表述。对上面1NN方法理解了,这个水到渠成。所谓“1NN/2NN<0.8”,即对于图像im1中的某个SIFT特征点point1,通过在im2图像上所有SIFT关键点查找到与point1最近的SIFT关键点point21(记该关键点point21到point1的距离为dis1)和次近的关键点point22(记该关键点point22到point1的距离为dis2),如果dis1/dis2<0.8,则我们将其视为正确匹配的点对,否则则为错配的点对予以剔除。这种寻找匹配的方法,由Lowe在其Distinctive image features from scale-invariant keypoints中有说明,当然,0.8这个阈值是可以调整的,不过一般都采用0.8。下面是采用该方法进行匹配后的结果:

可以看到,经过该方法匹配后,相比与“1NN”匹配方法,相比于“1NN”,这种方法进行匹配时有了很大的改善,不过正配点相比与1NN有部分损失。下面再探讨用RANSAC方法对这两种情况进行错配点剔除。

1NN+RANSAC

回到前面的“1NN”匹配的点对,我们再采用RANSAC方法对其进行错配点剔除,RANSAC方法的原理前面已有相关文章RANSAC算法做直线拟合,这里不再重复,相关的代码请看utils.cpp中findInliers函数,调用的是OpenCV中的cv::findFundamentalMat函数计算其变换矩阵,下面是“1NN”经过RANSAC剔除错配点对的结果:

可以看到,经过RANSAC后,“1NN”中的很多错配点对差不多剔除得比较好了,不过还有错配的点对没有剔除掉,图中用红色矩形框标出了未剔除的错配点对。我们在来看看对“1NN/2NN<0.8”进行RANSAC后会是怎样的结果呢?

1NN/2NN<0.8+RANSAC

在看匹配结果前,我们可以先做一个大概的预测,因为“1NN/2NN<0.8”得到的很多点就是正确匹配的点对,所以将其放入RANSAC中后,能够得到很好的拟合模型,所以其剔除错配点对效果也应该更好。为了验证这一预测,我们看一下“1NN/2NN<0.8+RANSAC”具体的效果,如下图所示:

可以看到,已经完全没有错配点了,从这一点来说,其效果是非常好的。不过,从正配点对数目来看,“1NN+RANSAC”的结果更密集,也就是说“1NN+RANSAC”包含了更多的正配点对,“1NN/2NN<0.8+RANSAC”正配点对要稍微少些。在大多数情况下,我们会选择完全剔除了错配点对的模型。

上面分别介绍了两种匹配方法,分别是“1NN”和“1NN/2NN<0.8”匹配方法,以及对它们采用RANSAC剔除错配点对的方法。有时候,如果要求经过RANSAC匹配后保留更多的正配点对,这时候,我们可以采用Affine-SIFT,简称ASIFT,具体可以阅读ASIFT: An Algorithm for Fully Affine Invariant Comparison这篇文章,作者提供了ASIFT的C++代码和匹配算法,可以在ASIFT下载得到,我大概跑了一下里面的demo,相比与SIFT,ASIFT可以提取到很多的关键点,对旋转等变换具有更好的不变性,不过缺点也很明显,速度实在太慢,很难做到实时,所以要使用的话,一般应用在对实时性不做要求的场合。我那个代码里有OpenCV的实现,你也可以试一下其效果,该OpenCV代码实现来源于OPENCV ASIFT C++ IMPLEMENTATION,OpenCV自带其Python实现,使用比较方便,就是速度太慢,所以自己在图像检索在写的项目中,也不打算用它了。

--------------------------------------------------------------------------------------------------------------------------------------------

更新一下:

这两天自己用c++重新写的一个剔除错配点的方法,效果很不错:

先到这里,还有很多坑要填。

7014 条评论

分享

收藏感谢收起

更专注才会更自由
10 人赞同了该回答
思路错了!
SIFT特征属于图像局部不变性特征,这类特征比较常用来进行图像配准,注意不是图像匹配,它关心的是图像上像素及像素领域的属性,往往是同一物体在不同位置和不同时刻形成的两幅图像的配准。
图像匹配一般使用全局特征,如颜色直方图,感知哈希编码等特征。
108 条评论

分享

收藏感谢

多听、多看,少说。
Lowe的SIFT代码网上是有很多大牛写的代码的,参考一下就好。

sift算法特征点如何匹配?的更多相关文章

  1. SIFT算法

     备注:源代码还未理解,所以未附上——下周任务 一.SIFT算法 1.算法简介 尺度不变特征转换即SIFT (Scale-invariant feature transform)是一种计算机视觉的算法 ...

  2. SIFT算法:特征描述子

    SIFT算法:DoG尺度空间生产  SIFT算法:KeyPoint找寻.定位与优化 SIFT算法:确定特征点方向  SIFT算法:特征描述子 目录: 1.确定描述子采样区域 2.生成描述子 2.1 旋 ...

  3. SIFT算法:确定特征点方向

    SIFT算法:DoG尺度空间生产  SIFT算法:KeyPoint找寻.定位与优化 SIFT算法:确定特征点方向  SIFT算法:特征描述子 目录: 1.计算邻域梯度方向和幅值 2.计算梯度方向直方图 ...

  4. 利用SIFT进行特征匹配

    SIFT算法是一种基于尺度空间的算法.利用SIFT提取出的特征点对旋转.尺度变化.亮度变化具有不变性,对视角变化.仿射变换.噪声也有一定的稳定性. SIFT实现特征的匹配主要包括四个步骤: 提取特征点 ...

  5. Sift算子特征点提取、描述及匹配全流程解析

    Sift之前的江湖 在Sift横空出世之前,特征点检测与匹配江湖上占据霸主地位的是角点检测家族.先来探究一下角点家族不为人知的恩怨情仇. 角点家族的族长是Moravec在1977年提出的Moravec ...

  6. Surf算法特征点检测与匹配

    Speeded Up Robust Features(SURF,加速稳健特征),是一种稳健的局部特征点检测和描述算法.最初由Herbert Bay发表在2006年的欧洲计算机视觉国际会议(Europe ...

  7. OpenCV计算机视觉学习(13)——图像特征点检测(Harris角点检测,sift算法)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 前言 ...

  8. SIFT算法中DoG特征点的修正

    SIFT算法中,在DoG空间找到极值点后,需要对极值点进行修正,本文主要详细的讲解一下为什么需要修正,以及如何对极值点进行修正. 下图演示了二维函数离散空间得到的极值点与连续空间的极值点之间的差别 利 ...

  9. SIFT算法详解(转)

    http://blog.csdn.net/zddblog/article/details/7521424 目录(?)[-] 尺度不变特征变换匹配算法详解 Scale Invariant Feature ...

随机推荐

  1. Zabbix-3.0.0 安装Graphtree

    导读 Zabbix中,想要集中展示图像,唯一的选择是screen,后来zatree解决了screen的问题,但性能不够好.Graphtree 由OneOaaS开发并开源出来,用来解决Zabbix的图形 ...

  2. 比较好用的Opera 翻译工具 ddict

    http://ddict.me

  3. 如何让listview滚动到底部

    方法一: // msgListView是ListView控件 // adapter是ListView绑定的Adapter,如果不方便直接使用,也可以通过ListView的getAdapter()方法获 ...

  4. SharePoint PerformancePoint开发实例

    前言 由于工作的原因,有一段时间没有发新的随笔了,最近使用了SharePoint PerformancePoint做了一些报表,与大家分享经验. 本文完全原创,转载请说明出处,希望对大家有用. 阅读目 ...

  5. Spoken English Practice(1、This is between you and me, Don't let it out. 2、Don't let your dreams be dreams, no matter how hard it gets, say to yourself, I'm going to make it.)

    绿色:连读:                  红色:略读:               蓝色:浊化:               橙色:弱读     下划线_为浊化 口语蜕变(2017/7/12) ...

  6. Abp Uow 设计

    初始化入口 在AbpKernelModule类中,通过UnitOfWorkRegistrar.Initialize(IocManager) 方法去初始化 /// <summary> /// ...

  7. #include <sys/epoll.h> epoll - I/O event notification facility 服务器端 epoll(7) - Linux manual page http://www.man7.org/linux/man-pages/man7/epoll.7.html

    epoll使用详解(精髓) - Boblim - 博客园 https://www.cnblogs.com/fnlingnzb-learner/p/5835573.html epoll使用详解(精髓) ...

  8. 移除 URL 中的 index.php

    w 将.htaaccess 放至该站点根目录. http://codeigniter.org.cn/user_guide/general/urls.html 如果你的 Apache 服务器启用了 mo ...

  9. java基础06 switch

    public class SwitchDemo01 { /** * 韩嫣参加计算机编程大赛 如果获得第一名,将参加麻省理工大学组织的1个月夏令营 如果获得第二名,将奖励惠普笔记本电脑一部 如果获得第三 ...

  10. LeetCode—Unique Paths

    题目: A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...