Я пытаюсь извлечь группы rect angular ненулевых значений из массива numpy. Массив может выглядеть так (но намного больше):
a = np.array([
[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,1,1,1,1,0],
[0,0,0,0,6,1,1,1,3,1,0],
[0,0,0,0,0,1,1,1,1,1,0],
[0,0,0,0,2,2,2,0,1,0,0],
[0,0,0,0,2,2,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0],
[1,1,1,1,0,0,0,0,0,0,0],
[1,1,1,1,0,0,0,0,7,2,0],
[1,1,1,1,0,0,0,0,0,0,0]])
, и я хочу извлечь группы / блоки ненулевых значений больше заданного размера (например, больше 3x3), то есть координаты минимальный и максимальный углы этих блоков. В этом примере я должен получить следующее:
res = [[(7,0), (10,4)],
[(1,5), (4,10)]]
, чтобы
In [12]: xmin, ymin = res[0][0]
In [13]: xmax, ymax = res[0][1]
In [14]: a[xmin:xmax, ymin:ymax]
Out[14]:
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
In [15]: xmin, ymin = res[1][0]
In [16]: xmax, ymax = res[1][1]
In [17]: a[xmin:xmax, ymin:ymax]
Out[17]:
array([[1, 1, 1, 1, 1],
[1, 1, 1, 3, 1],
[1, 1, 1, 1, 1]])
Я пробовал смотреть на каждое ненулевое значение массива и увеличивать форму требуемый размер с этого момента, пока он не будет содержать ноль. Это работает, но довольно медленно. Для этого примера массива это занимает около 1,17 мс, а в реальных приложениях (например, массивы 600x1000) это занимает около 18 секунд, что слишком медленно. Есть ли функция или трюк numpy или OpenCV, чтобы сделать это быстрее?