https://blog.csdn.net/jancis/article/details/80824793
https://blog.csdn.net/qq_37374643/article/details/88606351
本文主要包括以下几个部分: SIFT 定义 、SIFT 作用 、SIFT 过程 、SIFT 相关问题。
SIFT 定义: 特征点邻域高斯图像梯度统计结果的一种表示,是一种图像局部特征提取算法。
SIFT 作用: 可以找到两张不同角度拍摄的照片,利用特征描述子将两张图片的相同部分匹配起来。
SIFT 过程:
一、尺度空间的搭建;
相关概念: octave : 组
Difference of Gaussian (DOG): 高斯差分金字塔。
高斯金字塔构建过程中的4个关键点:
(1)金字塔组数的确定,,M,N表示图像的行,列数
(2)金字塔层数的确定,一般6层(不包括扩大一倍后的原图像)
(3)每一层尺度的确定
(4)下一组的图片降采样母本的确定
二、尺度空间中候选极值点的检测
尺度空间极值检测:通过使用高斯差分函数来计算并搜索所有尺度上的图像位置,用于识别对尺度和方向不变的潜在兴趣点。SIFT特征点是由高斯差分空间的局部极值点经过筛选组成的,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较, 一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下一个候选的特征点,DoG图像中的大值和小值出现在图像区域发生较大变化的边缘处,没有变化的区域响应则接近于0。
三、对上一过程中得出的候选极值点进行筛选,去除低对比度的点和不稳定的边缘响应点,得到真正的特征点(关键点筛选定位) ;
1、去除低对比度的点
在SIFT中,图像局部块的对比度是用DOG响应的绝对值大小来度量的,因为DOG运算的本质是度量一个像素点和其周围像素的不同,值越大则对比度越高。去除小的值的点,保留有较大响应的点。SIFT通过构建尺度空间来计算不同尺度下观察到的特别的局部图像块,由于尺度采样操作的存在,上面找到的近似极值点落在像素点的位置上,而实际上如果在像素点附近用空间曲面去拟合的话,很多情况下极值点都不是恰好在像素点上,而是在附近,即极值点的位置存在偏移,为了得到更精确的极值点的位置和其响应值,SIFT中,假定了DOG响应局部区域的连续性,用二阶泰勒展开式来拟合并估计DOG的响应值,若该特征点的响应值的绝对值>=0.03,则保留该特征点,否则视为低对比度的点丢弃。
2、去除不稳定的边缘响应点
边缘的梯度值是朝同一个方向的,于是会呈现明显的梯度主方向,SIFT寻找的局部图像块,期望局部块中的主梯度方向与其他方向的梯度相差不要太大,通过计算DOG的二阶导数(Hessian矩阵),得到主梯度方向和其他方向的比值,保留该比值小于一定数值的局部特征点。去除仅落在边缘上而非角点的点,这类应被舍去的点有一个特征:沿着边缘切线方向的图像函数平缓(曲率小)。垂直边缘方向陡峭(曲率大)。由于Hessian矩阵的两个特征值是X,Y方向的曲率,所以求出每个极值点两个特征值的比例,设定一个界限,舍去不合格的点即可。
四、关键点方向分配
1.通过尺度不变性求极值点,需要利用图像的局部特征为给每一个关键点分配一个基准方向,使描述子对图像旋转具有不变性。对于在DOG金字塔中检测出的关键点,采集其所在高斯金字塔图像3σ邻域窗口内像素的梯度和方向分布特征。梯度的模值和方向如下:
2.本算法采用梯度直方图统计法,统计以关键点为原点,一定区域内的图像像素点确定关键点方向。在完成关键点的梯度计算后,使用直方图统计邻域内像素的梯度和方向。梯度直方图将0~360度的方向范围分为36个柱,其中每柱10度。如下图所示,直方图的峰值方向代表了关键点的主方向,方向直方图的峰值则代表了该特征点处邻域梯度的方向,以直方图中最大值作为该关键点的主方向。为了增强匹配的鲁棒性,只保留峰值大于主方向峰值80%的方向作为该关键点的辅方向。
五、特征点(关键点)描述
对于每一个关键点,都拥有位置、尺度以及方向三个信息。为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使其不随各种变化而改变,比如光照变化、视角变化等等。这个描述子不但包括关键点,也包含关键点周围对其有贡献的像素点,并且描述符应该有较高的独特性,以便于提高特征点正确匹配的概率。
六、关键点匹配
1. 分别对模板图(参考图,reference image)和实时图(观测图,observation image)建立关键点描述子集合。目标的识别是通过两点集内关键点描述子的比对来完成。具有128维的关键点描述子的相似性度量采用欧式距离。
2. 匹配可采取穷举法完成,但所花费的时间太多。所以一般采用kd树的数据结构来完成搜索。搜索的内容是以目标图像的关键点为基准,搜索与目标图像的特征点最邻近的原图像特征点和次邻近的原图像特征点。
Kd树如下如所示,是个平衡二叉树
SIFT 相关问题
1.SIFT 特征为什么能实现尺度不变性?
检测得到的关键点为中心,选择一个16*16的邻域,然后再把这个邻域再划分为4*4的子区域,然后对梯度方向进行划分成8个区间,这样在每个子区域内疚会得到一个4*4*8=128维的特征向量,向量元素大小为每个梯度方向区间权值。提出得到特征向量后要对邻域的特征向量进行归一化,归一化的方向是计算邻域关键点的主方向,并将邻域旋转至根据主方向旋转至特定方向,这样就使得特征具有旋转不变性。然后再根据邻域内各像素的大小把邻域缩放到指定尺度,进一步使得特征描述子具有尺度不变性。
2.SIFT 特征为什么能实现旋转不变性?
基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的旋转不变性。
3.为什么采用高斯金字塔构建尺度空间?
尺度归一化的高斯拉普拉斯算子能够得到最稳定的图像特征,但因为计算量太大,而高斯差分函数与高斯拉普拉斯算子很相似,所以通过高斯差分函数来近似的计算图像最稳定的特征。
4.SIFT算法的优缺点?
优点:
a. 具有较好的稳定性和不变性,能够适应旋转、尺度缩放、亮度的变化,能在一定程度上不受视角变化、仿射变换、噪声的干扰;
b. 区分性好,能够在海量特征数据库中进行快速准确的区分信息进行匹配;
c. 多量性,就算只有单个物体,也能产生大量特征向量;
d. 高速性,能够快速的进行特征向量匹配;
e. 可扩展性,能够与其它形式的特征向量进行联合。
缺点:
计算量太大,特征提取的速度比较慢。
5.特征描述子为什么不仅仅包含关键点,还要包含它的邻域信息?
为了避免对光照、视角等因素的敏感性。