Здравствуйте! У меня есть следующий код, который ищет характерные точки в бинарном скелетированном изображении. Мне нужно
найти отдельно конечные точки, точки разветвления и точки пересечения и отобразить их координаты в виде (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)
Код правильно находит количество соседних пикселей, но они не являются точками разветвления и пересечения. Вы можете увидеть это на картинке ниже (найденная точка отмечена серым цветом):
Увеличенное изображение матрицы пикселей 3х3 (внизу два белых пикселя идут подряд):
Мне нужно находить точки следующего вида для точек разветвления (чтобы соседние пиксели чередовались):
Есть ли у кого-то идеи как это реализовать? Буду очень благодарна за помощь!