Предположим, у меня есть это:
import numpy as np
x = np.zeros((10,16), dtype=np.int)
x[6:8,3:11] = 1
x[4:6,5:7] = 1
x[2:4,4:8] = 1
x[4:6,9:11] = 1
x[7,2] = 1
x[6,11] = 1
x[8,3] = 1
print(x)
Выход:
[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 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 0]
[0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0]
[0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0]
[0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0]
[0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0]
[0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0]
[0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
И я хочу отфильтровать его так, чтобы элементы в окрестности 4 (так, вверх, влево, вправо, вниз), которые имели менее 2 соседей, были удалены. Итак, я бы в итоге (последние три позиции установлены как одна удалена):
[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 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 0]
[0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0]
[0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0]
[0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0]
[0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0]
[0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
Я пытался использовать scipy.ndimage.morphology.binary_closing
, scipy.ndimage.morphology.binary_opening
, scipy.ndimage.morphology.binary_dilation
и scipy.ndimage.morphology.binary_erosion
, но результат не тот, который мне нужен. Я мог бы сделать 2 для циклов и перебирать каждый элемент массива, проверяя соседние элементы, но я чувствую, что есть лучший способ сделать это. Я ошибаюсь?
Меня больше интересует эта конкретная ситуация (4 окрестности, оставьте 2 соседей), но легко ли обобщить на другую окрестность или число соседей (предполагая двоичный массив)?