Python:对体素组件进行网格化以计算表面积

Python: Mesh a voxels assembly to compute the surface area

我有一个在 3D 中表示石头的体素组件。这是一个二值化的 numpy 3D 数组,其中 1 被分配给构成我的石头的体素,而 0 被分配给其他地方。 我想:

  1. 创建其网格表面
  2. 计算它的表面积。

但是怎么办?

根据您的应用,我可以看到一些选项:3D 凸包或行进立方体。

3D凸包

首先,您需要获取所有体素 3D 坐标的数组,其中您的数组等于 1

以后可以用scipy.spatial.ConvexHullScipy 方法基本上是 qhull 库的包装器。使用 qhull 时,其中一个输出选项 (FA) 是计算总面积和体积。

您可以在此处找到更多信息: http://scipy.github.io/devdocs/generated/scipy.spatial.ConvexHull.html http://www.qhull.org/html/qconvex.htm

行进立方体

如果你需要保持凹陷,那么前面的选项是不够的。行进立方体将是一个不错的选择。 scikit-image 中已经有一个 python 实现。

http://scikit-image.org/docs/dev/auto_examples/plot_marching_cubes.html

您将再次需要像之前的情况一样获得所有积分。您使用以下方法计算 verbs/faces:

http://scikit-image.org/docs/dev/api/skimage.measure.html#marching-cubes

你可以用以下公式计算面积:

http://scikit-image.org/docs/dev/api/skimage.measure.html#mesh-surface-area

如果有用的话,我解决了我的问题。 Marching Cubes 算法很好,但在二值化数组上效果不佳。所以: 1) 应用于 3D 阵列的高斯滤波器 (scipy.filters) 2) Marching Cubes 算法对其进行网格划分(scikit-image 工具) 3) 总结三角形的面积(scikit-image 工具)