@VictoriaKas

Как найти точки разветвления и пересечения бинарного скелетированного изображения?

Здравствуйте! У меня есть следующий код, который ищет характерные точки в бинарном скелетированном изображении. Мне нужно найти отдельно конечные точки, точки разветвления и точки пересечения и отобразить их координаты в виде (x, y, тип точки). Например, (147, 45, 3), где 3 — количество соседних пикселей (точка разветвления).

import cv2 as cv
import numpy as np


def extraction(img):
    # Find row and column locations that are non-zero
    (rows, cols) = np.nonzero(img)

    # Initialize empty list of co-ordinates
    skel_coords = []

    # For each non-zero pixel
    for (r, c) in zip(rows, cols):

        # Extract an 8-connected neighbourhood
        (col_neigh, row_neigh) = np.meshgrid(np.array([c - 1, c, c + 1]), np.array([r - 1, r, r + 1]))

        # Cast to int to index into image
        col_neigh = col_neigh.astype('int')
        row_neigh = row_neigh.astype('int')

        # Convert into a single 1D array and check for non-zero locations
        pix_neighbourhood = img[row_neigh, col_neigh].ravel() != 0

        # If the number of non-zero locations, add this to our list of co-ordinates
        if np.sum(pix_neighbourhood) == 2:
            skel_coords.append((c, r, 1))
        elif np.sum(pix_neighbourhood) == 4:
            skel_coords.append((c, r, 3))
        elif np.sum(pix_neighbourhood) == 5:
            skel_coords.append((c, r, 4))

    return skel_coords


img = cv.imread('abc.png', 0)
coord = extraction(img)
for element in coord:
    print(element)


Код правильно находит количество соседних пикселей, но они не являются точками разветвления и пересечения. Вы можете увидеть это на картинке ниже (найденная точка отмечена серым цветом):
622df45ac607f353214246.png
Увеличенное изображение матрицы пикселей 3х3 (внизу два белых пикселя идут подряд):
622df8373c67e085106948.png
Мне нужно находить точки следующего вида для точек разветвления (чтобы соседние пиксели чередовались):
kernel_linejunctions.gifkernel_linejunctions3.gif

Есть ли у кого-то идеи как это реализовать? Буду очень благодарна за помощь!
  • Вопрос задан
  • 95 просмотров
Пригласить эксперта
Ответы на вопрос 1
@U235U235
Если у вас уже скелет есть, то, самое простое, это взять среднее по окрестности 3x3, а дальше порогом выделять разветления или конечные точки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы