生成 3D 对象(例如通过 Mayavi)并将其导出为 3D 图像堆栈(例如 tiff)
Generating a 3D object (e.g. via Mayavi) and exporting it as 3D image stack (e.g. tiff)
我当前的任务是生成一个 3D 图像 space,其中有我设计的 3D 对象(等值面)并将其导出为图像堆栈(numpy 或 tiff)。
我开始使用 Mayavi 生成 3D 等值面。我知道 Mayavi 最初是为自己提供 3D 可视化而设计的,但我想找到一种方法可以将 3D 对象导出到 3D 图像堆栈,就像 (z,y,x) 的 numpy 形式一样。我最初的想法是从 Mayavi mlab 对象沿 z 轴迭代地拍摄切片体积的快照,但我不确定是否有任何选项可以将等值面的切片图像保存为快照。
最好的情况是根据我从 Mayavi 看到的内容导出 3D 图像堆栈 (tiff) window。否则,我将采取任何建议来执行此任务。
这是一个示例代码。
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 class 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)
我当前的任务是生成一个 3D 图像 space,其中有我设计的 3D 对象(等值面)并将其导出为图像堆栈(numpy 或 tiff)。
我开始使用 Mayavi 生成 3D 等值面。我知道 Mayavi 最初是为自己提供 3D 可视化而设计的,但我想找到一种方法可以将 3D 对象导出到 3D 图像堆栈,就像 (z,y,x) 的 numpy 形式一样。我最初的想法是从 Mayavi mlab 对象沿 z 轴迭代地拍摄切片体积的快照,但我不确定是否有任何选项可以将等值面的切片图像保存为快照。
最好的情况是根据我从 Mayavi 看到的内容导出 3D 图像堆栈 (tiff) window。否则,我将采取任何建议来执行此任务。
这是一个示例代码。
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 class 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)