立体匹配算法改进与优化
2021-09-17侯一民尚浩天
侯一民,尚浩天
(东北电力大学自动化工程学院,吉林吉林,132012)
0 引言
立体匹配是当前双目视觉领域发展的重点和研究热点。各国研究学者都进行着深入的探索和研究,新的算法、模型及应用前景等不断涌现。例如,C.Tomasi提出了一种基于双边滤波的代价聚合方法[1],该方法改进了图像边缘的匹配精度。尹传历团队首先将待匹配图像用均值平移算法实现了颜色信息聚类处理后,计算初始视差,然后用图割算法得到全局能量最小的视差作为最优[2]。
双目立体视觉系统的应用过程中,双目相机所在场景、位置不同,采集的图像会受到很多因素干扰,例如光照、遮挡等,容易造成误匹配。在实际应用中,只能够根据不同场景和约束条件来选择合适的匹配算法。立体匹配也成为了当前的研究难点。
1 立体匹配算法基本原理
立体匹配算法原理[3]即以左目图像为参考,任取一像素点作待匹配像素点为中心取m×n的矩形窗口,再根据极线约束原理,在右目图像上肯定存在一个像素点与像素点对应匹配,接着从右目图像上沿着极线方向每个视差对应的整个窗口内所有像素点的匹配代价相似性最大的点所对应的视差值视为该像素的视差值。如图1所示。
图1 立体匹配过程图
经研究工作者对立体匹配算法进行了全面的总结,具体计算过程可分解为四步[4]:
第一步:代价计算。匹配代价是指对于双目图像匹配点对之间相似程度的一种数学描述。对应点之间的匹配代价越小表示它们间的差异越小,相关性越高,越可能成为对应匹配点,这种相似性的衡量需要利用相似性度量函数来计算测量。不同的立体匹配算法所选取的相似性度量函数有所不同。
第二步:代价聚合。基于区域的匹配算法是以像素点的灰度值作为匹配基元,但是如果只是利用单个像素点的灰度值计算得到的匹配代价衡量,会有可能在多个匹配点上得到同样的匹配代价,这样很容易在后期视差选择上造成歧义,使匹配出错。因此,为了提升匹配准确度,一般在匹配算法中加入代价聚合的匹配窗口,将匹配点邻域内的所有像素点的匹配代价也计算出来,然后对所选窗口内的所有像素点匹配代价进行聚合,再用聚合后的代价衡量待匹配点之间的相关性。
第三步:视差值选择。在视差值选择最优值的方法,目前最常见的方法是采用WTA(Winner Take All)方法,选取最小代价值所对应的视差值作最优的视差。
第四步:视差图优化。经过以上三步处理后得到的视差图还会存在一些噪声点,为了使视差图的效果看起来更好一些,还需要进行一些滤波操作,比如最常用、有效的方法是中值滤波,其采用不同的窗口滤波的效果也有所不同。
2 改进的立体匹配算法
立体匹配算法中局部匹配算法原理比较简单,但在视差图像的遮挡区域与视差不连续区域的处理效果比较差;全局匹配算法处理的视差图效果较好,但是图割匹配算法比较复杂,运行时间过长不利于实时性。通过综合分析来看,半全局匹配算法在各方面来看应用效果更好,因而本文算法主要是针对半全局匹配算法进行改进与优化。
■2.1 代价计算
在匹配代价计算上采用CEN算法[5]与SAD算法再加梯度信息相结合的方式。CEN算法首先选取一个3×3窗口,接着将窗口内所有像素与中心像素相比较,选定大于中心像素即为0,小于则为1。然后求取它们的hamming距离进而比较相似度。
SAD算法即先构造一个小窗口循环覆盖左边图像,直到将所有点遍历一遍,右边图像同样覆盖遍历,同时左、右边窗口中像素点灰度值相减得到绝对值之和,其中最小的一个值即为颜色信息的匹配代价。
梯度信息可以有效解决视差不连续区域的误匹配问题,提高匹配精确度。
综上,代价计算算法具体计算方法如式(1)所示:
■2.2 代价聚合
代价聚合本质上是一个滤波过程,本文采用的是引导滤波算法。代价计算获得的都是孤立像素区域的视差值并且带有大量噪声,代价聚合便能有效地解决问题,提高精度。本文在算法上将双目图像分解到多个尺度上,接着单独进行代价计算、代价聚合,然后融合代价聚合的结果,最终获得视差图。得到的不同尺度下的初级匹配效果如图2所示。
图2 金字塔处理效果图
从图中可以看出如同人眼中的不同观测范围,距离越远视差图越小,把握了主体的轮廓信息,距离越近,视差图的细节效果越明显。
为了融合多个尺度的信息,这里引入一致性约束规则进行约束。经正则化后各尺度下的代价聚合结果如式(2)所示:
其中,λ为正则化因子为尺度参数;Zi为归一化常数;Ni代表中心点像素为i的局部支持窗口;z为所期望优化的目标输出值;为经正则化后各尺度下的代价聚合结果。
■2.3 视差后处理
视差优化:一般通过以上方法计算后获取的视差图会包含一些缺点,如遮挡区域的视差不准确、噪声点、误匹配点仍然存在,因此还需进一步优化视差图。本文采用的是加权中值滤波和左右一致检测结合的方法。
左右一致检测方法:在立体匹配过程中由于遮挡区域和误匹配两种干扰因素导致了视差图中产生了奇异点。因为奇异点区域的原因是视差图效果不是很好,因此需要左右一致检测将奇异点区域检测并标记出来,然后针对不同的情况进行合理插值。奇异点判别定义如式(3)所示:
其中w表示图像像素列数,disparity表示视差图中的视差值,DL(p)表示左图像素点p的视差值,DR(p−DL(p))表示右图像素点p−(DL(p),0)处的视差值,dispTolerance表示可容许范围内视差误差阈值。
然后通过公式判断误匹配点与遮挡点,如式(4)所示:
其中disp表示有效视差值,DL(p)为左图中p点视差值,DR(p−DL(p))表示右图像素点p−(DL(p),0)处视差值。若视差图中奇异点是遮挡点常用邻域较小值代替,遮挡区域的产生大多因为背景的影响,误匹配区填充多因匹配代价与像素值的差异的影响,一般找相似区域的值代替。
中值滤波:一般以上操作完成之后,会再进行一步中值滤波加以消除可能存在的噪声点。具体过程如下:
首先遍历得到视差中的点,假设遍历到一点p,且已知其像素值为d,其左右邻域像素中点的匹配代价分别为c(p,d−)和c(p,d+),p点对应的匹配代价为c(p,d),然后通过公式(5)所示,计算第三项的值,若在范围内则将p点像素值用d+代替,否则保持原值。
经以上算法运算后得到最终视差图如图3所示。
图3 本文算法匹配效果图
3 立体匹配算法比较分析
对视差图进行一系列处理之后,若单纯只凭感官是不能客观的对视差图作出有效的判断。为此本文引入了一种评估方法,分别计算视差图的所有区域、视差不连续区域以及非遮挡区域的误匹配百分比。通过运算得到的数据可以清晰的看出各个方面的不足,以便能够有针对性的对其进行优化改进。本文对算法的评估所用的测试照片来自于Middlebury数据平台,算法运行环境为VS2013+Opencv2.4.13。图4是本文算法生成视差图的错误点图。
图4 本文算法评估
为了给出更加准确的比较结果,又将本文算法得到的视差图在all, disc, non三部分分别与SGBM、BM、GC、自适应窗口等算法生成的视差图进行对比,其中all, disc,non分别代表所有区域、非连续区域和非遮挡区域。测试结果如表1所示。
从表1中可以看出,本文算法在局部匹配算法的范围内,匹配精度有了很大的提高,但是相比于GC算法,在匹配精度的比较上还有一些差距,为我们提供了改进的方向。
表1 误像素匹配百分比
4 结论
本文首先阐述了立体匹配算法的原理,接着针对半全局匹配算法进行改进和优化,详细介绍了本文算法的原理,并且通过在Middlebury数据测试平台上进行对比分析表明了本文算法的优越性。本文所研究的算法在匹配精度方面有了一些提高,但是在执行速度上有所下降,因为算法的复杂度有所提高,所以增加了一定的运算时间,而且在算法精度上依然有上升的空间,有些算法步骤还可以进行更加细致的研究,在应用于真实场景中的视差图效果依然需要改进,下一步便是针对这些问题进行研究。