如何在mayavi中正确显示具有非立方体体素的体积

8
我正在使用mayavi (3.3.2)来显示体积等值面。
通常,我的体积不具有立方体元素;例如,采样网格在X和Y方向上可能是1毫米x 1毫米,但在Z方向上为1.4毫米。
如何使用mayavi的mlab.contour3dmlab.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完成它的话)。
1个回答

7

为此,最简单的方法是从输入数据中明确创建一个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()

Spherical shell with non-cubic voxels


谢谢,这正是我正在寻找的。我真的需要花费一些精力来学习如何操作mlab API。 - timday
1
@timday - 这是学习“管道”方面的好起点:http://code.enthought.com/projects/mayavi/docs/development/html/mayavi/mlab_pipeline.html#controlling-the-pipeline-with-mlab-scripts。此外,如果您熟悉VTK,并且有一个不被`mlab`直接包装的过滤器,您可以使用`mlab.pipeline.user_defined`调用它,如果您在VTK中找到所需内容但在mayavi / mlab中找不到,则这可能非常方便。 - Joe Kington
1
此外,也要看一下不同的 VTK 数据结构:http://code.enthought.com/projects/mayavi/docs/development/html/mayavi/data.html#data-structures-used-by-mayavi - Joe Kington
我猜测 data 应该等于 volume - foobarbecue
@foobarbecue - 是的,完全正确!感谢你指出来! - Joe Kington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接