SIFT特征匹配
一,SIFT概述
SIFT,即尺度不变特征变换(Scale-invariant feature transform, SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,它对物体的尺度变化,刚体变换,光照强度和遮挡都具有较好的稳定性,可在图像中检测出关键点,是一种局部特征描述子,同时是一套特征提取的理论。SIFT算法是一种基于局部兴趣点的算法,因此不仅对图片大小和旋转不敏感,而且对光照,噪声等影响的抗击能力也非常优秀。
SIFT算法步骤如下:
主要包含4个步骤:
1)尺度空间极值检测:通过使用高斯差分函数来计算并搜索所有尺度上的图像位置,用于识别对尺度和方向不变的潜在兴趣点。
2)关键点定位:通过一个拟合精细的模型在每个候选位置上确定位置和尺度,关键点的选择依赖于它们的稳定程度。
3)方向匹配:基于局部图像的梯度方向,为每个关键点位置分配一个或多个方向,后续所有对图像数据的操作都是相对于关键点的额方向、尺度和位置进行变换,从而为变换提供了不变性
4)关键点描述:这个和HOG算法有点类似指出,在每个关键点周围的区域内以选定的比例计算局部图像梯度,这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。
SIFT算法被认为是图像匹配效果好的方法之一,算法实现特征匹配主要有三个流程:
- 特征点提取;
- 特征点主方向确定;
- 特征点描述
- 特征点匹配
其中特征点提取主要包括生成高斯差分(DifferenceofGaussian,DOG)尺度空间、寻找局部极值点、特征点筛选、确定特征点方向;特征点匹配主要包括根据描述子相似性进行匹配、匹配对比值提纯、RANSAC方法剔除离群匹配对。
二,SIFT特征提取及匹配
2.1 特征点提取(关键点检测)
两种图像在匹配的时候可能因为拍摄的距离、拍摄的角度问题,会导致在特征点提取的时候差异很大,所以我们希望SIFT的特征点可以具有尺度不变性和方向不变性。
对于我们人类来说,在一定的范围内,无论物体远还是近,我们都可以一眼分辨出来,当一个人从远处走来的时候,我们可以从轮廓就判断出这是一个人,但是还看不清细节,当他走进的时候,我们才回去注意其他的细节特征。而计算机没有主观意识去识别哪里是特征点,它能做的,只是分辨出变化率最快的点。彩色图是三通道的,不好检测突变点。需要将RGB图转换为灰度图,此时灰度图为单通道,灰度值在0~255之间分布。而且当图像放大或者缩小时,它读取的特征点与原先可能差异很大,所以其中一个办法就是把物体的尺度空间图像集合提供给计算机,让它针对考虑不同尺度下都存在的特征点。
2.1.1 尺度空间
图像处理中的“尺度”可以理解为图像的模糊程度,类似眼睛近视的度数。尺度越大细节越少,SIFT特征希望提取所有尺度上的信息,也就是无论图像是否经过放大缩小都能够提取特征。这种思考,是和人的生理特征类似的,比如我们即使是在模糊的情况下仍然能够识别物体的种类,生理上人体对物体的识别和分类和其尺度(模糊程度)没有直接关系。
自然界中的物体随着观测尺度不同有不同的表现形态。例如我们形容建筑物用“米”,观测分子,原子等用“纳米”。更形象的例子比如google地图,滑动鼠标论可以改变观测地图的尺度。尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人再距离目标由近到远时目标再视网膜上的形成过程。尺度越大图像越模糊。尺度空间尺度大小用$\sigma$来表示
当用一个机器视觉系统分析未知场景时,计算机没有办法预先知道图像中物体尺度,因此,我们需要同时考虑图像再多尺度下的描述,获知感兴趣物体的最佳尺度。所以很多时候,我们再将图像构建为一系列不同尺度的图像集,在不同的尺度中去检测我们感兴趣的特征。比如:在Harr特征检测人脸的时候,因为我们并不知道图像中人脸的尺寸,所以需要生成一个不同大小的图像组成的金字塔,扫描其中每一幅图像来寻找可能的人脸。
尺度空间的基本思想为:高斯核是唯一可以产生多尺度空间的核,在输入的图像模型中,通过高斯模糊函数连续的对尺度进行参数变换,最终得到多尺度空间序列。尺度是自然客观存在的,不是主管创造的,高斯卷积只是表现尺度空间的一种形式。图像中某一尺度的空间函数$L(x, y, \sigma)$由可变参数的高斯函数$G(x, y, \sigma)$和原输入图像$I(x, y)$卷积得出:
其中,$\sigma$表示为尺度空间因子,$\sigma$越小,反应的局部点越清晰。反之$\sigma$越大,图像越模糊,越不能反映出图像的细节。
图像的尺度空间解决的问题是如何对图像在所有尺度下描述的问题。在高斯金字塔中一共生成O组L层不同尺度的图像,这两个量合起来(O, L)就构成了高斯金字塔的尺度空间,也就是说以高斯金字塔的组O作为二维坐标系的一个坐标,不同层L作为另一个坐标,则给定一组坐标(O, L)就可以唯一确定高斯金字塔中的一幅图像。尺度空间的形象表述:
上图中尺度空间中k前的系数n表示的是第一组图像尺寸是当前组图像尺寸的n倍。
尺度的选择【经验之谈】
一般我们采集到的图像中,我们并不知道感兴趣的目标在图像中的尺度,在这样的情况下,我们对图像进行分析时就无法选择合适的参数,比如边缘检测,可能由于参数不当,而造成过多的局部细节。如下图所示,红色圆圈内的半点的大小(直径)比例对应着两幅图像之间尺寸比例(scale ratio)。如果对两幅图像采用相同的固定尺度的LoG检测器检测,很难将这两个斑点检测出来。LoG检测器相当于一个匹配滤波器,只有当LoG的尺度与图片中半点结构尺寸相当时才会有较强的响应。如果用与作图中斑点结构相当大小尺度LoG算子,在右图中打扮点的对应的LoG响应很小不能被检测出来,反之亦然。因此固定尺度的LoG斑点检测器不具有尺度不变性。使用尺度空间进行多尺度检测可以将两幅图像中不同尺度的斑点检测出来。但是由于斑点结构是在一定范围之内存在的,比如用5~8尺度的LoG可能都能检测出来右边图像中的斑点结构,所以在尺度空间中进行半点检测会有重复检测的缺点。
在实际操作中,我们需要定义一个特征响应函数,在不同的尺度空间上寻找一个极值点。比如小猫的金字塔图像分析时,我们定义了一个大小为[w, h]的小猫的模板,用这个模板去与金字塔系列图像匹配,一定有匹配度最佳(即特征响应最强)。需要注意的是,图像结构往往是在粗糙的尺度上被检测到,此时位置信息未必是最准确的,因此通常图像的尺度分析包含两个阶段:首先在粗尺度上进行特征(结构)检测,然后再在系尺度上进行精确定位。
lowe于1999年提出在高斯差分函数(DOG)中使用尺度空间极值与图像做卷积,这可以通过由常数乘法因子分隔的两个相邻尺度的差来计算。由于平滑区域临近像素之间变化不大,但是在边,角,点这些特征较丰富的地方变化较大,因此通过DOG比较临近像素可以检测出候选关键点。
2.1.2 多分辨率图像金字塔
在早期图像的多尺度通常使用图像金字塔表述形式。图像金字塔是同一图像在不同的分辨率下得到的一组结果,其生成过程一般包含两个步骤:
- 对图像做高斯平滑(高斯模糊)
- 对图像做降采样,降维采样后得到一系列尺寸不断缩小的图像。
传统的SIFT算法是通过建立高斯差分函数(DOG)方法来提取特征点。首先,在不同尺度参数的组数中,高斯差分图像是由某一相同尺度层的相邻图像作差值得出。然后,将得到的差分图像与原图像$I(x,y)$做卷积得到DOG函数:
从上式可以知道,将相邻的两个高斯空间的图像相减就得到了DOG的响应图像。为了得到DOG图像,先要构造高斯尺度空间,而高斯的尺度空间可以在图像金字塔降维采样的基础上加上高斯滤波得到,也就是对图像金字塔的每层图像使用不同的尺度参数$\sigma$进行高斯模糊,使每层金字塔有多张高斯模糊过的图像,然后我们把得到的同一尺寸大小的图像划分为一组。
为了得到DOG图像,先要构建高斯金字塔。高斯金字塔在多分辨率金字塔简单降采样基础上加了高斯滤波,也就是对金字塔每层图像用不同参数的$\sigma$做高斯模糊,使得每层金字塔有多张高斯模糊图像。金字塔每层多张图像合称为一组(Octave),每组有多张(也叫层Interval)图像。另外,降采样时,金字塔上边一组图像的第一张图像(最底层的一张)是由前一组(金字塔下面一组)图像的倒数第三张隔点采样得到。
多尺度和多分辨率:
尺度空间表达和金字塔多分辨率表达之间最大的不同是:
- 尺度空间表达式由不同高斯核平滑卷积得到,在所有尺度上有相同的分辨率;
- 而金字塔多分辨率表达每层分辨率减少固定比率
所以,金字塔多分辨率生成较快,且占用存储空间少;而多尺度表达随着尺度参数的增加冗余信息也变多。多尺度表达的优点在于图像的局部特征可以用简单的形式在不同尺度上描述;而金字塔表达没有理论基础,难以分析图像局部特征。
2.1.3 DOG
DOG是LOG的近似,LOG(Laplacian of Gaussian)算子和DOG(Difference of Gaussian)算子是图像处理中实现极值点检测(Blob Detection)的两种方法。
LOG算子:
Laplace算子通过对图像求取二阶导数的零交叉点(zero-cross)来进行边缘检测。由于微分运算对噪声比较敏感,可以先对图像进行高斯平滑滤波,再使用Laplace算子进行边缘检测,以降低噪声的影响。由此便形成了用于极值点检测的LoG算子。
DOG算子:
DOG算子是高斯函数的差分,具体到图像中,就是将图像再不同参数下的高斯滤波结果相减,得到差分图。
LOG算子和DOG算子的函数波形对比如下图所示,由于高斯差分的计算更加简单,因此可用DOG算子近似替代LOG算子。
SIFT算法建议,在某一尺度上的特征检测可以通过对两个相邻高斯尺度空间的图像相减,得到一个DOG的响应值图像$D(x, y, \sigma)$。然后仿照LOG方法,通过对响应值图像$D(x, y, \sigma)$进行局部最大值搜索(正最大和负最大),在空间位置和尺度空间定位局部特征点。其中:$D(x, y, \sigma) = (G(x, y, k\sigma) - G(x, y, \sigma)) * I(x, y, k\sigma) = L(x, y, k\sigma) - L(x, y, \sigma)$。式中,k为相邻尺度空间倍数的常数。
2.1.3.1 为什么用DOG来检测特征点
Lindeberg证明用$\sigma^2$标准化的高斯拉普拉斯($\bigtriangledown ^2G$, LOG, Laplacian of Gauss)有着真正的尺度无关的特性,而Mikolajczyk发现,相比于其他一系列函数(比如梯度,Hessian, Harris叫函数等),用$\sigma^2$标准化的高斯拉普拉斯($\sigma^2 \bigtriangledown ^2G$)有着更稳定的图像特征,因此$\sigma^2 \bigtriangledown ^2G$函数是我们理想的寻找特征点的函数。而在此,我们利用DOG来近似$\sigma^2 \bigtriangledown ^2G$。
通过热传导方程也可以帮助我们理解DOG与$\sigma^2 \bigtriangledown ^2G$之间的近似关系。由热传导方程可知(通常用t=$\sigma^2$):
$\frac{\partial G}{\partial \sigma} = \sigma \bigtriangledown ^2G$
对上式进行有限差分运算得:
$\sigma \bigtriangledown ^2G = \frac{\partial G}{\partial \sigma} \approx \frac{G(x, y, k \sigma - G(x, y, \sigma))}{k\sigma-\sigma}$
因此: $DOG = G(x, y, k\sigma) - G(x, y, \sigma) \approx (k-1)\sigma^2 \bigtriangledown ^2G$
而常数项(k-1)并不会影响极值的位置。所以DOG是$\sigma^2 \bigtriangledown ^2G$的近似。使用DOG来近似$\sigma^2 \bigtriangledown ^2G$有如下优点:
1,$\sigma^2 \bigtriangledown ^2G$需要使用两个方向的高斯二阶微分卷积核,而DOG直接使用高斯卷积核,省去了对卷积核的生成的运算量。
2,DOG保留了各个高斯尺度空间的图像,这样,在生成某一空间尺度的特征时,可以世界尺度空间图像,而无需重新再次生成该尺度的图像。
2.1.3.2 尺度的选择
DOG近似于$\sigma^2 \bigtriangledown ^2G$,对于常数k, 即为相邻高斯尺度空间的两幅图像的尺度倍数,文中提道k值大小对于极值的检测没有什么影响,那么k值究竟取多大呢?
问题1, 为什么用前一个octave中的倒数第三幅图像生成下一octave中的第一幅图像?
我们通过上图来解释这段话,由 “must produce s + 3 images in the stack of blurred images for each octave” 可知每层octave产生了5幅图像,所以s = 2。 同一octave相邻图像之间尺度为k倍的关系, k = 21/s = 21/2,仔细阅读上一段下划线部分,当完成一层octave的处理后,对2倍σ的高斯图像(即用尺度大小为2σ的高斯函数模糊的图像)进行二分重采样,得到下一个octave的第一幅图像。而这个用尺度大小为2σ的高斯函数模糊的图像总是处于该octave的倒数第三幅(由上往下数,第三幅。原文:it will be 2 images from the top of the stack,程序员都是从0开始数的咯),因为总共一层octave为s+3幅图像,第n层即为knσ0(其中 n = 0,1,...,s,s+1,s+2. k = 21/s),当n等于s时,knσ0 = 2σ0,第s层即为倒数第三层。
问题2 每层octave为什么生成s+3幅图像?
在极值比较的过程中,每一组图像的首末两层是无法进行极值比较的,为了满足尺度变化的连续性,生成高斯金字塔每组有s+3层图像。DOG金字塔每组有s+2层图像。见上图,为s = 3的情况,由上一问题可知,GSS中倒数第三幅尺度与下一octave第一幅的尺度相同,由图中红色矩形中的尺度对应为DoG中极值检测的图像,将其各层红色矩形框中的尺度依次排列,即可发现其为以k = 21/s(即k = 21/3)为等比的连续尺度。所以极值检测是在一个连续变化的尺度空间中进行的。如下图:
高斯核性质及其在SIFT中的应用
对于二维高斯卷积,有如下性质:
- 距离高斯核中心3σ距离外的系数很小,相对于3σ内的系数值可以忽略不计,所以只用(6σ + 1)*(6σ + 1)的面积计算卷积即可。
- 线性可分,二维高斯核卷积(计算次数O(n2*M*N))效果等于水平和竖直方向的两个一维高斯核(计算次数O(n*M*N) + O(n*M*N)))累积处理的效果。n*n为滤波器大小,M*N图像大小
-
对一幅图像进行多次连续高斯模糊的效果与一次更大的高斯模糊可以产生同样的效果,大的高斯模糊的半径是所用多个高斯模糊半径平方和的平方根。例如,使用半径分别为 6 和 8 的两次高斯模糊变换得到的效果等同于一次半径为 10 (勾股定理)的高斯模糊效果。根据这个关系,使用多个连续较小的高斯模糊处理不会比单个高斯较大处理时间要少。
其中,性质3有助我们更快速的生成GSS。虽然两个小半径处理时间并不会比单个高斯较大半径处理的时间少,但相对于原图像,我们已经有一个小半径模糊过的图像,即可用另一小半径在现成的图像上进行模糊得到较大半径的模糊效果。例如尺度为σ0的图像已经存在,我们要得到尺度为kσ0的图像,即可只使用尺度为[(kσ0)2-(σ0)2]1/2的核在尺度为σ0的图像上进行模糊,即可得到尺度为kσ0模糊的图像,同理可得到高斯尺度空间各层的图像,使得高斯尺度空间生产得更快。
2.1.4 DOG极值粗略检测
特征点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点, 每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。
中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个 点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。在一组中,搜索从每组的第二层开始,以第二层为当前层,第一层和第三层分别作为立方体的上下层;搜索完成后再以第三层为当前层做同样的搜索。所以每层的点搜索两次。通常我们将组Octaves索引以-1开始,则在比较时牺牲了-1组的第0层和第N组的最高层
从27个点中找一个极值点,这是比较简单的运算,所以这里的特征点粗略的寻找是比较简单的,我们很快能从DoG空间中粗略的找到关键点。
2.1.5 DOG极值细化优化
1,较小的极值
以上极值点的搜索是在离散空间进行搜索的,由下图可以看到,在离散空间找到的极值点不一定是真正意义上的极值点。可以通过对尺度空间DOG函数进行曲线拟合寻找极值点来减小这种误差。
对关键点进行3D二次函数的拟合(可以类比最优化里牛顿法的做法),然后对函数求极值。将每个关键点的一段函数$D(x, y, \sigma)$进行泰勒二次展开:
$D(x) = D + \frac{\partial D^T}{\partial x}x + \frac{1}{2}x^T \frac{\partial^2D}{\partial x^2}x, 注意,泰勒公式是最为基本的连续函数量化(离散化)的相似公式。$
其中x是相对关键点的距离。D,$\frac{\partial D^T}{\partial x}$和$\frac{\partial^2 D}{\partial x^2}$分别表示函数在关键点的取值和一阶导数,二阶导数。这个展开就是在关键点周围拟合出的3D二次曲线。学导数的时候学过,当导数为0的时候原函数取极值。
此时的极值为:$\hat{x} = -{\frac{\partial ^2 D}{\partial x^2}}^{-1} \frac{\partial D}{\partial x}$, $D(\hat{x}) \approx D + \frac{1}{2} \frac{\partial D^T}{\partial x} \hat{x}$。当这个极值过小的时候,被去除。原论文中剔除$|D(\hat{x})|<0.03$(图像灰度归一化为[0, 1])的特征点。
2,边缘噪声
除了DOG响应较低的点,还有一些响应较强的点也不是稳定的特征点。DOG对图像中的边缘有较强的响应值,所以落在图像边缘的点也不是稳定的特征点。一方面图像边缘上的点是很难定位的,具有定位的歧义性;另一方面这样的点很容易受到噪声的干扰变得不稳定。
一个平坦的DOG响应峰值在横跨边缘的地方有较大的主曲率,而在垂直边缘的地方有较小的主曲率。主曲率可以通过2*2的Hessian矩阵H求出:
D值可以通过求临近点差分得到。H的特征值与D的主曲率成正比,具体可参见Harris角点检测算法。为了避免求具体的值,我们可以通过H将特征值的比例表示出来,令$\alpha = \lambda _max$ $\beta = \lambda _min$为最小特征值,那么:
$Tr(H) = D_{xx} +D_{yy} = \alpha + \beta$
$Det(H) = D_{xx}D_{yy} - (D_{yy})^2 = \alpha \cdot \beta$
$Tr(H)$表示矩阵H的迹,$Det(H)$表示H的行列式。
令$\gamma = \frac{\alpha}{\beta}$表示最大特征值与最小特征值的比值,则有:
(Hessian矩阵的特征值和特征值所在特征向量方向上的曲率成正比,我们希望使用曲率的比值剔除边缘点,就可以使用Hessian的特征值的比值替代曲率的比值。)上式与两个特征值的比例有关。随着主曲率比值的增加,$\frac{(\gamma+1)^2}{\gamma}$也会增加。我们只需要去掉比率大于一定值的特征点。Lowe论文中去掉r=10的点。
这个地方,需要看到,实际上这里出现的两处“精细筛选”的算法是有相互的关系的:它们一个是去掉了特征点中不是非常“锋利”的特征点、一个是去掉了属于“边缘”的特征点。目的是统一的,都是挑选出更为合适的特征点。
2.2 特征点主方向确定
经过上面的步骤已经找到了在不同尺度下都存在的特征点,为了实现图像旋转不变性,需要给特征点的方向进行赋值。利用特征点邻域像素的梯度来确定其方向参数,再利用图像的梯度直方图求取关键点局部结构的稳定方向。对于己经检测到特征点,我们知道该特征点的尺度值σ,因此根据这一尺度值,在GSS中得到最接近这一尺度值的高斯图像。然后使用有限差分,计算以特征点为中心,以3X1.5σ为半径的区域内图像梯度的幅角和幅值,如下图所示。幅角和幅值计算公式加下:
当然,我们的目标是用特征点邻域像素的梯度来确定其方向参数,确定关键点的方向采用梯度直方图统计法,统计以关键点为原点,一定区域内的图像像素点对关键点方向生成所作的贡献。
绿色格点代表邻域范围,蓝色圆圈代表格点的高斯权重,黑色箭头指向代表梯度方向,箭头长度代表梯度幅值。右边为梯度方向直方图。通过以上的图可以看出,梯度方向角为横轴刻度,取45度为一个单位,那么横轴就有8个刻度;纵轴是对应梯度的幅值累加值。
关键点主方向:极值点周围区域梯度直方图的主峰值也是特征点方向
关键点辅方向:再梯度方向直方图中,当存在另一个相当于主峰值80%能量的峰值时,则将这个方向认为是该关键点的辅方向。
图中所示的是180度方向为主方向,45度方向可以看作是辅方向。仅有15%的关键点被赋予多个方向,一个特征点可能会有多个方向(一个主方向,一个以上的辅方向)但可以明显的提高关键点匹配的稳定性。具体而言,就是将该特征点复制成多份特征点(除了方向θ不同外,x,y,σ都相同)。
2.3 特征点描述
通过以上步骤,对于每一个关键点,拥有三个信息:位置、尺度以及方向。接下来就是为每个关键点建立一个描述符,使其不随各种变化而改变,比如光照变化、视角变化等等。并且描述符应该有较高的独特性,以便于提高特征点正确匹配的概率。
2.3.1 确定描述子计算区域并校正主方向
在计算描述子之前,我们需要先确定计算区域,Lowe实验结果表明:描述子采用$4 \times 4 \times 8 = 128$维向量表征,综合效果最优(不变性与独特性)。
为了保证特征矢量具有旋转不变性,需要以特征点为中心,将特征点附近邻域内图像梯度的位置和方向旋转一个方向角θ,即将原图像x轴转到与主方向相同的方向。
2.3.2 生成描述子
在每子区域内计算8个方向的梯度方向直方图,绘制每个梯度方向的累加值,形成一个种子点。与求特征点主方向时有所不同,此时,每个子区域的梯度方向直方图将0° ~360°划分为8个方向范围,每个范围为45°,这样,每个种子点共有8个方向的梯度强度信息。由于存在4X4(Bp X Bp)个子区域,所以,共有4X4X8=128个数据,最终形成128维的SIFT特征矢量。同样,对于特征矢量需要进行高斯加权处理,加权采用方差为mσBp/2的标准高斯函数,其中距离为各点相对于特征点的距离。使用高斯权重的是为了防止位置微小的变化给特征向量带来很大的改变,并且给远离特征点的点赋予较小的权重,以防止错误的匹配。
这个128维的SIFT特征向量就像是我们每个人的身份证一样,拥有绝对标识,几乎不可能重复,在这里可以对128维向量进行归一化处理,可以去除光照变化的影响。我们对模板图和目标图分别建立描述子集合。特征点的匹配是通过两点集合内关键点描述子的比对来完成,描述子的相似度量采用欧氏距离。假设如下:
最终留下来的配对的关键点描述子,需要满足条件:
摘自:https://blog.csdn.net/zhou4411781/article/details/100713402
https://www.cnblogs.com/jsxyhelu/p/7591497.html
https://zhuanlan.zhihu.com/p/70385018
https://blog.csdn.net/qq_38906523/article/details/79960294
https://blog.csdn.net/xiaowei_cqu/article/details/8069548
https://blog.csdn.net/u010312937/article/details/86582781
https://www.cnblogs.com/JiePro/p/sift_1.html