#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);