行军方块

行进立方体是一种从3D体积提取2D曲面网格的算法。这可以概念化为地形图或天气图上的等值线的3D概化。它的工作原理是在体积上迭代,寻找跨越感兴趣级别的区域。如果找到这样的区域,则会生成三角剖分并将其添加到输出网格。最终结果是一组顶点和一组三角面。

该算法需要一个数据体和一个等值面。例如,在CT成像中,+700到+3000的Hounsfield单位表示骨骼。因此,一个潜在的输入将是重建的CT数据集和值+700,以提取骨骼或类似骨骼密度区域的网格。

此实现还可以在各向异性数据集上正常工作,在各向异性数据集中,每个空间维度的体素间距不相等,方法是使用 spacing 科瓦格。

plot marching cubes
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

from skimage import measure
from skimage.draw import ellipsoid


# Generate a level set about zero of two identical ellipsoids in 3D
ellip_base = ellipsoid(6, 10, 16, levelset=True)
ellip_double = np.concatenate((ellip_base[:-1, ...],
                               ellip_base[2:, ...]), axis=0)

# Use marching cubes to obtain the surface mesh of these ellipsoids
verts, faces, normals, values = measure.marching_cubes(ellip_double, 0)

# Display resulting triangular mesh using Matplotlib. This can also be done
# with mayavi (see skimage.measure.marching_cubes_lewiner docstring).
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')

# Fancy indexing: `verts[faces]` to generate a collection of triangles
mesh = Poly3DCollection(verts[faces])
mesh.set_edgecolor('k')
ax.add_collection3d(mesh)

ax.set_xlabel("x-axis: a = 6 per ellipsoid")
ax.set_ylabel("y-axis: b = 10")
ax.set_zlabel("z-axis: c = 16")

ax.set_xlim(0, 24)  # a = 6 (times two for 2nd ellipsoid)
ax.set_ylim(0, 20)  # b = 10
ax.set_zlim(0, 32)  # c = 16

plt.tight_layout()
plt.show()

脚本的总运行时间: (0分0.435秒)

Gallery generated by Sphinx-Gallery