首页 > 解决方案 > 生成 3D 对象(例如通过 Mayavi)并将其导出为 3D 图像堆栈(例如 tiff)

问题描述

我目前的任务是生成一个 3D 图像空间,其中有我设计的 3D 对象(等值面)并将其导出为图像堆栈(numpy 或 tiff)。

我开始使用 Mayavi 生成 3D 等值面。我知道 Mayavi 最初旨在提供 3D 可视化,但我想找到一种方法,可以将 3D 对象导出到 3D 图像堆栈,如 (z,y,x) 的 numpy 形式。我最初的想法是从 Mayavi mlab 对象沿 z 轴迭代地拍摄切片体积的快照,但我不确定是否有任何选项可以将等值面的切片图像保存为快照。

最好的情况是完全从我从 Mayavi 窗口中看到的内容导出 3D 图像堆栈 (tiff)。否则,我会接受任何建议来执行这项任务。

这是一个示例代码。

import numpy as np
from mayavi import mlab

# Produce some nice data.
n_mer, n_long = 6, 11
pi = np.pi
dphi = pi/1000.0
phi = np.arange(0.0, 2*pi + 0.5*dphi, dphi, 'd')
mu = phi*n_mer
x = np.cos(mu)*(1+np.cos(n_long*mu/n_mer)*0.5)
y = np.sin(mu)*(1+np.cos(n_long*mu/n_mer)*0.5)
z = np.sin(n_long*mu/n_mer)*0.5

# Init plot
source = mlab.points3d(x, y, z)

Mayavi 生成的用于可视化的 3D 对象示例

标签: pythonnumpy3dvtkmayavi

解决方案


您可能会参加 vtk 课程vtkImplicitModeller。例如:

import numpy as np
from vedo import Points, Volume

n_mer, n_long = 6, 11
dphi = np.pi/1000.0
phi = np.arange(0.0, 2*np.pi + 0.5*dphi, dphi, 'd')
mu = phi*n_mer
x = np.cos(mu)*(1+np.cos(n_long*mu/n_mer)*0.5)
y = np.sin(mu)*(1+np.cos(n_long*mu/n_mer)*0.5)
z = np.sin(n_long*mu/n_mer)*0.5

source = Points([x, y, z], r=4)
modl = source.implicitModeller(
         distance=0.15,
         res=(60,60,30),
         bounds=(-1.8,1.8,-1.8,1.8,-0.7,0.7),
)
modl.smoothLaplacian().computeNormals()
modl.c("blue9").lw(1).lighting("metallic").show(axes=1)

#######################################################
import vtk
imp = vtk.vtkImplicitModeller()
imp.SetInputData(source.polydata())
imp.SetSampleDimensions(50,50,30)
imp.SetModelBounds(-1.8,1.8,-1.8,1.8,-0.7,0.7)
imp.Update()

vol = Volume(imp.GetOutput())
arr = np.clip(vol.getDataArray(), 0, 1.2)
print(arr.shape)

在此处输入图像描述


推荐阅读