生成3D对象(例如通过Mayavi)并将其导出为3D图像堆栈(例如tiff)

2024-09-24 20:31:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

最好的情况是完全从我在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)

Example of a 3D object generated by Mayavi for visualization


Tags: 对象图像numpy堆栈nppiisocos
1条回答
网友
1楼 · 发布于 2024-09-24 20:31:45

您可以选择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)

enter image description here

相关问题 更多 >