双视图特征点匹配———使用RANSAC法剔除误差点

本文使用SIFT算法得到两张图的初始特征匹配集合,然后着重总结如何使用基于8点法的RANSAC法将匹配集合中的误差点(外点)剔除。

基础矩阵介绍

进行8点法之前首先需要知道基础矩阵的定义。

如图1-1所示,沿着空间点X和相机中心点之间的连线,可以在图像上找到对应的点x。那么,在空间中与成像平面上的位置x对应的场景点可以位于这条线上的所有位置。这说明如果要根据图像中的一个点找到另一幅图像中对应的点,就需要在第二个成像平面上沿着这条线的投影搜索,这条线成为对极线,就是图中的l'。所有的对极线都通过同一个极点,即e'和e。

               图1-1 两个摄像机观察同一个场景点

所以,可以看出一个空间点在不同视角下的像点存在一种约束关系,基础矩阵F就是用来表示这种约束关系的。它是图像中的点x到另一幅图像对极线l'的映射,即l'= Fx ,而和点x匹配的另一个点x'必定在l'上,所以有如下公式。

x'TFx=0

即:

这就是定义基础矩阵的方程。

8点法

 根据上面的基础矩阵公式,将其展开并转化为n组点的形式,有如下方程。

在F中,通常令f33=1来归一化矩阵,这样基础矩阵就有8个未知参数,求解需要8个线性方程,所以至少要包含8组匹配点对,利用它们线性求解基础矩阵就叫8点法。但是由于基本矩阵有一个重要的特点就是奇异性,F矩阵的秩是2。如果基本矩阵是非奇异的,那么所计算的对极线将不重合。所以在上述算法解得基本矩阵后,会增加一个奇异性约束。通常是用最小化Frobenius范数||F−F'||的F'来修正F。

8点法的算法流程如下。

            1.给定n≥8组对应点{xi↔x'i},需确定基本矩阵F使得

            2.求线性解,由系数矩阵A最小奇异值对应的奇异矢量f求的F。

            3.奇异性约束,使最小化Frobenius范数||F−F'||的F'代替F。

具体的matlab代码设计如下。首先通过SIFT匹配得到匹配集。

[f1,d1] = vl_sift(im1g) ;
[f2,d2] = vl_sift(im2g) ; 
[matches, scores] = vl_ubcmatch(d1,d2) ;
numMatches = size(matches,2) ;
X1 = f1(1:2,matches(1,:)) ; X1(3,:) = 1 ;
X2 = f2(1:2,matches(2,:)) ; X2(3,:) = 1 ;

然后使用8点法计算基础矩阵。

subset = vl_colsubset(1:numMatches, 8) ;  %取八个点
A = [] ;
%求线性解
for i = subset
A = cat(1, A, kron(X1(:,i)', vl_hat(X2(:,i)))) ;
end
[U,S,V] = svd(A) ;     						%奇异分解
F{t} = reshape(V(:,9),3,3) ;  				%得到基础矩阵F

 RANSAC法

实际问题中,特征点容易受噪声影响,可能存在误匹配,8点法的基本矩阵估计值会因误匹配所产生的误差使估计值变差,这时可以使用随机抽样一致性(RANSAC)算法。RANSAC的总体思想是:支撑集越大(这里是指符合极线约束的匹配项),那么矩阵正确的可能性越大,反之如果一个或多个随机选取的匹配项是错误的,那么基础矩阵的计算也是有问题的,支撑集会相对较少。RANSAC反复随机选取匹配项,并留下支撑集最大的矩阵作为最佳结果。不符合最优模型的点,被定义为“外点”。

具体来看,RANSAC寻找一个3×3的最佳单应性矩阵H。RANSAC目的是找到最优的参数矩阵使得满足该矩阵的数据点个数最多。

 RANSAC算法从匹配数据集中随机抽出8个样本并保证这8个样本之间不共线,使用8点法计算出基础矩阵,然后利用这个模型测试所有数据,并计算满足这个模型数据点的个数与投影误差(即代价函数),若此模型为最优模型,则对应的代价函数最小。代价函数公式如下。

所以,我理解的RANSAC算法就是不断重复的使用8点法,通过统计最终找到一个最优模型。

使用matlab实现RANSAC的核心代码如下。

for t = 1:100
%八点法
subset = vl_colsubset(1:numMatches, 8) ; %抽取样本
A = [] ;
for i = subset
A = cat(1, A, kron(X1(:,i)', vl_hat(X2(:,i)))) ;
end
[U,S,V] = svd(A) ;
H{t} = reshape(V(:,9),3,3) ;
%计算投影误差
X2_ = H{t} * X1 ;
du = X2_(1,:)./X2_(3,:) - X2(1,:)./X2(3,:) ;
dv = X2_(2,:)./X2_(3,:) - X2(2,:)./X2(3,:) ;
ok{t} = (du.*du + dv.*dv) < 6*6 ;
score(t) = sum(ok{t}) ;
end
%获得最优模型
[score, best] = max(score);
H = H{best} ;                      
ok = ok{best} ;

测试与分析

我对2D视图、3D视图和景观分别进行了测试,下面给出测试结果并在后面进行分析

2D视图测试

原图像如图1-2和图1-3。

     

                       图1-2  2D测试视图1                                             1-3  2D测试视图2   

执行RANSAC算法,匹配效果如图1-4。

                               图1-4  2D测试视图特征匹配  

3D视图测试

原图像如图1-5和图1-6。

               

图1-5 立体测试视图1                                              图1-6 立体测试视图2

执行RANSAC算法,匹配效果如图1-7。

                                           图1-7 立体视图特征匹配

场景视图测试    

     

                  图1-8 场景测试视图1                                      1-9 场景测试视图2

对场景图执行RANSAC算法,匹配效果如图1-10。

                                                               1-10 场景图特征匹配

由上面三种不同类型的测试可以发现,2D视图下误差点的剔除率是很小的,经过sift匹配后,有96.08%的匹配对被选为内点,而且在对2D视图的测试过程中,匹配结果图计算的很快,程序的运行效率很高。这就说明对于2D视图来说,进行特征点匹配是很容易的,仅用sift算法就能高效的计算出良好的结果,所以目前的研究热点应该是注重于3D视图。

第二种测试的是普通的3D视图,可以看到RANSAC算法剔除了超过一半的匹配对,sift算法的正确率达到41.06%。程序运行时速度较慢,说明3D视图的计算明显比2D视图复杂的多,这可能是因为3D视图下有一定的光照影响,导致物体边缘的像素值的变化梯度比2D视图要小,也说明了SIFT算法对于边缘光滑的目标还是很难准确提取特征点。而且因为在不同角度拍摄,也导致像素灰度值的大小会因光照角度的不同发生或明或暗的变化,所以降低了匹配成功率。但是经过RANSAC算法的筛选,还是得到了较好的特征匹配结果图。

在第三种测试中,我使用的是强光照下的建筑视图,可以发现,RANSAC剔除了大多数匹配点,只留下了22.37%,这说明sift算法匹配的效果很不好,而RANSAC算法应该也有错误的剔除。可以看到最后的结果图中内点很少,树上和地面上的匹配都被剔除掉了,只有墙上的字被大多数的保留了下来。我个人感觉造成这种情况的关键因素不是光照,而是不同视角产生的透视效果,因为两张图里光照并没有对色彩的明暗造成什么影响,反而是地上的纹路和后面高处的树叶因为不同的拍摄角度发生了很大的变化。而墙上的大字之所以能够良好的匹配,是因为这面墙是拱形的,字体的形状几乎没有因为我拍摄位置的改变而变化。所以,在特征匹配里除了克服光照的影响外,对于透视效果的克服应该是更为严重的问题。总体来看,因为最终得到的内点太少,效果不如前两种情况。

由于我是刚开始学习计算机视觉的菜鸟,如文中有误还望指正。

谢谢观看:)

猜你喜欢

转载自blog.csdn.net/qq_37553152/article/details/94656299