SIFT算法描述符简述
SIFT算法系列一直想把描述符阶段给写完,怪自己有点小偷懒,出来混迟早要还的。这次在之前SIFT算法系列之尺度空间与SIFT算法系列之特征点检测基础上,继续完善将描述符如何生成过程写完。
废话不多说,我们知道描述符生成是建立在特征点之后的,假设我们检测出一些特征点,如下图:
如上图,在特征点已经检测出来基础上,来计算特征点的主方向;
SIFT源代码中计算主方向:以关键点为中心对齐周围邻域窗口进行采样,首先采取高斯函数进行平滑,减少邻域像素突变干扰。然后计算邻域的像素与关键点的梯度幅值与方向来统计形成直方图。
梯度直方图的范围是0~360度,每45度一个柱,总共8个柱;或者设置每10度一个柱,总共36个柱。下图为8个柱示例图:
梯度直方图最大峰值则设置成关键点的主方向,如果第二峰值是第一峰值80%则也保存作为候选关键点辅助方向。
SIFT算法描述符构建过程
1. 确定关键点主方向后,根据关键点的尺度系数得到ROI邻域半径;
2. 将关键点邻域半径的ROI进行主方向旋转;
3. 对旋转后的ROI区域计算关键点的梯度直方图;
4. 对每个2x2的小子区域8为向量排序,生成128维向量;
5. 对128维向量进行归一化操作;
1 关键点的主方向确定后,首先将当前特征点尺度计算出ROI区域半径:(我们知道特征点检测会在尺度空间上进行,那么检测出来的特征点也会存在不同的尺度参数,所以我们在构建局部描述符时候需要根据不同的尺度那划分不同半径区域,这样才可以保持尺度不变性匹配)。
r a d i u s = ( 3 σ o c t × 2 × ( d + 1 ) + 1 ) 2 radius=\frac{(3σ_{oct}×{\sqrt2}×(d+1)+1)}{2} radius=2(3σoct×2×(d+1)+1)
其中 σ o c t σ_{oct} σoct即是尺度参数, d = 4 d=4 d=4。
2 根据主方向将确定后的ROI(尺度参数来确定邻域半径)旋转至主方向:
这样经过旋转后每个像素新坐标如下:
( x ′ y ′ ) = ( c o s θ − s i n θ s i n θ c o s θ ) ∗ ( x y ) \left( \begin{matrix} x^{'} \\ y^{'} \end{matrix} \right)= \left( \begin{matrix} cos^{θ} & -sin^{θ}\\ sin^{θ} & cos^{θ} \end{matrix} \right)*\left( \begin{matrix} x \\ y \end{matrix} \right) (x′y′)=(cosθsinθ