#python #scipy #scikit-image
#python #scipy #scikit-изображение
Вопрос:
Я использовал clear_border из scikit-image и label из scipy для определения областей смежных пикселей в 2d-массиве из единиц и 0. Я использую clear_border
first, который удаляет все группы по 1, которые касаются края, а затем помечает оставшиеся группы label
.
Мой вопрос в том, label
structure
можно ли передать пользовательский параметр. Это определяет, что определено для подключения, и в моем случае это в основном позволяет мне решить, подключены ли диагонали. Чтобы быть конкретным, в массиве
[[0,0,0,0,0]
[0,1,0,0,0]
[0,0,1,1,0]
[0,0,0,0,0]
[0,0,0,0,0]
label
нашел бы 2 независимых объекта, если [[0,1,0],[1,1,1],[0,1,0]]
используется для structure
, но используется только один, если [[1,1,1],[1,1,1],[1,1,1]]
используется. Проблема в том, clear_border
что такой опции нет, и она работает так же, как label
и при [[1,1,1],[1,1,1],[1,1,1]]
использовании (другими словами, clear_border
всегда определяет диагональные пиксели, которые должны быть подключены).
Итак, моя проблема заключается только в том, что мне нужно использовать точно такую же функцию clear_border
, но такую, которая не определяет диагональные пиксели для подключения. Аналог передачи structure=[[0,1,0],[1,1,1],[0,1,0]]
в label
.
Обновить
Основываясь на ответе Хуана, вот моя общая функция, которую я искал.
from skimage.segmentation import clear_border
from scipy.ndimage.measurements import label
def clear_border_adjacent(matrix):
"""
clear_border from skimage.segmentation considers diagonal pixels to be connected,
so e.g. all structures will be removed in all of these:
[[0,0,0,0], [[0,0,0,0], [[0,0,0,0],
[0,1,1,0], [0,1,1,0], [0,1,0,0],
[0,0,0,1], [0,0,1,1], [1,0,0,0],
[0,0,0,0]] [0,0,0,0]] [0,0,0,0]]
This function clears the border but only considers adjacent pixels connected,
so ex 1 and 3 would still have one structure in output but ex 2 would have 0.
"""
border_cleared = clear_border(label(matrix)[0])
border_cleared[border_cleared > 0] = 1
return border_cleared
Ответ №1:
Я думаю, вы можете сначала использовать label, а затем clear border для достижения того же результата? Если есть причина, по которой это не удается, пожалуйста, отправьте запрос на https://github.com/scikit-image/scikit-image/issues
Комментарии:
1. Вы правы, спасибо!