Как правильно отображать громкость с некубическими вокселями в Mayavi - PullRequest
8 голосов
/ 20 мая 2011

Я использую mayavi (3.3.2) для отображения изоповерхностей томов.

Как правило, мои тома не имеют кубических вокселей;например, сетка выборки могла бы быть 1 мм x 1 мм в X и Y, но 1,4 мм в направлении Z.

Как я могу заставить такие объемы отображать в правильных пространственных пропорциях, используя mlab.contour3d или * Mayavi?1008 *?Я бы действительно предпочел не пересчитывать тома в кубическую сетку.

Другой способ сформулировать проблему: что я могу сделать, чтобы приведенный ниже код отображал сферу вместо сплющенного эллипсоида (взяв 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 (его преобразования и т. д.) и вставка соответствующего анизотропного масштабирования (если не существует способа сделать это более напрямую через API mlab).

1 Ответ

7 голосов
/ 24 мая 2011

Для этого проще всего явно создать объект 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

...