015 OpenCV 霍夫变换(圆检测)

news2025/1/11 22:58:35

目录

一、环境

二、算法原理

三、完整代码


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、算法原理

霍夫圆检测(Hough Circle Detection)是计算机视觉中一种常用的图像处理技术,主要用于检测图像中的圆形物体。它是由Paul Hough于1962年提出的,因此得名。霍夫圆检测算法在很多领域都有广泛的应用,如工业自动化、机器人视觉、医学图像分析等。

霍夫圆检测算法的基本原理是:在一个图像中,如果一个点到某个固定半径为r的圆心的距离小于等于r,那么这个点就被认为是在圆上。通过统计图像中所有可能的圆心位置和半径,可以找到满足条件的圆。具体来说,霍夫圆检测算法可以分为以下几个步骤:

  1. 将图像转换为灰度图像。这是因为在灰度图像中,圆形物体的边缘信息更容易提取。

  2. 对灰度图像进行预处理。预处理的目的是消除噪声和提高边缘检测的准确性。常用的预处理方法有高斯滤波、中值滤波等。

  3. 使用边缘检测算法提取图像中的边缘信息。边缘检测算法有很多种,如Sobel算子、Canny算子等。边缘检测的目的是找到图像中亮度变化较大的像素点,这些像素点通常对应于物体的边缘。

  4. 对边缘图像进行霍夫变换。霍夫变换是一种用于寻找图像中特定形状的方法,它将图像从二维空间映射到一个参数空间(如圆心坐标和半径)。在这个参数空间中,每个可能的圆都对应着一条曲线。通过统计曲线的交点个数,可以估计原图像中圆的数量和位置。

  5. 对霍夫变换的结果进行后处理。后处理的目的是消除误检和减少计算量。常用的后处理方法有:设定一个阈值,只保留交点个数大于阈值的圆;对交点进行聚类,将距离较近的交点合并为一个圆等。

OpenCV中的HoughCircles函数的接口如下:

cv2.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]])

OpenCV中的HoughCircles函数的参数如下:

  • image:输入图像,必须是8位单通道灰度图像。
  • method:检测方法,目前主要支持cv2.HOUGH_GRADIENTcv2.HOUGH_GRADIENT_ALT两种方法,其中后者是前者的改进方法。
  • dp:此参数已在OpenCV的最新版本中弃用。
  • minDist:此参数代表两个圆之间的最小距离。
  • circles:调用HoughCircles函数后,此参数将存储检测到的圆的输出矢量,每个矢量由包含三个元素的浮点矢量(x,y,radius)表示。
  • param1 和 param2:此参数已在OpenCV的最新版本中弃用。
  • minRadius 和 maxRadius:这两个参数代表要检测的圆的最小半径和最大半径。

三、完整代码

import sys
import cv2 as cv
import numpy as np


def main(argv):
    # 读取图片
    default_file = 'data/smarties.png'
    filename = argv[0] if len(argv) > 0 else default_file
    src = cv.imread(cv.samples.findFile(filename), cv.IMREAD_COLOR)

    if src is None:
        print ('Error opening image!')
        print ('Usage: hough_circle.py [image_name -- default ' + default_file + '] \n')
        return -1
    # 彩色图转灰度图
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    # 中值滤波,用于降噪
    gray = cv.medianBlur(gray, 5)
    # 霍夫圆检测
    rows = gray.shape[0]
    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 1, rows / 8,
                               param1=100, param2=30,
                               minRadius=1, maxRadius=30)
    # 绘制圆
    if circles is not None:
        circles = np.uint16(np.around(circles))
        for i in circles[0, :]:
            center = (i[0], i[1]) #圆心
            # 绘制圆心
            cv.circle(src, center, 1, (0, 100, 100), 3)
            # 绘制圆轮廓
            radius = i[2]
            cv.circle(src, center, radius, (255, 0, 255), 3)
    cv.imshow("detected circles", src)
    cv.waitKey(0)
    return 0


if __name__ == "__main__":
    main(sys.argv[1:])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1282016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汽车底盘构造之离合器

目录 1.离合器的工作原理 2.离合器的作用 3.对摩擦离合器的基本性能要求 4.离合器的分类 5.膜片弹簧离合器 5.1膜片弹簧离合器结构 5.2膜片弹簧离合器的弹性特性 5.3膜片弹簧离合器的分类 6离合器工作原理 6.1名词解释 6.2工作过程 1.离合器的工作原理 离合器位于发…

问CHAT:怎样保持数据库中数据的完整性?

CHAT回复:保持数据库中数据的完整性有以下一些方法: 1. 使用约束:数据库中的约束可以确保数据遵循特定的规则。 例如,我们可以使用 UNIQUE 约束防止在某列中插入重复值,使用 NOT NULL 约束防止插入空值,或…

含mask的单通道灰度图内容可视化python

输入:单通道的灰度图,灰度图内含不同像素值的掩膜mask 输出:灰度图内的掩膜mask在RGB图像中输出 方法很简单,就是读取灰度图,根据掌握的像素值信息,分别赋予不同的颜色值像素进行保存输出。 如下输入的单…

电容、电感和电阻

一、电感 1)图片 2)作用 a)储存容量 例如dcdc转换器的原理,将一个电压值转换成另外一个电压值 b)选择信号 比如空气中弥漫着很多信号,我们应该怎么选取我们所需要的信号。 电感和电容可以看成一个电阻,当电…

Tomcat 配合虚拟线程,一种新的编程体验

Java 21 在今年早些时候的 9 月 19 日就正式发布,并开始正式引入虚拟线程,但是作为 Java 开发生态中老大哥 Spring 并没有立即跟进,而是在等待了两个月后的 11 月 29 日,伴随着 Spring Boot 3.2 版本的发布,在这个版本…

【SSM源码】基于JAVA的高校竞赛和考级查询系统

该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等学习内容。 目录 一、项目介绍: 二、文档学习资料: 三、模块截图: 四、开发技术与运行环境: 五、代码展示: 六、数据库表截图&#xff1a…

解决websocket集群的session共享问题

在websocket中,服务端主要使用的是session打交道,但是由于session无法实现序列化,不能存储到redis这些中间存储里面,因此这里我们只能把session存储在本地的内存中,那么如果是集群的话,我们如何实现session…

数据库-PostgreSQL学习笔记

目录 PostgreSQL介绍与安装docker安装腾讯云免费领用1个月 数据库操作连接数据库实例创建数据库查看数据库列表使用数据库删除数据库修改数据库属性 表操作字段类型整数浮点数日期与时间类型字符串类型 DDLCREATEDROPALTER DMLINSERTUPDATEDELETE 查询查询所有数据查询部分列指…

YB2412B 600KHz 30V 3A 同步降压稳压器

YB2412B 600KHz 30V 3A 同步降压稳压器 简介: YB2412是一种具有内部功率 MOSFET 的高频、同步、整流、降压开关模式转换器。它提供了一个非常紧凑的解决方案,可以在一个广泛的输入供应范围内实现4a的峰值输出电流, 具有良好的负荷和线路调节能…

基于Java SSM框架实现美好生活九宫格日志网站系统项目【项目源码+论文说明】

基于java的SSM框架实现美好生活九宫格日志网站系统演示 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人…

爱德华|书客|飞利浦护眼台灯好不好用?多方位测评对比爆料!

说到护眼台灯相信大家都不陌生,很多办公族、学生党都会备上一台用于工作、学习。因为长时间的工作或者学习,会明显的感觉到眼睛疲劳和不适。而护眼台灯可以很好的解决这个难题,因为护眼台灯是经过科学的设计和研发的,护眼台灯可以…

ESP32-Web-Server编程-简单的照片浏览器

ESP32-Web-Server编程-简单的照片浏览器 概述 从本节开始我们开始制作一些有趣的多媒体 Web 的示例。 当你希望在网页上展示一些广告、照片,或者你的开发板带摄像头,能够采集一些图片,这时你希望可以通过手头的浏览器查看图片,…

训练lora小模型

训练lora小模型 一,安装部署本地训练环境1,下载源码2,下载模型 二,准备数据1,准备图片2,标注图片 三,修改配置1,修改文件名2,修改配置文件 ,install.ps1 四&a…

聚观早报 |智界S7上路;荣耀与中国移动再牵手

【聚观365】12月4日消息 智界S7上路 荣耀与中国移动再牵手 新能源车11月销量成绩 比亚迪11月销量数据 赛力斯汽车11月销量数据 智界S7上路 华为举行智界S7及华为全场景发布会,带来了鸿蒙智行首款轿车智界S7,而其一经发布便在业内引起了关注。而其因…

(一)舒尔特表练习记

舒尔特表练习记 1 练习的开始 我们知道,一段时间中注意力的保持,对于学习效果的影响很大。我想应该不少朋友们有过和我相似的感觉,学着学着,就莫名开始容易走神;一行字看过去,发现自己脑子里什么也没有留…

Python读写XML文件:深入解析与技术实现

目录 一、引言 二、XML文件基础 1、XML文件结构 2、XML文件语法规则 三、Python读取XML文件 1、使用内置库xml.etree.ElementTree 2、使用第三方库lxml 四、Python写入XML文件 1、使用内置库xml.etree.ElementTree 五、注意事项 六、总结 一、引言 XML(…

【自然语言处理】【大模型】VeRA:可调参数比LoRA小10倍的低秩微调方法

VeRA:可调参数比LoRA小10倍的低秩微调方法 《VeRA:Vector-based Random Matrix Adaptation》 论文地址:https://arxiv.org/pdf/2310.11454.pdf 相关博客 【自然语言处理】【大模型】VeRA:可调参数比LoRA小10倍的低秩微调方法 【自…

猜数字赢金币

充值金币后开始游戏,猜中奖励10金币退出,不中扣除1金币继续。 (笔记模板由python脚本于2023年12月03日 21:52:23创建,本篇笔记适合熟悉程序函数式编程,熟练掌握基本数据类型的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&…

echarts笔记-GeoJSON河北数据下并裁剪为冀北地图并使用echarts加载

首先找个网站把河北的GeoJSON数据下载下来,我用的是这个,理论上任意一个都可以 DataV.GeoAtlas地理小工具系列 将json数据下载后,进行裁剪,仅保留冀北数据。 如下,我裁剪的数据: {"type": &qu…

中缀表达式构建后缀表达式

中缀表达式构建后缀表达式 文章目录 中缀表达式构建后缀表达式一、构造符号优先关系表二、构造后缀表达式 一、构造符号优先关系表 首先,我们需要知道什么是优先函数。优先函数是一种用于表示算符优先关系的函数,它有两种形式:f 和 g。f(a) …