Изменение определений соединений для clear_border в Python

#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. Вы правы, спасибо!