2011-05-20 44 views
8

我正在使用mayavi(3.3.2)顯示體積等值面。如何在mayavi中正確顯示包含非立方體素的體積

通常,我的體積沒有立方體素;例如,採樣網格在X和Y方向上可能爲1mm x 1mm,但在Z方向上爲1.4mm。

如何使用mayavi的mlab.contour3dmlab.pipeline.iso_surface以正確的空間比例顯示這樣的體積?我真的不想將這些卷重新採樣到立方格。

陳述問題的另一種方式:我可以做些什麼來獲得下面的代碼來顯示一個球體而不是展平的elipsoid(將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)。

回答

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

+0

感謝,這正是我一直在尋找。我真的需要付出一些努力來學習mlab API的方式。 – timday 2011-05-24 16:42:08

+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中找到。 – 2011-05-24 16:53:39

+1

另外,看看不同的VTK數據結構:http://code.enthought.com/projects/mayavi/docs/development/html/mayavi/data.html#data-structures-used-by-mayavi – 2011-05-24 16:54:38

相關問題