我正在使用 mayavi (3.3.2) 显示体积等值面。
通常,我的体积没有立方体素;例如,采样网格在 X 和 Y 方向可能为 1mm x 1mm,但在 Z 方向可能为 1.4mm。
如何使用 mayavi 的 mlab.contour3d
或 mlab.pipeline.iso_surface
让这些体积以正确的空间比例显示?我真的不想将体积重新采样到立方网格。
另一种陈述问题的方式:我该怎么做才能让下面的代码显示一个球体而不是扁平的椭球体(采用 volume
预期的 1:1:2 宽高比体素作为给定的,并且没有重新生成或重新采样体积)。
import numpy as np
from enthought.mayavi import mlab
def sqr(x): return x*x
s=64
x,y,z = np.ogrid[0:s,0:s,0:s/2]
volume = np.sqrt(sqr(x-s/2)+sqr(y-s/2)+sqr(2*z-s/2))
isos = mlab.contour3d(volume,contours=[5,15,25],transparent=True)
mlab.show()
我猜应该有某种方法可以获取底层 VTK 图形管道(其转换等)并插入适当的各向异性缩放(如果没有某种方法可以更直接地通过 mlab API 进行操作) .
最佳答案
为此,最简单的方法是根据输入数据显式创建一个 scalar_field
对象。
我实际上经常这样做,因为我们喜欢在地质学中深入研究(正向下)。这意味着您需要在 z 方向上有一个负增量。如果它只是各种 mlab 函数的参数,那就太好了,但它仍然不太难做到。
from mayavi import mlab
import numpy as np
s=64
x,y,z = np.ogrid[0:s,0:s,0:s/2]
data = np.sqrt((x-s/2)**2 + (y-s/2)**2 + (2*z-s/2)**2)
grid = mlab.pipeline.scalar_field(data)
grid.spacing = [1.0, 1.0, 2.0]
contours = mlab.pipeline.contour_surface(grid,
contours=[5,15,25], transparent=True)
mlab.show()
关于python - 如何在 mayavi 中正确显示具有非立方体素的体积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6076827/