Как улучшить обнаружение круга - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь определить определенные круги на этом изображении:

enter image description here

Это лучший результат, который мне удалось:

enter image description here

Вы можете видеть 4 круга, которые он обнаружил, которые я не пытался обнаружить, и 1 круг, которые он пропустил.

Вот код Я использовал:

def draw_circles(img, circles):
    cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
    for i in circles[0,:]:
    # draw the outer circle
        cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
        # draw the center of the circle
        cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
        cv2.putText(cimg,str(i[0])+str(',')+str(i[1]), (i[0],i[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.4, 255)
    return cimg

def detect_circles(image_path):
    gray = cv2.imread(image_path, 0)
    gray_blur = cv2.medianBlur(gray, 13)  # Remove noise before laplacian
    gray_lap = cv2.Laplacian(gray_blur, cv2.CV_8UC1, ksize=5)
    dilate_lap = cv2.dilate(gray_lap, (3, 3))  # Fill in gaps from blurring. This helps to detect circles with broken edges.
    # Furture remove noise introduced by laplacian. This removes false pos in space between the two groups of circles.
    lap_blur = cv2.bilateralFilter(dilate_lap, 5, 9, 9)
    # Fix the resolution to 16. This helps it find more circles. Also, set distance between circles to 55 by measuring dist in image.
    # Minimum radius and max radius are also set by examining the image.
    circles = cv2.HoughCircles(lap_blur, cv2.HOUGH_GRADIENT, 16, 80, param2=450, minRadius=20, maxRadius=40)
    cimg = draw_circles(gray, circles)
    print("{} circles detected.".format(circles[0].shape[0]))
    # There are some false positives left in the regions containing the numbers.
    # They can be filtered out based on their y-coordinates if your images are aligned to a canonical axis.
    # I'll leave that to you.
    return cimg

plt.imshow(detect_circles('test.jpeg'))

Я пытался играть с параметрами минимального и максимального радиуса, но без реального успеха любые предложения были бы полезны.

Ответы [ 2 ]

3 голосов
/ 27 января 2020

Я не понимаю, зачем вам вся эта предварительная обработка. У вас есть идеальные круги на вашем изображении, вы знаете их точный радиус ...

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

enter image description here

def detect_circles(image_path):
    gray = cv2.imread(image_path, 0)
    circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 2, 60, param2=100, minRadius=20, maxRadius=40)
    cimg = draw_circles(gray, circles)
    print("{} circles detected.".format(circles[0].shape[0]))
    return cimg

enter image description here

Я думаю, вы должны действительно исследовать, как работают эти алгоритмы. Ваш код выглядит так, будто вы слепо применили то, что нашли в Интернете.

1 голос
/ 27 января 2020

возможно это решение поможет.

def draw_circles(img, circles):
    cimg = img.copy()
    for i in circles[0,:]:
    # draw the outer circle
        cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
        # draw the center of the circle
        cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
        cv2.putText(cimg,str(i[0])+str(',')+str(i[1]), (i[0],i[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.4, 255)
    return cimg

def detect_circles(image_path):
    # open color image
    image = cv2.imread(image_path)
    image_blur = cv2.medianBlur(image, 3)
    # find edges
    edges = cv2.Canny(image_blur, 5, 50)
    # let's clean the neighboring pixels
    edges = cv2.medianBlur(edges, 3)

    circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 2, 80, param1=100, param2=45, minRadius=20, maxRadius=40)
    cimg = draw_circles(image, circles)
    print("{} circles detected.".format(circles[0].shape[0]))
    return cimg

Результат кода выше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...