该CGAL包实现了一种曲面重建方法,该方法以无序的点集为输入,并计算插值该点集的三角曲面网格。我们假设输入点是从对象的表面采样的。该方法也可以处理从对象内部采样的点集,尽管我们不能保证输出。这种方法可以处理相当多的噪声和异常值。点集可能会大大低估被遮挡区域中的对象采样,尽管不会重建任何表面来填充这些区域。
1、尺度空间
从点样本重建曲面的问题定义不清。因为这些点只提供了曲面的样本,所以我们无法确切地确定曲面在这些点之间的行为。我们可以通过对表面进行进一步采样来获得更多关于表面的信息,但即使如此,问题仍然存在于较小的范围内。
对于真实世界的数据集,我们还必须应对噪声和异常值,即点位置和未分别对曲面进行采样的点中的小误差。这些通常是由测量过程中的故障引起的。除非我们真正知道采样的表面,否则我们无法确定一个独特的点是由噪声引起的异常点,还是对表面的一个小特征进行采样。
为了克服这些障碍,我们使用尺度空间在不同尺度上对点集进行建模。就我们的目的而言,尺度是点集的抽象级别。在较低、较精细的比例上,点集描述对象的较小特征。相反,在更高、更粗糙的比例上,点集仅描述更大的特征。比例空间以动态比例描述点集。它是一个四维空间,尺度为第四维。增加比例类似于平滑点集所描述的基础曲面。下图显示了不同比例的示例点集。对这个尺度空间建模的总体效果是,在更高的尺度上,表面重建问题更加明确。
黑点集包含一个平滑区域、一个具有大特征的区域和一个具有小特征或噪声点的区域。蓝色点以更高的比例显示点云。
比例的微小变化会导致点集的微小变化,这取决于局部形状。随着比例的增加,几何图形会基于连接的零部件接近多个点。如下图所示,给定一组固定比例的点,可以明确地确定较高比例的点集,但较低比例的点集中并非如此。
黑点和十字显示了两个不同的点集。蓝色框以更高的比例显示两个点集。请注意,仅给定蓝色框,我们无法在较低的比例上确定其点集。
尺度空间曲面重建方法分为两个阶段。首先,从点集构建尺度空间,并计算该空间在更高尺度s的交点。然后,按比例s计算点集的三角曲面网格。网格中的相邻三角形具有一致的方向,如在三角形的有序顶点上使用右手规则所表示的。
通常,需要对原始点集进行插值的重建。这可以通过将网格的点恢复到其原始比例(即其原始位置)来实现。下图显示了点集在其原始比例和具有恢复网格的更高比例下的重建示例。
根据原始比例(左)和更高比例(右)的点集构建的曲面。右图中的曲面点将恢复到原始比例。虚线路径显示向内的壳,其中它不与向外的壳重叠。请注意,比例空间重建是如何假设对象右侧的点采样小特征的。
平滑算子和网格重建都假设彼此靠近的点属于对象的同一部分。这通常表示为具有固定大小的球的概念,即邻域半径。如果这样的球包含多个点,则这些点彼此靠近,并将在增加比例的同时相互影响。如果这样的球是空的,那么它就位于物体的外部。请注意,外部是基于没有点的区域,而不是基于体积是否被曲面包围。
邻域大小可以通过统计分析来估计。我们使用kD树来估计到第n个最近邻居的平均距离,并将该距离用作分辨率的近似值。
在初始尺度下设置的点集与输入点集等效。理论上,尺度可以连续变化,但实际上,为了提高效率,尺度在离散迭代中增加。通过使用平滑算子对每个点进行变换,每次迭代都会增加一个尺度。CGAL提供两个平滑算子用于尺度空间重建:
CGAL::Scale_space_reconstruction_3::Weighted_PCA_smoother(默认)使用局部邻域的密度加权主成分分析(PCA)。如果点集是从一个表面采样的,该表面上的任何不想要的变形和采样噪声都小于邻域大小,则经过几次增加尺度的迭代后,尺度足够粗,可以进行网格重建。
CGAL::Scale_space_reconstruction_3::Jet_smoother 使用函数 CGAL::jet_smooth_point_set() 将点投影到局部平滑(喷射)曲面。这种平滑不太激进,如果点集的噪声不是很大,并且需要更高的精度,则应使用这种平滑。
用户可以通过遵循cgal::Scale_space_reconstruction_3::Smoother的概念来定义自己的平滑算子。
通过插值平滑的点云并将连通性传播回原始点云来实现网格化。CGAL提供两个用于尺度空间重建的网格化算子:
CGAL::Scale_space_reconstruction_3::Alpha_shape_mesher (默认)使用一个经过筛选的 CGAL::Alpha_shape_3 算法来生成一个或多个“外壳”。这种方法是为封闭形状(没有边界)设计的。点集采样开放形状会导致重叠表面。它需要一个与数据分辨率相关的固定邻域大小参数。该参数表示一个区域,如果它以表面为中心,我们可以假设它至少包含一个点。
CGAL::Scale_space_reconstruction_3::Advancing_front_mesher 使用算法CGAL::Advancing_front_surface_reconstruction 生成定向的 2 流形曲面。此方法处理具有边界的形状,并允许用户控制所使用的最大面。
该方法提供了对中间结果的访问,用户可以对其进行调整以更好地满足他们的需求。 (中间)结果是分辨率、比例和表面三角形的最终收集的估计。
请注意,Jet_smoother 和 Advancing_front_mesher 是依赖于其他 cgal 包的方法,与原始尺度空间算法不对应。对于采样有边界的表面的低噪声点云,它们可以用作替代算子。有关其参数和效果的更多信息,请参阅其各自的手册页。本文档的其余部分重点介绍使用 Weighted_PCA_smoother 和 Alpha_shape_mesher 的默认行为。
1.1、参数设置
尺度空间曲面重构方法有两个主要的全局参数:邻域球的半径和增加尺度的迭代次数。如果不知道合适的邻域半径,可以使用另外两个参数来估计:邻域的平均数量和样本数量。我们已经根据经验确定了这些参数中每一个的值,这些值在广泛的数据集上都能很好地工作。但是,我们建议为每种类型的数据集仔细微调这些参数。
尺度空间重构在局部进行。当增加比例时,局部邻域内的点会相互影响。类似地,在空间中彼此靠近的点更有可能在重建的表面上彼此靠近。因此,对哪些点彼此靠近有一个良好的指示是很重要的。这种接近度用邻域球半径参数表示。
邻域球半径与点密度和对象厚度有关。在理想情况下,半径被选择为使得以对象的表面的任何点为中心的具有该半径的任何球B将包含几个点,这些点应该通过表面中的局部面片连接以进行重建。同时,B不应包含任何不应成为此局部面片一部分的点,例如对象另一侧的点。
邻域半径可以根据点集自动估计。在这种情况下,半径被估计为平均包含给定数量的点。点的数量应选择为使得上述邻域半径的条件得以保留。一般来说,平均30个邻居会产生良好的结果。如果对象的部分具有非常低的点密度,则可以增加该数量,如果对象的薄特征应该被更好地重建,则可以减少该数量。
半径估计基于多个采样点。此采样数与点集覆盖对象的规则性有关。如果物体被非常不规则地覆盖,则可能需要较大的样本量。然而,较大数量的样本可能需要更多的计算时间。我们通常使用200个样本来估计邻域半径。
尺度空间方法试图通过将尺度增加到适当的粗略尺度来减少曲面重建问题的不适定性。在这种粗略的比例下,点集对平滑的曲面进行采样,这更容易重建。比例增加迭代次数决定了此曲面的平滑程度。
迭代次数与点集中的噪声、曲面特征的锐度和对象的厚度有关。具有大量噪波的点集和具有尖锐或较小特征的对象将需要更多的迭代。同时,处理过多的迭代可能会将体积退化为平面。这些退化可能导致重建的表面连接对象相对两侧的点。通常,增加规模的4次迭代是合适的。
1.2、输出曲面
按比例s构建的曲面网格是非自相交的。任何两个三角形的内部都不能在线段中成对相交。但是,曲面不需要是2倍。一条边可能入射到两个以上的三角形,如果三角形两侧的大区域都没有点,则三角形可能正好重叠。请注意,我们将方向相反的重叠三角形计算为单独的三角形。在许多情况下,如果点对对象的曲面进行采样,则计算的曲面将包含一个向外的曲面和一个类似的向内的曲面,它们之间有一个薄体积。
曲面网格的边不会仅入射到一个三角形或孔,这些边的循环,并且三角形的方向都远离点集。如果点集有孔,则曲面网格可能会包含与该孔方向相反的重叠三角形。
可以应用额外的处理来迫使输出表面为2倍:在重建之前发现小的平坦体积,并且表面被迫仅使用体积的一侧,同时与相邻的奇异面保持一致。仅使用每个奇异面的一侧。此外,非流形边和顶点将作为后处理被移除。为使曲面成为2倍曲面而丢弃的刻面将被存储并可访问。
如果对象没有密集采样或具有断开的分量,则重建的曲面可能具有多个断开的组件。曲面要么是三角形的无序集合,要么是按壳排序的相同集合。壳是局部朝向曲面同一侧的连接三角形的集合。
当恢复到原始比例时,我们不能保证曲面是有效的嵌入,因为该曲面的三角形可能在其内部成对相交。它也可能有边界边,尽管这些边总是入射到两个方向相反的曲面三角形上。然而,当对迭代次数和邻域大小使用适当的参数设置时,曲面通常不会自相交。适当的参数设置取决于点集的几何图形,通常需要根据数据集进行微调,如后所述。
2、软件设计
主要类Scale_space_surface_reconstruction_3、Weighted_PAC_smoother和Alpha_shape_mesher包含估计邻域大小、计算比例空间和增加比例以及从当前比例的点集重建曲面的所有功能。
邻域大小是使用Orthogonal_k_nobghbor_search来估计的。点集通常存储在Orthogonal_k_neighbor_search::Tree。当邻域大小被估计时,该树被搜索最近的邻域。
比例空间是按点的原始比例构建的。使用加权PCA过程来计算增加标度的迭代。与类似方法不同,该过程不会导致不期望的聚类效应。默认情况下,有效的特征库用于此过程(如果可用)。否则,将使用内部回退Diagonalize_traits。也可以为对角特征概念提供自己的模型。加权PCA过程是按点本地执行的,因此可以使用并行计算来执行。
通过以固定比例对点集的3D阿尔法形状进行滤波来执行网格重建。这种过滤为每个规则面构造一个三角形;每个奇异面导致两个面向相反方向的三角形。
生成的曲面存储为三元组的集合。每个三元组包含点集的三个索引。缩放迭代不会更改点的顺序。这意味着这些索引可以按原始比例应用于点集,以获得插值曲面,称为恢复曲面的比例。索引也可以应用于当前比例的点集,以获得平滑的表面。与恢复的表面相比,此平滑表面通常会有所收缩。
为了减少内存需求,点集不会以其原始比例存储。相反,以当前比例存储的点集是输入的克隆。这意味着可以使用原始输入来恢复曲面。
3、指导和性能
有多种可能的点集,无论是合成的还是测量的。尺度空间曲面重构方法试图减少重构问题的不适定性。然而,我们不能保证任意点集的结果是好的。有些点集需要仔细设置参数,而另一些点集则完全不适合这种方法。在这里,我们展示了不同的案例,包括理想抽样和不同的问题案例。
3.1、理想条件
尺度空间曲面重构具有宽松的理想条件。表面应合理定期取样,且不应包含过多的凹角。这些概念以相反的方式影响邻域参数:更规则的采样可能允许更小的邻域参数,这将允许更小的凹陷。该点集可以包含明显小于邻域大小的噪声。即便如此,当使用该方法来构造对原始点集进行插值的网格时,任何噪波都会使网格变形。下图显示了理想条件下的重建。
左图:在理想情况下,点是规则分布的,凹度是有限的。右图:重建的曲面网格。
3.2、边界
具有边界的曲面是自然处理的。然而,需要注意的是,在这些情况下,曲面不会明确识别边界并在其周围循环。在许多情况下,这将导致边界边被曲面的相邻三角形共享,这些三角形除了方向之外都是相同的。可以通过识别相邻三角形之间的方向差异来明确边界,但此包不提供此功能。下图显示了具有边界的重建曲面。
左图:具有边界的曲面的点示例。右图:重建的曲面网格。
请注意,网格器Advancing_front_mesher是生成具有边界的定向良好的曲面的一个很好的选择。
3.3、采样规则
如上所述,理想情况下,点集定期对曲面进行采样。例如,对于每个点,其最近的六个点位于大致相等的距离处,形成围绕该点的粗略六边形。使用真实数据时通常不会出现这种情况。比例空间方法可以重建非常不均匀的采样表面,如图所示。然而,如前所述,采样规则性和允许的凹度形成了一种权衡。左图:一个非常不规则的采样点集。右图:重建的曲面网格。
图示了一种情况,即我们不能同时正确地对凹区域和稀疏区域进行建模。左图:一个非常不规则的采样点集,具有紧密的凹度。右图:重建的曲面网格。请注意,我们无法正确建模嘴巴、眼睛和脖子。
3.4、尖锐特征
尺度空间曲面重构方法并不是专门针对具有尖锐特征的曲面而设计的。然而,如图所示,当使用适当的参数设置时,它可以充分重建这些特征。正确重建尖锐特征的主要前提是它们在特征上包含足够的采样点,并且特征与邻域参数相比不太薄。
在具有尖锐折痕的曲面上设置的点和从不同侧面看到的重建曲面网格。请注意,尖锐特征大多是正确重建的。然而,在用红色圈出的薄区域中,该特征没有被正确地重建。规则性和凹度之间的权衡也意味着一个洞出现在第三个图的右下角。
3.5、拓扑
尺度空间曲面重构方法不考虑曲面的拓扑结构。这意味着重构的表面可以具有与采样以获得点集的表面不同的拓扑结构。下图显示了从具有球体拓扑的曲面采样的示例点集;重建的表面具有环面的拓扑结构。
左图:具有球体拓扑的曲面的不规则采样。右图:使用圆环体拓扑结构重建曲面网格。请注意,不规则采样使其无法重建具有球体拓扑的曲面,因为该方法使用全局尺度参数。
3.6、点属性
许多点集包含点属性,例如法线或颜色。因为比例空间曲面重建构建了原始点之间的连接,所以任何对曲面有意义的点属性都可以传播到重建中。下图显示了为一组具有颜色的点重建的表面。
左图:使用点集的颜色进行顶点着色的重建曲面。右图:显示为线框的曲面细节。
3.7、性能
我们已经在几个不同大小的数据集上评估了尺度空间表面重建方法。下图显示了处理比例空间重建方法时使用的参数设置。
Data set | Neighbors | Samples | Iterations |
---|---|---|---|
Mushroom (s) | 10 | 200 | 2 |
Elephant (s) | 15 | 200 | 1 |
Knot 1 (s) | 8 | 100 | 8 |
Retinal (s) | 30 | 200 | 4 |
Femur | 25 | 300 | 6 |
Kitten (s) | 10 | 100 | 4 |
Knot 2 (s) | 8 | 300 | 8 |
Bull (s) | 100 | 600 | 1 |
Fandisk (s) | 6 | 300 | 8 |
Lion-head (s) | 12 | 400 | 1 |
Turbine (s) | 60 | 400 | 1 |
Graill 1 | 10 | 200 | 4 |
Graill 11 | 10 | 200 | 4 |
Man (s) | 100 | 600 | 1 |
Face | 10 | 200 | 4 |
Carc 20 LR | 10 | 200 | 4 |
Carc 21 LR | 10 | 200 | 4 |
Bowl 1 | 10 | 200 | 4 |
Bowl 5 | 10 | 200 | 4 |
Fount 1 | 10 | 200 | 4 |
Fount 11 | 10 | 200 | 4 |
Trophime | 10 | 200 | 4 |
Carc 20 | 10 | 200 | 4 |
Carc 21 | 10 | 200 | 4 |
在多个数据集上运行比例空间方法时使用的设置。以“(s)”表示的数据集是合成的。邻居指示估计的邻居球平均应包含的邻居数量,采样指示用于估计邻居半径的采样点数量,迭代指示比例增加迭代的数量。
Data set | Number of points | Surface triangles | Neighborhood (ms) | Scale-space (ms) | Meshing (ms) | Total (ms) |
---|---|---|---|---|---|---|
Mushroom (s) | 2,337 | 7,966 | 7 | 64 | 88 | 159 |
Elephant (s) | 2,775 | 6,746 | 4 | 33 | 91 | 128 |
Knot 1 (s) | 3,200 | 12,800 | 7 | 148 | 134 | 289 |
Retinal (s) | 3,643 | 14,154 | 8 | 224 | 122 | 354 |
Femur | 3,897 | 12,612 | 6 | 592 | 120 | 718 |
Kitten (s) | 5,210 | 20,428 | 7 | 198 | 172 | 377 |
Knot 2 (s) | 5,760 | 22,904 | 5 | 278 | 206 | 489 |
Bull (s) | 6,200 | 11,892 | 20 | 238 | 149 | 407 |
Fandisk (s) | 6,475 | 25,282 | 5 | 330 | 212 | 547 |
Lion-head (s) | 8,356 | 27,128 | 7 | 125 | 249 | 382 |
Turbine (s) | 9,210 | 14,084 | 12 | 293 | 201 | 507 |
Graill 1 | 12,681 | 45,326 | 14 | 1,166 | 381 | 1,561 |
Graill 11 | 14,617 | 54,550 | 18 | 1,072 | 454 | 1,544 |
Man (s) | 17,495 | 38,496 | 25 | 845 | 421 | 1,291 |
Face | 296,275 | 906,648 | 128 | 17,983 | 7,843 | 25,957 |
Carc 20 LR | 1,311,850 | 1,311,850 | 154 | 20,652 | 10,822 | 31,632 |
Carc 21 LR | 1,443,510 | 1,443,510 | 157 | 19,778 | 12,290 | 32,228 |
Bowl 1 | 2,741,328 | 2,841,328 | 351 | 34,688 | 22,559 | 57,608 |
Bowl 5 | 3,682,188 | 3,682,188 | 471 | 50,762 | 29,899 | 81,144 |
Fount 1 | 1,504,761 | 5,946,502 | 764 | 112,028 | 51,451 | 164,262 |
Fount 11 | 2,589,083 | 10,203,108 | 1,350 | 216,623 | 85,231 | 303,248 |
Trophime | 4,572,657 | 16,982,194 | 2,413 | 630,502 | 134,427 | 767,389 |
Carc 20 | 5,370,681 | 21,190,868 | 2,531 | 304,015 | 179,223 | 485,813 |
Carc 21 | 5,800,135 | 23,042,576 | 2,916 | 365,731 | 212,840 | 581,535 |
显示了所构建曲面的三角形数量和运行时间。一半的数据集是合成的,其他数据集是通过基于图像的密集重建构建的。数据集按大小排序,合成集主要组成较小的数据集。
构建的曲面的三角形数以及比例空间方法的运行时间(以毫秒为单位)。以“(s)”表示的数据集是合成的。