杜晨瑞,李英祥
(成都信息工程大学 通信工程学院,成都 610225)
近年来随着计算机视觉领域的迅猛发展,基于视觉的三维重建已经成为一个非常热门的方向,双目视觉作为其中一种重要的分支也越来越得到大家的关注.立体匹配是从双目视觉到三维重建中的一个非常关键的步骤,对重建效果影响巨大.根据Sharstein 等[1]提出的双目立体匹配理论框架,立体匹配主要分为以下4 个步骤:匹配代价计算、匹配代价聚合、视差计算以及视差精化.当前主要的立体匹配算法又可以根据在匹配代价计算后是否采用代价聚合分为全局和局部立体匹配算法.全局立体匹配算法的核心思路是在计算匹配代价后,构建一个全局的能量函数,通过全局优化理论方法最小化能量函数估计视差.全局立体匹配算法匹配精度高,但其运行速度慢且算法复杂度较高.局部立体匹配算法充分利用像素点周围的局部信息,通过代价聚合来估计视差,得到视差的局部最优解.相比于全局立体匹配算法,精度稍低,但运行速度快且算法复杂度较低.
现有的局部立体匹配算法主要关注于改进代价计算和代价聚合两部分来提高算法精度.常见的匹配代价计算方法有基于像素的匹配代价如灰度绝对值(Adsolute Differences,AD)、灰度差平方(Squared Differences,SD)等;基于窗口的匹配代价如灰度差绝对值和(Sum of Absolute Difference,SAD)、归一化互相关(Normalized Cross Correlation,NCC)等;以及基于非参数变换[2]的匹配代价如Census、Rank 等.一般来说,基于像素和窗口的代价计算方法对噪声和光照变化非常敏感,Census变换对光照变化不敏感,但在重复纹理区域效果较差,因此融合多种代价计算方法也成为一种常用的手段.Hosni 等将SAD 和梯度信息结合作为性的代价计算方法;Mei 等[3]结合灰度差绝对值和Census 变换进行代价计算,在弱纹理区域和重复纹理结果区域都取得了很好的结果;Zhu 等[4]提出将AD、梯度信息和Census变换结合,提高了匹配精度.
代价聚合的方法主要分为自适应窗口和自适应权重的方法.Yoon 等[5]首先提出使用双边滤波器进行代价聚合,提出了自适应权重的算法,该算法的主要思想视为匹配窗口中每一个像素赋予一个权重,而权重通过其到窗口中心点的颜色差和距离得到,但算法复杂度较高,且运行速度较慢.Hosni 等[6]提出使用引导滤波替代双边滤波进行代价聚合,该算法整个计算过程都是线性的,计算效率大幅提高,在保持运行速度的情况下具有良好的匹配精度.Zhu 等[7]优化Census 变换策略,并讲动态规划引入到代价聚合中,有效的提升了代价聚合的效率.
为在保持运行速度的前提下,提高视差精度,本文提出了一种改进的基于跨尺度引导滤波的立体匹配算法.首先融合SAD 和改进的Census 变换两种代价计算方法,然后采用基于跨尺度的引导滤波进行代价聚合,在进行视差计算时,并没有采用常用的赢者通吃(Winner-Take-All,WTA)方法,而是通过制定一个判断准则判断图像中每一个像素点的最小聚合代价对应的视差值是否可靠,当判断为视差不可靠时,对像素点构建自适应十字交叉窗口,并基于自适应窗口修正该像素点对应的视差值,最后进行视差精化得到最终的视差图.实验表明,相比于当前的局部立体匹配算法,本文所提出的算法可以获得更高精度的视差图.
由He 等[8]提出的引导滤波算法,是一种能够实现边缘保留特性的滤波方法.
设I为引导图像,p为待滤波图像,q为滤波后图像,引导滤波基于如下假设:在以各个像素为中心的窗口 ωk内,q由I线性转换得到:
式(1)中,ωk表示以像素k为中心、以r为半径的方形窗口;ak和bk表示线性系数,在窗口ωk内为固定值.
在窗口 ωk内,通过最小化噪声能量求解线性参数ak和bk:
式(3)中,ε表示一个正则化系数.εa2k作为平滑项,防止线性系数ak过大,通常有ε >0 .正则化系数ε 对线性系数ak有惩罚作用,当ε 取值越大,惩罚作用越强,滤波后图像q 越平滑;当ε 取值越小,惩罚作用越弱,滤波后图像q 边缘保留越完整.
式(3)的解为:
式(4)、(5)中,µk和 σ2k分别表示引导图像I在窗口ωk内的均值和方差;| ω|表 示窗口 ωk内的像素数;pk表示待滤波图像p在窗口 ωk内的均值.
本文算法由代价计算、跨尺度引导图滤波以及视差计算三部分组成.核心算法流程如图1所示.首先对原始图像进行降采样,得到多尺度图像,并对每一尺度图像对计算其匹配代价,构建多尺度原始代价空间;然后基于引导滤波对多尺度原始代价空间进行代价聚合,并加入正则式项,优化相邻尺度的一致性问题;最后以处理后的代价空间为基础计算视差,根据视差判断准则,对不可靠视差进行优化.
图1 算法流程图
代价计算的目的是量化左右图像对应像素之间的相似程度,在设计代价计算方法时面对的主要问题是像素级的相似性判断对光照变化、噪声等非常敏感,非常容易误匹配.一般的计算方法有SAD、Census 和归一化互相关等,同时多种代价计算方法融合也是很常用的方法.本文采用的基于颜色通道的SAD 和census融合的代价计算方法.
假设左图中的一个像素点为pi,坐标为(x,y),相对应的右图中的像素点为坐标为(x-d,y),其中d 为视差.以像素点pi为 中心,半径为r的矩形窗位ωi,分别计算CAD(pi,d)和Ccensus(pi,d)的值.
式(6)、(7)中I(ωi)表示在矩形框ωi中,包含的像素点的平均值,N为矩形框的像素点个数.Ilc(ωi)和Irc(ωi)用于区分单一颜色通道和左右图像.
在计算Ccensus(pi,d)时,采用在左图像对应的灰度图像中计算矩形窗内像素的平均值,并依次比较矩形窗中像素点与平均值,得到二进制编码cenl(pi),然后根据同样的方法计算右图的cenr(pi).通过计算两个二进制编码串的Hamming 距离,得到Ccensus(pi,d).其计算公式如下:
SAD-census 联合匹配代价的定义为:
其中,ρ (C,λ)是关于C的函数:
其中,λcensus和 λAD参数,其主要目是通过该函数将两类代价值控制在[0,1],使代价不会因为某一项发生较大的突变.
传统的匹配代价聚合方法主要考虑原始图像,即在最细的尺度进行研究.其聚合代价可以视为一个加权最小二乘问题[9],即
式(11)中(i,d)为 中心像素pi在视差为d时的聚合代价,K(i,j)为其邻域像素pj的支持权重,Zi=为归一化常数,ωi为中心像素i的支持窗口.z为待计算的聚合代价.
为了融合多尺度的信息,充分利用粗尺度信息提高弱纹理和无纹理区域的匹配精度,Zhang 等[10]通过对图像下采样获取多尺度信息,提出了跨尺度模型来聚合多尺度匹配代价,在优化目标中添加广义L2 正则化项,使匹配代价在相邻尺度上具有一致性,即:
式(12)中上标s为下采样尺度空间,S为下采样的最大次数.γ为正则化因子.
代价聚合得到的代价空间,同时包含了对应像素之间的相似度信息和对应像素邻域之间的相似度信息.在计算每个像素点的视差值时,传统算法一般采用赢者通吃(WTA)的策略简单地选择最小匹配代价对应的视差值作为该像素对应的视差值.
然而,考虑到最小匹配代价对应的视差值不一定等于真实视差值.WTA 策略并不是一个好的选择视差的策略.根据聚合后的代价空间信息,可以对视差的可靠性进行判断.一个常用的视差可靠的判断依据[11]如下:
式(13)、(14)中对于任意像素pi,Ci,1表示最小匹配代价,Ci,2表 示次最小匹配代价.Cd越小,则在一定程度上说明匹配的视差值越可靠.当设定一个阀值Cth,可以和容易判断当前像素点的最小的匹配代价对应的视差值是否可靠.
对于不可靠的视差值还需要进一步的处理.一般来说某个区域梯度变化的不规则通常会导致其和噪声具有高相似性,从而导致引导滤波将其误认噪声.所以本文采用基于梯度相似性的自适应窗口来处理不可靠视差值,如图2所示.
图2 基于梯度相似性的自适应窗口
从图像左上角开始,按照从上到下、从左到右的顺序搜索视差不可靠像素点,对于搜索到的每一个像素点pi=(xi,yi),以像素pi为中心从垂直和水平两个方法构建自适应窗口.根据图像的区域梯度结构自适应地确定臂长,令四个方向上的臂长分别为hli、hri、vui和vbi.以hri为例,使用x方向上的Sobel 算子对像素i右侧的像素进行梯度相似性检测,其目的是在相邻像素梯度相似的情况下找到最大的水平右臂长.设像素pi的水平右像素点为pi+j=(xi+j,yi),j=1,2,3,···,N,则有:
式(15)、(16)中,L表示最大臂长;Gx(j)表示像素点pi+j在x轴方向上的梯度值;∂表示梯度相似性的判定阀值.
确定hli、hri、vui和vbi四个方向上的臂长后,水平部分Hi和垂直部分Vi定义如下:
像素点pi的 自适应窗口Ui定义如下:
由于自适应窗口Ui中的像素梯度结构相似,可以认为它们是位于相同的区域内,所以具有相同的视差值.选择窗口Ui中的像素匹配代价和最小的视差值,作为窗口Ui中的每个视差不可靠像素的结果时差之,即
处理完成后,将窗口Ui中的所有视差不可靠像素标记为可靠像素,继续搜索下一个视差不可靠像素进行处理,直到所有视差不可靠的像素点全部处理.
为验证本文算法的有效性,在Clion 集成开发环境中结合图像处理开源库OpenCV,使用C++实现了算法.实验环境为:Ubuntu16.04 系统,Intel i7-4720HQ,内存8 GB.采用学术界公认的立体匹配算法测试平台Middlebury[12]进行测评.该网站提供了4 组标准色彩立体匹配图以及其对应的真实视差图,分别为:Tsukuba(384 像素×288 像素),Venus(434 像素×383 像素),Teddy(450 像素×375 像素),Cones(450 像素×375 像素).通过将实验结果视差图与真实视差图比较并量化匹配误差,从而客观地对算法效果进行评价.其中实验中参数设置如下:Cth=0.7,∂ =1.0.
图3中为在Middlebury2006 标准立体图像数据集中的实验结果.图3(a)为各组标准图像对的原始左图像,图3(b)为各组标准图像对的真实视差图,图3(c)为单尺度引导滤波算法(GF)[6]的视差图,图3(d)为跨尺度引导滤波算法(S-GF)[10]的视差图,图3(e)为本文算法的视差图.以上几种算法与本文算法相关性较大,具有很高的可比性.由对比结果可以看出,本文算法对4 对标准图像对都有一定程度的精度提升.
表1为本文算法与其他局部立体匹配算法的定量结果对比.其中n-occ 为非遮挡区域误匹配像素百分比,disc为深度不连续区域误匹配像素百分比,all 是全部区域误匹配像素百分比.通过它们的均值可以得出4 组标准图像对的平均错误率(Average Percent of Bad Pixels,Avg PBM).从表1数据可以看出,本文算法同GF 算法相比精度提高了0.81 个百分比,同S-GF 算法相比提高了0.2 个百分点.本文算法尽管在Tsukuba 精度上有所降低,但在Venus,Teddy 和Cones 的匹配精度上有了显著提高.
参数Cth为判断像素点视差是否可靠的判定阀值,参数 ∂为构建基于梯度的自适应十字交叉窗口时,判断梯度结构相似性的阀值.这两个参数对视差计算得到视差图的精度都起到了非常大的影响.对于参数Cth而言,其越小判断像素点视差值是否可靠的标准越严格,越大则判断标准越放松.对于参数 ∂而言,其越小则构建的十字交叉窗口越小,越大则构建的十字交叉窗口越大.十字交叉窗口的大小会直接影响匹配精度.为得到最高的匹配精度,需要通过实验确定合理的 ∂值.为得到最高的匹配精度,需要通过实验确定合理的Cth和∂值.在保持其他实验条件和参数不变的情况下,对Cth从[0.3,1]之间的取值进行了实验,计算匹配误差,实验结果如图4所示.在保持其他实验条件和参数不变的情况下,对 ∂从[0.2,2]之间的取值进行了实验,计算匹配误差,实验结果如图5所示.
图3 标准图像对不同方法下的视差图对比
表1 不同算法误匹配像素百分比
图4 不同C th 取值下的误匹配率
图5 不同∂ 取值下的误匹配率
从图4、图5可以看出,对于Venus 数据,误匹配率受参数Cth和 ∂ 值得影响不明显.而对于其他3 组图像数据,当Cth=0.7,∂ =1.00时,得到的视差图精度最好.
为提高视差图精度同时保持较快的运行速度,本文提出了一种改进的跨尺度引导滤波算法.首先融合SAD 和Census 变换两种代价计算方法,然后采用基于跨尺度的引导滤波进行代价聚合,在进行视差计算时,并没有采用常用的赢者通吃(Winner-Take-All,WTA)方法,而是通过制定一个判断准则判断图像中每一个像素点的最小聚合代价对应的视差值是否可靠,当判断为视差不可靠时,对像素点构建基于梯度相似性的自适应窗口,并基于自适应窗口修正该像素点对应的视差值,最后进行视差精化得到最终的视差图.实验结果表明,通过达到精度和速度的平衡.在接下来的研究中,会基于GPU 平台重构代码,实现并行运算进一步提高算法运行速度.