转自:https://www.cnblogs.com/jinjidexuetu/p/90ace4e8de574e3d5f4e6ac16a0dc157.html

另外加了些自己的理解


一、原理:

Sift算法的优点是特征稳定,对旋转、尺度变换、亮度保持不变性,对视角变换、噪声也有一定程度的稳定性;缺点是实时性不高,并且对于边缘光滑目标的特征点提取能力较弱。 
Surf(Speeded Up Robust Features)改进了特征的提取和描述方式,用一种更为高效的方式完成特征的提取和描述。

二、Surf实现流程如下:

1. 构建Hessian(黑塞矩阵),生成所有的兴趣点,用于特征的提取

黑塞矩阵(Hessian Matrix)是一个多元函数的二阶偏导数构成的方阵,描述了函数的局部曲率。由德国数学家Ludwin Otto Hessian于19世纪提出。 
surf构造的金字塔图像与sift有很大不同,SIFT对原图像不断地进行Gauss平滑+降采样,采用的是DOG图像,而surf采用的是Hessian矩阵行列式近似值图像。 
Hessian矩阵是Surf算法的核心,构建Hessian矩阵的目的是为了获取图像稳定的边缘点(突变点),为下文的特征提取做好基础。 SIFT算法使用DOG图像可以较好的获得图像特征点,但是对边缘点反应迟缓。
每一个像素点都可以求出一个Hessian矩阵。

SURF使用了斑点侦测的海森矩阵来侦测特征点,其行列式值代表相素点周围的变化量,因此特征点需取行列式值为极大、极小值。除此之外,为了达到尺度上的不变,SURF还使用了尺度σ的行列式值作特征点的侦测,给定图形中的一点x=(x, y),在尺度σ的海森矩阵为H(x, σ):

使用近似的Hessian矩阵行列式来表示图像中某一点x处的斑点响应值,遍历图像中所有的像元点,便形成了在某一尺度下特征点检测的响应图像。使用不同的模板尺寸,便形成了多尺度特征点响应的金字塔图像,利用这一金字塔图像,就可以进行特征点响应极值点的搜索,其过程完全与SIFT算法类同。

在SURF算法中,图像像素l(x,y)即为函数值f(x,y)。但是由于我们的特征点需要具备尺度无关性,所以在进行Hessian矩阵构造前,需要对其进行高斯滤波,选用二阶标准高斯函数作为滤波器。 
L(x,t)=G(t)⋅I(x,t) 
通过特定核间的卷积计算二阶偏导数。通过特定核间的卷积计算二阶偏导数,这样便能计算出H矩阵的三个矩阵元素L_xx, L_xy, L_yy从而计算出H矩阵: 
H(x,σ)=[Lxx(x,σ)Lxy(x,σ)Lxy(x,σ)Lyy(x,σ)] 
由于高斯核是服从正态分布的,从中心点往外,系数越来越低,为了提高运算速度,Surf使用了盒式滤波器来近似替代高斯滤波器,提高运算速度。 盒式滤波器(Boxfilter)对图像的滤波转化成计算图像上不同区域间像素和的加减运算问题,只需要简单几次查找积分图就可以完成。 
每个像素的Hessian矩阵行列式的近似值: 
det(H)=Dxx∗Dyy−(0.9∗Dxy)2 
在Dxy上乘了一个加权系数0.9,目的是为了平衡因使用盒式滤波器近似所带来的误差:

2. 构建尺度空间

同Sift一样,Surf的尺度空间也是由O组L层组成,不同的是,Sift中下一组图像的尺寸是上一组的一半,同一组间图像尺寸一样,但是所使用的高斯模糊系数逐渐增大;而在Surf中,不同组间图像的尺寸都是一致的,但不同组间使用的盒式滤波器的模板尺寸逐渐增大, 在通常尺度分析情况下,随着尺度的增大,被检测到的斑点数量迅速衰减。所以一般进行3-4组就可以了。同一组间不同层间使用相同尺寸的滤波器,但是滤波器的模糊系数逐渐增大。

3. 特征点定位

特征点的定位过程Surf和Sift保持一致,将经过Hessian矩阵处理的每个像素点与二维图像空间和尺度空间邻域内的26个点进行比较,初步定位出关键点,再经过滤除能量比较弱的关键点以及错误定位的关键点,筛选出最终的稳定的特征点。 

4. 特征点主方向分配

Sift特征点方向分配是采用在特征点邻域内统计其梯度直方图,而在Surf中,采用的是统计特征点圆形邻域内的harr小波特征。
以特征点为中心,计算半径为6s(S为特征点所在的尺度值)的圆形邻域内的点在x、y方向的Haar小波(Haar小波边长取4s)响应,Harr小波模板如图所示:


分别为X,Y方向响应 
计算出图像在哈尔小波的x和y方向上的响应值之后,对两个值进行因子为2S的高斯加权,加权后的值分别表示在水平和垂直方向上的方向分量。Harr特征值反应了图像灰度变化的情况,那么这个主方向就是描述那些灰度变化特别剧烈的区域方向。接着,以特征点为中心,张角为60°的扇形滑动,计算窗口内的Harr小波响应值dx、dy的累加: 
 


 
在所有的向量当中最长的(即x、y分量最大的)即为此特征点的方向。

5. 生成特征点描述子

在Sift中,是取特征点周围44个区域块,统计每小块内8个梯度方向,用着448=128维向量作为Sift特征的描述子。 
Surf算法中,也是在特征点周围取一个4
4的矩形区域块,但是所取得矩形区域方向是沿着特征点的主方向。每个子区域统计25个像素的水平方向和垂直方向的haar小波特征,这里的水平和垂直方向都是相对主方向而言的。该haar小波特征为水平方向值之后、垂直方向值之后、水平方向绝对值之后以及垂直方向绝对值之和4个方向。 

把这4个值作为每个子块区域的特征向量,所以一共有444=64维向量作为Surf特征的描述子,比Sift特征的描述子减少了一半。

6. 特征点匹配

与Sift特征点匹配类似,Surf也是通过计算两个特征点间的欧式距离来确定匹配度,欧氏距离越短,代表两个特征点的匹配度越好。 
不同的是Surf还加入了Hessian矩阵迹的判断,如果两个特征点的矩阵迹正负号相同,代表这两个特征具有相同方向上的对比度变化,如果不同,说明这两个特征点的对比度变化方向是相反的,即使欧氏距离为0,也直接予以排除。

另外,还可以加RANSAC算法做直线拟合方法对其进行错配点剔除。

另有部分来自:https://blog.csdn.net/YJThuicheng/article/details/83472163

特征提取(三)SURF算法详解相关推荐

  1. 人脸识别系列三 | MTCNN算法详解上篇

    前言 我们前面分享了PCA,Fisher Face,LBPH三种传统的人脸识别算法,Dlib人脸检测算法.今天我们开始分享一下MTCNN算法,这个算法可以将人脸检测和特征点检测结合起来,并且MTCNN ...

  2. 图像处理SIFT与SURF算法详解

    图像的特征点检测是图像配准的第一步,下面将为大家介绍尺度不变特征检测(SIFT)和加速鲁棒特征检测(SURF)两种算法. 一.SIFT算法 SIFT 算法是一种高精度的特征点检测算法.运用此算法检测出 ...

  3. UWB的三种算法详解

    超宽带UWB定位的三种常用定位算法,包括TDOA定位算法.TOF定位算法.TOA定位算法. (一)TOF定位算法 基于TOF的定位方法与基于TOA的定位方法在本质上是相同的,而TOF测距不依赖基站与标 ...

  4. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

  5. Unicode双向算法详解(bidi算法)(三)

    Unicode双向算法详解(bidi算法)(三) 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C++语法详解>一书相关章节的增补,以增强读者对 ...

  6. 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...

  7. 9. PKI - 三种密钥交换算法详解(RSA DHE ECDHE)及他们在SSL/TLS协议中的应用

    9. PKI - 三种密钥交换算法详解(RSA& DHE& ECDHE)及他们在SSL/TLS协议中的应用 RSA密钥交换算法 DHE密钥交换算法 ECDHE密钥交换算法 参考 密钥交 ...

  8. 目标检测 RCNN算法详解

    原文:http://blog.csdn.net/shenxiaolu1984/article/details/51066975 [目标检测]RCNN算法详解 Girshick, Ross, et al ...

  9. 【目标检测】Faster RCNN算法详解

    转载自:http://blog.csdn.net/shenxiaolu1984/article/details/51152614 Ren, Shaoqing, et al. "Faster ...

最新文章

  1. 国内42所一流大学综合排名出炉!清北之后谁是国内第三?
  2. 面试官:你知道java类是怎么跑起来的吗?问的我一脸懵
  3. NullPointerException异常的原因及java异常??
  4. Java 17正式发布, Oracle宣布免费提供!“版本任你发,我用Java 8”或成历史?...
  5. 同事查询多行_从零学会SQL-简单查询
  6. Spring boot的Thymeleaf使用
  7. 基于ZXing的二维码,你可以这样改造它
  8. 教你学会Linux/Unix下的vi文本编辑器
  9. 关于sencha touch 2的mvc问题的思考。
  10. 《OSPF网络设计解决方案(第2版)》一第2章 介绍OSPF
  11. 20200606:最长连续序列(leetcode128)
  12. JavaScript如何调用摄像头
  13. 在VS中安装nuget离线包nupkg文件
  14. 确保着法合规:象棋通用规则解析
  15. utools:比everything更好用的集成工具
  16. npm启动报错Eorror:ENOENT no such file or directory ‘/node-sass/vender‘
  17. uni-app 学习: 页面高度设置100%
  18. 【二分图匹配】【CSTC2000】丘比特的烦恼
  19. oracle导入dmp文件
  20. General error: 1366 Incorrect string value: '\xF0\x9F\x98\x8A' for column

热门文章

  1. Clone方法与浅拷贝深拷贝
  2. Adobe Photoshop—画笔动态画笔
  3. automapper java 有什么_AutoMapper用法
  4. 微信小程序 swiper组件轮播图宽度自适应
  5. Linux 基础篇 -- 虚拟机快照
  6. 考虑电动汽车灵活性的微网多时间尺度协调调度研究(Matlab代码实现)
  7. docker apache php-fpm AH01071: Got error 'Primary script unknown\n'
  8. 便携式蓝牙打印机iOS sdk
  9. webpack构建自定义vue组件库
  10. 在linux12.10环境下运行spec2006