SIFT特征和SURF特征比较_Blateyang的博客-程序员秘密

技术标签: SURF  SIFT  计算机视觉  尺度不变特征  

SIFT特征和SURF特征都是优秀的尺度不变特征,常用来进行物体辨识和图像匹配。所谓的尺度不变特征是指每个检测到的特征点都伴随着对应的尺寸因子(特征点的局部尺寸参数与特征的尺度成正比),下面就这两种著名的尺度不变特征进行简要的介绍和比较。(PS:由于两种特征提取算法的细节较多,本篇文章只简单介绍它们的原理、主要步骤和简单应用,主要关注两者的比较)

1 SIFT特征简介

1.1 SIFT原理

SIFT(Scale-Invariant Feature Transform)特征,即尺度不变特征变换,是一种计算机视觉的特征提取算法,用来侦测与描述图像中的局部性特征。它在尺度空间中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。

1.2 SIFT特征提取步骤

  1. 尺度空间的极值检测:尺度空间指一个变化尺度( σ )的二维高斯函数 G(x,y,σ) 与原图像 I(x,y) 卷积(即高斯模糊)后形成的空间,尺度不变特征应该既是空间域上又是尺度域上的局部极值。极值检测的大致原理是根据不同尺度下的高斯模糊化图像差异(Difference of Gaussians,DoG)寻找局部极值,这些找到的极值所对应的点被称为关键点或特征点。
  2. 关键点定位:在不同尺寸空间下可能找出过多的关键点,有些关键点可能相对不易辨识或易受噪声干扰。该步借由关键点附近像素的信息、关键点的尺寸、关键点的主曲率来定位各个关键点,借此消除位于边上或是易受噪声干扰的关键点。
  3. 方向定位:为了使描述符具有旋转不变性,需要利用图像的局部特征为给每一个关键点分配一个基准方向。通过计算关键点局部邻域的方向直方图,寻找直方图中最大值的方向作为关键点的主方向。
  4. 关键点描述子:找到关键点的位置、尺寸并赋予关键点方向后,将可确保其移动、缩放、旋转的不变性。此外还需要为关键点建立一个描述子向量,使其在不同光线与视角下皆能保持其不变性。SIFT描述子是关键点邻域高斯图像梯度统计结果的一种表示,见下图。通过对关键点周围图像区域分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。Lowe在原论文中建议描述子使用在关键点尺度空间内4*4的窗口中计算的8个方向的梯度信息,共4*4*8=128维向量表征。
    这里写图片描述

1.3 OpenCV中的SIFT应用

OpenCV2中有一个封装类用于检测SIFT特征,其简要应用代码如下:

//特征点的向量
std::vector<cv::KeyPoint> keypoints;
//构造SIFT特征检测器
cv::SiftFeatureDetector sift(
    0.03,    //特征的阈值
    10.)     //用于降低直线敏感度的阈值
//检测SIFT特征值
sift.detect(image,keypoints);

更多详细介绍可以参考以下链接:
1.尺度不变特征变换中文维基百科(如访问不了请用VPN访问)
2.SIFT算法详解

2 SURF特征简介

2.1 SURF原理

SURF(Speeded Up Robust Features, 加速稳健特征) 是一种稳健的图像识别和描述算法。它是SIFT的高效变种,也是提取尺度不变特征,算法步骤与SIFT算法大致相同,但采用的方法不一样,要比SIFT算法更高效(正如其名)。SURF使用海森(Hesseian)矩阵的行列式值作特征点检测并用积分图加速运算;SURF 的描述子基于 2D 离散小波变换响应并且有效地利用了积分图。

2.2 SURF特征提取步骤

  1. 特征点检测:SURF使用Hessian矩阵来检测特征点,该矩阵是x,y方向的二阶导数矩阵,可测量一个函数的局部曲率,其行列式值代表像素点周围的变化量,特征点需取行列式值的极值点。用方型滤波器取代SIFT中的高斯滤波器,利用积分图(计算位于滤波器方型的四个角落值)大幅提高运算速度。
  2. 特征点定位:与SIFT类似,通过特征点邻近信息插补来定位特征点。
  3. 方向定位:通过计算特征点周围像素点x,y方向的哈尔小波变换,并将x,y方向的变换值在xy平面某一角度区间内相加组成一个向量,在所有的向量当中最长的(即x、y分量最大的)即为此特征点的方向。
  4. 特征描述子:选定了特征点的方向后,其周围相素点需要以此方向为基准来建立描述子。此时以5*5个像素点为一个子区域,取特征点周围20*20个像素点的范围共16个子区域,计算子区域内的x、y方向(此时以平行特征点方向为x、垂直特征点方向为y)的哈尔小波转换总和 ΣdxΣdy 与其向量长度总和 Σ|dx|Σ|dy| 共四个量值,共可产生一个64维的描述子。

2.3 OpenCV中的SURF应用

OpenCV2中也有一个封装类用于检测SURF特征,其简要应用代码如下:

//特征点的向量
std::vector<cv::KeyPoint> keypoints;
//构造SURF特征检测器
cv::SurfFeatureDetector surf(
    2500.)     //阈值
//检测SURF特征值
surf.detect(image,keypoints);

更多详细介绍和应用可以参考以下链接:
1.加速稳健特征中文维基百科
2.浅墨的博客专栏 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑

3 SIFT特征和SURF特征比较

比较项目 SIFT SURF
尺度空间极值检测 使用高斯滤波器,根据不同尺度的高斯差(DOG)图像寻找局部极值 使用方形滤波器,利用海森矩阵的行列式值检测极值,并利用积分图加速运算
关键点定位 通过邻近信息插补来定位 与SIFT类似
方向定位 通过计算关键点局部邻域的方向直方图,寻找直方图中最大值的方向作为关键点的主方向 通过计算特征点周围像素点x,y方向的哈尔小波变换,将x、y方向小波变换的和向量的最大值作为特征点方向
特征描述子 是关键点邻域高斯图像梯度方向直方图统计结果的一种表示,是16*8=128维向量 是关键点邻域2D离散小波变换响应的一种表示,是16*4=64维向量
应用中的主要区别 通常在搜索正确的特征时更加精确,当然也更加耗时 描述子大部分基于强度的差值,计算更快捷
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Blateyang/article/details/76512398

智能推荐

httppost数据上传 unity_Unity3D携带Header发送POST请求_菜鸟特效的博客-程序员秘密

1、客户端 unity 发送post请求IEnumerator Post(){string url = "http://localhost/tp/public/api/v1/test";//header dataDictionary header = new Dictionary();header["Content-Type"] = "application/json";header["chars...

黑马程序员--java高新技术--eclipse开发工具_MsLinux386的博客-程序员秘密

---------------------- android培训、java培训、期待与您交流! ----------------------===================第1单元:概述 ======================01.课程价值与目标介绍===============第2单元:eclipse开发工具================02.eclipse

JavaString类对象的常用方法_小羊可可星冰乐的博客-程序员秘密

Java程序设计项目教程——String类对象的常用方法

022-云E办_全局异常处理 @ExceptionHandler注解【SQLIntegrityConstraintViolationException】_BigTree的学习之路的博客-程序员秘密

022-云E办_全局异常处理前言:一、介绍:1、SpringBoot全局异常处理方式主要两种:2、区别:二、代码实现:三、再次测试:全局异常捕获:前言:当删除操作时,正常删除时,就会正常删除。当删除某个字段,与其他字段关联的数据时,就会报错。无法删除或更新父行:外键约束失败(yeb.t_employee,约束t_employeeU ibfk_3外键(posId)在删除时引用t_position(id`)在更新时限制)报错信息对于程序员而言,可以帮助定位问题,如果将给用户看的话,用户是看不懂这个报

解析如何选用合适的肖特基二极管?_weixin_43747182的博客-程序员秘密

肖特基二极管是生产电子产品不可或缺的重要保护器件,尤其在便携式电子产品及开关电源中应用广泛,深受电子行业的喜爱,可是在肖特基二极管市场,如何才能挑选到合适自己产品的肖特基二极管那,这对于一些刚入电子行业的采购人员来讲,确实很头疼,可能一不下心就会踏入误区,看完下文,相信你会有醍醐灌顶的感觉。一、肖特基二极管定义:肖特基二极管是以其发明人肖特基博士(Schottky)命名的,SBD是肖特基...

随便推点

Springboot项目动态加载配置文件及刷新bean_springboot更新bean_西柚感觉日了狗的博客-程序员秘密

需求系统遇到这样一个需求,线上环境在配置文件发生变动时,可以不用经过重启,通过刷新接口的方式得到配置文件的加载,主要目的是为了迅速部署,避免因手动重启,处理不及时导致积压的问题问题1.程序中如何获取修改后的配置2.某些配置值是应用在bean里面的,在程序初始化的时候已经注入,如何修改这一部分。例如,程序是分主备环境的,kafka consumer的groupid或topic根据环境不同而改变,那么consumer若写在bean中,修改配置文件,要一并更新到bean中//示例代码,KafkaCon

IDEA+SpringBoot+支付宝沙箱支付_网页程序idea集成支付宝收款_啥昵称好呢?的博客-程序员秘密

一:环境配置参数1.下载支付宝官方提供的支付demo,https://docs.open.alipay.com/270/106291/我们下载java版本然后解压就可以看到项目结构:红色框里面,是需要我们去支付宝开发平台去申请配置的信息:免费注册蚂蚁金服开发者账号:注册地址:https://developers.alipay.com/developmentAccess/developmentAccess.htm申请步骤:用支付宝账号申请注册获得appId[配置文件必要]此处私

JavaScript 实现复制到剪贴板的总结_风雨雾花丶的博客-程序员秘密

最近开发需要用到复制文本内容,这是最详细的解释了吧转载: https://www.cnblogs.com/dodocie/p/7210253.html 在官网看到以下代码,原生JS把input输入的内容复制到剪贴板&amp;lt;p&amp;gt;点击复制后在右边textarea CTRL+V看一下&amp;lt;/p&amp;gt;&amp;lt;input type=&quot;text&quot; id=&quot;inputText&quot;...

Neutron模块oslo.messaging_oslo messaging示例_half-beast的博客-程序员秘密

前面简单介绍过Neutron消息中间件RabbitMQ的用法。学习过的人,相信对RabbitMQ不会再有陌生感。接下来将会继续介绍Neutron中消息通信模块oslo.messaging。它是OpenStack公共库oslo中的一个组件,封装了RPC调用,为RPC和事件通知提供了一套统一的接口。使用过OpenStack的人都知道,目前原生OpenStack底层MQ驱动默认是kombu。那么为什么OpenStack又在此基础上做了一层封装?在编程领域,一个显而易见的原因是减少模板代码和对底层驱动提供更加灵

c语言常用字符串操作函数_在c语言中,给字符变量赋值的专用函数是_5念since的博客-程序员秘密

1、puts函数说明函数功能这个函数很简单,只有一个参数。s可以是字符指针变量名、字符数组名,或者直接是一个字符串常量。功能是将字符串输出到屏幕。输出时只有遇到 ‘\0’ 也就是字符串结束标志符才会停止。函数原型# include &lt;stdio.h&gt;int puts(const char *s);函数应用# include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;int main(void){ char name[]

推荐文章

热门文章

相关标签