2017-01-30 137 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)