写在前面的话:
Surf算法是对Sift算法的一种改进,主要是在算法的执行效率上,比Sift算法来讲运行更快!由于我也是初学者,刚刚才开始研究这个算法,然而网上对于Surf算法的资料又尤为极少,稍微介绍的明白一点的还是英文。所以在此想借这个机会把我所理解的部分介绍一下,对于后面准备学习Surf算法的朋友来说,希望有一点点的帮助!言归正传,心得大致包括几下几部分: 1、算法原理;2、源码简析;3、OpenCV中Demo分析;4、一些关于Surf算法的剖析。Surf算法原理:
参考资料:Surf算法论文及实现源码 作为尺度不变特征变换算法(Sift算法)的加速版,Surf算法在适中的条件下完成两幅图像中物体的匹配基本实现了实时处理,其快速的基础实际上只有一个——积分图像haar求导。我们先来看介绍Sift算法的基本过程,然后再介绍Surf算法。1、Sift算法简介
Sift算法是David Lowe于1999年提出的局部特征描述子,并于2004年进行了更深入的发展和完善。Sift特征匹配算法可以处理两幅图像之间发生平移、旋转、仿射变换情况下的匹配问题,具有很强的匹配能力。总体来说,Sift算子具有以下特性: (1)、Sift特征是图像的局部特征,对平移、旋转、尺度缩放、亮度变化、遮挡和噪声等具有良好的不变性,对视觉变化、仿射变换也保持一定程度的稳定性。 (2)、独特性好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配。 (3)、多量性,即使少数的几个物体也可以产生大量Sift特征向量。 (4)、速度相对较快,经优化的Sift匹配算法甚至可以达到实时的要求。 (5)、可扩展性强,可以很方便的与其他形式的特征向量进行联合。 其Sift算法的三大工序为,(1)提取关键点;(2)对关键点附加详细的信息(局部特征)也就是所谓的描述器;(3)通过两方特征点(附带上特征向量的关键点)的两两比较找出相互匹配的若干对特征点,也就建立了景物间的对应关系。提取关键点和对关键点附加详细的信息(局部特征)也就是所谓的描述器可以称做是Sift特征的生成,即从多幅图像中提取对尺度缩放、旋转、亮度变化无关的特征向量,Sift特征的生成一般包括以下几个步骤: (1)、构建尺度空间,检测极值点,获得尺度不变性;



2、Surf算法原理
(1)、构建Hessian矩阵 Hessian矩阵是Surf算法的核心,为了方便运算,假设函数f(z,y),Hessian矩阵H是由函数,偏导数组成:








(5)特征点描述子生成
首先将坐标轴旋转为关键点的方向,以确保旋转不变性。
接下来以关键点为中心取8×8的窗口。图左部分的*黑点为当前关键点的位置,每个小格代表关键点邻域所在尺度空间的一个像素,利用公式求得每个像素的梯度幅值与梯度方向,箭头方向代表该像素的梯度方向,箭头长度代表梯度模值,然后用高斯窗口对其进行加权运算,每个像素对应一个向量,长度为,为该像素点的高斯权值,方向为, 图中蓝色的圈代表高斯加权的范围(越靠近关键点的像素梯度方向信息贡献越大)。然后在每4×4的小块上计算8个方向的梯度方向直方图,绘制每个梯度方向的累加值,即可形成一个种子点,如图右部分示。此图中一个关键点由2×2共4个种子点组成,每个种子点有8个方向向量信息。这种邻域方向性信息联合的思想增强了算法抗噪声的能力,同时对于含有定位误差的特征匹配也提供了较好的容错性。