代码地址:https://github.com/kujason/ip_basic
题目:《In Defense of Classical Image Processing: Fast Depth Completion on the CPU》
KITTI depth completion benchmark:http://www.cvlibs.net/datasets/kitti/eval_depth.php?benchmark=depth_completion
随着数据驱动的深度神经网络作为一个通用函数估计的实现,大部分研究员在计算机视觉问题上,已逐渐脱离研究人工设计经典图像处理算法。本论文用一个巧妙设计出的算法表明,在深度补全领域经典算法可以超越神经网络。本文提出的算法运行在CPU上,是简单和快速的,只依靠基本的图像处理运算就能实现稀疏LIDAR深度数据的补全。作者在KITTI深度补全竞赛上进行算法评估,在当时提交的算法中,作者在测试服务器上排名第一。
本论文提出的方法不需要引导,只需要依靠LIDAR数据。作者的贡献:
(1)作者提出了一个快速深度补全算法,在CPU上能够运行到90HZ。在发布此论文时,在KITTI深度补全竞赛上排名第一。
(2)作者提出的算法性能优于CNN方法,这些方法设计出来大幅度解决稀疏输入表示问题
在深度图补全过程,主要分为两种:引导深度补全和非引导深度补全。
引导深度补全:该方法将加入彩色图像作为引导来进行深度图补全。
非引导深度补全:该方法只需要稀疏深度图来进行稠密化处理
(1)深度反演:主要的稀疏处理机制实施采用OpenCV形态学转换运算,用较大像素重写较小像素值。当考虑原始KITTI深度图数据,深度距离从0-80m之间。然而,空像素处的像素值也为0,这将阻止在没有修改情况下使用OpenCV运算。在原始深度图上应用一个形态学运算将会导致大距离重写小距离,导致近目标损失边缘信息。为解决这个问题,有效(非空)像素深度将被转换根据公式:
这也创造一个20米的缓存在有效和空像素值。这步转换将允许在应用膨胀处理时,算法保护临近边界。20m缓存区用于偏移有效深度,来允许后续操作期间屏蔽无效像素。
(2)自定义膨胀核:作者利用最临近有效像素来填充空像素,比较像用有效的深度共享最近深度值。考虑到投影稀疏性和LIDAR的线扫描结构性,作者设计了一个自定义核来作为每个有效深度像素的初始膨胀。内核形状的设计使得具有相同值的最可能像素放大到相同值上。作者实施和评估上面四个核,经试验证明5*5 diamond核用来膨胀所有有效像素。
(3)小空洞闭运算:经过初始膨胀操作后,在深度图上仍然存在一些空洞。因为这些区域不包含深度值,作者考虑到目标在环境中的结构性和膨胀深度的临近块能够从目标连接形成边界。一个形态学闭运算5*5全核,用来对深度图进行小空洞的闭合。这个操作用了一个二进制核,能够保护目标边界。此步骤用于连接附近的深度值,可以看做5*5像素平面从最远到最近进行堆叠。
(4)小空洞填充:在深度图中,一些小到中大小的空洞没有被填充,在前两步膨胀运算中。为填充这些空洞,一个空像素的mask首先被计算,通过一个7*7全核膨胀运算。这个操作将会使只有空像素被填充,原先计算的有效像素保持不变。
(5)延伸至框架顶端:考虑到较高处目标,例如:树和建筑物在LIDAR点的上方,为了补齐这些像素,将每列顶端值延伸到图像的顶端。
(6)大空洞填充:在先前的步骤中没有对大空洞深度区进行填充。因为这些区域不包含点和没有图像数据被用,这些像素的深度值被填充从邻近值。一个膨胀操作使用一个31*31全核来填充空像素区域,保持有效像素不变。
(7)中值和高斯模糊:经先前步骤处理后,可以得到一个稠密的深度图。然而,深度图中的异常值作为膨胀运算的副产品。为移除这些异常值,作者用了一个5*5核中值模糊。这个去噪步骤是非常重要的来去除异常值保持局部边界。最后,一个5*5高斯模糊被用来平滑局部平面和四舍五入尖锐目标边界。
(8)深度反演:进行一步深度取反操作,与第一步对应来得到最终真实的深度图:
实验结果
了解更多关于《计算机视觉与图形学》相关知识,请关注公众号: