sift描述子,SIFT特征详细描述 下

2.3 找到特征点

到现在,我们已经生成了一个尺度空间,并且使用尺度空间来计算Difference of Gaussian,它们被用于计算尺度不变性的Laplacian of Gaussian的近似。通过得到的DoG图像可以找到好的特征点,分为两个子步骤:
1. 在DoG图像中找到极大或极小像素点
2. 找到子像素级的极大极小值点
极大或极小像素点
第一步是粗糙地找到极大极小值像素点,这很简单,我们可以扫描每个像素并且检测所有的邻接像素点,邻接像素点不仅包括当前图像中的邻接像素,而且包括上一层和下一层图像中的邻接像素。 图2.6 在DoG图像中找极大极小像素点

clip_image002SIFT特征详细描述 下sift描述子
X标记当前像素点,绿色的圈标记邻接像素点,用这个方式,最多检测26个像素点。X被标记为特征点,如果它是所有邻接像素点的最大值或最小值点。
通常对于非极大或极小值点不需要遍历所有26个邻接像素点,少数的几个检测就足够抛弃它。注意最高层和最底层的尺度是不需要检测的,经过上一个操作,我们从每组图像中得到4幅DoG图像,只需要对中间的两幅DoG图像进行极大极小值像素点进行检测。
这步结束后,所标记的点就是近似的极大极小值点,之所以说是“近似的”是因为极大极小值点都不会巧好在像素点的位置上,它一般位于像素的中间,但是我们无法直接访问像素间的数据,所以我们需要通过插值得到子像素的位置。如下图所示:
clip_image004clip_image002SIFT特征详细描述 下sift描述子
图2.7 子像素的极大极小像素点

红色的叉标记图像中的像素,但是真正的极值点是绿色的位于像素间的点。
子像素的极大或极小像素点
使用可用的像素数据,可以生成子像素的值,它通过近似的特征点附近图像的Taylor展开来计算,数学上的形式如下:
clip_image006clip_image004clip_image002SIFT特征详细描述 下sift描述子
通过对x求偏导并将结果置为零,我们可以简单地计算出方程的极值,从而得到子像素特征点的位置,这些子像素点可以增加匹配和算法稳定性的机率。
若子像素点与近似特征点间的偏移量大于0.5,则按照偏移近似特征点的方向相应改变(移动)特征点,然后再把该点当做近似特征点,重复该操作,直到子像素点与近似特征点间的偏移量小于等于0.5。
实现细节
图2.8给出了经过上面两个子步骤得到的子像素极大极小值点,SIFT算法的作者建议生成两个极值点图像,所以我们只需要4幅DoG图像。为了生成4幅DoG图像,我们需要5幅高斯模糊的图像,因此每组图像需要5层模糊图像。该图中,我们只显示了一组图像,但程序中要对每组图像都这么执行。
clip_image008clip_image006clip_image004clip_image002SIFT特征详细描述 下sift描述子
图2.8 在一组DoG图像中找出特征点

2.4 消除边界和低对比度的特征

从上一步能产生许多特征点,其中的一些特征点位于边界,或者亮度上没有足够的对比度。在这些情况下,它们都不是有用的特征,所以我们要抛弃它们。我们使用类似于Harris Corner检测中所使用的方法来去除位于边界上的特征,通过检测亮度来去除低对比度的特征。
移除低对比度的特征
如果从DoG图像中检测到的特征点的亮度值少于某个值,那么该特征点就被拒绝。因为我们已经得到子像素的特征点(极大或极小像素点),我们可以得到子像素的亮度,如果亮度少于某个值,那么就拒绝它。
移除边界特征
要想移除边界特征,我们要计算特征点附近高斯模糊图像的梯度。基于特征点附近的图像,有三种可能的特征:
1. 平坦特征
该特征两个方向的梯度值都很小。
2. 边界特征
该特征一个方向的梯度值很大(垂直于边界的方向),另一个方向的梯度值很小(沿着边界的方向)。
3. 直角特征
该特征两个方向的梯度值都很大。
直角特征是很好的特征点,所以我们想得到直角特征,如果特征点的两个方向的梯度值都很大,那么就让它通过,否则就拒绝它。这可以通过Hessian矩阵实现,使用这个矩阵我们可以很容易地检测它是不是直角特征。在SIFT算法中,不需要像Harris corner检测直接计算Hessian矩阵的两个特征值,而只需要计算两个特征值的积与和的比率。
实现细节
下面用例子来说明,如图2.9所示。 图2.9 在所有特征点中筛选出直角特征点

clip_image010clip_image008clip_image006clip_image004clip_image002SIFT特征详细描述 下sift描述子
两个包含特征点的图依次通过这两个测试:对比度测试和边界测试,并去掉未通过测试的特征点。

2.5 分配特征点的方向

在上个步骤,我们得到了合理的特征点,并且这些特征点被测试是在位置上稳定的,容易识别匹配的。由于我们已经知道特征点是在哪个尺度被检测到的,所以这些特征点也是尺度不变的。接下来要对每个特征点赋一个方向,以使这些特征点具有旋转不变性。特征点所拥有的不变性越多越好。
特征点的方向
在每个特征点周围计算图像的梯度方向和大小,我们可以得到最显著的方向,并且将该方向赋给该特征点。后面的操作都相对该方向进行计算,确保了旋转不变性。
clip_image011clip_image010clip_image008clip_image006clip_image004clip_image002SIFT特征详细描述 下sift描述子
图2.10 将高斯模糊图像分解为梯度大小图和方向图

在特征点附近,我们创建一个方向收集区域来控制该特征点影响的范围,方向收集区域的大小依赖于它所在图像的尺度,尺度越大,收集的区域越大。在方向收集区域中每个像素点的梯度大小和方向用下面的公式计算,从而得到另外两幅图,分别是梯度的大小图和方向图。
clip_image013clip_image011clip_image010clip_image008clip_image006clip_image004clip_image002SIFT特征详细描述 下sift描述子
我们用一个直方图来统计方向收集区域中像素的平均方向,在该直方图中,将360度的方向分成36个bins,每个bin包含10度。假设方向收集区域中某个像素点的梯度方向是18.75度,把它放入10-19度的bin中,并且加入到bin中的量与该像素点的梯度大小成正比。
一旦对方向收集区域中的每个像素点都执行了这个操作后,直方图在某个bin上出现最高峰值。如图2.11直方图的最高峰值在20-29度,所以特征点的方向被赋值为3(第三个bin)。并且所有大于最高峰80%的峰值也被转化为一个新的特征点,这个新的特征点和原来的特征点一样拥有相同的位置和尺度,但是新特征点的方向是另一个峰值。所以方向将一个特征点分为多个特征点。 图2.11 特征点的方向收集区域中的直方图

clip_image015clip_image013clip_image011clip_image010clip_image008clip_image006clip_image004clip_image002SIFT特征详细描述 下sift描述子
实现细节
如前面所述,在直方图的统计方向的过程中,需要往相应的bin中加入与当前像素梯度相关的量,这个量应是将图2.10中的梯度大小图进行1.5倍图像尺度量的高斯模糊后的梯度大小值。
方向收集区域的窗口大小等于1.5倍图像尺度量的高斯窗口的大小。

2.6 生成SIFT描述子

这是SIFT算法的最后一步,现在我们已经得到了拥有尺度不变性和旋转不变性的特征点,接下来要为每个特征点创建一个唯一标识它的“指纹”,SIFT算法作者将它称为SIFT描述子(descriptor)。所生成的SIFT描述子既要能让相同场景中图像的特征点能够正确匹配,而且还要让不同场景中图像的特征点能够正确区分。
为了得到这样的SIFT描述子,我们将特征点周围16*16的窗口分解为16个4*4的子窗口,图2.12显示了分解的过程。在每个4*4的子窗口中,计算出梯度的大小和方向,并用一个8个bin的直方图来统计子窗口的平均方向,如图2.13所示。 图2.12 将特征点周围16*16的窗口分解为16个4*4的子窗口

clip_image017clip_image015clip_image013clip_image011clip_image010clip_image008clip_image006clip_image004clip_image002SIFT特征详细描述 下sift描述子 图2.13每个子窗口创建一个8 bin的直方图

clip_image019clip_image017clip_image015clip_image013clip_image011clip_image010clip_image008clip_image006clip_image004clip_image002SIFT特征详细描述 下sift描述子
梯度方向在0-44度范围的像素点被放到第一个bin中,45-89度范围的像素点被放到下一个bin中,依此类推。同样加入到bin中的量依赖于该像素点梯度的大小。与之前不同的是,加入的量不仅与像素点的梯度大小相关,而且还依赖离特征点的距离,这样远离特征点的像素点会加入较少的量到直方图中。这通过一个高斯加权函数来实现,这个函数生成一个加权值(像一个二维的钟形曲线),用它乘以16*16的窗口中每个像素点的梯度大小,得到加权后的梯度大小,距离特征点越远,要加入直方图的像素点的梯度大小越小。
这样每个4*4的子窗口都对应一个8 bin的直方图,且直方图中加入的值是像素的用高斯加权后的梯度大小,而特征点周围16*16的窗口中包含16个4*4的子窗口,共有16*8=128个数,然后将这128个数组成的向量进行单位化,单位化后的128维向量就是SIFT的描述子。
实现细节
在最后得到SIFT描述子前,我们还要处理两个问题:旋转依赖和亮度依赖。
由于SIFT描述子中包含梯度方向信息,如果我们旋转图像,那么所有的梯度方向都会改变。为了实现旋转不变性,要使用2.5中计算出的特征点方向,在使用每个4*4子窗口中像素的梯度方向时,要先减去特征点方向。
由于某些图像亮度变化较大,这可能会导致特征点周围像素的梯度大小变化过大,也就是说在单位化后的SIFT描述子中某些维度的量要远大于其它维度的量。为了减少亮度的依赖,我们将128维SIFT描述子中大于0.2的维度量截取为0.2,并对最后的128为描述子再做一次单位化。
通过这系列操作,我们最后得到了具有位置稳定、尺度不变性、旋转不变性和较少亮度依赖的SIFT描述子。

三、程序说明

下面是程序的截图,从图中找到了657个具有稳定位置的特征点,为此丢弃了1437个对比度低的特征点或边界特征点。在特征点方向的计算中,将具有稳定位置的特征点进行分离,增加了特征点的数量,产生了1161个的特征点。
clip_image021clip_image019clip_image017clip_image015clip_image013clip_image011clip_image010clip_image008clip_image006clip_image004clip_image002SIFT特征详细描述 下sift描述子
左图是原始输入的图像,右图是显示了657个稳定特征点的位置,关联的直线的方向表示最大的梯度方向(未显示其它方向的特征点),直线的长度是10倍的最大梯度大小。
Tags:  siftout sift算法 sift特征点 sift特征匹配 sift描述子

延伸阅读

最新评论

发表评论