Как правильно отобразить объем с некубическими вокселями в Mayavi

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

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

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

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


person timday    schedule 20.05.2011    source источник


Ответы (1)


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

Сферическая оболочка с некубическими вокселями

person Joe Kington    schedule 24.05.2011
comment
Спасибо, это именно то, что я искал. Мне действительно нужно приложить некоторые усилия, чтобы изучить API mlab. - person timday; 24.05.2011
comment
@timday — это хорошее место, чтобы начать изучать конвейерную сторону вещей: code.enthought.com/projects/mayavi/docs/development/html/mayavi/ Кроме того, если вы знакомы с VTK и есть фильтр, который не обернут непосредственно mlab, вы можете вызвать его с помощью mlab.pipeline.user_defined, что может быть очень удобно, если вы можете найти то, что вам нужно, в VTK, но не напрямую в mayavi/mlab. - person Joe Kington; 24.05.2011
comment
Кроме того, взгляните на различные структуры данных VTK: code.enthought.com/projects/mayavi/docs/development/html/mayavi/ - person Joe Kington; 24.05.2011
comment
Я предполагаю, что data должен == volume? - person foobarbecue; 23.07.2015
comment
@foobarbecue - Да, конечно! Спасибо за улов! - person Joe Kington; 23.07.2015