surf特征点检测

不重复造轮子,但首先你得会造轮子。

一个笑话:

Theory is when you know everything but nothing works.
Practice is when everything works but no one knows why.
In our lab,theory and practice are combined:nothing works and no one knows why.


言归正传,还是先列出参考文献,第一手资料还是看原论文的好。

参考文献:Speeded-Up Robust Features.——Herbert Bay


简单来说SURF是SIFT算法的加速版。



Hassian矩阵

SURF的兴趣点检测是基于Hessian矩阵的,它依靠Hessian矩阵行列式的局部最大值定位兴趣点位置。当Hessian矩阵行列式局部最大时,所检测出的实际上是斑状结构(blob-like structures)。所谓斑状结构是指:比周围区域更亮或更暗的一个小区域。首先用Hassian矩阵提取关键点。

Hessian matrix主要运用于判断一个双变量函数在一点处的性质(极大值/极小值/驻点)。对于图像I中某点X=(x,y),在x点的σ尺度上的Hessian矩阵定义为


其中,Lxx(X,σ)表示高斯二阶偏导在X处与图像I的卷积。Lxy(X,σ)、Lyy(X,σ)具有相似的含义。

当这个行列式在图像邻域内取得极值时,在图像上检测到的就是blob-like特征。这是后面的基础。



box filter

在构建多尺度空间时,SURF算法使用盒子滤波(box filter)近似代替SIFT算法中的二阶高斯函数,然后与原始图像做卷积,并在这一过程中应用了积分图像(这个积分图就是计算Haar-Like特征时用到的积分图)技巧,这是两者最根本的区别。下图给出了二阶高斯滤波同盒子滤波的对比。


盒子滤波是经过加权重的。对于x、y方向上的滤波,黑色区域赋权重为-2,白色区域赋权重为l,其余区域不赋权重;对于xy方向的滤波,黑色区域赋权重为-1,白色区域赋权重为1。

这样一来,Hessian矩阵的二阶导数行列式就可以近似为


Dxx就是Lxx的近似,Dyy、Dxy类似。

论文里面计算得到w取0.9比较合理。


SURF特征检测算法中,利用盒子滤波结合积分图像求取尺度空间函数的方法非常巧妙,这也正是该算法比SIFT检测算法更快速的主要原因。


尺度空间构建

SIFT特征检测算法在构建多尺度空间时,后层图像需要依赖前层图像不断降采样调整大小,然后用相同尺寸不同σ的高斯内核在不同方向上迭代卷积,分别形成尺度空间函数。而在SURF特征检测算法中,并不需要对图像迭代下采样。仅仅通过改变盒子滤波的大小,然后用不同大小的滤波同原始图像在不同方向上做卷积,即可形成多尺度的空间函数。下面是在不同尺度上用到的box的示意图。



金字塔图像中分为很多层,每一层叫做一个octave,每一个octave中又有几张尺度不同的图片。在sift算法中,同一个octave层中的图片尺寸(即大小)相同,但是尺度(即模糊程度)不同,而不同的octave层中的图片尺寸大小也不相同,因为它是由上一层图片降采样得到的。在进行高斯模糊时,sift的高斯模板大小是始终不变的,只是在不同的octave之间改变图片的大小。而在surf中,图片的大小是一直不变的,不同的octave层得到的待检测图片是改变高斯模糊尺寸大小得到的,当然了,同一个octave中个的图片用到的高斯模板尺度也不同。

在SURF特征检测算法中,尺度空间金字塔的最底层由9x9的盒子滤波输出得到,对应二阶高斯滤波σ=1.2。为保证盒子滤波的结构不变,后续滤波器的大小最少要有6个像素值步长的变化.

每4个模板为一阶(Octave)。第1阶中,相邻的模板尺寸相差6个像素,第2阶中相差12个像素,第3阶中相差24个像素,以此类推。每一阶的第一个模板尺寸是上一阶的第二个模板的尺寸。因为兴趣点的数量在尺度的方向上退化很快,所以
一般情况下取4个Octave就足够了




为了保证在高斯差分图像中检测到的局部极值更加稳定,样本像素点需要在3x3x3的立体邻域内进行非最大值抑制。其中,参与比较的像素包括同层相邻的8个像素以及相邻上下两层图像中对应的9x2个像素。如果样本点为极大值或者极小值,则判定为候选极值点,同时记下该点的位置和对应尺度。



特征点描述

与SIFT等算法类似,SURF的兴趣点描述算子所掐述依然是兴趣点某个小邻域内的灰度分布信息。SURF使用一阶Haar小波在x、y两个方向的响应作为构建特征向量的分布信息。


确定兴趣点的方向特征

为使兴趣点描述算子具有旋转不变的性能,首先要赋予每一个兴趣点方向特征。我们在以某个兴趣点为圆心,以6S(S为该兴趣点对应的尺度)为半径的圆形邻域里,用尺寸为4S的Haar小波模板对图像进行处理,求x、y两个方向的Haar小波响应。Haar小波的模板如下图所示,其中左侧模板计算x方向的响应,右侧模板计算y方向的响应,黑色表示一1,白色表示+1。


用Haar小波滤波器对圆形邻域进行处理后,就得到了该邻域内每个点所对应的x、y方向的响应,然后用以兴趣点为中心的高斯函数(σ=2s)对这些响应进行加权。用一个圆心角为PI/3扇形以兴趣点为中心环绕一周,计算该扇形处于每个角度时,
它所包括的图像点的Haar小波响应之和。由于每一点都有x、y两个方向的响应,因此扇形区域中所有点的响应之和构成一个矢量。把扇形区域环绕一周所形成的矢量都记录下来,取长度最大的矢量,其方向即为该兴趣点所对应的方向。



构建描述子向量

为了构建描述子向量,首先要确定一个以兴趣点为中心的正方形邻域。该邻域的边长为20s(s为该兴趣点对应的尺度),把上面所确定的兴趣点方向作为该邻域的y轴方向。在程序实现的过程中并不是通过旋转图像来实现下图所展示的计算过程,因为旋转图像会降低计算效率。我们直接使用Haar小波滤波器直接对原始图像进行处理,然后对所得响应进行插值处理,从而得到相对于兴趣点方向的dx、dy。把该正方形区域分成4x4个子块区域,在每一个子块区域中用Haar小波滤波器进行处理(该处的Haar小波模板尺寸为2sx2s)。我们用dx表示水平方向的Haar小波响应,用dy表示竖直方向的Haar小波响应。这里的水平和竖直是相对于兴趣点方向来说的。在构建描述子向量之前,对于所有的dx、dy都要用一个以兴趣点为中心的高斯函数加权,该高斯函数的σ=3.3S。


在每个子块区域中对dx、dy、|dx|、|dy|求和,从而得到一个4维向量。把4*4个子块区域的向量连接起来就得到了一个64维的向量,此向量就是描述该兴趣点的描述子(deseripror)特征向量。如果我们对dx、Idxl求和时分成dy<0,dy>=0两种情况,相应的在对dy、|dy|求和时分成dx<0,dx>=两种情况,我们就会得到128维的描述子向量。


至此,我们得到了SURF描述子。







版权声明:

原文地址:https://www.cnblogs.com/walccott/p/4956857.html