原因:最近在分析pointsift网络,里面借鉴了二维sift算法,所以了解一下。
SIFT算法的主要步骤:
1.尺度空间关键点的检测:( 降采样 + 高斯模糊 )
在图像金字塔降采样的基础上得到多组图像,每组由多层同一尺寸大小的图像组成,其中每层图像使用不同的尺度参数σ进行高斯模糊,从而构造了高斯尺度空间。再将相邻的两个高斯空间的图像相减就得到了DoG的响应图像,公式如下:
然后寻找DoG金字塔尺度空间的极值点,每个像素点要和所有相邻点进行比较,当其大于(或者小于)所有相邻点时,该点就是极值点。(为了解决每组图像的第一层和最后一层是无法进行比较取极值的问题,在高斯金字塔每组图像中继续使用高斯模糊生成3层图像,那么DoG金字塔每组多2层。
2.关键点的精确定位与过滤
通过尺度空间DoG函数进行曲线拟合寻找极值点(去掉DoG局部曲率非常不对称的点),包括两种:
- 低对比度的特征点:
设对比度的阈值,若
,则该特征点保留,否则剔除。
- 不稳定的边缘响应点:
越大,则表示该点越有可能在边缘。设阈值
,若
,则该特征点保留,否则剔除。
3.关键点的方向确定
在高斯图像中,以关键点为中心,统计一定半径内图像的幅角和幅值,在直方图的峰值就是关键点的主方向,每个特征点可以得到三个信息(x,y,σ,θ),即位置、尺度和方向,再复制多份,即可一个特征点产生多个坐标、尺度相等,但是方向不同的特征点。
4.生成特征点的描述子
首先将坐标轴旋转为特征点的方向,以特征点为中心的16×16窗口的像素的梯度幅值和方向,将窗口内的像素分成16块,每块是其像素内8个方向的直方图统计,共可形成128维的特征向量。
实践效果图
主要整理理解过程,如有错误,欢迎指正。详细过程见以下参考文献。
参考:https://www.cnblogs.com/zyly/p/9519011.html(主要)
https://blog.youkuaiyun.com/ptxcz/article/details/42643547
https://blog.youkuaiyun.com/lhanchao/article/details/52345845