Как определить, сколько разных кривых на изображении, используя Python? - PullRequest
1 голос
/ 17 марта 2020

Я пытаюсь написать алгоритм для систематического определения количества различных «кривых» на изображении. Пример изображения . Меня особенно интересуют белые линии, поэтому я использовал порог цвета, чтобы замаскировать оставшуюся часть изображения и получить только белые пиксели. Эти линии представляют путь, пройденный игроком (широкие приемники в НФЛ), поэтому меня интересуют координаты x и y, которые представляет путь - и каждая «кривая» представляет другой путь, по которому игрок прошел (или «маршрут»). «). Все кривые должны начинаться на или за синей линией.

Однако, хотя я могу получить только белые пиксели, я не могу понять, как систематически идентифицировать отдельные кривые. На этом примере изображения присутствуют 8 белых кривых (или маршрутов). Я идентифицировал эти кривые в этом изображении . Я попытался определить края, а затем с помощью scipy ndimage получить количество подключенных компонентов, но поскольку кривые перекрываются, он считает их связанными и дает мне только 3 помеченных компонента для этого изображения, а не восемь. Вот как выглядит выход обнаружения края. Есть ли лучший способ go по этому поводу? Вот мой пример кода.

import cv2
from skimage.morphology import skeletonize
import numpy as np
from scipy import ndimage

#Read in image
image = cv2.imread('example_image.jpeg')


#Color boundary to get white pixels
lower_white = np.array([230, 230, 230])
upper_white = np.array([255, 255, 255])

#mask image for white pixels
mask = cv2.inRange(image, lower_white, upper_white)
c_pixels = cv2.bitwise_and(image, image, mask=mask)
#make pixels from 0 to 1 form to use in skeletonize
c_pixels = c_pixels.clip(0,1)
ske_c = skeletonize(c_pixels[:,:,1]).astype(np.uint8)

#Edge Detection
inputImage =ske_c*255
edges = cv2.Canny(inputImage,100,200,apertureSize = 7)
#Show edges
cv2.imshow('edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()


#Find number of components

# smooth the image (to remove small objects); set the threshold
edgesf = ndimage.gaussian_filter(edges, 1)
T = 50 # set threshold by hand to avoid installing `mahotas` or
       # `scipy.stsci.image` dependencies that have threshold() functions
# find connected components
labeled, nr_objects = ndimage.label(edgesf > T) # `dna[:,:,0]>T` for red-dot case
print("Number of objects is %d " % nr_objects)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...