冯晶明,苗文娟,畅青
(四川大学计算机学院,成都610065)
近年来3D 技术快速发展,包含场景深度信息的深度图像在三维探测、场景重建、虚拟视点融合等应用领域起到关键作用。但是深度图像的产生过程往往在边缘和遮挡处伴随空洞[1],降低了深度图像的质量。传统的深度图修复算法主要有基于联合双边滤波和基于图像分割的深度图修复算法。利用基于联合双边滤波的方法[2-4]从彩色图的引导性出发,结合双边滤波等优秀算法进行深度图修复,实现了在动态环境下深度信息的实时恢复,但该算法不仅降低了算法的效率而且依旧无法解决物体边缘模糊化的情况,另外该算法会导致修复的深度图出现边缘过平滑化等现象。利用马尔可夫随机场描述深度恢复问题,利用基于图像分割的方法[5],通过利用不同分割区域内不同邻域的深度值对无效值进行修复,可在某种程度上解决深度图边缘模糊以及过平滑的情况,但该算法对图像分割的效果依赖性很高,而且效率不高,满足不了算法对实时性的要求。
关于深度图像的空洞填充如今已提出多种算法。文献[6]利用高斯滤波来估计空洞处的深度值,这是一种基于时域滤波的方法,该方法虽然能填充空洞像素,但高斯滤波法仅仅利用了空洞周围像素的深度信息,而忽略了颜色信息,因此填充效果的置信度并不高;文献[7]利用帧差法进行背景估计,即通过视频序列估计背景深度图来进行修复,该方法也可有效填充深度信息,但所需数据量较大,并且对于单幅深度图像无能为力;文献[8]通过空洞周围有效的深度值的分布来估计空洞处的深度值,该方法能有效对空洞进行修复,但算法的复杂度较高。文献[9]利用卡尔曼滤波与多帧平均法相结合修复深度图像,但该算法对于场景中存在动态目标的情况需要对图像序列中的动态目标进行再次配准。
针对文献[2-4]所出现低效且不能有效解决物体边缘模糊化问题以及文献[5]带来的高实时性要求,本文提出了基于灰度值变化的快速鲁棒深度图修复算法。该算法首先结合灰度图将空洞分为两部分,然后对不同部分的像素对应的深度值采用不同的方法进行修复。
针对空洞为灰度图像素梯度变化较低的部分,如图1 所示。该部分主要分布在物体的中间结构部分,原因是由于物体中间结构部分非粗糙表面对红外的衍射特性造成的。由于该部分的深度值变化连续,可以直接利用邻域内的有效深度值,计算空洞区域内像素的深度值。
图1 物体中间结构表面梯度变化示意图
因此对该部分,本文直接采用中值滤波的方法对灰度值无效的部分进行填充,该算法公式如下:
第二部分空洞为灰度值像素梯度较大的部分,(如图2 所示)该部分主要出现在物体的边缘结构处,特别是弱纹理场景下表现的更加明显。由于该部分处于物体的边缘,空洞处往往包含不同物体表面的像素点,深度变化不连续且不规律,对该部分的深度修复是本文的研究重点。以往采用中值滤波或联合双边滤波的方法,由于它们都需要点p 邻域内的大部分视图与点p具有很好的深度相关性,但是该指标在物体的边缘处并不满足,因此都不能很好的解决此类问题。而采用区域分割的方法对分割的效果依赖性很高,且效率低下,不适合本文算法使用。
图2 物体边缘处梯度变化示意图
因此,本文采用像素点p 邻域内和点p 权值系数最大的点所对应的深度值作为点p 的深度值,也即:
其中,d 表示深度值,∅p 表示点p 的邻域,并且保证在点q 处的深度值为有效值。w( )p,q 表示像素点p 和q 之间的权重系数:
该权重系数表示,和中心点距离越近,并且和中心点灰度值越相似,权重系数越大,对中心点的影响越大。其中x、y 表示像素的坐标,I 表示像素的灰度值,σd和σr是高斯函数的标准差。
本文算法仅仅需要找到邻域内和中心点权值最大的点所对应的深度值对中心点深度值进行填充,可快速对物体边缘处的深度值进行修复。如图2 所示,在物体边缘处,梯度变化很明显,而该处的深度变化也极其不规律不连续,如果利用周围像素的深度相关性进行中心点的修复,必定造成物体边缘处模糊不清且精确度不高。而使用本文算法进行边缘处的深度修复,虽然相对激进,但是后面处理中,还需要对点云进行滤波降噪。
点云中的异常点主要是由于深度传感器自身的问题造成的,例如深度传感器存在一定的有效量程,超过量程之后的深度值会有很大的误差。对于这类点,在生成每帧点云时,要去掉深度值太大或无效的点。而对于离群点的去除,以往的算法中主要采用统计滤波器或半径滤波器的方法。统计滤波器需要统计中心点邻域内的点到中心点的距离,如果距离过大就把该点去掉。而半径滤波器则是统计中心点邻域内的点的个数,如果该中心点邻域内的点不满足条件,就把中心点去掉。相比于前一种方法,半径滤波器的速度更快,更适合本文算法使用。
综上考虑,本文采用半径滤波器对离群点进行去除。排除离群点以及不可靠的点,因此该算法不会造成任何灾难性的后果。并且本文算法只需要计算在中心点邻域内像素的权重系数,然后找到权重系数最大的像素点对应的深度就可以对中心点的无效深度值进行填充。因此我们的算法计算量很小,满足实时性的要求。
本文实验在Ubuntu 16.04 操作系统下进行程序编写、调试以及效果展示。同时,笔记本电脑的硬件配置为Intel Core i7-7700 2.80GHz 主频、四核CPU、8G 运行内存。
本文算法是在Ubuntu 系统下由自己独立搭建的,实验所利用的数据集为middlebury 以及TUM 标准数据集。本文算法的效果图如图3 所示。
通过实验表明,本算法有效修复了原始深度图的空洞问题。本文算法可以保证边缘处深度值的精确度,而且相当的高效,满足整体算法鲁棒高速的要求。但本文算法也存在一定的不足,只适应于深度图存在较少空洞的情况,如果深度图存在大量的空洞,本文算法并不能取得很好的效果。
由于本文依赖深度传感器采集的深度信息,而当前的深度传感器(如Kinect2.0),在采集深度的时候,会出现一定的误差。而且在户外或者遇到有反光材质的物体表面时,会出现大面积的空洞。因此,希望以后的深度传感器在保持成本不提高的情况下,无论是在室内还是室外,都可以有非常好的精确度。本文给出了基于像素值变化在不改变数据的原始位置情况下而对数据进行排序的算法并利用C#语言编程实现了该算法的实验演示,该算法可用于解决实际工作中的一些相关问题,具有一定的实际意义。用C#语言实现的动态演示程序则有助于其他研究人员更好地理解和把握该算法的基本思想和实现过程。
图3 基于本文算法进行深度图修复的效果图
上面两组为middlebury 标准数据集上提供的数据,下面两组为TUM 标准数据集上提供的数据。