SIFT算法是一种基于尺度空间的算法。利用SIFT提取出的特征点对旋转、尺度变化、亮度变化具有不变性,对视角变化、仿射变换、噪声也有一定的稳定性。

SIFT实现特征的匹配主要包括四个步骤:

  • 提取特征点
  • 计算关特征点的描述子
  • 利用描述子的相似程度对特征点进行匹配
  • 消除误匹配点

1、 提取特征点

构建尺度空间:模拟图像的多尺度特征。经证实,唯一可能的尺度空间核是高斯函数。用L(x,y,σ)表示一幅图像的尺度空间,由可变尺度的高斯函数G(x,y,σ)和图像卷积产生,即,其中,(x,y)表示图像上的点,σ是尺度因子。

 

高斯金字塔:

  • 将图像与不同σ的高斯函数做卷积
  • 对图像进行降采样

第一阶的第一层是原始图像,同一阶中相邻两层的尺度因子比例为k,其它层依次类推。

第二阶第一层的尺度因子来自于第一阶中间层的尺度因子。

DOG金字塔

Laplace算子:,具有旋转不变性(证明参考)。

LOG算子:将Laplace算子与高斯函数相结合,

为了简化LOG的计算,提出了DOG算子即高斯差分函数:

所以, 而

所以

根据上面可知,高斯差分算子只是比LOG算子多了一个系数(k-1),并不影响特征点的求解。

所以DOG函数如下:

DOG金字塔通过高斯金字塔相邻尺度空间函数相减得到,第一层的尺度因子与高斯金字塔第一层的尺度因子一致。

检测极值点,初步确定特征点

该步骤检测DOG空间的最大最小值,需要对DOG尺度空间的每个像素点(除去最顶层最底层)与其周围26个像素点(如下图,同层相邻8个,上一层9个,下一层9个)进行比较。若结果是该像素点比其周围26个像素点值都大或都小,则初步判断为局部极值点,记下其位置和尺度因子。若结果是该像素点比其周围26个像素点值都大或都小,则初步判断为局部极值点,记下其位置和尺度因子。

对上一步得到的特征点进行筛选,去除低对比度及边缘的点。

精确定位极值点:

我们找的极值点属于离散空间上的点,不一定是真正极值点,需要一条曲线进行拟合。

设A(x0,y00)为检测到的极值点,B(x,y,σ)为真正的极值点,在A附近应用泰勒展开公式:

D对x求导,令其为0得:

带入上式得:

若上式求出的中|Δx|或|Δy|或|Δσ|中有一个>0.5,表示该插值点偏离了插值中心,

令x=x+round(Δx)

y=y+round(Δy)

σ=σ+round(Δσ)

继续插值直到达到最大迭代次数或|Δx|、|Δy|、|Δσ|均<0.5。

对得到的极值点B计算D(B)进行低对比度筛选。

消除边缘效应:

目的是消除边缘极值点。边缘极值点满足的条件是:一个方向上变化率非常小,另一个方向上变化率较大(如在黑板上画一条水平线,则水平方向灰度值变化率非常小,垂直方向变化率大,且主曲率与黑塞矩阵的特征值成正比)。根据这一性质,求出黑塞矩阵,设H的特征值为λ1、λ2,其中较大的是λ1。令r=λ12,则边缘极值点即是r比较大的点,设r阈值为thres,对所有的极值点判断其r值是否大于thres,若大于则去除。

更简单的方法是,利用进行筛选,其中λ11=tr(H),λ1λ2=|H|。

寻找特征点主方向:

对于任一像素点(x,y),

其梯度值:

梯度方向:

对于每个特征点,统计以其为中心的邻域内的像素梯度方向,用直方图表示统计结果,直方图的峰值就是该特征点的主方向。

2、特征点描述子:

以特征点x为中心画圆邻域,将该邻域划分成16个子区域。每为一个单位,那么总共有8个刻度,统计每个子区域内8个刻度值,如下图:

则用16x8=128维矢量作为该特征点的描述子。

3、特征匹配:

分别提取图像1、图像2的特征点并计算描述子。对图像1的每个特征点f,在图像2中找到距离其最近的两个特征点k1、k2,并计算f与k1、f与k2之间夹角θ1、θ2,

,则为一对匹配点。

4、消除误匹配点:使用RANSAC算法消除误匹配点

  • 随机找到8个特征点对,使用八点法计算基础矩阵F
  • 用F验算剩余特征点对,计算用F验算成功的点对数n
  • 重复一定次数,找到使n达到最大值的F,不满足F的特征点对删除。

利用SIFT进行特征匹配的更多相关文章

  1. OpenCV-Python sift/surf特征匹配与显示

    import cv2 import numpy as np def drawMatchesKnn_cv2(img1_gray,kp1,img2_gray,kp2,goodMatch): h1, w1 ...

  2. 【特征匹配】SIFT原理之KD树+BBF算法解析

    转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/47606159 继上一篇中已经介绍了SIFT原理与C源代码剖析,最后得到了一系列 ...

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

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

  4. opencv学习之路(34)、SIFT特征匹配(二)

    一.特征匹配简介 二.暴力匹配 1.nth_element筛选 #include "opencv2/opencv.hpp" #include <opencv2/nonfree ...

  5. 第十六节、基于ORB的特征检测和特征匹配

    之前我们已经介绍了SIFT算法,以及SURF算法,但是由于计算速度较慢的原因.人们提出了使用ORB来替代SIFT和SURF.与前两者相比,ORB有更快的速度.ORB在2011年才首次发布.在前面小节中 ...

  6. SIFT提取特征

    SIFT特征提取: 角点检测: Morvavec角点检测算子:基于灰度方差的角点检测方法,该算子计算图像中某个像素点沿水平.垂直方向上的灰度差异,以确定角点位置 Harris角点检测算子:不止考察水平 ...

  7. python利用sift和surf进行图像配准

    1.SIFT特征点和特征描述提取(注意opencv版本) 高斯金字塔:O组L层不同尺度的图像(每一组中各层尺寸相同,高斯函数的参数不同,不同组尺寸递减2倍) 特征点定位:极值点 特征点描述:根据不同b ...

  8. 特征提取(Detect)、特征描述(Descriptor)、特征匹配(Match)的通俗解释

    特征匹配(Feature Match)是计算机视觉中很多应用的基础,比如说图像配准,摄像机跟踪,三维重建,物体识别,人脸识别,所以花一些时间去深入理解这个概念是不为过的.本文希望通过一种通俗易懂的方式 ...

  9. OpenCV探索之路(二十三):特征检测和特征匹配方法汇总

    一幅图像中总存在着其独特的像素点,这些点我们可以认为就是这幅图像的特征,成为特征点.计算机视觉领域中的很重要的图像特征匹配就是一特征点为基础而进行的,所以,如何定义和找出一幅图像中的特征点就非常重要. ...

随机推荐

  1. 谈一谈JUnit神奇的报错 java.lang.Exception:No tests found matching

    最近在学习Spring+SpringMVC+MyBatis,一个人的挖掘过程确实有点艰难,尤其是有一些神奇的报错让你会很蛋疼.特别是接触一些框架还是最新版本的时候,会因为版本问题出现很多错误,欢迎大家 ...

  2. 转:Java工程师成神之路~(2018修订版)

    转: http://www.hollischuang.com/archives/489 阿里大牛珍藏架构资料,点击链接免费获取 针对本文,博主最近在写<成神之路系列文章> ,分章分节介绍所 ...

  3. asp.net mvc如何获取url的相关信息

    1.获取完整url信息(协议名+域名+虚拟目录名+文件名+参数) string url = Request.Url.ToString(); 如: //1)获取完整url(协议名+域名+虚拟目录名+文件 ...

  4. fzu1977

    题解: 和前两题差不多 只不过变成了有些一定走,有些不一定 代码: #include<cstdio> #include<cmath> #include<algorithm ...

  5. 和的java程序

  6. Mysql InnoDB三大特性-- change buffer

    Mysql InnoDB三大特性-- change buffer

  7. Linux查看某个进程的磁盘IO读写情况 pidstat

    一.现象 1)钉钉告警不断,告警如下CPU使用达到100% 普罗米修斯监控 2)查看数据库,没有发现比平时同一时段,业务量的增加.但是,数据库显示latch free等告警,验证了CPU使用过高导致. ...

  8. oracle日志相关的表

    SELECT * FROM all_objects t where  object_name like '%EN_CONCAT_IM%';DBA_HIST_SQLTEXTDBA_HIST_SQLSTA ...

  9. xml解析与生成的学习资料

    xml解析与生成的学习资料:http://blog.csdn.net/u012325167/article/category/6129813 ----------------------------- ...

  10. tomcat启动失败,提示信息:Unable to ping server at localhost:1099

    jdk1.7+maven9.0.0开启服务器时,提示Unable to ping server at localhost:1099 然后换成tomcat8.5.1就成功开启服务器