天天看点

sift特征--关键点搜索与定位

     前面介绍了如何生成高斯图像金字塔,并计算了每组图像的高斯差分图像。现在介绍如何进行关键点搜索与定位(都在灰度图上搞的)。

一、极值点计算

   关键点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。

sift特征--关键点搜索与定位

每一幅高斯差分图像中的一个像素点,要和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。

具体算法:

(1)   遍历不同分辨率和尺度高斯差分金字塔,获取特定分辨率和尺度下的高斯差分图像Io,s

(2)   同组同层比较,对Io,s内的每个像素Pcenter,首先比较Pcenter与阈值PRE_COLOR_THRES,若不满足条件,则返回false,即该点不是极值点,转到(4);否则,将Pcenter与其周围8邻域像素点比较,只要该邻域内存在相对于Pcenter的最大和最小值像素点,则认为Pcenter是该层的极值点,返回true,转到(3)

(3)   同组不同层比较,在Io,s上下两层高斯差分图像Io,s-1和Io,s+1中,分别将Pcenter同其对应的上下层邻域进行比较,如果在上下两层邻域内均存在相对于Pcenter的最大最小值,则认为Pcenter是相邻层的极值点,返回true,否则就不是极值点,返回false,转到(4)

(4)   对于返回值为true的,将Pcenter加入极值点坐标集合ret中

代码如下,清华小哥用到了c++的新特性,lamda函数,略高端:

   有一个问题是到底要在多少个尺度中寻找极值点, 即如何确定 s 值(组内层数)。实验表明, s 取 3 是较好的选择。如果 s = 3,则需要 5 幅高斯差分图像才可以。这里的计算是高效的,因为大多数情况下,只需要几步比较,就可以排除一个像素点,认为它不是极值。

另外,在极值比较的过程中,每一组图像的首末两层是无法进行极值比较的,为了满足尺度变化的连续性,我们在每一组图像的顶层继续用高斯模糊生成了3幅图像,高斯金字塔有每组S+3层图像。DOG金字塔每组有S+2层图像。也就是说,我们只牺牲了-1组的第0层和第N组的最高层。

二、抽取稳定的关键点

   由于DoG值对噪声和边缘较敏感,因此,在上面DoG尺度空间中检测到局部极值点还要经过进一步的检验才能精确定位为特征点。上一步已经求出了极值点,现在要对这些极值点进行筛选,去除不稳定的点,以增强特征点匹配时的稳定性、提高抗噪声能力。不稳定的点包括低对比度的点和边缘上的点。同时,由于在金子塔中存在降采样的图像,在这些图像中提取的极值点在原始输入图像中到底在什么位置,也是一个问题。下面将提出上面两个问题的解决方案。

1.      去除低对比度点

   低对比度的极值点,是那些对噪声敏感的候选点 ,需要剔除。遍历每个候选极值点sp,利用插值法重新计算坐标,并重复多次后,再将新坐标的像素与阈值比较,决定去留。对于保留的极值点,更新其坐标,进入边缘响应剔除步骤。

   插值的计算采用对尺度空间DoG函数进行曲线拟合,DoG函数在尺度空间的Taylor展开式,即在某极值点A对D(x,y,σ)进行泰勒展开:

sift特征--关键点搜索与定位

         (1)

    这里X=(x,y, σ)是最终插值点到点A的偏移量,对上式求X的偏导数,并令之为零,求X

sift特征--关键点搜索与定位

                                                                                (2)

     Sift原著作者认为如果,偏移量中任何一个分量大于0.5,则这个极值点和另一个采样点(图像中的另一个像素)离得更近,需要采用插值法求得极值点位置的估计值(即分量大于0.5,offset不可忽略~~),同时也可以将x待回原式求得D(x)与阈值0.03比较去除低对比度点:

sift特征--关键点搜索与定位

                                                            (3)

     上面的式子中,二阶导数用Hessian矩阵,一阶导数用梯度,它们均通过相邻像素的差值计算。这里的Hessian矩阵是由三元函数的二阶偏导数构成的方阵,描述了DOG函数的局部曲率:

sift特征--关键点搜索与定位
sift特征--关键点搜索与定位

                                                                    (4)

具体算法流程:

    遍历每个极值点,利用(4)式计算新的插值坐标偏移量iter_offset。若满足OFFSET_THRES阈值要求,则更新极值坐标,并将新坐标代入(3)式,求得的结果dextr与阈值CONTRAST_THRES比较,若满足要求,则更新极值点的真实坐标sp->real_coor

2.      去除边缘响应点

    由于DoG函数在图像边缘有较强的边缘响应,而边缘上的极值点抗噪性较差,因此我们还需要排除边缘响应。

    我们知道曲面上每个点(非平点)都有两个主方向,并且沿这两个主方向的法曲率(即两个主曲率)分别是曲面在该点法曲率的最大值和最小值。对于边缘上的点,沿垂直于边缘的方向上,法曲率最大,而沿边缘的方向上,法曲率最小。因此对于分布在边缘上附近的极值点,它们的法曲率最大值和最小值之比(即两个主曲率之比),一般情况下要比非边缘点的比值大。根据这种思想,我们可以设一个比值的阈值,当比值大于这个阈值就认为极值点在边缘上。

    DOG函数主曲率可以通过计算在该点位置尺度的2×2的Hessian矩阵得到,导数由采样点相邻差来估计:

sift特征--关键点搜索与定位

    这里Dxx表示DOG金字塔中某一尺度的图像x方向求导两次,微分可以通过计算邻近点的差值来近似计算。

    又因为DOG的主曲率和H的特征值成正比,我们只需要计算 H 的较大特征值与较小特征值的比例即可。设α 是较大的特征值, β 是较小的特征值,由矩阵性质知:

sift特征--关键点搜索与定位

    其中用到了矩阵的迹和行列式。通常这里的行列式不会是负值,如果出现负值的情况,即两个主曲率不同号,我们将丢弃这个点,不将其视为极值点。设 r=α/ β ,我们可得:

sift特征--关键点搜索与定位

      这里当 r≥1,(r+1)2/r是r的单调递增函数,因此要计算主曲率的比值(即 r)是否在某阈值之下,为了避免求H的特征值,只需要判断上式左边的项是否在阈值之下即可,通常r取10。

具体步骤:

  对于每个候选特征点,计算其Hessian矩阵,然后计算该矩阵的迹和行列式的比值,如果该比值大于阈值则保留该候选关键点,否则剔除。

极大值点结果(未去除低对比度和边缘响应)

sift特征--关键点搜索与定位

精确定位特征点处理效果:

sift特征--关键点搜索与定位

    注意这里的特征点来自于不同分辨率的不同尺度的高斯差分图像,下图展示的是经过统一坐标大小后的结果。

继续阅读