2016-03-24 7 views
0

私は3Dラベルマトリックスを持っています。 を使用するndimage.sumラベル付きオブジェクトサイズを取得できます。これは、ボリュームに基づいてフィルタリングするのに最適です。 私の質問は次のとおりです。各軸に沿ってオブジェクトのサイズを簡単に取得して、1つのプレーンにしかないものを排除することはできますか?次元に沿ったオブジェクトのサイズ?

少しコードが明確であるかもしれない...今の代わりに標識されたオブジェクトのボリュームを表す1次元の

from scipy import ndimage 
labmat,n = ndimage.label(np.random.rand(30,30,30) > 0.99) 
sizes = ndimage.sum(labmat.astype(bool),labmat,range(n+1)) 

、各次元でそれらの表面を表す3次元アレイを有している方法はありますか?各平面のサーフェスを表す30-D配列もOKですが、最初のオプションを優先します。

答えて

1

ndimage.find_objectsを使用して、各ラベルの境界ボックスを見つけることができます。境界ボックスはスライスのタプルで与えられます。例えば、

data_slices = ndimage.find_objects(labmat) 
# [(slice(0L, 1L, None), slice(4L, 5L, None), slice(28L, 29L, None)), 
# (slice(0L, 1L, None), slice(25L, 26L, None), slice(19L, 20L, None)), 
# (slice(0L, 1L, None), slice(27L, 28L, None), slice(10L, 11L, None)), 
# (slice(0L, 1L, None), slice(28L, 29L, None), slice(7L, 8L, None)), 
# ... 

その後、

sizes = np.array([[s.stop-s.start for s in object_slice] 
        for object_slice in data_slices]) 
# array([[1, 1, 1], 
#  [1, 1, 1], 
#  [1, 1, 1], 
#  [1, 1, 1], 
# ... 

を使用して、各バウンディングボックスのサイズを見つけて、その長さは、すべての3次元での1以上である各ボックスのために真であるブールマスクを作成することができます。

:対応するインデックスを見つけるため

mask = (sizes > 1).all(axis=1) 

使用

スライスを使用して、labmat(または元の配列)から値の範囲を選択することもできます。例えば、

for i in idx: 
    print(labmat[data_slices[i]]) 

import numpy as np 
from scipy import ndimage 
np.random.seed(2016) 

labmat, n = ndimage.label(np.random.rand(30,30,30) > 0.5) 
data_slices = ndimage.find_objects(labmat) 
sizes = np.array([[s.stop-s.start for s in object_slice] 
        for object_slice in data_slices]) 
mask = (sizes > 1).all(axis=1) 
idx = np.flatnonzero(mask) 
for i in idx: 
    print(labmat[data_slices[i]]) 
+0

'find_objects' http://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy([値0とラベルを無視]。 ndimage.measurements.find_objects.html#scipy.ndimage.measurements.find_objects)。最初のサイズの行はラベル値1に対応しています。他のランダム入力をテストするには 'np.random.seed(2016)'を削除/変更してください。 'mask =(sizes> 1).all(axis = 1)'は、すべての次元で複数の平面に現れるボックスを選択します。最初の次元に沿って1つ以上の平面に現れるボックスを選択するには、 'mask =(sizes [:, 0]> 1)'を使います。 – unutbu

+0

ああ私は混乱して、それを実現し、あなたのことを見る前に私のコメントを削除しました。ありがとう。 – nicoco