SIFT算法概述

 

SIFT算法小结

1 SIFT 发展历程

 SIFT算法由D.G.Lowe 1999年提出,2004年完善总结。后来Y.Ke将其描述子部分用PCA代替直方图的方式,对其进行改进。

2 SIFT 主要思想

  SIFT算法是一种提取局部特征的算法,在尺度空间寻找极值点,提取位置,尺度,旋转不变量。

3  SIFT算法的主要特点:

 a) SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性。

b) 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配[23]

c) 多量性,即使少数的几个物体也可以产生大量SIFT特征向量。

d) 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求。

e) 可扩展性,可以很方便的与其他形式的特征向量进行联合。

 

4       SIFT算法步骤:

1)检测尺度空间极值点

2)精确定位极值点

3)为每个关键点指定方向参数

4)关键点描述子的生成

5       SIFT算法详细

▲尺度空间的生成

尺度空间理论目的是模拟图像数据的多尺度特征。

  高斯卷积核是实现尺度变换的唯一线性核[],于是一副二维图像的尺度空间定义为:

                                              (1)

其中 是尺度可变高斯函数,           

 (2)

(x,y)是空间坐标,是尺度坐标。

为了有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间(DOG scale-space)。利用不同尺度的高斯差分核与图像卷积生成。

         (3)

DOG算子计算简单,是尺度归一化的LoG算子的近似。

图像金字塔的构建:图像金字塔共O组,每组有S层,下一组的图像由上一组图像降采样得到。

图1由两组高斯尺度空间图像示例金字塔的构建, 第二组的第一副图像由第一组的第一副到最后一副图像由一个因子2降采样得到。

图2 DoG算子的构建:

SIFT算法概述_第1张图片


图1 Two octaves ofa Gaussian scale-space image pyramidwith s =2 intervals. The first image in thesecond octave is created by down sampling the second to last image in the previous

SIFT算法概述_第2张图片

图2 The difference of two adjacent intervalsin the Gaussian scale-space pyramid create an interval in the difference-of-Gaussianpyramid (shown in green).

 

▲空间极值点检测

为了寻找尺度空间的极值点,每一个采样点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如图3所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。

                                                                                       SIFT算法概述_第3张图片

图3 DoG尺度空间局部极值检测

 

▲  构建尺度空间需确定的参数

     -尺度空间坐标

   O-octave坐标

   S- sub-level坐标

  和O、S的关系,

其中是基准层尺度。o-octave坐标,s- sub-level 坐标。注:octaves的索引可能是负的。第一组索引常常设为0或者-1,当设为-1的时候,图像在计算高斯尺度空间前先扩大一倍。

空间坐标x是组octave的函数,设是0组的空间坐标,则


如果是基础组o=0的分辨率,则其他组的分辨率由下式获得:


注:在Lowe的文章中,Lowe使用了如下的参数:

    

     在组o=-1,图像用双线性插值扩大一倍(对于扩大的图像)。

▲  精确确定极值点位置

   通过拟和三维二次函数以精确确定关键点的位置和尺度(达到亚像素精度),同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力。

 

 边缘响应的去除

一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。主曲率通过一个2x2 的Hessian矩阵H求出:

          (4)

导数由采样点相邻差估计得到。

D的主曲率和H的特征值成正比,令为最大特征值,为最小的特征值,则


 (r + 1)2/r的值在两个特征值相等的时候最小,随着r的增大而增大,因此,为了检测主曲率是否在某域值r下,只需检测


在Lowe的文章中,取r=10。

 

▲  关键点方向分配

   利用关键点邻域像素的梯度方向分布特性为每个关键点指定方向参数,使算子具备旋转不变性。

        (5)

式(5)为(x,y)处梯度的模值和方向公式。其中L所用的尺度为每个关键点各自所在的尺度。

在实际计算时,我们在以关键点为中心的邻域窗口内采样,并用直方图统计邻域像素的梯度方向。梯度直方图的范围是0~360度,其中每10度一个柱,总共36个柱。直方图的峰值则代表了该关键点处邻域梯度的主方向,即作为该关键点的方向。图4是采用7个柱时使用梯度直方图为关键点确定主方向的示例。

SIFT算法概述_第4张图片 

图4 由梯度方向直方图确定主梯度方向

在梯度方向直方图中,当存在另一个相当于主峰值80%能量的峰值时,则将这个方向认为是该关键点的辅方向。一个关键点可能会被指定具有多个方向(一个主方向,一个以上辅方向),这可以增强匹配的鲁棒性[53]

至此,图像的关键点已检测完毕,每个关键点有三个信息:位置、所处尺度、方向。由此可以确定一个SIFT特征区域(在实验章节用椭圆或箭头表示)。

▲  特征点描述子生成

  首先将坐标轴旋转为关键点的方向,以确保旋转不变性。

                                                                                 SIFT算法概述_第5张图片

 

图5 由关键点邻域梯度信息生成特征向量

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

实际计算过程中,为了增强匹配的稳健性,Lowe建议对每个关键点使用4×4共16个种子点来描述,这样对于一个关键点就可以产生128个数据,即最终形成128维的SIFT特征向量。此时SIFT特征向量已经去除了尺度变化、旋转等几何变形因素的影响,再继续将特征向量的长度归一化,则可以进一步去除光照变化的影响。

当两幅图像的SIFT特征向量生成后,下一步我们采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图像1中的某个关键点,并找出其与图像2中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离少于某个比例阈值,则接受这一对匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。

你可能感兴趣的:(c/c++笔试面试)