张一飞,李新福,田学东
(河北大学 网络空间安全与计算机学院,河北 保定 071000)
立体匹配就是找出同一视点在左右视图中的坐标位置,从而计算得到视差图的过程[1-2]。工业测量、无人驾驶、医疗诊断等领域都迫切需要立体匹配生成的3D信息来帮助计算机和机器人完成各项任务[3-5]。SAD算法是实时系统的典型算法,但其匹配精确度不高[6]。边缘是图像的重要特征,优秀的边缘提取结果可以提高匹配的精确度。
文献[7]对SAD算法进行改进,在其比较窗口上赋予不同的权值,并与Census算法相结合提出SAD-Census算法,该算法可较好地解决左右视图存在亮度差异的问题,但其对弱纹理区域的匹配效果不好。文献[8]在实验中将深度边缘和纹理边缘进行匹配,同时采用基于边缘线段的方法来提高算法的鲁棒性,该算法能准确检测到深度图的边缘失真并确定位置,但是对于层次复杂且颜色相近的物体,该算法的深度值准确率下降。文献[9]提出一种两阶段算法,第1个阶段进行特征提取和特征匹配,第2个阶段围绕特征区域的特殊邻域的差异增长计算视差,该算法能够较快较好地得到视差图,但其对特征选取的依赖性太强。文献[10]仅使用加减和乘法运算,而无占用计算资源较多的矩阵运算,提出递归边缘保持性双目立体匹配算法,该算法准确率高但递归的使用导致计算量增大。
本文为了保留SAD算法实现简单、实时性好等优点,同时提高匹配精度,提出将边缘特征与SAD算法相融合的立体匹配算法Edge-Gray。
SAD算法通常在左右图上分别创建一个W=[(2n+1)×(2n+1)]的窗口,n为正整数,固定左(或右)图窗口,滑动右(或左)图窗口,每次滑动后记录窗口上相同位置的差值和,直至滑动结束,差值和最小的点记为左右视图的匹配点[6]。其中,n的取值越大,时间消耗越长。以Cones为例,实验中窗口大小与时间的关系如图1所示。
图1 窗口大小与时间的关系
Roberts、Prewitt、Sobel、Canny等算子都是计算图像边缘的有效方法[11-13],各个算子都有自己的特点。Roberts算子边缘定位较准,但对噪声敏感。Prewitt算子能去掉部分伪边缘并对噪声具有平滑作用,但是对边缘的定位不准确。Sobel算子能很好地消除噪声的影响[14-15],但主题与背景的区分不明确。Canny算子具有很好的信噪比和检测精度,定位性能良好,其边缘检测的标准较为严格,是一个具有滤波、增强、检测的多阶段的优化算子[16],但Canny算子相比其他3个算子计算过程更为复杂[17]。综上所述,Canny算子检测精度高,边缘刻画清晰。为了减少立体匹配中可能出现的错误匹配,本文选择使用Canny算子来计算边缘信息。
文献[18]将立体匹配算法分为4步,即匹配代价计算、代价聚合、视差计算与优化和视差后处理。本文在上述流程上做出了调整,如图2所示。
图2 本文立体匹配算法流程
预处理部分就是将彩色图像转化为灰度图像,灰度化后的图像一个像素由24位转化为8位,可减少后续处理中的内存消耗。图像灰度化过程所用到的公式如下:
IGray(i,j)=0.299R(i,j)+0.587G(i,j)+
0.114B(i,j)
(1)
其中,IGray为彩色图像计算转化为灰度图像后的灰度值。(i,j)为当前像素点在图片中的横纵坐标,R、G、B分别为24位真彩图像的红、绿、蓝的色值[19]。
本文采用Canny算子计算图像边缘信息,主要包括以下3个步骤:
1)使用高斯滤波器平滑图像,滤除噪声。
2)计算图像中每个像素点的梯度强度和方向。
3)应用非极大值抑制(Non-Maximum Suppression,NMS)消除边缘检测带来的杂散响应。
2.2.1 图像平滑
高斯滤波的主要作用是去除噪声。由于噪声集中于高频信号,很容易被识别为伪边缘,因此应用高斯模糊去除噪声,可降低伪边缘的识别。由于图像边缘信息也是高频信号,因此高斯模糊的半径选择很重要,窗口半径越大,对噪声的敏感度越低[19]。高斯核的生成方法如下:
(2)
其中,G(i,j)为输出结果,它是一个大小为(2k+1)×(2k+1)的方形矩阵,k为正整数。标准差σ取值一般为k的一半,即k/2。生成的高斯核如图3所示,其归一化后的结果如图4所示。
图3 k=2且σ=1时的高斯滤波核
图4 归一化后的高斯滤波核
将得到的高斯核与待处理的图像进行卷积运算,计算公式如下:
(3)
其中,Q(m,n)为输出结果,G(i,j)为高斯滤波核,F(m,n)为待处理图像,(m,n)为当前要处理的像素点的坐标值。5×5的高斯核与待处理图像卷积后的结果如图5所示。
图5 高斯滤波后的图像
2.2.2 梯度强度和方向计算
本文采用Sobel算子来计算水平和垂直方向的差分。在计算后返回水平和垂直方向的一阶导数值,由此便可以确定像素点的梯度Ggrad和角度θ。将水平方向记为X方向,将垂直方向记为Y方向,则X方向和Y方向的Sobel算子分别如图6、图7所示。
图6 X方向的Sobel算子
图7 Y方向的Sobel算子
分别将X和Y方向的Sobel算子与高斯滤波后的图像进行卷积运算,得到两组数据Gx与Gy。计算公式与式(2)类似,在此不再赘述。
在得到Gx和Gy后,就可以利用这两组数据来计算梯度,计算公式如下:
Ggrad=|Gx|+|Gy|
(4)
同时,每个像素点对应角θ也可以由Gx和Gy求出,计算公式如下:
θ=arctan(Gy/Gx)
(5)
通过以上步骤可以得到两组数据,即各个像素点的梯度值Ggrad和各个像素点的角度θ。
2.2.3 非极大值抑制
非极大值抑制是一种边缘稀疏技术,其作用在于“瘦边”[11]。为保证图像中给定的边缘应只被标记一次,并且在可能的情况下,使图像的噪声不产生假的边缘。
如图8所示,将P点的周围分为4个区域,分别标有0、1、2和3。将0°到180°分别对应到4个区域内。
图8 P点的八邻域图
应用非极大值抑制将局部最大值之外的所有梯度值抑制为0,计算结果如图9所示。
图9 边缘特征图
以θ在[0°,45°)范围内为例,计算过程描述如下:
1)将当前像素的梯度强度与沿正负梯度方向上的2个像素进行比较,梯度方向的点的像素计算方法如式(6),可得F(p1)和F(p2)。
F(p1)=(1-tanθ)E+tanθ×NE
F(p2)=(1-tanθ)W+tanθ×SW
(6)
2)如果当前像素的梯度强度大于另外2个像素的梯度强度,即F(p)>F(p1)且F(p)>F(p2),则当前像素点保留为边缘点,否则该像素点将被抑制。
SAD算法速度快、效率高、实时性好,可以较好地满足大部分立体匹配系统的需求[5],但其匹配精度不高。为此,本文引入图像边缘特征来提高匹配结果的精确性。改进SAD算法后,Edge-Gray算法的流程如图10所示。
图10 Edge-Gray算法流程
将预处理图像得到的左右视图的灰度图和边缘特征图分别记为Lgray、Rgray和Ledge、Redge,Edge-Gray算法描述如下:
1)确定参考图(以左图为参考图,则右图为匹配图),在参考图对应的灰度图中构建参考窗口,窗口大小的取值W=[(2n+1)×(2n+1)],n为正整数。计算不同窗口大小下,窗口中所有值的标准差,对应标准差最大的W即为此次匹配的窗口大小。
2)在参考图和匹配图中构建大小为W的窗口,分别计算窗口中心点与各个邻域点的差值和,记作Sgray和Sedge。
3)若Sgray>Sedge则选Lgray和Rgray为匹配源图,反之则选Ledge和Redge为匹配源图。然后采用经典的SAD算法计算出当前点的视差值,计算公式如下:
(7)
其中,L(x,y)和R(x,y)代表左右图像中(x,y)点的灰度值。用i和j遍历匹配窗口中的每一个像素点,每次计算d加1直到遍历完W。当CSAD最小时所得点即为匹配点,d即为所求视差。
4)逐一取出参考图中的每一个点进行上述步骤,得到左图的视差图。
5)将左视图作为匹配图,右视图作为参考图,重复步骤2~步骤4得到右图的视差图。
视差后处理专为除去视差图中的错误点而设计。该过程包含左右一致性检测、奇异点填充和平滑滤波3个步骤。
在左右视图中,存在某些区域在其中一幅图中可见,而在另一幅图中被遮挡,视差图中的错误点主要来源于图片中的遮挡区域,这些区域往往会造成深度图的不连续。左右一致性检测所采用的公式如下:
DL(x,y)=DR(x-DL(x,y),y)
(8)
其中,DL和DR分别为左右视图的视差图,(x,y)为当前点的坐标,不能满足式(8)的点为奇异点。以奇异点为中心,向左右搜寻距离最近的非遮挡点中较小的值来填充。
在平滑滤波过程中,本文采用中值滤波[20]的方法对像素点进行检测与恢复。具体操作为取出中心点周围8邻域或24邻域的灰度值,将这些深度值排序,取排序后中间位置的值为当前像素点的深度值。
本文实验参数如下:操作系统为64位Windows10专业版,CPU为Intel(R)Core(TM)i7-6700,CPU主频为3.40 GHz(3 408 MHz),内存8 GB,显卡AMD Radeon(TM) R5 340X(2 048 MB)。
将本文所得的实验结果图与理想视差计算所得深度图进行比较,将同一位置的像素值作差,超出阈值的点记为误匹配点,遍历所有点即可得到实验的误匹配率。所得的实验结果如图11所示。
图11 3种算法的匹配结果对比
图11(a)~图11(c)分别为传统SAD算法(记为Gray)、单纯使用边缘增强图(记为Edge)和本文算法(记为Edge-Gray)的匹配结果。可以看出,Edge算法在纹理较多的区域的匹配结果要优于Gray算法,但在纹理较弱、纯色区域较多的区域,Gray算法要优于Edge算法。总体而言,本文算法虽然在弱纹理的纯色区域提升效果不明显,但在边缘较多、纹理较丰富的区域有较好的匹配结果。具体数据如表1和表2所示。
表1 4种算法的误匹配率对比
表2 4种算法的时间消耗对比
由表1和表2可知,本文提出的融合边缘特征的SAD立体匹配算法精确度较好,该算法既能提高传统算法在边缘丰富区域的匹配精确度,又改善了该算法在纯色和边缘较少的区域匹配精度较低的特点。同时,从时间上看,本文算法与传统SAD算法的时间消耗相近,具有较好的实时性。
本文对传统的SAD算法进行改进,提出一种融合边缘特征的立体匹配算法。通过预处理得到边缘特征图,根据匹配窗口中像素点的标准差对自适应窗口大小进行处理。在匹配过程中,不同于传统的立体匹配算法只利用灰度图进行匹配,而是融合了边缘特征图和灰度图。实验结果表明,与传统SAD算法相比,该算法的耗时与其相近,但误匹配率普遍降低,对于边缘较多的Cones效果最为明显,该算法的误匹配率可降低10.52%。然而,在弱纹理和纯色区域较多的部分,本文算法的匹配准确率不高,针对该问题进行改进将是下一步的研究方向。