SURF原理分析

本文转载自http://blog.csdn.net/luoshixian099/article/details/47807103。

SURF (Speed Up Robust Features)是SIFT改进版也是加速版,提高了检测特征点的速度,综合性能要优于SIFT。

1.积分图像

SURF是对积分图像进行操作,从而实现了加速,采用盒子滤波器计算每个像素点的Hessian矩阵行列式时,只需要几次加减法运算,而且运算量与盒子滤波器大小无关,所以能够快速的构成出SURF的尺度金字塔。

积分图像中每个像元的值,是原图像上对应位置的左上角所有元素之和

如上图:我们要得到绿色矩形区域内的矩形像素之和S,只需要在积分图上,运算S=D-B-C+A就可以得到。

2.尺度空间的构造

2.1

对DoH的近似

SIFT采用了对LoG的近似算法DoG,而SURF (Speed Up Robust Features) 采用对DoH近似进行特征点检测,LoG与DoH是检测特征点的两种常用方法。

连续函数f(x,y)的二阶微分Hessian矩阵。

我们可以利用Hessian矩阵的行列式值判断点(x,y)是否是极值点

在离散空间上,为了得到Hessian矩阵的四个元素,SURF采用二阶标准高斯核函数的对图像卷积运算,因为高斯核可以构造出不同尺度下的响应图像。在尺度σ下,点 X=(x,y) 处,对应的Hessian矩阵。

Lxx是标准高斯函数g(x,y,σ)的二阶偏导数与图像在点(x,y)处卷积的结果;

同理,Lyy,Lxy的计算方法。这样可以计算出图像上所有点的Hessian行列式值。

为了能加速运算,Bay等人采用盒子滤波器对高斯二阶微分模板近似处理。

Lyy                                   Lxy                                    Dyy                                     Dxy

如图所示,图1是y方向的二阶高斯微分模板,图3采用盒子滤波器对其进行近似,数字表示对应颜色区域的权值,灰色区域权值为0,采用盒子滤波器与图像卷积的结果记为Dxx,Dyy,Dxy。因为盒子滤波器在积分图像上计算非常快。

由于是对原Hessian矩阵的近似,由相关推导可以证明采用下面的公式,更接近真实值。由于不同的尺度下,对应的值(0.9)不同,这里为了统一,要求计算盒子滤波响应时,对模板盒子进行归一化处理。

采用上面的公式,图像上每一个像素点计算出一个Hessian矩阵响应值,作为在尺度σ下的响应图像。

2.2

构造尺度空间

构造尺度空间是为了在空间域与尺度域上找到极值点,作为初步的特征点。构造尺度空间传统的方法即构造一个高斯金字塔,原始图像作为最底层,然后对图像进行高斯模糊再降采样(2倍)作为下一层图像,循环迭代下去。高斯金字塔是对原图像的尺寸是在不断变化的,高斯模板尺寸不变。每一层的建立必须等到上一层构造完毕后才能进行处理,依赖性很强,这样造成速度上很慢。SURF构建尺度金字塔的方法采用原图像大小不变,变化的是模板大小,即采用变化的模板盒子尺寸对原图像进行滤波,构造出尺度空间。同时,SURF可以采用并行运算,对金字塔中的每层图像同时进行处理。通过逐渐增大的盒子尺寸滤波模板与积分图像卷积产生的Hessian矩阵行列式的响应图像,构造出金字塔。

如下图所示,左图为构建高斯金字塔的方法,右图为SURF构建的方法。

SURF首先采用9×9的盒子滤波器(近似等于σ=1.2时的高斯二阶微分,记为尺度s=1.2)得到的响应图像作为最底层的图像,然后逐渐增大盒子的尺寸,对原图像继续进行滤波处理。与SIFT类似,把响应图像分成若干组,每组若干层。每组都是采用逐渐增大的滤波器尺寸进行处理。层与层之间的尺度变化量是高斯二阶微分模板决定的。对于9×9的滤波器,由于要保证滤波器的结构比例不变同时要求存在滤波器模板中心,每个块最小增加量是2,由于有三个块,所以最小增加量是6,即下一个滤波器的大小为15×15,依次增加为21×21,27×27,...;利用这样的模板序列,就构造出尺度空间。

2.3D非极大值抑制

与SIFT类似,对每层图像上的每个像素与空间邻域内和尺度邻域内的响应值比较(不包括第一层与最后一层图像),同层上有8个邻域像元,向量尺度空间共有2×9=18个,共计26个像元的值进行比较,如果是极大值则保留下来,作为候选特征点。

同时如果特征点的响应值小于Hessia行列式的阈值,也被排除。

3.准确定位特征点

由于是离散空间的极值点,通过拟合方法,准确定位到特征点的位置,每个特征点包含三个信息H(x,y,σ),即位置与尺度。与SIFT的方法一样,可以看我写的SIFT原理的文章。

求导,并令其等于0得:

计算方法:

,

求得,即在三个方向的偏移量

通过以上的方法,即找到了每个特征点的位置,下面介绍SURF特征点的描述子。

4.特征点描述子

4.1

为特征点分配主方向

为了保证旋转不变性,首先要为特征点分配主方向。以特征点为中心,6s为半径的圆域,统计所有像素点的Harr小波响应。算法上就是采用下面的模板对图像卷积运算,作为每个像素点水平与垂直方向Harr小波响应。Harr小波模板的长度为4s。尺度s的计算,是根据当前模板的大小。

,Harr小波模板(黑色1,白色-1)

圆域内的每个像素都计算出Harr小波水平响应与垂直响应值,同时乘以对应位置的高斯权重(σ=2.5s).
为了求取主方向,采用一个张角为60度的扇形滑动窗口,计算其区域内的Harr小波水平与垂直方向的响应之和,滑动扇形窗口,得到最大的响应区域对应的方向即为此特征点的主方向。

4.2

形成特征矢量

 

沿着主方向,取20s×20s的矩形区域作为其邻域,分成4×4个子区域,统计每个子区域内像素点的Harr小波模板,沿着主方向与垂直于主方向的响应,Harr小波模板的宽度为2s。统计16个子区域的响应信息,每个子区域采用下面公式的方法进行统计,同时每个像素点的响应要乘以对应位置的高斯权重(σ = 3.3s)。

这样每个子区域携带4个信息,共有16个子区域,共64维。最后为了防止光照与对比度的影响,对特征矢量归一化处理。

参考:
SURF: Speeded Up Robust Features :Herbert Bay, Tinne Tuytelaars, and Luc Van Gool
http://blog.csdn.net/crzy_sparrow/article/details/7392345
http://blog.csdn.net/yangtrees/article/details/7482960
http://www.cnblogs.com/tornadomeet/archive/2012/08/17/2644903.html

时间: 2024-10-11 01:26:43

SURF原理分析的相关文章

kafka producer实例及原理分析

1.前言 首先,描述下应用场景: 假设,公司有一款游戏,需要做行为统计分析,数据的源头来自日志,由于用户行为非常多,导致日志量非常大.将日志数据插入数据库然后再进行分析,已经满足不了.最好的办法是存日志,然后通过对日志的分析,计算出有用的数据.我们采用kafka这种分布式日志系统来实现这一过程. 步骤如下: 搭建KAFKA系统运行环境 如果你还没有搭建起来,可以参考我的博客: http://zhangfengzhe.blog.51cto.com/8855103/1556650 设计数据存储格式

android脱壳之DexExtractor原理分析[zhuan]

http://www.cnblogs.com/jiaoxiake/p/6818786.html内容如下 导语: 上一篇我们分析android脱壳使用对dvmDexFileOpenPartial下断点的原理,使用这种方法脱壳的有2个缺点: 1.  需要动态调试 2.  对抗反调试方案 为了提高工作效率, 我们不希望把宝贵的时间浪费去和加固的安全工程师去做对抗.作为一个高效率的逆向分析师, 笔者是忍不了的,所以我今天给大家带来一种的新的脱壳方法——DexExtractor脱壳法. 资源地址: Dex

android脱壳之DexExtractor原理分析

导语: 上一篇我们分析android脱壳使用对dvmDexFileOpenPartial下断点的原理,使用这种方法脱壳的有2个缺点: 1.  需要动态调试 2.  对抗反调试方案 为了提高工作效率, 我们不希望把宝贵的时间浪费去和加固的安全工程师去做对抗.作为一个高效率的逆向分析师, 笔者是忍不了的,所以我今天给大家带来一种的新的脱壳方法--DexExtractor脱壳法. 资源地址: DexExtractor源码:https://github.com/bunnyblue/DexExtracto

Adaboost算法原理分析和实例+代码(简明易懂)

Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333     本人最初了解AdaBoost算法着实是花了几天时间,才明白他的基本原理.也许是自己能力有限吧,很多资料也是看得懵懵懂懂.网上找了一下关于Adaboost算法原理分析,大都是你复制我,我摘抄你,反正我也搞不清谁是原创.有些资料给出的Adaboost实例,要么是没有代码,要么省略很多步骤,让初学者

Android视图SurfaceView的实现原理分析

附:Android控件TextView的实现原理分析 来源:http://blog.csdn.net/luoshengyang/article/details/8661317 在Android系统中,有一种特殊的视图,称为SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面.由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独立的线程中进行绘制.又由于不会占用主线程资源,SurfaceView一方面可以实现复杂而高效的UI,另一方面又不会导致用户输

AbstractQueuedSynchronizer的介绍和原理分析(转)

简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过继承同步器并需要实现它的方法来管理其状态,管理的方式就是通过类似acquire和release的方式来操纵状态.然而多线程环境中对状态的操纵必须确保原子性,因此子类对于状态的把握,需要使用这个同步器提供的以下三个方法对状态进行操作: java.util.concurrent.locks.Abstra

linux中mmap系统调用原理分析与实现

参考文章:http://blog.csdn.net/shaoguangleo/article/details/5822110 linux中mmap系统调用原理分析与实现 1.mmap系统调用(功能)      void* mmap ( void * addr , size_t len , int prot , int flags ,int fd , off_t offset )      内存映射函数mmap, 负责把文件内容映射到进程的虚拟内存空间, 通过对这段内存的读取和修改,来实现对文件的

Android 4.4 KitKat NotificationManagerService使用详解与原理分析(一)__使用详解

概况 Android在4.3的版本中(即API 18)加入了NotificationListenerService,根据SDK的描述(AndroidDeveloper)可以知道,当系统收到新的通知或者通知被删除时,会触发NotificationListenerService的回调方法.同时在Android 4.4 中新增了Notification.extras 字段,也就是说可以使用NotificationListenerService获取系统通知具体信息,这在以前是需要用反射来实现的. 转载请

一个日期算法的原理分析

1.问题描述 在 OSC 问答频道有一个问题:时间算法:帮忙解答下 简单的复述一遍就是能够通过如下式子来计算month月day日是一年的第几天. 闰年是 day_of_year=(275*month)/9 - (month+9)/12 + day - 30 非闰年比这个少1天.可以简单的验证,这个式子中每个部分计算后都取整,整个结果总是对的. 我们知道1.3.5.7.8.10.12都是31天,2月的天数有点诡异,其他都是30天,正常情况下我们写程序会写很多if来判断月份,进而计算累积的天数.但是