Обнаружение размытого круга

#opencv #image-processing #computer-vision

#opencv #обработка изображений #компьютерное зрение

Вопрос:

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

Это изображение легко получить с помощью контуров и порогового кодирования:

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

Это сложнее сделать:

Это сложнее сделать

Пороговое значение и окружность Хафа не работают с этим изображением:

Пороговое значение и окружность Хафа не работают с этим изображением

Добавление дополнительных изображений для справки

Можете ли вы предложить какой-либо метод, который будет надежным для всех изображений?

Комментарии:

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

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

Ответ №1:

Поскольку круг — единственная яркая вещь на изображении, мы можем получить центр, ища центроид белого пятна. Мы автоматически установим пороговое значение с помощью otsu и используем findContours, чтобы получить центроид маски.

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

 import cv2
import numpy as np

# load image
img = cv2.imread("circ1.png");
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY);

# threshold
gray = cv2.GaussianBlur(gray, (5,5), 0);
_, mask = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU);

# contour
_, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE);

# center
M = cv2.moments(contours[0]);
cx = int(M['m10']/M['m00']);
cy = int(M['m01']/M['m00']);
center = (int(cx), int(cy));

# draw
img = cv2.circle(img, center, 4, (0,0,200), -1);

# show
cv2.imshow("marked", img);
cv2.imshow("mask", mask);
cv2.waitKey(0);