Нахождение центра тяжести круга в opencv

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

Пока что я превратил это изображение в градациях серого в двоичное изображение с помощью адаптивного определения порога.

Изображение в оттенках серого

введите описание изображения здесь

Пороговое изображение

введите описание изображения здесь

До сих пор я использовал преобразование hough и Findcontour. Ни один из этих методов не работает.

Как к этому следует подходить?


person Totally New    schedule 26.06.2019    source источник
comment
Что не работало с преобразованием Хафа? Удалось ли ему найти хотя бы несколько кругов?   -  person marco romelli    schedule 26.06.2019
comment
Потенциальный подход в этом порядке состоит в том, чтобы преобразовать изображение в оттенки серого, изображение с размытием по Гауссу, выполнить адаптивную пороговую обработку, точное обнаружение краев, найти контуры, выполнить итерацию по контурам и отфильтровать, используя контурную область и минимальную / максимальную пороговую область. Для каждого отфильтрованного контура найдите центроид, используя cv2.moments()   -  person nathancy    schedule 27.06.2019


Ответы (1)


Я получил достойный результат, используя преобразование Хафа для кругов. Это конвейер:

img = cv2.imread('I7Ykpbs.jpg', 0)
img = cv2.GaussianBlur(img, (5, 5), 2, 2)
img_th = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                            cv2.THRESH_BINARY, 9, 3)
circles = cv2.HoughCircles(img_th, cv2.HOUGH_GRADIENT, 2, minDist=30, 
                           param1=200, param2=40, minRadius=10, maxRadius=20)

for i in range(circles.shape[1]):
    c = circles[0,i,:]
    center = (np.round(c[0]), np.round(c[1]))
    radius = np.round(c[2])
    # print(center)
    # print(radius)
    if np.linalg.norm(np.array([600., 600.])-center) < 500.:
        cv2.circle(img, center, 3, (0,255,0), -1, 8, 0)
        cv2.circle(img, center, radius, (0,0,255), 3, 8, 0)

plt.imshow(img)
plt.show()

Это не идеально, но я думаю, что вы можете начать отсюда и провести некоторую настройку параметров и предварительную обработку, чтобы оптимизировать результат. Обнаруженные круги

person marco romelli    schedule 27.06.2019