Как подключить ломаные линии в двоичном изображении с помощью Python / Opencv

Как я могу подключить эти линии в целевых точках? Изображение является результатом процесса скелетонизации.

Результирующее изображение из скелетонизации

Очки, которые мне нужно подключить

Я пытаюсь сегментировать каждую линию как регион с использованием Watershed Transform.

    Ответ MikeE довольно хорош: использование морфологических операций в области дилатации и эрозии может помочь в этом.
    Я хочу предложить небольшое улучшение, используя конкретную структуру изображения под рукой. Вместо использования расширения / эрозии с общим ядром я предлагаю использовать горизонтальное ядро, которое будет связывать конечные точки горизонтальных линий, но не будет связывать смежные линии друг с другом.

    Вот эскиз кода (при условии, что входное изображение сохраняется в 2D-массиве bw numpy):

     import cv2, numpy as np kernel = np.ones((1,20), np.uint8) # note this is a HORIZONTAL kernel d_im = cv2.dilate(bw, kernel, iterations=1) e_im = cv2.erode(d_im, kernel, iteraions=1) 

    для удаления артефактов, созданных методом dialte / erode, я предлагаю снова извлечь скелет

    То, что вы получаете, – это расширенное изображение:
    введите описание изображения здесь

    Обратите внимание на то, как зазоры закрываются, сохраняя отдельные горизонтальные линии

    И эродированное изображение:
    введите описание изображения здесь

    Если вы затем примените морфологическую операцию скелета к эродированному изображению, вы можете получить этот результат:
    введите описание изображения здесь

    Когда у вас есть связанные кривые, вам не нужно использовать сегментацию водораздела, а используйте связанные компоненты для обозначения каждой кривой.

    Поскольку изображение уже монохроматично, вы можете использовать морфологические преобразования для закрытия ломаных линий.

    В случае, если вам нужен пример, вы можете найти его в документации здесь: http://docs.opencv.org/2.4/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.html#closing

    Он работает, сначала расширяя белые области изображения, а затем стирая обратно на ту же сумму. Эффективное закрытие любых отверстий в белых областях. Более подробную информацию и примеры можно найти здесь: http://docs.opencv.org/2.4/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html

    Эта стратегия требует, чтобы разрыв в ломаной линии был меньше расстояния между соседними линиями.

    Это не сработает, если линии пересекаются, или линии слишком близки друг к другу. Однако я думаю, что это будет хорошо работать в вашем примере.

    Вы также можете удалить артефакты под третьей строкой, используя функцию erode.