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]])
'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
ああ私は混乱して、それを実現し、あなたのことを見る前に私のコメントを削除しました。ありがとう。 – nicoco