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

标签 python scipy volume mayavi

我正在使用 mayavi (3.3.2) 显示体积等值面。

通常,我的体积没有立方体素;例如,采样网格在 X 和 Y 方向可能为 1mm x 1mm,但在 Z 方向可能为 1.4mm。

如何使用 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 进行操作) .

最佳答案

为此,最简单的方法是根据输入数据显式创建一个 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

关于python - 如何在 mayavi 中正确显示具有非立方体素的体积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6076827/

相关文章:

python - 如何在pygame 64位退出窗口?

python - Python 中的匈牙利算法

python - 如何计算矩阵的以 2 为底的对数?

python - Scipy.sparse.csr_matrix : How to get top ten values and indices?

objective-c - 获取iOS当前铃声音量值?

python - 无法通过python Spark连接MysqlDB

python - Word2Vec + Regression - 数值评分方法

python - 迭代稀疏矩阵并连接每行的数据和索引

linux - 模拟挂载卷错误导致只读

java - 在 MIDI 音序器中控制音量的方法是什么?