2017-01-30 90 views
0

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

如果切口平行于所述轴中的一个,这是微不足道的,只是切片3D阵列(具有numpy的索引片)。但是如果切割不平行于一个轴,我没有看到开始处理这个问题的好方法。唯一想到的是旋转3D阵列(可能使用2D旋转的组合),以便切割平行于轴,但这似乎非常低效。

我与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

没有真正测试这一点,但它确实产生各种各样的图像。根据@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)