Python, преобразование круга Хафа в OpenCV
В этом блоге вы узнаете, как находить круги на изображении с помощью преобразования круга Хафа OpenCV использует cv2.HoughCircles() для реализации преобразования круга Хафа.
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=40, minRadius=25, maxRadius=0)
- img: изображение в градациях серого для обнаружения
- cv2.HOUGH_GRADIENT: метод обнаружения, градиент Хафа
- 1: обнаруженный круг имеет тот же размер, что и исходное изображение, dp=2, обнаруженный круг составляет половину исходного изображения.
- 20: Минимальное расстояние между обнаруженными центрами соседних кругов (если параметр слишком мал, несколько соседних кругов могут быть ложно обнаружены в дополнение к одному истинному кругу. Если параметр слишком велик, некоторые круги могут быть пропущены.)
- param1: В случае градиента #HOUGHŠu он выше, оба порога передаются в детектор краев Canny (нижний в два раза меньше).
- param2: В случае градиента #HOUGHŠu это порог накопителя для центра круга в фазе обнаружения. Чем он меньше, тем больше вероятность обнаружения ложных кругов;
- minRadius: минимальный радиус круга
- maxRadius: Максимальный радиус круга, если
1. Рендеринг
Рендеринг круга обнаружения исходного изображения VS выглядит следующим образом:
Как показано на правом рисунке ниже, вы можете видеть, что три внешних круга зеленые, а красный центр круга был успешно обнаружен; Минимальный радиус круга регулируется с 25 до 10, круг может определяться некорректно Эффект следующий: Результат определения порога радиуса окружности (param2 установлен на 35), минимальный радиус окружности установлен на 10, возможно неправильное определение окружности Эффект следующий:
2. Исходный код
# 霍夫圆检测
import cv2
import numpy as np
cimg = cv2.imread('opencv_logo_350.jpg')
cv2.imshow("origin", cimg)
cv2.waitKey(0)
img = cv2.cvtColor(cimg,cv2.COLOR_BGR2GRAY)
img = cv2.medianBlur(img, 5)
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
# - img: 待检测的灰度图
# - cv2.HOUGH_GRADIENT:检测的方法,霍夫梯度
# - 1:检测的圆与原始图像具有相同的大小,dp=2,检测的圆是原始图像的一半
# - 20:检测到的圆的中心的最小距离(如果参数为太小,除了一个真实的圆外,还可能会错误地检测到多个相邻圆。如果太大,可能会漏掉一些圆。)
# - param1:在#HOUGHŠu梯度的情况下,它是较高的. 两个阈值传递到Canny边缘检测器(较低的一个小两倍)。
# - param2:在#HOUGHŠu梯度的情况下,它是检测阶段圆心的累加器阈值。它越小,就越可能检测到假圆;
# - minRadius:最小圆半径,也可能会检测到假圆
# - maxRadius:最大圆半径,如果<=0,则使用最大图像尺寸。如果<0,则返回没有找到半径的中心。
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20,
param1=50, param2=40, minRadius=0, maxRadius=0)
# 最小圆半径设置不合适,也可能会检测到假圆
# circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20,
# param1=50, param2=40, minRadius=0, maxRadius=0)
# circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20,
# param1=50, param2=30, minRadius=10, maxRadius=0)
circles = np.uint16(np.around(circles))
print(len(circles))
print(circles)
for i in circles[0, :]:
# 绘制外圈圆(蓝色)
cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)
# 绘制圆心(红色)
cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)
cv2.imshow('detected circles', cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()