参考博客:
如何高效且准确的匹配出两个不同视角的图像中的同一个物体,是许多计算机视觉应用中的第一步。虽然图像在计算机中是以灰度矩阵的形式存在的,但是利用图像的灰度并不能准确的找出两幅图像中的同一个物体。这是由于灰度受光照的影响,并且当图像视角变化后,同一个物体的灰度值也会跟着变化。所以,就需要找出一种能够在相机进行移动和旋转(视角发生变化),仍然能够保持不变的特征,利用这些不变的特征来找出不同视角的图像中的同一个物体。
为了能够更好的进行图像匹配,需要在图像中选择具有代表性的区域,例如:图像中的角点、边缘和一些区块,但在图像识别出角点是最容易,也就是说角点的辨识度是最高的。所以,在很多的计算机视觉处理中,都是提取角点作为特征,对图像进行匹配,例如SFM,视觉SLAM等。
但是,单纯的角点并不能很好的满足我们的需求,例如:相机从远处得到的是角点,但是在近处就可能不是角点;或者,当相机旋转后,角点就发生了变化。为此,计算机视觉的研究者们设计了许多更为稳定的的特征点,这些特征点不会随着相机的移动,旋转或者光照的变化而变化。例如:SIFT,SURF,ORB等
一个图像的特征点由两部分构成:
特征点的匹配通常需要以下三个步骤:
1)提取图像中的关键点,这部分是查找图像中具有某些特征(不同的算法有不同的)的像素;
2)根据得到的关键点位置,计算特征点的描述子;
3)根据特征点的描述子,进行匹配;
这里先介绍下特征点的描述子,一个好的描述子是准确匹配的基础,关键点的提取和特征点的匹配,在后面介绍。
从图像中提取到特征的关键点信息,通常只是其在图像的位置信息(有可能包含尺度和方向信息),仅仅利用这些信息无法很好的进行特征点的匹配,所以就需要更详细的信息,将特征区分开来,这就是特征描述子。另外,通过特征描述子可以消除视角的变化带来图像的尺度和方向的变化,能够更好的在图像间匹配。
特征的描述子通常是一个精心设计的向量,描述了关键点及其周围像素的信息。为了能够更好的匹配,一个好的描述子通常要具有以下特性:
其中描述子的可区分性和其不变性是矛盾的,一个具有众多不变性的特征描述子,其区分局部图像内容的能力就比较稍弱;而如果一个很容易区分不同局部图像内容的特征描述子,其鲁棒性往往比较低。所以,在设计特征描述子的时候,就需要综合考虑这三个特性,找到三者之间的平衡。
特征描述子的不变性主要体现在两个方面:
为了有个更直观的理解,下面给出SIFT,SURF,BRIEF描述子计算方法对比:
从上表可以看出,SIFT,SURF和BRIEF描述子都是一个向量,只是维度不同。其中,SIFT和SURF在构建特征描述子的时候,保存了特征的方向和尺度特征,这样其特征描述子就具有尺度和旋转不变性;而BRIEF描述子并没有尺度和方向特征,不具备尺度和旋转不变性。
上面提到图像的特征点包含两个部分:
在图像中提取到关键点的位置信息后,为了能够更有效的匹配(主要是保证尺度和旋转不变性),通常使用一个向量来描述关键点及其周围的信息。特征的描述子,在特征点的匹配中是非常重要的,上一小节中对其应该具有的性质做了介绍。但具体到一个算法来说,可能其既有特征点的提取算法也有特征点描述子的算法,也有可能其仅仅是一个特征点提取算法或者是特征点的描述子算法。在本小节就常用的特征点算法做一个简要的说明。
提到特征点算法,首先就是大名鼎鼎的SIFT算法了。SIFT的全称是Scale Invariant Feature Transform,尺度不变特征变换,2004年由加拿大教授David G.Lowe提出的。SIFT特征对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。
SIFT算法主要有以下几个步骤:
SIFT算法中及包含了特征点的提取算法,也有如何生成描述子的算法,更进一步的SIFT算法介绍可参看:
SURF全称 Speeded Up Robust Features “加速版的具有鲁棒性的特征”,是在SIFT算法的基础上提出的,主要针对SIFT算法运算速度慢,计算量大的缺点进行了改进。
SURF的流程和SIFT比较类似,这些改进体现在以下几个方面:
SIFT和SURF是非常好的,稳定的特征点算法,但运算速度是其一大弊端,无法做到实时的特征提取和匹配,其应用就有了很大的局限性。FAST特征提取算法弥补了这一局限,检测局部像素灰度变化明显的地方,以速度快而著称,其全称为:Features From Accelerated Segment Test。在FAST算法的思想很简单:如果一个像素与周围邻域的像素差别较大(过亮或者过暗),那么可以认为该像素是一个角点。和其他的特征点提取算法相比,FAST算法只需要比较像素和其邻域像素的灰度值大小,十分便捷。
FAST算法提取角点的步骤:
FAST算法只检测像素的灰度值,其运算速度极快,同时不可避免的也有一些缺点:
上面的介绍的SIFT和SURF算法都包含有各自的特征点描述子的计算方法,而FAST不包含特征点描述子的计算,仅仅只有特征点的提取方法,这就需要一个特征点描述方法来描述FAST提取到的特征点,以方便特征点的匹配。下面介绍一个专门的特征点描述子的计算算法:
BRIEF描述子
BRIEF是一种二进制的描述子,其描述向量是0和1表示的二进制串。0和1表示特征点邻域内两个像素(p和q)灰度值的大小:如果p比q大则选择1,反正就取0。在特征点的周围选择128对这样的p和q的像素对,就得到了128维由0,1组成的向量。那么p和q的像素对是怎么选择的呢?通常都是按照某种概率来随机的挑选像素对的位置。
BRIEF使用随机选点的比较,速度很快,而且使用二进制串表示最终生成的描述子向量,在存储以及用于匹配的比较时都是非常方便的,其和FAST的搭配起来可以组成非常快速的特征点提取和描述算法。
ORB的全称是Oriented FAST and Rotated BRIEF,是目前来说非常好的能够进行的实时的图像特征提取和描述的算法,它改进了FAST特征提取算法,并使用速度极快的二进制描述子BRIEF。
针对FAST特征提取的算法的一些确定,ORB也做了相应的改进。
FAST-12算法:
添加预测试操作,于每个像素,直接检测在邻域圆上的第1,5,9,13个像素的亮度,只有当这四个像素当中有三个同时大于IP+T或者小于IP-T的时候,当前像素才有可能是是角点。
解决方法:在ORB当中,我们可以指定要提取的特征点数量。对原始的FAST角点分别计算Harris的响应值,然后选取前N个点具有最大相应值的角点,作为最终角点的集合。
解决方法:尺度不变性构建的图像的金字塔,并且从每一层上面来检测角点。旋转性是由灰度质心法实现。
灰度质心法:质心是指以图像块灰度值作为权重的中心。(目标是为了找到方向)