Opencv 学习笔记:霍夫变换实现图像中圆的精准检测与绘制

在工业检测、目标识别等场景中,从图像中精准查找圆形目标是高频需求。本文通过 OpenCV 的霍夫圆变换(HoughCircles),演示灰度图中圆的检测、提取与绘制全流程,新手可直接复用。

核心代码实现

python 复制代码
import cv2 as cv
import numpy as np

# 1. 读取灰度图像并显示
src = cv.imread('.\image\12.bmp', 0)
if src is None:
    print('could not load image')
    exit()
cv.namedWindow('src', cv.WINDOW_NORMAL)
cv.resizeWindow('src', 600, 600)
cv.imshow('src', src)

# 2. 霍夫圆变换检测圆
circles = cv.HoughCircles(
    src, 
    cv.HOUGH_GRADIENT, 
    dp=1,               # 分辨率比例(1为原图分辨率)
    minDist=300,        # 圆心最小距离(避免重复检测)
    param1=41,          # Canny边缘检测高阈值
    param2=40,          # 检测阈值(越小检测越多,需调优)
    minRadius=51,       # 最小圆半径
    maxRadius=100       # 最大圆半径
)

# 3. 创建纯白画布(可选,用于单独绘制圆)
circleimage = np.zeros((src.shape[0], src.shape[1]), np.uint8)
circleimage.fill(255)

# 4. 灰度图转彩色(用于绘制彩色圆)
color = cv.cvtColor(src, cv.COLOR_GRAY2BGR)

# 5. 绘制检测到的圆
if circles is not None:  # 避免无圆时索引报错
    circles = np.uint16(np.around(circles))  # 坐标/半径取整
    for circle in circles[0, :]:
        x, y, r = circle[0], circle[1], circle[2]
        # 绘制圆形轮廓(红色,线宽5)
        outimage = cv.circle(color, (x, y), r, (0, 0, 255), 5)

# 6. 显示结果
cv.namedWindow('circleimage', cv.WINDOW_NORMAL)
cv.resizeWindow('circleimage', 600, 600)
cv.imshow("circleimage", outimage)

cv.waitKeyEx(0)
cv.destroyAllWindows()

关键知识点解析

1. 霍夫圆变换核心参数

参数 作用说明 调优技巧
dp 累加器分辨率与图像分辨率的比值 固定为 1 即可,值越大检测速度越快但精度越低
minDist 检测到的圆心之间的最小距离 小于此值的圆心会被视为同一个圆,需根据圆大小调整
param1 Canny 边缘检测的高阈值(低阈值为其 1/2) 值越小边缘越多,易检测到杂圆;值越大漏检风险高
param2 圆心检测阈值 核心调优参数,值越小检测到的圆越多(含假圆),值越大仅检测高置信度圆
minRadius/maxRadius 圆半径范围 限定检测半径,过滤无关大小的圆,大幅提升效率

2. 核心操作说明

  • 输入要求HoughCircles仅支持灰度图输入,无需提前做边缘检测(内部自动调用 Canny);
  • 坐标取整 :检测到的圆心 / 半径为浮点数,需通过np.around+np.uint16取整,避免绘制报错;
  • 空值判断 :新增if circles is not None,解决图像无圆时circles[0]索引异常问题;
  • 彩色绘制 :灰度图转彩色(COLOR_GRAY2BGR)后,可绘制彩色圆,视觉效果更直观。

3. 避坑与优化技巧

  • 圆检测对噪声敏感:检测前可对图像做高斯滤波(cv.GaussianBlur(src, (5,5), 0)),减少假圆;
  • 重复检测问题:调大minDist,避免相邻圆被重复检测;
  • 漏检问题:降低param2param1,或放宽minRadius/maxRadius范围。

总结

  1. 霍夫圆变换核心是调优param2(检测阈值)和minDist(圆心间距),是精准检测的关键;
  2. 输入需为灰度图,检测后需对坐标 / 半径取整才能绘制;
  3. 预处理加高斯滤波可有效减少噪声导致的假圆检测。
相关推荐
sensen_kiss11 分钟前
CAN302 Technologies for E-Commerce 电子商务技术 Pt.6 市场营销与SEO(搜索引擎优化)
android·学习·搜索引擎
我的xiaodoujiao13 分钟前
API 接口自动化测试详细图文教程学习系列9--Requests模块
python·学习·测试工具·pytest
乐园游梦记15 分钟前
机器学习:监督学习与无监督学习由浅入深全解析
人工智能·深度学习·学习·机器学习
bobasyu19 分钟前
Claude Code 源码笔记 -- queryLoop
java·笔记·spring
woai336421 分钟前
JVM学习-基础篇-常见引用
jvm·学习
世人万千丶27 分钟前
Flutter 框架跨平台鸿蒙开发 - 家庭健康档案云应用
学习·flutter·华为·开源·harmonyos·鸿蒙
東雪木35 分钟前
Java学习——泛型基础:泛型的核心作用、泛型类 / 方法 / 接口的定义
java·学习·java面试
水云桐程序员44 分钟前
Quartus II集成开发环境 |FPGA
笔记·fpga开发·硬件工程·创业创新
東雪木1 小时前
Java学习——内部类(成员内部类、静态内部类、局部内部类、匿名内部类)的用法与底层实现
java·开发语言·学习·java面试
AI_零食1 小时前
二十四节气物候现象速览卡片:鸿蒙Flutter框架 实现的传统文化应用
学习·flutter·华为·开源·harmonyos·鸿蒙