размывая несколько слоев массива - PullRequest
3 голосов
/ 25 сентября 2019

У меня проблемы с пониманием функции scipy binary_erosion.

from scipy.ndimage import binary_erosion
a = np.zeros([12,12])
a[1:11,1:11]=1
binary_erosion(a).astype(int)

, это удаляет самые внешние края, но что, если я хочу удалить и второй слой?Я знаю, что, вероятно, мне следует использовать опцию structure, но я не понимаю, как она работает, и не смог найти достаточно примеров, которые бы правильно ее объяснили

1 Ответ

1 голос
/ 25 сентября 2019

Используйте параметр iterations, чтобы он повторялся n раза (удаляйте дополнительные слои): [ источник ]

итерации: int , необязательно
Эрозия повторяется несколько раз (одна по умолчанию).Если итераций меньше 1, размывание повторяется до тех пор, пока результат больше не изменится.

Итак, ваш:

array([[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, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 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]])

И с параметром итераций, установленным на 2, выВы заметите, что дополнительный слой был уменьшен.

>>> binary_erosion(a, iterations=2).astype(int)
array([[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, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 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, 0, 0]])

Поскольку вы спросили в комментарии, structure можно использовать для определения того, сколько нужно удалить для каждого iteration.Здесь есть хорошая разбивка здесь того, что это значит.

Это the structuring element used for erosion.Это означает, что если бы это был квадрат 3х3, когда он перемещался по краю, полностью покрытые пиксели будут удалены, а оставшиеся только частично покрыты останутся.

Также взгляните на этот средний пост , который нарисовал множество примеров того, как это работает, и разбил его еще дальше.

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