python - 生成 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)
解决方案
您可能会参加 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)
推荐阅读
- mysql - 选择简单的列和聚合函数返回结果
- html - htaccess 中的自定义链接而不更改?
- typescript - 我想在没有服务器端的 Angular 6 应用程序中获取客户端的 Windows 登录用户名
- python - 数组元素设置为整数而不是浮点数
- c++ - 具有多个数组的结构
- python - 为什么A*算法不会卡在两个节点之间
- python - 将散景加载到嵌入式 python dll 崩溃
- matlab - 当数据很大时,为什么当我在 n 点移动平均滤波器中增加 n 时,信号的峰值数量保持不变?
- artifactory - 无法索引 jar - 意外的记录签名:0X622F2123
- npm - npm run install with --prefix 创建“etc”文件夹