Нулевые значения кластера в двумерном массиве NumPy - PullRequest
1 голос
/ 13 мая 2019

Я хочу кластеризовать ненулевые местоположения в массиве NumPy 2D для обнаружения MSER.Затем я хочу найти количество точек в каждом кластере и удалить те кластеры, у которых нет числа точек между некоторыми x и y (10 и 300).

Я попытался кластеризовать их путем поиска в соседних точкахно метод не работает для ненулевых кластеров вогнутой формы.

[[0, 1, 0, 0, 1],
 [0, 1, 1, 1, 1],
 [0, 0, 0, 0, 0],
 [1, 1, 0, 1, 1],
 [1, 0, 0, 1, 1]]

должен выводить, для x = 4 и y = 5 (оба включены)

[[0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 1, 1],
 [0, 0, 0, 1, 1]]

1 Ответ

2 голосов
/ 14 мая 2019

Я не уверен, что правильно понял ваш вопрос, но я думаю, что scikit-image label и regionprops могли бы выполнить работу.

In [6]: import numpy as np

In [7]: from skimage import measure, regionprops

In [8]: img = np.array([[0, 7, 0, 0, 7],
   ...:                 [0, 9, 1, 1, 4], 
   ...:                 [0, 0, 0, 0, 0], 
   ...:                 [2, 1, 0, 2, 1],
   ...:                 [1, 0, 0, 6, 4]])
   ...: 

In [9]: arr = measure.label(img > 0)

In [10]: arr
Out[10]: 
array([[0, 1, 0, 0, 1],
       [0, 1, 1, 1, 1],
       [0, 0, 0, 0, 0],
       [2, 2, 0, 3, 3],
       [2, 0, 0, 3, 3]])

In [11]: print('Label\t# pixels')
    ...: for region in measure.regionprops(arr):
    ...:     print(f"{region['label']}\t{region['area']}")
    ...:
Label   # pixels
1       6
2       3
3       4
...