Python:网格化体素组件来计算表面积

时间:2016-04-08 11:45:20

标签: python algorithm numpy mesh voxel

我有一个体素组件,代表3D中的石头。它是一个二进制化的numpy 3D数组,其中1分配给构成我的石头的体素,0分配给其他地方。 我想:

  1. 创建其网状表面
  2. 计算其上的表面积。
  3. 但是怎么样?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

3D凸包

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

稍后,您可以使用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

您将再次需要像上一个案例中那样获得所有积分。你用:

计算动词/面孔

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