Gaussian Curvature Filter on 3D Meshes

一句话看懂GCF 无需计算高斯曲率即可降低曲率,从而平滑三角网格并去除噪声:每个顶点只需移动到使某个邻点落在其切平面上的位置。全程仅一个参数,速度约为高斯曲率流的 18 倍。
问题背景
由三维扫描等方式获取的三角网格往往带有噪声,而含噪网格的高斯曲率高于对应的无噪声模型。因此,降低高斯曲率即可对网格进行平滑和去噪;若高斯曲率处处为零,得到的就是可展曲面——它能够无畸变地展开到平面上,也便于工业制造。
最小化高斯曲率的经典方法是高斯曲率流,但它存在两个问题。其一,它需要显式计算高斯曲率,这隐含地假设曲面二阶可微,而实际网格很难满足这一条件。其二,为保证数值稳定,它的时间步长必须很小,因而速度很慢;在论文的实验中,步长还需针对不同网格分别调节。专门的去噪方法大多基于顶点或面法向,同样有其困难:需要人工设定大量参数并依赖较强的先验假设,而且在处理纹理丰富的模型时,去噪过程容易破坏原有特征。

方法原理
该滤波器建立在一个观察之上:在可展曲面上,任意一点附近总存在另一点位于其切平面上,且两点可以任意接近(论文定理 1)。因此,只要移动某个顶点,使它的某个邻点落在其切平面上,就能降低该顶点处的高斯曲率;若已有邻点位于切平面上,顶点则无需移动。整个过程从不计算高斯曲率本身,也不需要二阶导数。

- 切平面上的邻点。 在柱面、锥面、切线曲面这类可展曲面上,点 x 附近总有一点 x0 位于其切平面上。在离散网格上,这个点未必恰好是顶点,因此滤波器把一环邻域顶点(与该顶点直接相连的顶点)都作为候选,并取其中之一作为近似。
- 区域分解。 通过着色(算法 1)为每个顶点分配一个与其所有邻点都不同的标签。各颜色集合依次更新,从而保证某一顶点移动时,其一环邻域顶点保持不动。这正是迭代得以收敛的前提;同时,这些相互独立的集合也便于并行实现。
- 无约束的移动距离。 对顶点 vi,计算各一环邻点到 vi 切平面的距离,取绝对值最小者作为移动距离 |d|。
- 带约束的移动距离。 为保持特征,还需用到各邻点的法向(由该邻点相邻两条边的叉积单位化得到)。将 vi 到各邻点的每条边分别投影到 vi 的法向和每个邻点的法向上,对五个邻点的一环邻域共得到 5 条边 × 6 个法向(vi 的法向加 5 个邻点法向)= 30 个距离,取其中绝对值最小者。对于位于平面、棱边或角点上的顶点,总有某个法向与某条边垂直,于是 |d| = 0,顶点保持原位。
- 顶点更新。 顶点移动到 v′ = v + |d|·δ,其中 δ 是微分坐标(顶点减去其邻点质心)反方向的单位向量,近似于法向的反方向。边界顶点不移动。对所有颜色集合按设定的迭代次数(滤波器唯一的参数)反复更新,整个网格的高斯曲率随之降低。


实验结果
论文检验了两方面的性质。在高斯曲率最小化方面,作者在 Max Planck 头像和 Vase 两个网格上与高斯曲率流进行比较,分别测试无噪声和加入 0.3 倍平均边长 le 噪声的情形。两种投影策略降低高斯曲率能量的速度都快于曲率流。不加约束时,滤波器约 10 次迭代即收敛,但会丢失细节,角度误差在快速下降后又回升;加入约束后,约 40 次迭代收敛,能在去噪的同时保留细节。与 Stein 等人的可展性方法(SIGGRAPH 2018)相比,二者在无噪声网格上结果相近,而滤波器得到的能量更低。在含噪 bunny 上,滤波器的高斯曲率能量为 83.48(对方为 323.21),MSAE 为 11.86(对方为 12.59),耗时 37.90 s(对方为 1571.10 s)(表 2)。在含噪 mask 上,Stein 等人的方法产生了奇异点,而滤波器没有(图 7)。
在去噪实验中,滤波器迭代 40 次,七种基于优化和基于滤波的对比方法均使用默认参数。除 MSAE 最低外,滤波器在四个网格上的高斯曲率能量也都是所有方法中最低的;论文认为较低的 MSAE 说明其几何特征保持得最好。在两个含未知噪声的真实扫描模型(angel 和 rabbit)上,它同样能在去除噪声的同时保持几何特征(图 13 和图 14)。若不加几何约束,滤波器虽能去噪,却无法保持特征。作者计划在未来研究并行版本的滤波器,以便在 GPU 上处理超大规模网格。


引用
@article{tang2020gaussian,
title={Gaussian Curvature Filter on 3D Meshes},
author={Tang, Wenming and Gong, Yuanhao and Liu, Kanglin and Liu, Jun and Pan, Wei and Liu, Bozhi and Qiu, Guoping},
journal={arXiv preprint arXiv:2003.09178},
year={2020}
}