特征点检测
1. Harris角点检测
角点检测的基本思想是:使用角点检测算子,对图像的每个像素计算角点响应函数(Corner Response Function ),阈值化角点响应函数,根据实际情况选择阈值,对阈值化的角点响应函数进行非极大值抑制,并获取非零点作为角点。
角点响应函数定义为:
E(u,v)=∑x∑yw(x,y)[I(x+u,y+v)−I(x,y)]2, w(x,y)代表窗函数
使用泰勒级数展开,并忽略非线性项:
I(u+Δx,v+Δy)=I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy+O(Δx2,Δy2)≈I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy
进一步化简为:
E(u,v)=∑x,yw(IxΔx+IyΔy)2=[ΔxΔy]M⎣⎡ΔxΔy⎦⎤
其中:
where M=∑(x,y)w(x,y)(IX2IXIYIXIYIY2)=(∑WIX2∑WIXIY∑WIXIY∑WIY2)=[ACCB]
即图像的角点响应函数近似为二项函数:
c(x,y;Δx,Δy)≈AΔx2+2CΔxΔy+BΔy2
二项函数的本质是椭圆; 而特征值代表椭圆的长轴和短轴:
为了评价特征值大小,他们定义了一个评价指标为;
R=det(M)−k(trace(M))2
一般 k=0.04 0.06
det(M)=λ1λ2
trace(M)=λ1+λ2
其中
1)图像中的直线,一个特征值大,另一个特征值小, 此时R<0
2)图像中的平面,两个特征值都小,且近似相等,此时 R 很小
3)图像中的角点,两个特征值都大,且近似相等, 此时 R 很大
- Harri角点对亮度和对比度变化不敏感
- Harris角点具有旋转不变性
- Harris不具有尺度不变性
2.SIFT特征点检测
尺度空间理论: http://www.cnblogs.com/ronny/p/3886013.html
可以证明: 高斯核是实现尺度变换的唯一变换核。
SIFT算法的特点有:
- SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
- 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
- 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
- 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;
- 可扩展性,可以很方便的与其他形式的特征向量进行联合
SIFT算法步骤
-
尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。
-
关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。
-
方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。
-
关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。
构建尺度空间
尺度空间理论目的是模拟图像的多尺度特征,高斯核是实现尺度变换的唯一线性核,二维尺度空间定义为;
L(x,y,σ)=G(x,y,σ)∗I(x,y)
G(x,y,σ)=2πσ21e−(x2+y2)/2σ2
σ是尺度座标,代表图像平滑程度,大尺度对应图像概貌(低分辨率),小尺度对应图像细节特征(高分辨率), 为了在尺度空间有限检测特征点,提出了高斯差分尺度空间(DOG scale-space):
从图中可以看出,构建尺度空间分为两步
- 对图像进行不同程度的高斯模糊得到每一层的若干幅图像
- 对上一层倒数第三幅图像(为了保持尺度空间的连续性)进行下采样,得到下一层(octave)
在得到了尺度空间后,则要构建高斯差分金字塔:如下图所示,首先将同一层不同尺度的图像做差,得到DOG, 为了检测不同尺度下的极值点,中间检测点需要和同一尺度下相邻的8个点,同时和上下层的9*2=18个点作比较,如果是这26个点中最大或最小值,则初步认为是一个极值点,从上面分析可知,要想在一层S个尺度下检测特征点,则需要S+2高斯差分金字塔,S+3尺度金字塔;
关键点定位
上述的过程得到的是离散形式下的极值点,并非真正意义上的极值点,因此需要将离散空间插值到连续空间得到极值点,该方法叫子像元插值方法:
假设我们前面检测到的离散极值点的位置是:(x,y,σ),则连续情况下极值点的位置应该在(x,y,σ)附近,设连续情况下极值点的位置在(Δx,Δy,Δσ), 进行泰勒展开可得:
D(Δx,Δy,Δσ)=D(x,y,σ)+[x∂Dy∂Dσ∂D]⎣⎡ΔxΔyΔσ⎦⎤+21[ΔxΔyΔσ]⎣⎢⎡∂xL∂2D∂ydx∂2D∂σdx∂2D∂x∂y∂2D∂y2∂2D∂σ∂y∂2D∂xdσ∂2D∂ydσ∂2D∂σ2∂2D⎦⎥⎤⎣⎡ΔxΔyΔσ⎦⎤
写成矢量形式:
D(X)=D+∂X∂DTX+21XT∂X2∂2DX
令上面式子一阶导数为零,则X^=−∂X2∂2D−1∂X∂D,
如果任一尺度的相对偏移量大于0.5,说明候选点更新到了新的位置,通过上式迭代得到稳定的候选点的精确位置和尺度,将其带入公式求出D(X),如果绝对值低于阈值,将会被删除。
如果想得到稳定的特征点,还需要删除边缘效应
由于DoG对图像的边缘也有较大的响应值,因此需要删除不稳定边缘点,可以通过主曲率来剔除这些点。
图像的主曲率可以由 2×2的Hessian矩阵H求得:
H(x,y)=[Dxx(x,y)Dxy(x,y)Dxy(x,y)Dyy(x,y)]
H的特征值α和β分别代表两个方向的主曲率(梯度值), 不妨假设α是其中较大的一个,令α=γβ对于边缘点来说,他们一个方向梯度很大,另一个方向梯度很小,即r很大的点,需要剔除这些点。
易得:
Tr(H)=Dxx+Dyy=α+β
Det(H)=DxxDy−(Dxy)2=αβ,
则:
Det(H)Tr(H)2=αβ(α+β)2=γ(γ+1)2, 当特征值相等,上式值最小,随着γ增大,上式值也增大,所以要想检查主曲率的比例小于某一阈值γ,只要检查下式是否成立
Det(H)Tr(H)2<γ(γ+1)2,论文中取γ=10
关键点方向确定
为了使特征描述子具有旋转不变性,需要根据图像的局部梯度特征分配一个基准方向,
梯度的模值和方向定义如下:
m(x,y)=(L(x+1,y)−L(x−1,y))2+(L(x,y+1)−L(x,y−1))2
θ(x,y)=tan−1((L(x,y+1)−L(x,y−1))/L(x+1,y)−L(x−1,y)))
其中L所用的尺度为各自关键点素在的尺度,这样每个关键点有三个信息:位置,尺度,方向。
在实际计算时,我们在以关键点为中心的邻域窗口内采样,并用直方图统计邻域像素的梯度方向。梯度直方图的范围是0~360度,其中每45度一个柱,总共8个柱, 或者每10度一个柱,总共36个柱。Lowe论文中还提到要使用高斯函数对直方图进行平滑,减少突变的影响。直方图的峰值则代表了该关键点处邻域梯度的主方向,即作为该关键点的方向。邻域范围可以根据3σ原则来确定。
关键点特征描述子
- 将座标轴旋转到关键点的方向,以确保旋转不变性
- 计算keypoint周围的16*16(邻域的范围根据尺度确定,这里仅举一个例子)的window中每一个像素的梯度,而且使用高斯下降函数降低远离中心的权重。
- 在每一个4×4的小块计算8个方向梯度直方图,绘制梯度方向的累加值,即可形成16个种子点,则这样对每一个feature形成一个4×4×8=128维特征描述子。每一维表示的是每个格子的 scale/orientation
- 将这个向量进一步归一化,就除去了光照的影响。
根据特征描述子进行Match
生成了A B两幅图的描述子,就可以把两幅图中各个scale的描述子计算欧式距离,进行匹配。
具体来说,对于图像A中的某个特征点,首先根据欧氏距离会在图像B中寻找两个匹配点,如果最邻近距离与次邻近距离距离比率小于某个阈值才认为是正确匹配,减少匹配点的数量,使结果更稳定。
作者建议ratio的取值原则如下:
ratio=0. 4 对于准确度要求高的匹配;
ratio=0. 6 对于匹配点数目要求比较多的匹配;
ratio=0. 5 一般情况下。
参考博客
Harris特征点检测
https://www.cnblogs.com/ronny/p/4009425.html
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_features_harris/py_features_harris.html
sift特征点检测
https://blog.csdn.net/dcrmg/article/details/52561656
https://www.jianshu.com/p/03449c6b42c4
https://blog.csdn.net/zddblog/article/details/7521424
http://www.cnblogs.com/ronny/p/4028776.html#3962356