2017-01-30 16 views
0

У меня есть 3D-массив с некоторыми данными (растровое трехмерное изображение). Я хотел бы получить 2D разрез через этот массив, используя некоторую подходящую интерполяцию (предпочтительно линейную - это, вероятно, «трилинейная» в этом случае). Плоскость разреза может быть описана, однако, удобно, например, с использованием нормального вектора и расстояния.Как создать 2D-прорезь через трехмерное изображение?

Если разрез параллелен одной из осей, это тривиально, просто нарежьте 3D-массив (с помощью numpy index slice). Но если разрез не параллелен оси, я не вижу хорошего способа начать работу с этой проблемой. Единственное, что приходит в голову, это повернуть 3D-массив (возможно, используя композицию двумерных поворотов), чтобы разрез был параллелен оси, но это кажется ужасно неэффективным.

Я работаю в python с numpy, ndimage и skimage. Любые другие модули python можно считать доступными.

+1

Вы можете вращать плоские координаты и использовать [ 'scipy.interpolate.RegularGridInterpolator'] (https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.interpolate. RegularGridInterpolator.html) –

+0

@ DanielForsman Большое спасибо, похоже, что это сработает. Вы можете отправить какой-то пример кода в качестве ответа, если хотите, я соглашусь с ним. –

+0

Не знаю достаточно, чтобы получить полный ответ, это было скорее просто google-fu. –

ответ

1

На самом деле это не испытало это, но оно действительно порождает образ. Основано на предложении Даниэля Форсмана.

import numpy as np 
from scipy.interpolate import RegularGridInterpolator 

# stack coordinates 
z0,z1,z2 = 20, 20, 20 
zz0,zz1,zz2 = np.linspace(0, 1, z0), np.linspace(0, 1, z1), np.linspace(0, 1, z2) 

# fake stack data 
d0,d1,d2 = np.ix_(0.5-np.abs(zz0-0.5), 0.5-np.abs(zz1-0.5), 0.5-np.abs(zz2-0.5)) 
data = np.minimum(np.minimum(d0, d1), d2) 

# define picture (same coords as stack) 
tl = np.array((0.1, -0.02, 0.3)) # top left corner 
yo = np.array((-0.01, 0.1, 0.01)) 
yo /= np.sqrt((yo*yo).sum()) # y-axis unit 
xo = np.array((0.1, 0, 0.1)) 
xo -= (xo*yo).sum() * yo # should be perpendicular now 
xo /= np.sqrt((xo*xo).sum()) # x-axis unit 

# build picture grid 
nx,ny = 20j, 20j 
ya, xa = np.ogrid[:1:ny, :1:nx] 
grid = tl + ya[..., None] * yo + xa[..., None] * xo 

picture = RegularGridInterpolator((zz0,zz1,zz2), data, bounds_error=False)(grid)