-
DOG(高斯差分)金字塔的构建
-
极值点检测(初步探查):关键点是由DOG空间的局部极值点组成的,关键点的初步探查是通过同一组内各DoG相邻两层图像之间比较完成的。这样产生的极值点并不全都是稳定的特征点,因为某些极值点响应较弱,而且DOG算子会产生较强的边缘响应。
-
关键点定位
以上方法检测到的极值点是离散空间的极值点,以下通过拟合三维二次函数来精确确定关键点的位置和尺度,同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力。
3.1 关键点精确定位
离散空间的极值点并不是真正的极值点,图4.1显示了二维函数离散空间得到的极值点与连续空间极值点的差别。利用已知的离散空间点插值得到的连续空间极值点的方法叫做子像素插值(Sub-pixel Interpolation)。
以某关键点为中心的尺度空间函数 的二次泰勒展开式为:
令 D(X) 导数为零,得到精确极值位置的偏移量为:
若偏移量在任意一个维度大于0.5,说明极值点精确位置距离另一个点更近,应该将关键点定位于更近的那个位置。定位到新点后再进行相同操作,若迭代5次位置仍不收敛,则不认为此点为关键点。设定图像边缘img_border,若关键点落在图像边缘区域(以img_border为宽度的矩形外框)也不认为此点为关键点。
3.2 消除边缘响应
一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。
主曲率:在微分几何中,在曲面给定点的两个主曲率(principal curvatures)衡量了在给定点一个曲面在这一点的不同方向怎样不同弯曲的程度。
DOG算子会产生较强的边缘响应,需要剔除不稳定的边缘响应点。获取特征点处的Hessian矩阵,主曲率通过一个2x2 的Hessian矩阵H求出:
H的特征值α和β代表该点2个特征向量的强度,D的主曲率和H的特征值成正比,所以可以利用大特征值与小特征值之比来表示大曲率和小曲率之比,两个特征值的比值越大,可以说明在某一个方向的梯度值越大,而在另一个方向的梯度值越小,而边缘恰恰就是这种情况。所以为了剔除边缘响应点,需要让该比值小于一定的阈值。(求导数利用的中心差分法,具体请看转载博客)3.3 去除低反差(low contrast)点
当精确极值点处函数值小于某个阈值时,不认为此点时极值点。 -
关键点方向分配
为了使描述符具有旋转不变性,需要利用图像的局部特征为给每一个关键点分配一个基准方向。使用图像梯度的方法求取局部结构的稳定方向。对于在DOG金字塔中检测出的关键点,采集其所在高斯金字塔图像3σ邻域窗口内像素的梯度和方向分布特征。梯度的模值和方向如下:
在完成邻域范围内的梯度幅值和幅角的计算以后,需要建立直方图来对邻域内各个像素点的幅角进行记录。在这里直方图一共分为36个柱,每个柱表示10度。把邻域内的所有像素点按所在的幅角范围进行分类,把邻域内的所有幅角在该范围内的像素点的梯度幅值乘以高斯权重相加作为该柱的高度。
把直方图建立好后,为了防止噪声的干扰,即对直方图进行两次平滑处理,即按0.25,0.5,0.25的权重对每3个连续的bin加权两次。
方向直方图的峰值则代表了该特征点处邻域梯度的方向,以直方图中最大值作为该关键点的主方向。为了增强匹配的鲁棒性,只保留峰值大于主方向峰值80%的方向作为该关键点的辅方向。因此,对于同一梯度值的多个峰值的关键点位置,在相同位置和尺度将会有多个关键点被创建但方向不同。仅有15%的关键点被赋予多个方向,但可以明显的提高关键点匹配的稳定性。实际编程实现中,就是把该关键点复制成多份关键点,并将方向值分别赋给这些复制后的关键点,并且,离散的梯度方向直方图要进行抛物线插值处理,来求得更精确的方向角度值。
至此,将检测出的含有位置、尺度和方向的关键点即是该图像的SIFT特征点。 -
关键点特征描述
通过以上步骤,对于每一个关键点,拥有三个信息:位置、尺度以及方向。接下来就是为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使其不随各种变化而改变,比如光照变化、视角变化等等。这个描述子不但包括关键点,也包含关键点周围对其有贡献的像素点,并且描述符应该有较高的独特性,以便于提高特征点正确匹配的概率。
Lowe建议描述子使用在关键点尺度空间内4x4的窗口中计算的8个方向的梯度信息,共448=128维向量表征。表示步骤如下:
5.1 确定计算描述子的图像区域
特征点描述符是跟特征点所在的尺度相关的,因此我们需要在特征点所在的尺度图像中生成特征点的描述符,对梯度的求取应在特征点对应的高斯图像上进行。在Lowe的论文中,把特征点的邻域区域划分为d∗d个正方形区域,Lowe论文中取d=4。每个正方形的区域的边长为3σ,这里的σ是相对于该组中的基准图像的尺度。由于实际情况下,编程时用到三线性插值,因此这里用到的特征点邻域的边长实际为3σ(d+1),因此邻域中一共有3σ(d+1)*3σ(d+1)个像素点。又由于旋转操作,这个值需要乘以 2 \sqrt{2} 2, 得到圆形区域的radius=3σ(d+1) 2 \sqrt{2} 2/2 。
5.2 将坐标轴旋转为关键点的方向,以确保旋转不变性
设x,y分别为采样点相对关键点的行偏移量和列偏移量,x= -radius:radius,y = -radius:radius,关键点左上角x和y均为负数。关键点方向为θ,范围是(−π,π]。在右手平面直角坐标系中,向量(x,y)逆时针旋转θ,得到的向量(x’,y’)为:
旋转结果如下:
旋转后的采样点 落在子区域的下标为:
将 3σ 设为单位长度,得到新的坐标c_bin( x ′ ′ x^{''} x′′)和r_bin( y ′ ′ y^{''} y′′),c_bin和r_bin的范围是[0, 5 2 5\sqrt{2} 52],对梯度方向弧度值减去主方向弧度(因为旋转),并设 2 π / 8 2\pi/8 2π/8为一个单位,得到o_bin,o_bin的范围是[0,8]。采样点的梯度幅值按照 σ=0.5⋅4⋅3σ (即16个区域边长的一半)的高斯函数加权:
其中a,b为关键点在高斯金字塔图像中的位置坐标。
5.3 插值计算每个种子点八个方向的梯度
上述过程中构造了一个三维的bin空间,维度包括r_bin,c_bin和o_bin。所有带有三维坐标的梯度幅值都将分配到三维格子里。为了减少一个样本点从一个格子漂移(shift)到另一个格子引起的描述子突变,需要对梯度值做三线性插值。也就是根据三维坐标计算距离周围格子的距离,将梯度幅值按权重分配到临近的格子里。
某点在三维bin空间的坐标为(r_bin,c_bin,o_bin),求出r=⌊r_bin⌋, c=⌊c_bin⌋, o=⌊o_bin⌋, dr=r_bin−r, dc=c_bin−c, do=o_bin−o,它的梯度幅值最多可能分配到周围的8个格子中。计算公式如下:
其中i,j,k均可取0或1,weightedValue下标加1的目的是使下标从1开始。
易得:
因为i,j,k均只取0或1,所以可以简化:
下图展示了描述符的梯度方向直方图:
5.4 生成描述符
为了减少光照变化的影响,对该向量进行归一化(2范数)处理。非线性光照变化仍可能导致梯度幅值的较大变化,然而影响梯度方向的可能性较小。因此对于超过阈值0.2的梯度幅值设为0.2,然后再进行一次归一化。最后将描述子按照对应高斯金字塔图像的尺度大小排序,SIFT特征描述向量生成。
图像特征点检测-SIFT算法
最新推荐文章于 2022-05-13 15:48:57 发布