1

3D ラベル マトリックスがあります。I を使用ndimage.sumすると、ラベル付けされたオブジェクトのサイズを取得できます。これは、ボリュームに基づくフィルタリングに最適です。私の質問は次のとおりです。たとえば、各軸に沿ってオブジェクトのサイズを簡単に取得して、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))

ラベル付けされたオブジェクトのボリュームを表す 1 次元の代わりに、各次元でサーフェスを表す 3D 配列を作成する方法はありますか? 私は最初のオプションを好みますが、各平面の表面を表す 30 次元配列も問題ありません。

4

1 に答える 1

4

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 より大きい各ボックスに対して True であるブール値マスクを作成します。

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

np.flatnonzero対応するインデックスを見つけるために使用します。

idx = np.flatnonzero(mask)

スライスを使用して、値の領域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]])
于 2016-03-24T13:32:15.880 に答える