如何通过3D图像生成2D切割?

时间:2017-01-30 03:42:24

标签: numpy 3d image-rotation scikit-image ndimage

我有一个包含一些数据的3D数组(光栅3D图像)。我希望通过该阵列进行2D切割,使用一些合适的插值(最好是线性的 - 在这种情况下可能是“三线性”)。然而,可以描述切割平面是方便的,例如使用法向矢量和距离。

如果切割平行于其中一个轴,则这很简单,只需切片3D数组(使用numpy索引切片)。但是如果切割与轴不平行,我看不到开始解决这个问题的好方法。唯一想到的是旋转3D阵列(可能使用2D旋转的组合),使切割平行于轴,但这看起来非常低效。

我正在使用numpy,ndimage和skimage在python中工作。可以假定任何其他python模块都可用。

1 个答案:

答案 0 :(得分:1)

没有真正测试过这个,但确实产生了各种各样的图像。基于@Daniel Forsman的建议。

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)