SIFT的步骤如下:
(1) 尺度空间极值检测(Scale-space Extrema Detection)
也就是在多尺度高斯差分(Difference of Gauss)空间中检测极值点(3x3x3 区域极值),
作为候选的关键点(Potential keypoints)。
(2) 定位关键点(Keypoint Localization),舍弃低对比度关键点和高边缘响应的关键点。
确定候选关键点后,使用泰勒级数展开来精确定位极值点。舍弃亮度值较低(对比度较低)的极值点。
同时由于DoG空间是差分空间,对边缘有较高响应的同时也对噪声敏感。因此使用 2x2 的
Hassian 矩阵计算其特征值的比率,舍弃比值较大的极值点。
(3) 方向赋值(Orientation Assignment)
在关键点周围一定区域内计算梯度方向和幅度累计直方图。使用高斯窗函数(sigma=1.5 x Scale)加权。
取所有 bin 峰值大于最大值 80% 的峰的朝向作为关键点的方向。
(也就是说,可能存在同一尺度空间同一位置不同朝向的关键点们)。
(4) 构建关键点描述子(Keypoint descriptor)
取关键点周围 16x16 的邻域,划分为 16 个 4x4 的子块,每个子块构建 8 方向 朝向直方图,
构成 16 x 8 = 128 维度特征向量。
(5) 关键点匹配(Keypoint matching)和测试
对场景图和目标物体图都提取 SIFT 关键点,然后使用 KNN 以计算匹配最匹配的两个点。
如果到最匹配距离和到次匹配距离之间比值大于一定阈值(如0.9)则说明是噪声点,舍弃。
(6) 获取仿射变换矩阵,几何变换查找物体
从获取到的匹配关键点对使用随机抽样一致性(RANSAC, Random Sample consensus algorithm)
计算放射变换矩阵,然后变换后即可获取带查找目标在场景图中的位置。