2017-01-30 9 views
0

私はいくつかのデータ(ラスタ3D画像)を持つ3D配列を持っています。私はいくつかの適切な補間(好ましくは線形 - これはおそらく "三線形"です)を使用して、その配列を通じて2Dカットを取得したいと思います。しかしながら、カットの平面は、例えば、法線ベクトルおよび距離を使用して、好都合であると説明することができる。3D画像から2Dカットを作成する方法は?

カットが軸の1つに平行である場合、これは簡単です.3D配列をスライスするだけです(numpyインデックススライスを使用)。しかし、切れ目が軸に平行でない場合、私はその問題を開始する良い方法は見当たりません。念頭に置かれるのは、2D配列の回転を使用して3D配列を回転させて、カットが軸に平行になるようにすることですが、それはひどく非効率的です。

私はnumpy、ndimage、skimageでPythonで作業しています。他のPythonモジュールも利用可能であると見なすことができます。

+1

あなたの平面座標を回転させると、[ 'scipy.interpolate.RegularGridInterpolator'](https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.interpolateを使用することができます。 RegularGridInterpolator.html) –

+0

@DanielForsmanありがとう、それは仕事をするように聞こえる。あなたが望むなら、私はそれを受け入れるでしょう。答えを得るためにいくつかのコード例を投稿することができます。 –

+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) 
関連する問題