利用SIFT进行特征匹配
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,y0,σ0)为检测到的极值点,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=λ1/λ2,则边缘极值点即是r比较大的点,设r阈值为thres,对所有的极值点判断其r值是否大于thres,若大于则去除。
更简单的方法是,利用进行筛选,其中λ1+λ1=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进行特征匹配的更多相关文章
- OpenCV-Python sift/surf特征匹配与显示
import cv2 import numpy as np def drawMatchesKnn_cv2(img1_gray,kp1,img2_gray,kp2,goodMatch): h1, w1 ...
- 【特征匹配】SIFT原理之KD树+BBF算法解析
转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/47606159 继上一篇中已经介绍了SIFT原理与C源代码剖析,最后得到了一系列 ...
- Sift算子特征点提取、描述及匹配全流程解析
Sift之前的江湖 在Sift横空出世之前,特征点检测与匹配江湖上占据霸主地位的是角点检测家族.先来探究一下角点家族不为人知的恩怨情仇. 角点家族的族长是Moravec在1977年提出的Moravec ...
- opencv学习之路(34)、SIFT特征匹配(二)
一.特征匹配简介 二.暴力匹配 1.nth_element筛选 #include "opencv2/opencv.hpp" #include <opencv2/nonfree ...
- 第十六节、基于ORB的特征检测和特征匹配
之前我们已经介绍了SIFT算法,以及SURF算法,但是由于计算速度较慢的原因.人们提出了使用ORB来替代SIFT和SURF.与前两者相比,ORB有更快的速度.ORB在2011年才首次发布.在前面小节中 ...
- SIFT提取特征
SIFT特征提取: 角点检测: Morvavec角点检测算子:基于灰度方差的角点检测方法,该算子计算图像中某个像素点沿水平.垂直方向上的灰度差异,以确定角点位置 Harris角点检测算子:不止考察水平 ...
- python利用sift和surf进行图像配准
1.SIFT特征点和特征描述提取(注意opencv版本) 高斯金字塔:O组L层不同尺度的图像(每一组中各层尺寸相同,高斯函数的参数不同,不同组尺寸递减2倍) 特征点定位:极值点 特征点描述:根据不同b ...
- 特征提取(Detect)、特征描述(Descriptor)、特征匹配(Match)的通俗解释
特征匹配(Feature Match)是计算机视觉中很多应用的基础,比如说图像配准,摄像机跟踪,三维重建,物体识别,人脸识别,所以花一些时间去深入理解这个概念是不为过的.本文希望通过一种通俗易懂的方式 ...
- OpenCV探索之路(二十三):特征检测和特征匹配方法汇总
一幅图像中总存在着其独特的像素点,这些点我们可以认为就是这幅图像的特征,成为特征点.计算机视觉领域中的很重要的图像特征匹配就是一特征点为基础而进行的,所以,如何定义和找出一幅图像中的特征点就非常重要. ...
随机推荐
- listener.ora和tnsnames.ora格式解析
listener.ora是oracle数据库服务端的监听配置文件,包括协议.IP地址和端口等内容:tnsnames.ora是oracle数据库客户端的连接配置文件,也是对应的协议.IP地址和端口等内容 ...
- Net Core2.0 升级到.Net Core 2.1
1. 安装新 .Net Core SDK 2.1 2. 升级VS.net 到15.7, 这个版本极其不好用,IIS打中文会自动退出,但现在也没办法降级了.只能等微软打补丁. 3. 对于面向 ASP.N ...
- 最新jquery+easyui_api培训文档
目 录 1 Accordion(可折叠标签) 2 1.1 实例 2 1.2 参数 3 2 DateBox(日期框) 4 2.1 实例 4 2.2 参数 6 2.3 事件 6 2.4 方法 6 3 C ...
- 回声TCP服务器端/客户端
一.TCP服务端 1.TCP服务端的默认函数调用顺序 socket()创建套接字 bind()分配套接字地址 listen()等待请求连接状态 accept()允许连接 read()/write()数 ...
- Win10系列:VC++媒体播放控制3
(5)添加视频进度条 视频进度条可以用来显示当前视频的播放进度,并可以通过拖动视频进度条来改变视频的播放进度.接下来介绍如何实现视频进度条,首先打开MainPage.xaml文件,并在Grid元素中添 ...
- Linux电源管理-Linux regulator framework概述
前言 1. 什么是regulator? regulator翻译为"调节器",分为voltage regulator(电压调节器)和current(电流调节器).一般电源 ...
- js 图片延时加载
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- Spring MVC之DispatcherServlet初始化详解
Spring作为一个优秀的web框架,其运行是基于Tomcat的.在我们前面的讲解中,Spring的驱动都是使用的ClassPathXmlApplicationContext,并且都是直接在main方 ...
- 设计一个高质量的API接口
参考网址:http://url.cn/5UaTeyv 前言 在设计接口时,有很多因素要考虑,如接口的业务定位,接口的安全性,接口的可扩展性.接口的稳定性.接口的跨域性.接口的协议规则.接口的路径规则. ...
- 执行这些代码, Edit1只能输入数字,小数点和负号,负号和小数点只能输入一个,负号必须在最前,粘贴的数字必须完全正确.
执行这些代码, Edit1只能输入数字,小数点和负号,负号和小数点只能输入一个,负号必须在最前,粘贴的数字必须完全正确. type TForm1 = class(TForm) Edit1: TEdit ...