张春成
V2
2023/04/03阅读:19主题:默认主题
Vedo 的体积点云计算
Vedo 的体积点云计算
Vedo 是很好用的 3D 点云操作工具,本文使用该工具进行体积点云的初步计算。
Vedo 与致密点云
Vedo 是很好用的 3D 点云操作工具,本文使用该工具进行体积点云的初步计算。
https://github.com/marcomusy/vedo
致密点云与日常看到的表面点云具有较大的区别,最直观的区别就是表面点云是在物体的表面进行采样,而体积点云却是在物体的体积上进行采样,在医学影像数据中,CT、MRI等都是利用类似断层扫描的方法对身体部位进行无创的立体建模,它的每个点代表三维空间坐标下的生理指标。当这些生理指标往往与病灶或器官外缘有关,因此对致密点云进行分析和建模,让它能够准确地反映病灶或器官的形态是医学影像的重要课题。
Vedo 是一种可用的工具,它可以从体积点云中找到连续等值曲面。由于它是一款开源软件,因此它的文档虽然完备,但功能基本靠猜,为了避免以后猜不透,现将它的计算逻辑简要记录如下

-
首先,它从点云中计算曲面的方法比较直观,调用 isosurface 方法即可; -
其次,在调用该方法时,可以通过指定分割值的方法来寻找不同的等值面; -
最后,每个顶点的值均保存在 mesh.pointdata[’input_scalars’]之中。
# ------------------------------------------------
# Compute the hull mesh
vol = Volume(array_3d)
mesh = vol.isosurface(np.linspace(np.min(array_3d), np.max(array_3d), 5))
mesh.apply_transform(affine, reset=True)
'''
Explain of isosurface
(method) def isosurface(
value: Any | None = None,
flying_edges: bool = True
) -> Any
'''
# The pointdata contains the keys of ['Normals', 'input_scalars']
print([e for e in mesh.pointdata.keys()])
# The input_scalars
# (array([ 29.5, 29.5, 29.5, ..., 118. , 118. , 118. ]),
# (538288,),
# array([ 29.5, 59. , 88.5, 118. ]))
d = mesh.pointdata['input_scalars']
display(d, d.shape, np.unique(d))
# The vertices and cells
# ((538288, 3), (1076000, 3))
vertices = np.array(mesh.vertices())
cells = np.array(mesh.cells())
display(vertices.shape, cells.shape)
大脑 MRI 的分层表面
用以上方法从大脑 MRI 数据中对等值面进行建模,得到的结果如下:





作者介绍
张春成
V2