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. linux下/proc/diskstats文件详解

    每一列的含义分别为: 第一列为 设备号 (number of issued reads. This is the total number of reads completed successfull ...

  2. 小程序swiper效果高宽设置(微信小程序交流群:604788754)

    swiper的宽和高一定要设置在swiper上面.swiper-item默认继承swiper的宽和高.swiper-item容器里面的宽和高没有继承他的父节点宽和高,需要从新设置. 不明白之处,可以咨 ...

  3. Ubuntu16.04无法使用WiFi

    本人联想431,安装ubuntu16.04  lts,打开之后没有wife,参考这个解决 http://blog.csdn.net/bubblem/article/details/53575017 U ...

  4. http协商缓存VS强缓存

    之前一直对浏览器缓存只能描述一个大概,深层次的原理不能描述上来:终于在前端的两次面试过程中被问倒下,为了泄恨,查阅一些资料最终对其有了一个更深入的理解,废话不多说,赶紧来看看浏览器缓存的那些事吧,有不 ...

  5. window.open()打开页面

    一.window.open()支持环境:JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二.基本语法:window.open(pageURL,name,pa ...

  6. C/S与B/S架构对比

    概述 在这个信息急剧膨胀的社会,我们不得不说人类正进入一个崭新的时代,那就是信息时代.信息时代的一个主要而显著的特征就是计算机网络的应用.计算机网络从最初的集中式计算,经过了Client/Server ...

  7. docker samba

    这个就是匿名用户可以登录访问,不能写. root登录,就可以写了. #命令,是在物理机上运行的. 主要是根据dockerfile构建镜像. 启动容器 进入镜像 设置root密码. 附smb.conf ...

  8. PC/FORTH 判定

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  9. [Leetcode 44]通配符匹配Wildcard Matching

    [题目] 匹配通配符*,?,DP动态规划,重点是*的两种情况 想象成两个S.P长度的字符串,P匹配S. S中不会出现通配符. [条件] (1)P=null,S=null,TRUE (2)P=null, ...

  10. Java 中的代理模式及动态代理

    原文:https://blog.csdn.net/briblue/article/details/73928350