Обнаружение кругов на изображениях — фундаментальная задача компьютерного зрения и обработки изображений. Будь то распознавание объектов, медицинская визуализация или даже игровые приложения, точная идентификация кругов может дать ценную информацию о визуальном содержании изображения. В этой статье блога мы рассмотрим несколько методов обнаружения кругов, сопровождаемых примерами кода, а также обсудим методы извлечения радиуса и цвета обнаруженных кругов.
Метод 1: преобразование Хафа
Преобразование Хафа — популярный метод обнаружения кругов на изображениях. Он работает путем преобразования пространства изображения в пространство параметров, где каждый круг соответствует пику в пространстве параметров. Вот пример фрагмента кода с использованием OpenCV в Python:
import cv2
import numpy as np
def detect_circles_hough(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray_blurred = cv2.GaussianBlur(gray, (5, 5), 0)
circles = cv2.HoughCircles(gray_blurred, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
if circles is not None:
circles = np.uint16(np.around(circles))
for circle in circles[0, :]:
center = (circle[0], circle[1])
radius = circle[2]
color = image[circle[1], circle[0]]
cv2.circle(image, center, radius, (0, 255, 0), 2)
cv2.circle(image, center, 1, (0, 0, 255), 3)
return image
Метод 2: обнаружение краев и обнаружение контуров
Другой подход к обнаружению кругов включает обнаружение краев на изображении, а затем поиск контуров, напоминающих круги. Вот пример фрагмента кода, использующего обнаружение краев Canny и обнаружение контуров в Python:
import cv2
import numpy as np
def detect_circles_edges(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray_blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(gray_blurred, 50, 150)
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
area = cv2.contourArea(contour)
if area > 100:
perimeter = cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, 0.03 * perimeter, True)
if len(approx) > 6:
(x, y), radius = cv2.minEnclosingCircle(contour)
center = (int(x), int(y))
color = image[int(y), int(x)]
radius = int(radius)
cv2.circle(image, center, radius, (0, 255, 0), 2)
cv2.circle(image, center, 1, (0, 0, 255), 3)
return image
Анализ цвета.
Чтобы извлечь цвет обнаруженных кругов, мы можем просто получить доступ к значению пикселя в центре круга. В приведенных выше примерах кода переменная colorпредставляет цвет круга в формате BGR. Вы можете дополнительно проанализировать цвет, преобразовав его в другие цветовые пространства, например RGB или HSV, в зависимости от ваших требований.
В этой статье мы рассмотрели два популярных метода обнаружения кругов на изображениях с помощью преобразования Хафа и обнаружения краев/контуров. Мы также предоставили примеры кода на Python с использованием библиотеки OpenCV. Кроме того, мы обсудили, как извлечь радиус и цвет обнаруженных кругов. Используя эти методы, вы сможете точно обнаруживать круги на изображениях и извлекать ценную информацию для различных приложений.