Как указать периодическое соединение для функций scipy.ndimage.label? - PullRequest
1 голос
/ 02 мая 2019

Учитывая массив N * N, равный 0 и 1, я хочу построить список кластеров (кластер представляет собой набор связанных точек, помеченных 1).

scipy.ndimage.label очень полезно, потому что оно говорит вам, какие точки связаны.

Но я также хотел бы, чтобы в моем массиве были периодические граничные условия, т. Е. Точки (0,j) и (N,j) идентифицированы (как плоскость, которую я склеиваю, чтобы сделать цилиндр). Поэтому мне нужно сообщить scipy.ndimage.label, что объекты связаны через границу.

Например, если мой исходный массив:

In[187]: a = [[1, 1, 0, 0, 0, 0, 1, 1],[1, 1, 0, 1, 0, 0, 1, 1],[1, 1, 0, 0, 0, 1, 1, 1]] 

labels = measurements.label(a)
print(labels)
Out [187]: (array([[1, 1, 0, 0, 0, 0, 2, 2],
   [1, 1, 0, 3, 0, 0, 2, 2],
   [1, 1, 0, 0, 0, 2, 2, 2]], dtype=int32), 3)

и мне хотелось бы:

(array([[1, 1, 0, 0, 0, 0, 1, 1],
   [1, 1, 0, 3, 0, 0, 1, 1],
   [1, 1, 0, 0, 0, 1, 1, 1]], dtype=int32), 2)

Параметр структуры метки позволяет указать соединение (например, элементы, подключенные, даже если они касаются по диагонали), может ли оно также использоваться для этой цели?

1 Ответ

0 голосов
/ 02 мая 2019

Вот пример для наложения периодического граничного условия на левую и правую границы. Каждая метка справа обозначена соответствующей меткой слева (если она существует).

for y in range(label_image.shape[0]):
    if label_image[y, 0] > 0 and label_image[y, -1] > 0:
        label_image[label_image == label_image[y, -1]] = label_image[y, 0]

Вы можете сделать то же самое для верхней и нижней границ. Вы также можете придумать любое другое граничное условие, перебрать граничные пиксели в цикле for и проверить условие в вашем выражении if аналогичным образом.

...