Python:对体素组件进行网格化以计算表面积
Python: Mesh a voxels assembly to compute the surface area
我有一个在 3D 中表示石头的体素组件。这是一个二值化的 numpy 3D 数组,其中 1 被分配给构成我的石头的体素,而 0 被分配给其他地方。
我想:
- 创建其网格表面
- 计算它的表面积。
但是怎么办?
根据您的应用,我可以看到一些选项:3D 凸包或行进立方体。
3D凸包
首先,您需要获取所有体素 3D 坐标的数组,其中您的数组等于 1
以后可以用scipy.spatial.ConvexHull
。 Scipy
方法基本上是 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 工具)
我有一个在 3D 中表示石头的体素组件。这是一个二值化的 numpy 3D 数组,其中 1 被分配给构成我的石头的体素,而 0 被分配给其他地方。 我想:
- 创建其网格表面
- 计算它的表面积。
但是怎么办?
根据您的应用,我可以看到一些选项:3D 凸包或行进立方体。
3D凸包
首先,您需要获取所有体素 3D 坐标的数组,其中您的数组等于 1
以后可以用scipy.spatial.ConvexHull
。 Scipy
方法基本上是 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 工具)