3D几何处理 | 点云补洞算法+代码分享

3D几何处理 | 点云补洞算法+代码分享

导读 : 今天介绍的是2017年发表在the virtual computer上的点云补洞算法,针对点云的补全和补洞算法是比较少见的,大多数算法都只是针对网格的补洞。而针对点云的补洞在三维重建中能够很有效的应用,特别是如泊松重建中因遮挡导致的点云稀疏或缺失的区域,但点云补洞能够很有效的解决该区域的重建问题。点云补洞本质上是个病态问题,所有的补洞方式只能根据洞周围点的特征来补全,但在几何结构相对简单区域,点云补洞能有很好的表现。

算法论文地址:yanqingan.github.io/docs/tvc16_shape.pdf
代码获取 : 获取代码请微信扫文章末尾二维码关注公众号 什锦加,回复 CloudHole 获取

摘要

这篇文章提出了一种全新的点云补洞方法,能够在平滑和尖锐的地方都有较好的补洞表现,该方法模仿物理上的扩散模型,将一次洞的边缘收缩分解为法向传播和顶点位置传播,并根据其相应的约束来保持其平滑或尖锐的特性。通过迭代上述过程直到没有新的边缘生成,即完成点云补全。

1.简介

点云模型在过去20多年中有很广泛的应用。直到现在,尽管扫描仪等获取设备的性能有很大的提升,但是或多或少在其扫描的模型上存在有不同的空洞区域。此外,因为物体表面磨损和损坏,也会形成空洞区域。针对点云补洞这个病态问题,现有的大部分工作基于网格步面片的方式。而直接在点云上补洞的相对较少,而且大多只能生成平滑的补洞结果。本文模仿物理中能量扩散的方式进行点云补全,能够有效的生成平滑和尖锐的补洞结果,如下图1所示:
3D几何处理 | 点云补洞算法+代码分享_第1张图片

2.算法

​ 本文将洞边缘收缩主要分为两步:

  • 法向传播:用于控制填充点的方向和恢复的表面的形状。

  • 位置传播:在一次边缘收束中生成新的边界点。

    这两个步骤在补洞算法中交替执行,且能够相互优化。这种交替传播方式能够将法相约束插入到法向传播步骤中,以恢复空洞的尖锐特征。

2.1 算法总览

​ 给定带法向的点云作为输入,本文算法首先对输入点云进行预处理去噪,然后提取空洞的边界点,并通过迭代传播的方式缩小空洞区域,直到没有新点生成。
3D几何处理 | 点云补洞算法+代码分享_第2张图片

2.2 预处理

​ 为了得到有效的洞的边界,本文采用了二阶段的处理去噪,同时对点云位置和其法向进行双边滤波 [1]操作,从而获得去噪的后的带法向的点云。

2.3 洞边界确定

​ 本文采用分而治之的策略进行边界提取,首先在边界上手动顺序选择少量特征点$f_i’ 其 中 其中 (i = 1,…,m) , 将 这 些 点 输 入 边 界 点 集 合 中 ,将这些点输入边界点集合中 B’$中。 因此任意两相邻点间可以看作时局部线性的。

​ 对于相邻点 f i ′ f i + 1 ′ f_i' f_{i+1}' fifi+1构成的线段,计算其中点 M M M, 并选择距离最近的边界上的点 b m ′ b_m' bm,如果该点是新的点,则将该店插入到点集中 f i ′ f_i' fi f i + 1 ′ f_{i+1}' fi+1之间。通过迭代直到所有相邻点间距离小于阈值,则获得最终的边界点集,以此作为空洞边界。

2.4 法向传播

为了计算收缩后的空洞边界,本文在采样的边界点集上构建法向传播。新填充的点 b i b_i bi的法向计算方式为:
在这里插入图片描述
在这里插入图片描述
N r ( b i ) N_r(b_i) Nr(bi)表示 b i b_i bi附近半径为r以内的邻近点。 g 1 g1 g1 g 2 g2 g2分别是标准差为 σ d \sigma_d σd σ n \sigma_n σn的高斯权重。 n i ′ n_i' ni为距离 b i bi bi最近的上一轮边界上的点的法向。

2.5 顶点位置采样

以传播的法向作为指导,一轮边界收束的采样点需满足两个目标:

  • 新生成的边界与周围区域的表面相匹配
  • 新填充的点应该保持合理的分布,保持连续实际的收缩,使得空洞区域变小

为此,文章定义 E 1 E1 E1用来度量填充点和周围表面的差异。同时引入弹力来填充点的位置,一个好的候选点应该在受力平衡点附近且受到最小的合力 E 2 E2 E2。结合两者,建立了以此边界收缩的目标函数:

在这里插入图片描述

3. 生成新的孔洞边界

​ 虽然上述算法给除了顶点采样的目标函数,但是直接求解是非常困难的,因为空间中有无数的位置能满足该函数最小化。因此文章提出了间接的采样方法。

​ 首先,通过上一轮生成的边界点,生成新的边界点的控制曲线。在控制曲线约束下,本轮采样变为沿着控制曲线的1-D采样。 采样到的新的顶点是目标函数(3)的近似解。

​ 然后,对每个采样点根据其邻域和(1)中计算的法向进行位置优化,直到收敛。

3.1 计算洞边缘控制曲线

定义弹力:文章利用高斯函数来对弹力进行仿真并控制邻近点间距离的权重。 O b i ′ O_{bi}' Obi表示新的候选点 b i bi bi沿着上一轮边界点 b i ′ b_i' bi沿着该点传播方向的平衡点,在 O b i ′ O_{bi}' Obi位置受到的邻域其他点的弹力如下式(4):
在这里插入图片描述
其中 O q O_q Oq是邻近点 q q q沿着 q O b i ′ ′ ⃗ \vec{qO_{bi}''} qObi 的平衡点,如图Fig.3所示。
3D几何处理 | 点云补洞算法+代码分享_第3张图片
事实上,一旦给定邻域点 q q q,则从点 q q q受到的弹力仅与 O b i ′ O_{bi}' Obi O q O_q Oq的符号距离有关,其正向为斥力,负向为引力,因而可简化为式 (5),而平衡点的计算公式为式 (6)

在这里插入图片描述
3D几何处理 | 点云补洞算法+代码分享_第4张图片
边界控制曲线: 边界控制曲线有上一轮生成的边界点计算得到的平衡位置得到。对于边界点 b i ′ b_i' bi 其收缩方向为该点法向与边界方向的叉乘。从而根据式(5)(6)可计算出所有新的平衡点以及该点收到的弹力,并删除受到邻域斥力的平衡点,剩下的作为新一轮的边界曲线采样点。

3.2 位置优化

为保证生成的采样点与局部表面形状匹配,本文提出了位置优化方法,如式(7)
3D几何处理 | 点云补洞算法+代码分享_第5张图片
所有的边界点受到邻域点的沿着其法向的引力作用,到新的平衡点,其中 g 1 g_1 g1 g 2 g_2 g2是和式(1)类似的高斯权重,则优化后的顶点位置为:
在这里插入图片描述
注意到位置优化后的点的法向与表面不匹配,而重新计算后的法向也会导致优化位置的偏离。因此,理论上可进行交替优化的方式,使之达到收敛。而在实际上收敛速度会比较快,因而采用两轮交替优化即可。

3.4 保持特征一致

在尖锐的洞区域,采用上述方法容易因其区域交叠的问题,如Fig.7所示,可通过设置相应的阈值,在出现位置偏移反向的时候,将其进行剔除,即可剔除该区域多余的顶点。

3D几何处理 | 点云补洞算法+代码分享_第6张图片

算法结果

​ 文章在不同的模型上进行了测试,如图Fig.1 所示,不同半径的邻域取值对补洞表面的收敛速度不同。FIg.8 则展示了不同的同算法相对本文算法的补洞结果。本文算法在尖锐和平滑区域都有很好的表现。3D几何处理 | 点云补洞算法+代码分享_第7张图片
3D几何处理 | 点云补洞算法+代码分享_第8张图片
特别是在泊松重建之前,本文算法通过提前对点云进行空洞填充,再进行播送重建后能够很好的降低模型空洞粘连的问题,提高模型质量。

代码获取

获取本文源码请微信下列二维码关注本人公众号,并回复 cloudhole 自行获取。
3D几何处理 | 点云补洞算法+代码分享_第9张图片
本文为原创,转载请著明出处。

参考文献

[1] Fleishman S, Drori I, Cohen-Or D (2003) Bilateral mesh denoising. In: ACM Transactions on Graphics (TOG), ACM, vol 22, pp 950–953

你可能感兴趣的:(Paper,Reading,3D几何处理)