霍夫圆检测原理及使用案例(带调参过程)
创作时间:
作者:
@小白创作中心
霍夫圆检测原理及使用案例(带调参过程)
引用
CSDN
1.
https://m.blog.csdn.net/qq_49110168/article/details/144374740
霍夫圆检测是一种在图像中检测圆形目标的有效方法,广泛应用于工业检测和机器视觉等领域。本文将详细介绍霍夫圆检测的原理,并通过Python和OpenCV库实现圆形目标的检测,同时提供具体的调参过程和实例。
1 霍夫圆检测原理
1.1 检测原理
圆的解析方程为:(x - a)^2 + (y - b)^2 = r^2,其中参数空间为(a, b, r),(a, b)表示圆心坐标,r表示半径。
具体步骤如下:
边缘检测:对输入图像进行边缘检测,常用的方法有Canny算子、Sobel算子等,得到二值化的边缘图像,边缘点像素值为1,非边缘点像素值为0。
计算梯度:对边缘图像计算梯度幅值和方向,梯度幅值反映边缘强度,梯度方向指向圆心。
参数空间投票:对每个边缘点(x, y),根据其梯度方向和预设的半径范围,计算可能的圆心坐标(a, b),将(a, b, r)对应的参数空间的累加器加1,表示一次投票。
查找局部最大值:在参数空间的累加器中查找局部最大值,超过设定阈值的局部最大值对应检测到的圆,局部最大值的坐标(a, b, r)即为检测到的圆的参数。
圆心和半径的确定:对于每个检测到的圆,以(a, b)为圆心,r为半径,在原图像上绘制圆。
1.2 函数参数解释
circles = cv2.HoughCircles(GrayImage, cv2.HOUGH_GRADIENT, 1, minDist=20, param1=70, param2=50, minRadius=20, maxRadius=80)
- GrayImage:输入图像,单通道、灰度图像。
- cv2.HOUGH_GRADIENT:表示使用梯度信息进行圆检测。
- dp:累加器分辨率与图像分辨率的反比。dp = 1 时,累加器的分辨率与图像分辨率相同;dp = 2 时,累加器的宽高都被减半。通常设置为 1 或 2。调整建议:增大 dp 可以减少计算量,但可能导致漏检;减小 dp 可以提高检测精度,但计算量增加。
- minDist:检测到的圆心之间的最小距离。如果两个圆心之间的距离小于该值,则认为它们是同一个圆。调整建议:根据圆之间的实际距离设置。增大 minDist 可以避免重复检测,但可能漏检一些圆;减小 minDist 可以检测更多的圆,但可能出现重复检测。
- param1:Canny 边缘检测的高阈值,低阈值是高阈值的一半。调整建议:增大 param1 可以减少边缘点数,提高检测速度,但可能漏检一些圆;减小 param1 可以增加边缘点数,提高检测准确性,但速度变慢。
- param2:累加器的阈值。一个圆对应的累加器值超过该阈值时,才被认为是真正的圆。调整建议:增大 param2 可以提高检测精度,但可能漏检一些圆;减小 param2 可以检测更多的圆,但可能出现误检。
- minRadius:圆的最小半径。调整建议:根据待检测圆的实际最小尺寸设置。
- maxRadius:圆的最大半径。调整建议:根据待检测圆的实际最大尺寸设置。
2 使用案例
2.1 调参顺序
- 先调整 dp 和 minDist,使检测到的圆的数量和位置大致正确。
- 调整 param1 和 param2,使检测结果更加准确,同时尽量避免漏检和误检。
- 最后根据实际需求调整 minRadius 和 maxRadius,限定检测圆的大小范围。
2.2 调参实例
2.2.1 原始代码
原始图像如下所示:
原始代码如下:
import cv2
import numpy as np
import time
if __name__ == "__main__":
img=cv2.imread(r'C:\Users\Admin\Desktop\xiangmu\222222.png')
t1=time.time()
GrayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(GrayImage, cv2.HOUGH_GRADIENT, 1, 40, param1=70, param2=30, minRadius=0,maxRadius=0)
t2=time.time()
print("运行时间:",t2-t1)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
x,y,r=i[0],i[1],i[2]
#draw the outer circle
cv2.circle(img,(x,y),r,(0,255,0),2)
cv2.circle(img,(x,y),2,(0,0,255),3)
cv2.imshow("img",img)
cv2.waitKey()
2.2.2 初步调参
调整内容:
- 加入均值滤波
- minDist改为20(根据圆之间的实际距离设置。)
- param2改为50(提高检测精度,避免误检)
- minRadius改为20,maxRadius改为80(根据待检测圆的实际最小、最大尺寸设置。)
代码如下:
import cv2
import numpy as np
import time
if __name__ == "__main__":
image = cv2.imread(r'C:\Users\Admin\Desktop\xiangmu\222222.png')
t1 = time.time()
GrayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
GrayImage = cv2.blur(GrayImage, (7, 7)) # 均值滤波 滤除背景噪声
circles = cv2.HoughCircles(GrayImage, cv2.HOUGH_GRADIENT, 1, minDist=20, param1=70, param2=50, minRadius=20, maxRadius=80)
t2 = time.time()
print("运行时间:", t2 - t1) # 只统计霍夫圆检测时间
# 这里进行圆绘制
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
x, y, r = i[0], i[1], i[2]
# draw the outer circle
cv2.circle(image, (x, y), r, (0, 255, 0), 2)
cv2.circle(image, (x, y), 2, (0, 0, 255), 3)
cv2.imshow("img1", image)
cv2.waitKey()
2.2.3 最终调参
调整内容:
- 加入均值滤波
- minDist改为70(根据圆之间的实际距离设置。)
- param2改为40(提高检测精度,避免误检)
- minRadius改为30,maxRadius改为60(根据待检测圆的实际最小、最大尺寸设置。)
代码如下:
import cv2
import numpy as np
import time
def hough_circle_detection(image_path):
# 读取图像
# img = cv2.imread(image_path)
img= cv2.imread(r'C:\Users\Admin\Desktop\xiangmu\222222.png')
# 图像缩放
# img = cv2.resize(img, None, fx=1, fy=1)
# 转换为灰度图像
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 均值滤波以减少噪声
gray_image = cv2.blur(gray_image, (9,9))
# 霍夫圆检测
t1 = time.time()
circles = cv2.HoughCircles(
gray_image,
cv2.HOUGH_GRADIENT,
dp=1,
minDist=70, # 设置最小圆心距离
param1=70, # Canny 边缘检测的高阈值
param2=40, # 圆心检测的阈值
minRadius=30, # 最小半径
maxRadius=60 # 最大半径
)
t2 = time.time()
print("运行时间:", t2 - t1)
# 绘制检测到的圆
if circles is not None:
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
x, y, r = i[0], i[1], i[2]
# 绘制外圆
cv2.circle(img, (x, y), r, (0, 255, 0), 2)
# 绘制圆心
cv2.circle(img, (x, y), 2, (0, 0, 255), 3)
# 显示结果
cv2.imshow("Detected Circles", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == "__main__":
hough_circle_detection("test.png") # 替换为你的图像路径
运行结果如下:
热门推荐
租房APP大盘点:靠谱选择指南与注意事项全解析
如何评价租房平台的质量和信誉?这些评价标准如何帮助租客做出选择?
手机如何让虚拟机不卡顿
手机虚拟内存小科普常识知多少
《无相颂》六祖坛经中的至高智慧,寥寥九联,却句句直指心灵深处。
《本杰明·巴顿奇事》:一部关于时间、生命与爱情的哲学电影
杭齿前进股价异动:机器人概念加持下暴涨120%,重要股东减持引发关注
腊八粥的寓意和象征 腊八粥的历史发展
DC系列电影观看顺序2025
如何祛水肿
孩子不听话叛逆期怎么办
简易比较法助你轻松选择最佳方案
常见的眼病有哪些?了解这些眼科疾病对保护视力的重要性
如何评估工作环境以选择合适的工作?这些评估标准有哪些实际意义?
20万以内的四驱车推荐有哪些?
高纯石英砂价格下降的原因分析
“深入探讨‘tx’缩写的多重含义及其在社交中的应用”
气化炉安全操作与维护全攻略
修改手机号码的详细步骤及注意事项
螺丝检测新突破:CCD视觉检测设备如何实现高精度自动化检测?
萨内身价缩水近1000万欧元,拜仁边锋面临职业生涯新挑战
古化石揭示地球秘史:南美洲与非洲是如何戏剧性分离的?
古化石揭示地球秘史:南美洲与非洲是如何戏剧性分离的?
数据不准确?销售数据分析的校正方法
2025年五运六气特点及科学养生指南
AI如何赋能优质直播内容创作?
【文明实践 绽放李沧】精彩非遗 古韵流芳——冷凝香制作技艺
虚拟仿真技术赋能老年护理:促进人工智能助力教育变革
39.7%!无锡接待游客量增幅江苏第一,江阴宜兴双双跻身全国百强
公章伪造用于招投标:法律风险与防范