SURF算法学习心得
本文主要内容来自下面两篇博客:
http://www.yongblog.com/archives/123.html
http://www.cnblogs.com/blue-lg/archive/2012/07/17/2385755.html
SURF算法是对SIFT算法的一种改进,主要是在算法的执行效率上,比Sift算法来讲运行更快!参考资料:Surf算法论文及实现源码。
SURF (Speeded Up Robust Feature) is a robust local feature detector, firstpresented by Herbert Bay et al. in 2006, that can be used in computer visiontasks like object recognition or 3D reconstruction. It is partly inspired bythe SIFT descriptor. The standard version of SURF is several times faster thanSIFT and claimed by its authors to be more robust against different imagetransformations than SIFT. SURF is based on sums of 2D Haarwavelet responses and makes an efficient use of integral images.
上面这段文字的大体意思就是说:SURF意指 加速的具有鲁棒性的特征,由Bay在2006年首次提出,这项技术可以应用于计算机视觉的物体识别以及3D重构中。SURF算子由SIFT算子改进而来,一般来说,标准的SURF算子比SIFT算子快好几倍,并且在多幅图片下具有更好的鲁棒性。SURF最大的特征在于采用了HARR特征以及积分图像integralimage的概念,这大大加快了程序的运行时间。
SURF提出算法参见http://www.vision.ee.ethz.ch/~surf/papers.html ,有paper下载地址。
要理解SURF算法,要先理解SIFT算法,SIFT的原理可以参考我上篇转载的博客,下面对其简单说明一下:
一、SIFT算法简介
SIFT算法是David Lowe于1999年提出的局部特征描述子,并于2004年进行了更深入的发展和完善。Sift特征匹配算法可以处理两幅图像之间发生平移、旋转、仿射变换情况下的匹配问题,具有很强的匹配能力。总体来说,Sift算子具有以下特性:
- Sift特征是图像的局部特征,对平移、旋转、尺度缩放、亮度变化、遮挡和噪声等具有良好的不变性,对视觉变化、仿射变换也保持一定程度的稳定性。
- 独特性好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配。
- 多量性,即使少数的几个物体也可以产生大量Sift特征向量。
- 速度相对较快,经优化的Sift匹配算法甚至可以达到实时的要求。
- 可扩展性强,可以很方便的与其他形式的特征向量进行联合。
其SIFT算法的三大工序为:
(1)提取关键点;
(2)对关键点附加详细的信息(局部特征)也就是所谓的描述器;
(3)通过两方特征点(附带上特征向量的关键点)的两两比较找出相互匹配的若干对特征点,也就建立了景物间的对应关系。
提取关键点和对关键点附加详细的信息(局部特征)也就是所谓的描述器可以称做是Sift特征的生成,即从多幅图像中提取对尺度缩放、旋转、亮度变化无关的特征向量,Sift特征的生成一般包括以下几个步骤:
(1)、构建尺度空间,检测极值点,获得尺度不变性;
(2)、特征点过滤并进行精确定位;
(3)、为特征点分配方向值;
(4)、生成特征描述子。
以特征点为中心取16*16的邻域作为采样窗口,将采样点与特征点的相对方向通过高斯加权后归入包含8个bin的方向直方图,最后获得4*4*8的128维特征描述子。示意图如下:
当两幅图像的SIFT特征向量生成以后,下一步就可以采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图1的某个关键点,通过遍历找到图像2中的距离最近的两个关键点。在这两个关键点中,如果次近距离除以最近距离小于某个阙值,则判定为一对匹配点。
对于SIFT算法,找到的误匹配的点还是比较多,后续需要用RANSAC等算法进行剔除。
2、SURF算法原理
SURF算法的步骤与SIFT算法类似,下面是SURF算法的大致流程。
1.特征点的提取
1)利用Hessian矩阵,计算特征值α
其中Lxx(x, σ)是高斯滤波后图像g(σ)的在x方向的二阶导数,其他的Lyy(x, σ)、Lxy(x, σ)都是g(σ)的二阶导数。为了减小计算量,原文使用了一个简单的方法,并利用了积分图像的优势(大大的减少计算量),方法其实很简单就是在模糊的基础上将原本的模块近似下。
总所周知,一般计算图像的二阶导时,利用下面的公式d2f(x)/dx2=(f(x+1)-f(x))-(f(x)-f(x-1))=-2*f(x)+f(x+1)+f(x-1)。以9X9滤波器为例,如下图所示,左边两幅图分别为灰度图像在中心点(黑色点)处的二阶导数d2f(x)/dx2和d2f(x)/dxdy的模板对应的值, 近似后变成右边的两幅图,图中灰色部分像素值为0。可是这样计算特征值不是也很复杂么?当然,所以作者提供了一种新思路--使用积分图像。
积分图像,顾名思义,即指当前像素点所在位置距原点(0,0)所包围面的所有灰度之和。下图绿色的部分为当前像素点,红色为积分区域。
这样计算图像中任意一块矩形区域的灰度之和Sx只需要利用矩形4个顶点(Xi,Yi)(i=1,2,3,4? 顺序为从上之下,先左后右)的积分值S(x,y)即可。
Sx=S(X1,Y1)+S(X4,Y4)-S(X2,Y2)-S(X3,Y3)
至此,大家应该知道近似二阶导数的高斯模板并引入积分图像的好处了吧,只需要在函数定义之前计算各个坐标点的积分图像,然后就能方便的求出hessian的特征值。不过由于函数模板的近似,这里需要修正下特征值α的求解公式:
这里Dxx和Dxy就是根据图一得到的,而Dyy和Dxx类似,只需要导致一下模板即可。
2)根据是否为领域极大值判断特征点
这里要引入图像堆的概念,说简单点,就是一组大小相同的图像,这些图像都是根据不同大小高斯滤波二阶导模板。按照模板大小从小到大将Pi沿z轴方向排布,这样中间层的每个像素点的领域就为3X3X3(包括上下两层)。若该点的特征值α为这27个点中的最大值,那么可以认为该点为Feature points--特征点(图像依据这些特征点的匹配进行更多的操作,比如拼接,比较相似性等等)。
2.特征点的匹配
1)寻找特征向量
欲进行特征点的匹配,必须提取出特征点的特征向量再利用两个向量的相似程度认为两个点是否为两幅图像相互对应的点。
第一步:计算特征点的主方向
以特征点为圆心半径为6像素建立圆领域,计算得出里面有109个像素点。计算这些点的harr特征harrx和harry。那么该怎样计算任意一点的harr特征值?
选取edge features前两个作为harrx和harry值,这个方向有些类似与梯度方向,不过这里的领域显然更广。至于计算么,依旧是利用积分图像。
对这109个像素点分别求出各自的向量的方向angle=acrtan(harry/harrx) ,根据最近邻原则将这些 angle划分到60,120,...,300,360等6个值上。划分在同一范围上的像素点分别将他们的harrx和harry相加即可。不过为了体现相邻像素点的更大影响,还需要考虑高斯权重系数。这样得到最大的harrx和最大的harry,组成了主方向向量。
第二步.提取特征描述符
图中红色箭头为上面计算出来的主方向,按上图所示选取该红色特征点的8X8邻域(紫色边框内部)
计算得到4X4个像素块的梯度大小和方向(可以利用上面已经计算的harrx和harry),将8X8区域分割为2X2个区域T1,2,3,4,这样每个区域就包括了4个更小的由4个像素点组成的区域.
x1 ? x2
x3 ? x4
harrx和harry就是利用白色部分像素灰度值减去黑色部分像素灰度值即可得到(harrx,harry)方向向量。这样的向量一共有16个,将这些方向向量的方向角归并到上下左右斜上下8个方向上,并在T1,2,3,4中计算这8个方向的值。
那么这个4X8=32维向量即为所求的特征描述符。?
3)特征点的匹配
采用最简单的两向量内积最大值为最匹配的点,设定一阈值,只有当这个最大值大于该阈值方可认为两特征点匹配。