MATLAB's label2idx
выводит уплощенные индексы (упорядоченные по главному столбцу) с учетом помеченного изображения.
Мы можем использовать scikit-image's
встроенный regionprops
, чтобы получить эти индексы из помеченного изображения. Scikit-image
также предоставляет нам встроенный модуль для получения помеченного изображения, так что все работает с тем же пакетом. Реализация будет выглядеть примерно так -
from skimage.measure import label,regionprops
def label2idx(L):
# Get region-properties for all labels
props = regionprops(L)
# Get XY coordinates/indices for each label
indices = [p.coords for p in props]
# Get flattened-indices for each label, similar to MATLAB version
# Note that this is row-major ordered.
flattened_indices = [np.ravel_multi_index(idx.T,L.shape) for idx in indices]
return indices, flattened_indices
Пробный прогон -
# Input array
In [62]: a
Out[62]:
array([[1, 1, 1, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 1, 1, 0, 0],
[1, 1, 1, 0, 1, 1, 0, 0],
[1, 1, 1, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0, 1, 0],
[1, 1, 1, 0, 0, 0, 1, 0],
[1, 1, 1, 0, 0, 1, 1, 0],
[1, 1, 1, 0, 0, 0, 0, 0]])
# Get labeled image
In [63]: L = label(a)
In [64]: idx,flat_idx = label2idx(L)
In [65]: flat_idx
Out[65]:
[array([ 0, 1, 2, 8, 9, 10, 16, 17, 18, 24, 25, 26, 32, 33, 34, 40, 41,
42, 48, 49, 50, 56, 57, 58]),
array([12, 13, 20, 21]),
array([38, 46, 53, 54])]
Если вам нужны индексы в главном порядке столбцов, как в MATLAB, просто транспонируйте изображение, а затем введите -
In [5]: idx,flat_idx = label2idx(L.T)
In [6]: flat_idx
Out[6]:
[array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23]),
array([33, 34, 41, 42]),
array([46, 52, 53, 54])]
Обратите внимание, что индексирование по-прежнему начинается с 0
, в отличие от MATLAB, где оно 1
.
Альтернатива получению помеченного изображения с помощью SciPy
В SciPy также есть встроенное изображение для маркировки: scipy.ndimage.label
-
from scipy.ndimage import label
L = label(a)[0]