Speed-Up Robust Features(SURF)

SURF 是一种尺度,旋转不变的detector和descriptor.最大的特点是快!在快的基础上保证性能(repeatability,distinctiveness 和robustness)。
SURF采用有效策略的主要有:1)积分图(用于对图像卷积)2)detector是基于Hessian矩阵,descriptor是基于分布的
下面是SURF算法的具体实现:
1.兴趣点检测
SURF 对于兴趣点的检测是基于最基本的Hessian近似矩阵。
1.1积分图像



1.2 用于检测兴趣点的Hessian矩阵
作者Herbert Bay利用Hessian矩阵来检测兴趣点,具体是用Hessian矩阵行列式的最大值标记斑状结构(blob-like structure)的位置。同时,行列式值也作为尺度选择的依据,这里,作者是参考了Lindeberg的做法('Feature detection with automatic scale selection'我还没有拜读原文!!)。
说一下Hessian矩阵的定义:



有了前面的着一些准备工作,就可以对一幅图像I计算每个点的近似Hessian矩阵的行列式值,将这些值存储,备用!
1.3尺度空间表示
算法的尺度不变性主要靠不同尺度下寻找感兴趣点。谈到不同尺度就不得不说‘金字塔’。Lowe在其SIFT大作中是这样构造尺度空间的:对原图像不断地进行Gauss平滑+降采样。得到金字塔图像后,有进一步得到了DoG图,边和斑状结构就是通过DoG图得到其在原图的位置。
SURF中的做法与SIFT是有所不同的。SIFT算法在构造金字塔图层时Gauss滤波器大小不变,改变的是图像的大小;而SURF则恰恰相反:图像大小保持不变,改变的是滤波器的大小。

与SIFT类似,SURF的尺度空间也是按组(Octaves)划分的。每一个Octave里是对输入图像用size不断增加的filter进行滤波后得到的一系列响应。总的来说,一组包含了一个缩放因子2()。每一组内的层数是一个常量。由于积分图像的离散特性(不懂),两个连续尺度间的最小尺度差分取决于二阶偏导在导数方向(x或y)上正的或负的波瓣(即不同的颜色块,见Fig.1.5)长度L0,实际中,L0设为filter边长的1/3。例如,对于9*9的filter,L0值为3.对于连续的level,采用的filter的size大小增加的最小量是2,以保证filter的边长始终是奇数,(奇数可以保证filter有中心点)。这样使得Mask以6个像素为单位进行扩充。


对于Fig.1.6左边是x-y方向的大小为9*9的filter,每个对角方向各有两个波瓣(2个黑的,2个白的),对波瓣扩两个像素,得到右边的filter。
尺度空间的构造具体对于第一组(Octave)而言开始所用的是大小为9*9的filter(最小的scale),接下来的filter大小依次为15*15,21*21,27*27,采用这些模板可以达到多于两个像素的尺度变化。作者说这么做是有必要的,原因是要对空域和相邻的尺度附近进行一个三维的非极大值抑制。(什么是非极大值抑制呢?字面意思:不是极大值就抑制。非极大值抑制通常用于边缘检测中边的进一步精简。举个简单例子,如果要从一些边缘中进一步提出水平边缘,那么就这么做:逐个检测边缘图中在水平方向的梯度值,如果不是局部极大值(非极大值),则就把该梯度值置0(抑制))。
由于要采用三维的非极大值抑制,那么Hessian响应图的首尾两个实际上是不包含极值信息的(这里跟SIFT算法里每一Octave里尽管有层,实际上只能利用中间的7层是一个道理)。因此,经过内插后(后面会讲到),可能的最小的尺度应该是,

由于组之间较大尺度的变化(从9到15变化倍数是1.7)会带来较为粗糙的尺度采样,所以作者主张对尺度进行更为精细的采样来构造尺度空间。具体做法是:先用内插将图像大小加倍,然后用一个size为15的filter对加倍的图像进行滤波得到第一个Octave中的第一个响应图,随后用到的filter的size依次是21,27,33和39.第二组类似,只不过此时相邻的两个filter的size差为12个像素,是第一组的两倍。第三组...类似。这样,两个filter之间的尺度变化就会相对变小了(15到21变化倍数降为1.4:21/15)。
由于对任何size的filter,F范数模值是一个常量(????)已经做了尺度上的归一化,所以对滤波器的响应不需要在加权了。
1.4 兴趣点的定位
作者采用的是在3*3*3的邻域内进行非极大值抑制。具体是采用了文章'Efficient Non- maxmum Supprerssion '中的做法(需要再进一步参考)。检测到的Hessian 矩阵的行列式极大值还要在尺度和图像空间内做个内插,采用的方法可参见文章'Invatiant Features from Interest Point Groups'.之所以要做内插,是因为每一组(Octave)的第一层(layer)的尺度(scale)差分是很大的。
2 兴趣点描述和匹配
原文采用的descriptor跟SIFT类似也是基于兴趣点的邻域分布。具体是计算了x和y方向上的Harr小波值分布(具体的Harr小波也要研究一下),而不是梯度值分布。这样做同样是因为可以借助积分图加速运算,同时只用了64维信息。同时,根据Laplacian的符号,作者想出了一个新的indexing方法,既提高了鲁棒性,同时也加快了匹配过程。
2.1方向分配
为了具有方向不变性,作者为每个感兴趣点指定了一个可再复制(reproducible)的方向。做法如下:
① 再以6s为半径的圆形邻域计算在x,y方向的Harr小波响应,这里s指的是所要检测的兴趣点所处的尺度。
② 采样步长设为s,小波的size设为4s,(这样又可以利用积分图进行快速滤波了)


2.2基于Haar小波响应的Descriptor
对于Descriptor的提取,第一步是构造一个中心点在兴趣点附近,带方向(方向即前面所估计的方向)的方框。方框的大小设为20s。方框具体形式课参考图2.3.

Fig.2.3 不同scale下的方框
这一步具体是怎样实现的呢?先把区域分成16个(4*4)子域。对每个子域我们计算25(5*5)个空间归一化的采样点的Haar小波响应。假定我们用dx表示水平方向上的Haar小波响应,dy表示垂直方向上的(滤波器的size为2s),这里可参考2.1.注意,这里的“水平”和“垂直”是相对于兴趣点的方向而言的(参见图2.4)。.为了增加鲁棒性,可对dx,dy,进行高斯滤波(sigma=3.3s),滤波器中心为兴趣点。

Fig. 2.4
PS:通过图2.4进一步解释:左边大的方框即图2.3中的方框,将该大方框分成16块,每一小块如右图,又分为4个小快,这里的小块就是实际中descriptor的基本元,2.1节所提到的加法求和就是对这些元进行的,形式如图2.4右上角。

2.3 快速建立索引用于匹配
前面说过,为了加速匹配过程,作者借助Laplacian(比如Hessian矩阵的迹)的符号使匹配过程索引加快。这样可以将下面的情况区分开(Fig.2.6):

Fig.2.6
左右两幅图尽管contrast值是相同的,但符号不同,所以采用带符号的匹配,两者匹配不成功。
PS:本文仅仅是把作者的论文算是翻译了一遍,还需要结合OpenCV里的SURF源码对某些细节仔细研究...Come on!