@maryaTurova

Как можно удалить фон или получить координаты кругов?

На картинках под спойлером мне надо получить координаты кругов
spoiler
64dcb632dd375296146271.png64dcb6409e45f593247570.png64dcb64aee032079292695.png

Пробовал поиск кругов с помощью :
HoughCircles
import cv2
import numpy as np

# Read image.
img = cv2.imread('m_00a095ac1b8de816048b145d58968efb.png', cv2.IMREAD_COLOR)

# Convert to grayscale.
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Blur using 3 * 3 kernel.
gray_blurred = cv2.blur(gray, (3, 3))

# Apply Hough transform on the blurred image.
detected_circles = cv2.HoughCircles(gray_blurred,
                                    cv2.HOUGH_GRADIENT, 1, 30, param1=100,
                                    param2=30, minRadius=10, maxRadius=40)

# Draw circles that are detected.
if detected_circles is not None:

    # Convert the circle parameters a, b and r to integers.
    detected_circles = np.uint16(np.around(detected_circles))

    for pt in detected_circles[0, :]:
        a, b, r = pt[0], pt[1], pt[2]

        # Draw the circumference of the circle.
        cv2.circle(img, (a, b), r, (0, 255, 0), 2)

        # Draw a small circle (of radius 1) to show the center.
        cv2.circle(img, (a, b), 1, (0, 0, 255), 3)
cv2.imshow("Detected Circle", img)
cv2.waitKey(0)

Но результат мягко говоря не очень.
Есть мысли как реализовать?
  • Вопрос задан
  • 156 просмотров
Пригласить эксперта
Ответы на вопрос 3
mayton2019
@mayton2019
Bigdata Engineer
Да. Ты правильно выбрал преобразование Хафа для кругов (окружностей). Только у тебя должен
быть pipeline из последовательного применения фильтров.

1) Сначала обесцветить картинку.
2) Применить фильтр границ. На этом этапе круги появятся
3) Ты заранее знаешь диаметр круга - желательно его вбить в настройки чтоб Хаф не искал все-все радиусы
которые возможны.
4) Ну и далее - твой метод должен их найти.
Ответ написан
@U235U235
Еще можно разбить изображение на блоки, такого же размера как у фона, посчитать у каждого блока дисперсию, блоки у которых дисперсия низкая - это скорее всего не круги, а где высокая - круги.
Ответ написан
Maksim_64
@Maksim_64
Data Analyst
Очевидно нужно играть с параметрами. Например для первой картинки
detected_circles = cv2.HoughCircles(gray_blurred,
                                    cv2.HOUGH_GRADIENT, 1, 45, param1=75,
                                    param2=25, minRadius=8, maxRadius=36)

Даст улучшение в обнаружении, для первой картинки.
param2 - чем меньше тем больше False окружностей он обнаружит. param1 - что то очень специфическое и каких то либо паттернов при увеличении или уменьшении я не заметил, ну остальное вроде понятно. Стало интересно, глянул так же в интернете, собственно везде приблизительно одно и тоже подбор параметров.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час