1

我有点卡住了。

我有一个 3D 点云(一个 (n,3) 顶点数组),我试图从中生成一个 3D 三角形网格。到目前为止,我没有运气。

我的数据格式:

  • (x,y) 值以规则间隔 (z) 间隔。将数据视为在 z 方向逐层存储的闭环平面轮廓。
  • 我的数据中的顶点必须是网格三角形的绝对位置(即我不希望它们被平滑以使体积开始改变形状,但层之间的线性插值很好)。

插图:

Z=2. : ..x-------x...   <- Contour 2
Z=1.5: ...\......|...   <- Join the two contours into a mesh.
Z=1. : .....x----x...   <- Contour 1
Repeat for n slices, end up with an enclosed 3D triangular mesh.

我尝试过的事情:

  • 使用Open3D
    • 滚球(枢轴)方法只能完成 75% 的网格,并且留下大面积不完整的区域(尽管有一系列球尺寸)。它在顶部和底部切片有特别的问题,中间往往有很大的间隙(即平面)。
    • 泊松重建方法过度平滑了音量,我不再有音量的准确表示。这发生在从 3 到 12 的所有深度。
  • CGAL
    • 我不能让它为我的生活工作。SWIG 不是很好,使用 SWIG 实现 CGAL 也不是很好。
    • CGAL 有两个 PyBind 实现,但是它们没有合并 CGAL 的 3D 三角测量库。
  • 探索了其他模块,如 PyMesh、TriMesh、TetGen、Scikit-Geometry、Shapely 等。我可能在某个地方错过了答案。

鉴于我的数据是闭环平面轮廓的列表,似乎必须有一些简单的解决方案来将相邻的切片轮廓“加入”到一个大的 3d 网格中。有点像你在搅拌机里做的。有非 python 解决方案(如 MeshLab)可以很好地解决这些问题,但我需要 python 解决方案。有没有人有任何想法?我对 VTK 和 ITK 进行了一些研究,但到目前为止还没有找到我想要的东西。

我也开始考虑也许我可以在切片之间插入中间轮廓,并用顶点填充顶部和底部的轮廓,以使数据对“枢轴球”方法更加友好。

提前感谢您的任何帮助,不胜感激。如果有一种尚未编码的好方法,我承诺会对其进行编码并提供给处于我这种情况的人:)

4

3 回答 3

1

实际上有两种方法可以在 python 中使用 meshlab 功能:

  1. 首先是MeshLabXML(https://github.com/3DLIRIOUS/MeshLabXML)第三方,是一个Python脚本接口转meshlab脚本接口
  2. 第二个是 PyMeshLab ( https://github.com/cnr-isti-vclab/PyMeshLab ) MeshLab 作者正在进行的一项工作,(目前处于 alpha 阶段)直接将 Python 绑定到所有 meshlab 过滤器
于 2020-09-04T06:49:48.643 回答
1

《医学物理学杂志》上有一篇非常简洁的论文,题为“技术说明:一种将放射治疗轮廓序列数据转换为可打印的 3D 结构的算法和软件”,很好地描述了这个问题。不需要 python 包,但是使用 numpy 更容易实现。不需要任何 3D 包。

提供了一个有用的摘录:...

  1. 确定构成指定结构的切片(2D 轮廓)的数量。
  2. 确定每个切片中的点数。
  3. 每个切片中每个点的笛卡尔坐标被提取并存储在专用数据结构中......
  4. 每个切片(曲线)中的点数以这样的方式重新排列,即起始点(索引为 0 的点)是后续切片之间的最近点。重枚举从点 0 开始,切片 0(具有最低 z 坐标的切片)。
  5. 确定每条曲线的方向(即,由点的相对于曲线内部/外部的增加的索引确定的方向)。如果发现切片之间的差异,则反转不匹配曲线中的点编号(因此,方向)。
  6. 所考虑结构的侧面是离散的。相邻层的点排列成三个,构成 STL 文件的三角形面。对于每个三角形,与来自每一层的后续索引的最近点被连接。
  7. 所考虑结构的上下基面是离散的。程序在曲线上每隔三个点进行迭代,并检查它们是否属于边缘的凸部分。如果是,则将它们连接成一个构面,并将中间点从进一步的迭代中删除。

所以基本上这是一个将每个切片中的数据集与每个切片的最近值对齐的问题。然后对齐每个轮廓的方向。然后根据距离连接两层之间的点。

该论文还提供了执行此操作的代码(对于 DICOM 文件),但是我自己重新编写了它并且它很有魅力。

我希望这对其他人有帮助!确保您在使用此功能的任何工作中归功于作者。

于 2020-10-06T03:43:30.450 回答
0

pymadcad的最新功能可以做这样的事情,不确定它是否符合您在“枢轴球”或此类事情方面的确切期望,请查看混合文档

从轮廓列表开始,它可以生成混合曲面来加入它们:

出于您的目的,我想最好的是以下之一:

  • blendpair(line1, line2)
  • junction(*lines)
于 2020-12-13T11:52:23.390 回答