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. PagerAdapter 普通写法

    1,viewPagre的普通写法 public ImagePagerAdapter(Context context, List<Photo> imgList) { this.mContex ...

  2. IOS6.0调用通讯录和之前的差别

    6.通讯录列表获取差异 自iOS6.0后获取通讯录列表需要询问用户,经过用户同意后才可以获取通讯录用户列表.而且ABAddressBookRef的初始化工作也由ABAddressBookCreate函 ...

  3. 三 Android Studio打包EgretApp (SDK选择和下载)

    一 设置项目的sdk路径 二 设置项目使用sdk版本 一 设置项目的sdk路径 设置SDK目录 选择你电脑上的sdk路径 二 在项目中设置SDK版本 在项目中设置编译的sdk版本 在SDK Manag ...

  4. 浏览器中使用 ES6 import

    html 中的 head 标签引入: <script src="test.js" type="module"></script> tes ...

  5. tomcat https 证书生成与配置

    第一步:生成证书 命令行输入: keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore &quo ...

  6. 使用response来控制浏览器的缓存

    缓存这个技术在我们实际的开发中是非常常用的,也是非常重要的一项技术.主要用于客户端(浏览器)向服务器端请求的是一些比较大的数据,并且这个数据在短时间内不会经常发生变化的情况,比如一些网站的logo图片 ...

  7. 网络模型一般是指 OSI 七层参考模型和 TCP/IP 五层参考模型。

    网络模型一般是指 OSI 七层参考模型和 TCP/IP 五层参考模型. 每一层实现各自的功能和协议,并且都为上一层提供业务功能.为了提供这 种业务功能,下一层将上一层中的数据并入到本层的数据域中,然后 ...

  8. Yii框架2.0的模块

    模块是个独立的软件单元,也是又控制器,视图,模型组成的,也可以有自己的布局.但他必须属于某个应用下,不能独立存在. 其中模块的控制器,视图和应用的控制器和视图使用基本相同,不作赘述,下面说说模块的使用 ...

  9. MapReduce分布式编程框架

    一.MapReduce分布式编程框架及yarn集群搭建 1.大数据解决的问题? 海量数据的存储:hadoop->分布式文件系统HDFS 海量数据的计算:hadoop->分布式计算框架Map ...

  10. Java-多线程基本

    Java-多线程基本 一 相关的概念 进程:是一个正在执行中的程序 每个进程都有一个执行的顺序,该顺序是一个执行路径,或者叫一个控制单元 线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行 ...