Удаление элементов из двоичного массива python, чья окрестность меньше N - PullRequest
0 голосов
/ 28 июня 2018

Предположим, у меня есть это:

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 соседей), но легко ли обобщить на другую окрестность или число соседей (предполагая двоичный массив)?

1 Ответ

0 голосов
/ 28 июня 2018

Мне удалось сделать это так:

from scipy.signal import convolve2d
kernel = [[0,1,0],[1,1,1],[0,1,0]]
filtered = convolve2d(x, kernel, mode='same')
x[filtered<=2] = 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 1 3 4 4 3 1 0 0 0 0 0 0 0]
 [0 0 0 1 3 5 5 3 1 1 1 0 0 0 0 0]
 [0 0 0 0 2 4 4 2 1 3 3 1 0 0 0 0]
 [0 0 0 1 2 4 4 2 2 4 4 2 0 0 0 0]
 [0 0 2 3 4 5 5 4 4 5 5 2 1 0 0 0]
 [0 1 2 5 4 4 4 4 4 4 3 2 0 0 0 0]
 [0 0 2 2 2 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]]

И я получил желаемый результат. Спасибо @ user3080953

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...