前言
目前,深度图像的获取方法有:激光雷达深度成像法、计算机立体视觉成像、坐标测量机法、莫尔条纹法、结构光法等。针对深度图像的研究重点主要集中在以下几个方面:深度图像的分割技术,深度图像的边缘检测技术,基于不同视点的多幅深度图像的配准技术,基于深度数据的三维重建技术,基于深度图像的三维目标检测技术,深度数据的多分辨率建模和几何压缩技术等。在PCL中深度图像与点云最主要的区别在于,其近邻的检索方式不同,并且可以互相转换。
RangeImage概念及相关算法
1.1 深度图像简介
深度图像(Depth Images),也被称为距离影像(Range Images),是指将图像采集器到场景中各点的距离(深度)值作为像素值的图像,它直接反映了景物可见表面的几何形状,利用它可以很方便的解决3D目标描述中的许多问题。深度图像经过坐标转换可以计算为点云数据,有规则及必要信息的点云数据也可以反算为深度图像数据。
从数学模型上看,深度图像可以看作是标量函数 在集合 上的离散采样,得到 ,其中 为二维网格(矩阵)的索引,
1.2 PCL中RangeImage的相关类
PCL中的range_image库包含两个表达深度图像和对深度图像进行操作的类,其依赖于pcl::common模块。深度图像(或距离图像)的像素值代表从传感器到物体的距离或者深度,如下图所示。深度图像是物体三维表示形式,一般通过立体相机或者ToF相机获取。如果知道相机的内标定参数,就可以将深度图像转化为点云。
pcl::RangeImage rangeImage;rangeImage.createFromPointCloud(pointCloud,angularResolution, maxAngleWidth,maxAngleHeight,sensorPose,coordinate_frame,noiseLevel,minRange,borderSize);
std::cout << rangeImage << "\n";
基于经典图像处理的方法
虽然基于CNN的方法已经霸榜了KITTI的Depth Completion,但是在小数据量情况下,基于经典图像处理的算法依旧有其优势。我们来看看几个常见的基于图像处理的深度图补全思路。
High-resolution LIDAR-based Depth Mapping using Bilateral Filter
这篇文章的直接在点云投影的深度图像上做补全,没有用到彩色图像信息,方法颇为平凡,可读之处在于实验,它把最常见的几个图像滤波方法做了非常细致的对比。它的输入是一个点云投影成的颇为稠密的深度图,尚未没有去除背景点。它的方法分为两步:第一步是背景点剔除,在局部区域用DBSCAN取剔除远处的cluster;第二步是用双边滤波器(Bilateral Filter)对深度图进行插值,以达补全的目的。
背景点剔除,在每一个局部区域内,用DBSCAN将有值的点聚类为几个类,距离函数是相对深度差 -neighborhood值为0.08,如果DBSCAN有超过两个类,根据类的大小取选择哪个类参与下一步插值,总体是偏向于靠近相机的类。
双线性插值,对每一个空白点 ,它的局部窗口内有值点集为 ,它的深度值为:
最后的结果如上表所示。BF*为上述方法,毫无疑问效果最好。其他方法并未做遮挡检测,这个比较颇为不公平。BF方法没有做遮挡检测。NEA是取距离最近值。DEL是做Delaunay三角花后插值。MIN方法其实就是Z-buffer的方法,效果不赖。MED是中值滤波。IDW是线性插值,线性系数是Inverse Distance Weighting。KRI是Kriging Filter。AVE是均值滤波。MAX是最大值滤波。
这篇文章其实有四个问题:第一个问题是是速度,对每一个窗口做DBSCAN速度会极慢,可以改用点云渲染里面的技巧快速去除背景。第二个问题是在深度图像里面做插值有些不合理,我们应该在视差图中用重心坐标进行插值,这一点在我的另外一篇文章里描述了。第三个问题是它的输入深度图像其实非常稠密,它是由好几帧激光雷达点云拼接出来的,无法处理更为稀疏的图像。最后一个问题是这篇16年的文章的想法其实在其很多年之前的文章就有了,比如这篇08年的文章,这篇08年的文章甚至比这篇16年的文章提供了更为全面和深刻的分析。
详见:深度图像补全(Depth Map Completion) - 上
(3)聚类算法之DBSCAN算法