图像特征——尺度不变特征变换匹配算法(SIFT)
一 尺度不变特征转换(Scale Invariant Feature Transform,SIFT)
原论文:https://github.com/Fox-Legend/ImageProcessPaper/blob/master/Distinctive%20Image%20Features%20from%20Scale-Invariant%20Keypoints.pdf
论文解读:https://zhuanlan.zhihu.com/p/261697473
转自:https://blog.csdn.net/mingcheng2650/article/details/103620977
https://www.cnblogs.com/ronny/p/4028776.html
1、SIFT概述
SIFT:Scale Invariant Feature Transfrom
尺度不变特征转换
该算法是由David G.Lowe在1999年所发表,2004年完善总结,论文下载地址SIFT-Paper。
该算法是一种检测局部特征的算法,该算法通过求一幅图中的特征点(兴趣点interest points,or 角点corner points)及其有关尺度(scale) 和 方向(orientation) 的描述值得到特征并进行图像特征点匹配。
其特点有:
- 1.SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
- 2.独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
- 3.多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
- 4.高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;
- 5.可扩展性,可以很方便的与其他形式的特征向量进行联合。
SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。
Lowe将SIFT算法分为四个步骤:
- 1.尺度空间极值检测(Scale-space extrema detection):搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。
- 2.关键点定位(Keypoint localization):在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。
- 3.方向确定(Orientation assignment):基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、
- 尺度和位置进行变换,从而提供对于这些变换的不变性。
- 4.关键点描述(Keypoint descriptor):在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。
2、 SIFT算法中一些符号的说明
二 SIFT算法实现
1 尺度空间极值检测(Scale-space extrema detection)
1.1 高斯模糊(Gaussian Blur)基础知识
介绍高斯模糊的原因在于:
高斯卷积核 实现 尺度变换
高斯金字塔 进行 尺度空间表示
高斯差分金字塔 进行 极值点检测
Lindeberg在1994年就发现**高斯差分函数(Difference of Gaussian ,简称DOG算子)与尺度归一化的高斯拉普拉斯函数非常近似**。
SIFT算法是在不同的尺度空间上查找关键点,而尺度空间的获取需要使用高斯模糊来实现。而且Lindeberg等人已证明**高斯卷积核是实现尺度变换的唯一变换核,并且是唯一的线性核**。
即通过 高斯模糊 --> 获取尺度空间 --> 获取关键点
高斯模糊是一种图像滤波器,它使用正态分布(高斯函数)计算模糊模板,并使用该模板与原图像做卷积运算,达到模糊图像的目的。
N维空间正态分布方程为:
其中,sigma是正态分布的标准差,sigma值越大,图像越模糊。r为模糊半径,模糊半径是指模板元素到模板中心的距离。如二维模板大小为m*n,则模板上的元素(x,y)对应的高斯计算公式为:
在二维空间中,这个公式生成的曲面的等高线是从中心开始呈正态分布的同心圆,如图2.1所示。
分布不为零的像素组成的卷积矩阵与原始图像做变换。每个像素的值都是周围相邻像素值的加权平均。原始像素的值有最大的高斯分布值,所以有最大的权重,相邻像素随着距离原始像素越来越远,其权重也越来越小。这样进行模糊处理比其它的均衡模糊滤波器更高地保留了边缘效果。
理论上来讲,图像中每点的分布都不为零,这也就是说每个像素的计算都需要包含整幅图像。在实际应用中,在计算高斯函数的离散近似时,在大概3σ距离之外的像素都可以看作不起作用,这些像素的计算也就可以忽略。通常,图像处理程序只需要计算\(({6\sigma+1})({6\sigma+1})\)的矩阵就可以保证相关像素影响。
1.2 尺度空间极值检测
1.2.1 尺度空间的表示
尺度空间使用高斯金字塔表示。
一个图像的尺度空间L(x,y,sigma),定义为一个变化尺度的高斯函数与原图像的卷积。
其中,*表示卷积运算,
m,n表示高斯模板的大小。(x, y)代表图像的像素位置。sigma标准差是尺度空间因子,sigma值越小表示图像被平滑的越少,相应的尺度也就越小,图像变化也越小。大尺度对应于图像的概貌特征,小尺度对应于图像的细节特征。
1.2.2 高斯金字塔
尺度空间使用高斯金字塔表示。
下图两图是典型的图像高斯金字塔,这就是模仿的图像离你远去时在你视网膜上的成像,图像分别以动态方式表示。
高斯金字塔的构建步骤:
- 对图像做不同尺度的高斯模糊,得到的每张尺度图像称为一层,多张不同尺度图像为一组(Octave);
- 对图像做降采样(隔点采样),形成新的一组(Octave)。
上面描述貌似有问题,应该是先做降采样,在对降采样后的图像做不同尺度的高斯模糊。
1.2.3 高斯差分金字塔
构造《高斯差分金字塔》目的是为了寻找最大的差异点,比如两个双胞胎各方面都一样,怎么找他们的差异点,他们之间最大的差异点可能是名字。
而高斯差分金子塔就是为了找出最大的差异点-名字。
2002年Mikolajczyk在详细的实验比较中发现尺度归一化的高斯拉普拉斯函数的极大值和极小值同其它的特征提取函数(例如:梯度,Hessian或Harris角特征)比较,能够产生最稳定的图像特征。
Lindeberg在1994年就发现**高斯差分函数(Difference of Gaussian ,简称DOG算子)与尺度归一化的高斯拉普拉斯函数非常近似**。
因此,Lowe使用更高效的高斯差分算子代替拉普拉斯算子进行极值检测,如下:
DoG三个参数,x,y指像素点的坐标,σ是当前图像使用的高斯滤波函数的标准差。
在实际计算时,使用高斯金字塔每组中相邻上下两层图像相减,得到高斯差分图像,进行极值检测,如下:
左侧是构建的一组(σ, kσ, k**2σ, k**3σ, k**4σ, k**5σ)高斯滤波的高斯金字塔,而右侧是相邻两层差值得到的高斯差分图像,
1.3 构建高斯差分金字塔的几个问题
1.3.1 第一组第一层图像的生成
1.3.2 尺度空间生成了多少幅图像
1.3.3 为什么是倒数第3张
1.3.4 用第i-1层的图像生成第i层的图像
2. 关键点定位(Keypoint localization)
2.1 关键点定位
关键点定位即DOG空间极值检测定位。在上一步得到DoG高斯差分金字塔后,怎么找到差分后的极值点。为了寻找尺度空间的极值点,每个像素点要和其图像域(同一尺度空间)和尺度域(相邻的尺度空间)的所有相邻点进行比较,当其大于(或者小于)所有相邻点时,该点就是极值点。如下图所示,中间的检测点要和其所在图像的3×3邻域8个像素点,以及其相邻的上下两层的3×3领域18个像素点,共26个像素点进行比较,以确保在尺度空间和二维图像空间都检测到极值点。 一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点。
搜索过程从每组的第二层开始,以第二层为当前层,对第二层的DoG图像中的每个点取一个3×33×3的立方体,立方体上下层为第一层与第三层。这样,搜索得到的极值点既有位置坐标(DoG的图像坐标),又有空间尺度坐标(层坐标)。当第二层搜索完成后,再以第三层作为当前层,其过程与第二层的搜索类似。当S=3时,每组里面要搜索3层。
2.2 关键点精确定位——子像元插值法
以上方法检测到的极值点是离散空间的极值点,以下通过拟合三维二次函数来精确确定关键点的位置和尺度,同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力。
下图显示了二维函数离散空间得到的极值点与连续空间极值点的差别。利用已知的离散空间点插值得到的连续空间极值点的方法叫做子像元插值(Sub-pixel Interpolation)。
注意:如这里以一维的泰勒级数展开为例,这里泰勒级数展开只展开到二阶,因为一般三阶导就很小了,所以只展开到二阶。
实际是三维的,公式中的D(Δx, Δy, Δσ)是f(x)在3维空间的扩展。
这里的D(x)即为检测到的极值点。
2.3 消除边界效应
为了得到稳定的特征点,只是删除DoG高斯差分函数响应值低的点是不够的。由于DoG对图像中的边缘有比较强的响应值,而一旦特征点落在图像的边缘上,
这些点就是不稳定的点。一方面图像边缘上的点是很难定位的,具有定位歧义性;另一方面这样的点很容易受到噪声的干扰而变得不稳定。一个平坦的DoG
响应峰值往往在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。而主曲率可以通过2X2的Hessian矩阵H求出:
上式中,D值可以通过求取邻近点像素的差分得到。H的特征值与D的主曲率成正比例。我们可以表面求取具体的特征值,因为我们只关心特征值的比例。
令α = λmax 为最大的特征值,β = λmin为最小的特征值,那么,我们通过H矩阵直迹计算它们的和,通过H矩阵的行列式计算它们的乘积:
如果γ为最大特征值与最小特征值之间的比例,那么α = γβ,这样便有
上式的结果只与两个特征值的比例有关,而与具体的特征值无关。当两个特征值相等时,的值最小,随着γ的增加,的值也增加,所以要想检查主曲率的比例小于某一个阈值γ,只要检查下式是否成立:
Low在论文中给出的γ=10。也就是说对于主曲率比值大于10的特征点将被删除。
3 方向确定(Orientation assignment)
3.1 特征点的主方向
4.5 生成特征描述
计算得到梯度方向后,使用直方图统计特征点邻域内像素对应的梯度方向和幅值。梯度方向的直方图的横轴是梯度方向的角度(梯度方向的范围是0到360度,直方图每36度一个柱共10个柱,或者每45度一个柱共8个柱),纵轴是梯度方向对应梯度幅值的累加,在直方图的峰值就是特征点的主方向(可以只看下图右边部分的示意图)。
- 在Lowe的论文还提到了使用高斯函数对直方图进行平滑以增强特征点近的邻域点对关键点方向的作用,并减少突变的影响。
- 为了得到更精确的方向,通常还可以对离散的梯度直方图进行插值拟合。具体而言,关键点的方向可以由和主峰值最近的三个柱值通过抛物线插值得到。
在梯度直方图中,当存在一个相当于主峰值80%能量的柱值时,则可以将这个方向认为是该特征点辅助方向。所以,一个特征点可能检测到多个方向(也可以理解为,一个特征点可能产生多个坐标、尺度相同,但是方向不同的特征点)。Lowe在论文中指出
15%的关键点具有多方向,而且这些点对匹配的稳定性很关键。
得到特征点的主方向后,对于每个特征点可以得到三个信息(x,y,σ,θ)(x,y,σ,θ),即位置、尺度和方向。由此可以确定一个SIFT特征区域,一个SIFT特征区域由三个值表示,中心表示特征点位置,半径表示关键点的尺度,箭头表示主方向。具有多个方向的关键点可以被复制成多份,然后将方向值分别赋给复制后的特征点,一个特征点就产生了多个坐标、尺度相等,但是方向不同的特征点。
算法流程:
1. 遍历特征点集合points,搜索每个特征点的邻域,半径为rad,生成含有36柱的方向直方图,梯度直方图范围0~360度,其中每10度一个柱。 2. 利用高斯加权对方向直方图进行两次平滑,增加稳定性(每相邻三个bin采用高斯加权,根据Lowe的建议,模板采用[0.25,0.5,0.25],并连续加权两次。) 3. 通过峰值比较,求取关键点方向(可能是多个方向); 4. 通过Taylor展开式对上述峰值进行二次曲线拟合,计算关键点精确方向,即重新计算峰值所在bin的值; 5. 根据bin的值还原角度,作为特征点的方向。
通过以上的步骤已经找到了SIFT特征点位置、尺度和方向信息,下面就需要使用一组向量来描述关键点也就是生成特征点描述子,这个描述符不只包含特征点,也含有特征点周围对其有贡献的像素点。描述子应具有较高的独立性,以保证匹配率。
特征描述符的生成大致有三个步骤:
1. 校正旋转主方向,确保旋转不变性。 2. 生成描述子,最终形成一个128维的特征向量 3. 归一化处理,将特征向量长度进行归一化处理,进一步去除光照的影响。
旋转后以主方向为中心取 8×8的窗口。下图所示,左图的中央为当前关键点的位置,每个小格代表为关键点邻域所在尺度空间的一个像素,求取每个像素的梯度幅值与梯度方向,箭头方向代表该像素的梯度方向,长度代表梯度幅值,然后利用高斯窗口对其进行加权运算。最后在每个4×4的小块上绘制8个方向的梯度直方图,计算每个梯度方向的累加值,即可形成一个种子点,如右图所示。每个特征点由4个种子点组成,每个种子点有8个方向的向量信息(也就是在这个例子里,一个关键点的描述子为4*8=32维向量)。这种邻域方向性信息联合增强了算法的抗噪声能力,同时对于含有定位误差的特征匹配也提供了比较理性的容错性。(左图:Image gradients, 右图:Keypoint descriptor)
与求主方向不同,此时每个种子区域的梯度直方图在0-360之间划分为8个方向区间,每个区间为45度,即每个种子点有8个方向的梯度强度信息。
在实际的计算过程中,为了增强匹配的稳健性,Lowe建议
对每个关键点使用 4×4共16个种子点来描述,这样一个关键点就可以产生128维的SIFT特征向量。
通过对特征点周围的像素进行分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。
4.6 根据SIFT描述子进行Match
生成了A、B两幅图的描述子,(分别是k1128维和k2128维,k1和k2是两幅图中的关键点个数),就将两图中各个scale(所有scale)的描述子进行匹配,匹配上128维即可表示两个特征点match上了。
当两幅图像的SIFT特征向量生成后,下一步我们采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图像1中的某个关键点,并找出其与图像2中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离少于某个比例阈值,则接受这一对匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。为了排除因为图像遮挡和背景混乱而产生的无匹配关系的关键点,Lowe提出了比较最近邻距离与次近邻距离的方法,距离比率ratio小于某个阈值的认为是正确匹配。因为对于错误匹配,由于特征空间的高维性,相似的距离可能有大量其他的错误匹配,从而它的ratio值比较高。Lowe推荐ratio的阈值为0.8。但作者对大量任意存在尺度、旋转和亮度变化的两幅图片进行匹配,结果表明ratio取值在0. 4~0. 6之间最佳,小于0. 4的很少有匹配点,大于0. 6的则存在大量错误匹配点。(如果这个地方你要改进,最好给出一个匹配率和ration之间的关系图,这样才有说服力)作者建议ratio的取值原则如下:
ratio=0. 4 对于准确度要求高的匹配; ratio=0. 6 对于匹配点数目要求比较多的匹配; ratio=0. 5 一般情况下。 也可按如下原则:当最近邻距离<200时ratio=0. 6,反之ratio=0. 4。ratio的取值策略能排分错误匹配点。