SIFT
一个好的特征描述子,要有好的区分性、尺度和旋转不变性以及鲁棒性(光照等)。SIFT可能说是最经典的
特征描述方法了,其主要分成下面四步:
(1)尺度空间选择:在尺度空间中选择潜在的满足尺度不变和旋转不变的关键点;
关于尺度空间,先对图像做高斯金字塔(包括高斯模糊和降维),再做拉普拉斯金字塔(需要做内插才能做差)。
更多可以参考:http://www.cnblogs.com/ronny/p/3886013.html
具体到SIFT,将不同尺度空间分成不同的Octave(高斯金字塔的组数),对于每个Octave,采用不同的标准差,即
每个Octave不同的层数(S)。同一个Octave中,相邻图像的差即为DoG,即对应的尺度空间。
(2)关键点定位:精确定位特征点的位置,剔除伪特征点;
由不同的尺度空间,我们可以选出所有的局部极值点,这其有有很多极值点,且不一定为关键点,因为需要剔除。
主要分为两步:
1)粗剔除:剔除响应值低的关键点。通过将DoG进行泰勒展开、求导,可以得到关键点的
精确位置与尺度,剔除响应值低的点;
2)进一步剔除:DoG在边缘具有较强的响应值,而这些点通常是难定位、不稳定的,因此需要删除边缘效应。
(3)方向分配:基于关键点的局部梯度方向,给每个关键点分配方向;
选取关键点周围16*16的窗口,统计这256个像素的梯度按方向统计到36个bin的直方图中(加权的,权值为梯度大小)。
选取直方图中的峰值作为这个关键点的方向(旋转不变)。
(4)关键点描述:对于每个关键点,用一个高维的向量去描述每个关键点。
采用梯度方向直方图来对其进行描述。将16*16的窗口分成16个4*4的小窗口,统计每个小窗口的梯度(8个bin),
最后得到的描述子向量为16*8=128维。
参考:http://blog.csdn.net/a130737/article/details/37564463?utm_source=tuicool&utm_medium=referral
更具体的,可参考如下博文:
参考:http://www.cnblogs.com/ronny/p/4028776.html
博文同样是分为几个点:
构建高斯差分金字塔:在这个点中,尺度空间生成了多少图像,为什么是倒数第三张解释的很清楚。
这部分代码可参考这位博主:http://blog.csdn.net/xiaowei_cqu/article/details/8067881
特征点搜索:在这个点中,清楚的解释了子像元插值,也就知道了为什么以及如何进行精确点的定位。最后介绍了边缘效应的方法。
这部分的源码可看这里,很惭愧,没看下去:http://blog.csdn.net/xiaowei_cqu/article/details/8087239
方向赋值:为关键点赋值,包括位置、方向和尺度信息。源码分析:http://blog.csdn.net/xiaowei_cqu/article/details/8096072
关键点描述:http://blog.csdn.net/xiaowei_cqu/article/details/8113565