OpenCV 笔记(20):霍夫圆检测

1.  霍夫圆变换

霍夫圆变换(Hough Circle Transform)是一种数字图像处理中的特征提取技术,用于在图像中检测圆形。它将二维图像空间中一个圆转换为该圆半径、圆心横纵坐标所确定的三维参数空间中一个点的过程。因此,圆周上任意三点所确定的圆,经霍夫变换后在三维参数空间应对应一点。

霍夫圆变换的优点:

  • 通用性强,可以检测任意大小、形状的圆形。

  • 效率高,可以快速检测出图像中的圆形。

霍夫圆变换的缺点:

  • 对噪声敏感。

  • 容易产生错误检测。

  • 计算量大。

2.  霍夫圆检测的原理

2.1 标准霍夫圆变换

圆的一般方程为:

,其中 (a、b) 为圆心坐标,r 是圆的半径。

把图像空间转换成参数空间,这里将 x-y 平面转化成 a-b-r 参数空间,则在图像空间中的一个过 x、y 点的圆,对应参数空间中高度变化的三维锥面。

c7c446a9158a4233703c73c9bd352f65.jpeg
图像空间映射到霍夫空间.png

过图像空间上同一个圆的点,对应的参数空间中的三维锥面,在 r 平面必然相交于一点 (a, b, r) ,这样通过这一点就可以得到一个圆的参数。

4f3c196ea27ac2dc23be07c306f93493.jpeg
图像空间上同一点的圆对应霍夫空间的三维锥面.png

标准霍夫圆变换的基本思想:对于图像中的每个边缘点,我们考虑所有可能通过该点的圆形。对于每个这样的圆形,我们将其参数 (a, b, r) 对应的累加器加 1。最终,累加器中值最大的点所对应的参数即为图像中存在的圆形参数。

2.2 霍夫梯度法

在 OpenCV 中使用了霍夫梯度法实现圆检测。霍夫梯度法是一种改进的霍夫圆变换算法,用于提高圆检测的效率和鲁棒性。

霍夫梯度法的基本原理:

  • 与标准霍夫圆变换类似,霍夫梯度法也基于将图像空间中的圆形映射到参数空间中的点这一思想。

  • 不同之处在于,霍夫梯度法利用边缘点的梯度方向来对每个边缘点进行投票,而不是简单地累加所有可能的圆心。

  • 梯度方向代表了边缘点所在的圆的切线方向,因此,只有当圆心的位置与边缘点的梯度方向一致时,才会对该圆进行投票。

8e0fed469e4100766f311c3c24fbc832.jpeg
使用梯度方向.png

霍夫梯度法包含以下步骤:

  • 边缘检测: 使用 Canny 等边缘检测算法获取图像的边缘点集合。

  • 梯度计算: 使用 Sobel 算子等方法计算每个边缘点的梯度方向。

  • 参数空间投票: 遍历所有可能的圆心坐标 (x, y) 和半径 r:

  • 计算该圆上与边缘点相交的点的梯度方向。

     a. 将这些梯度方向与边缘点的梯度方向进行比较。

     b. 如果两者一致,则为该候选圆在参数空间中对应的点投票。

  • 局部最大值检测: 在参数空间中寻找投票数最多的点,这些点对应的参数即为图像中存在的圆的参数。

  • 圆形绘制: 根据检测到的圆参数,绘制图像中的圆形。

霍夫梯度法与霍夫圆检测的主要区别在于:

  • 参数空间: 霍夫梯度法使用的是梯度方向和圆半径参数空间,而霍夫圆检测使用的是圆心横纵坐标和圆半径参数空间。

  • 投票策略: 霍夫梯度法根据边缘点的梯度方向进行投票,而霍夫圆检测根据边缘点的位置进行投票。

因此,霍夫梯度法相比于标准霍夫圆变换具有以下优点:

  • 计算效率更高: 利用梯度信息减少了参数空间的搜索范围,提高了计算效率。

  • 检测精度更高: 利用梯度方向信息可以更好地区分边缘点,提高了检测精度。

  • 抗噪声能力更强: 梯度信息可以抑制部分噪声的影响,提高抗噪声能力。

霍夫梯度法也存在以下的一些缺点:

  • 对参数设置敏感: 梯度阈值和累加器阈值等参数需要根据图像特点进行调整,否则可能影响检测效果。

  • 容易产生误检: 在边缘点密集区域容易产生误检。

3.  示例

OpenCV 提供了 cv::HoughCircles 函数用于检测图像中圆形的函数。

下面的例子,使用霍夫梯度法检测图中的硬币。

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"using namespace std;
using namespace cv;int main(int argc, char **argv) {Mat src = imread(".../coins.jpg");imshow("src", src);Mat gray;cvtColor(src, gray, cv::COLOR_BGR2GRAY); // 灰度化Mat gauss;GaussianBlur(gray, gauss, Size(15, 15),0); //降噪Mat thresh;threshold(gauss, thresh,0,255,THRESH_BINARY | THRESH_OTSU );imshow("thresh", thresh);vector<Vec3f> circles;cv::HoughCircles(thresh, circles, HOUGH_GRADIENT, 1, 50, 100,15,5,100);for (auto i = 0; i < circles.size(); i++){Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));int radius = cvRound(circles[i][2]);circle(src, center, 3, Scalar(0, 0, 255), -1, 8);circle(src, center, radius, Scalar(0, 0, 255), 3, 8);}imshow("result", src);waitKey(0);return 0;
}
97932a1e2ac2420ebc6f525e13cb374b.jpeg
霍夫圆检测的效果.png

下面详细介绍一下 HoughCircles 函数:

void HoughCircles( InputArray image, OutputArray circles,int method, double dp, double minDist,double param1 = 100, double param2 = 100,int minRadius = 0, int maxRadius = 0 );

第一个参数 image: 输入图像,是 8 位单通道灰度图像。 

第二个参数 circles: 输出圆形信息的容器,是一个 std::vector<Vec3f> 类型的数组,其中每个元素包含三个浮点数,分别代表圆心的 x 坐标、y 坐标和半径。 

第三个参数 method: 圆形检测方法,目前支持 HOUGH_GRADIENTHOUGH_GRADIENT_ALT。 

第四个参数 dp: 累加器图像的分辨率与输入图像分辨率的比值倒数,默认为 1。 

第五个参数 minDist: 检测到的圆心之间的最小距离,可以避免检测到重叠的圆形。 

第六个参数 param1: HOUGH_GRADIENT 中的第一个参数,用于 Canny 边缘检测算子的高阈值,默认为 100。 

第七个参数 param2: HOUGH_GRADIENT 中的第二个参数,用于在检测阶段对圆心累加器的阈值,默认为 100。 

第八个参数 minRadius: 圆形的最小半径,默认为 0。 

第九个参数 maxRadius: 圆形的最大半径,默认为 0。

4.  总结

霍夫圆检测是一种用于图像处理中圆形检测的经典方法,具有广泛的应用场景、良好的鲁棒性和准确性、灵活性和可扩展性、高效的计算性能以及易于理解和实现等优点,在许多领域发挥着重要作用。

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

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

相关文章

ElasticSearch查询语句用法

查询用法包括&#xff1a;match、match_phrase、multi_match、query_string、term 1.match 1.1 不同字段权重 如果需要为不同字段设置不同权重&#xff0c;可以考虑使用bool查询的should子句来组合多个match查询&#xff0c;并为每个match查询设置不同的权重 {"query&…

二叉树的详解

二叉树 【本节目标】 掌握树的基本概念掌握二叉树概念及特性掌握二叉树的基本操作完成二叉树相关的面试题练习 树型结构&#xff08;了解&#xff09; 概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。…

JS-本地文件上传

由于不需要原上传文件的样式&#xff0c;所以自己书写了一个按钮触发文件上传&#xff0c;并将原本的样式隐藏 <!doctype html> <html><head><meta charset"utf-8"><title>文件传输</title> </head><body><inpu…

工业笔记本丨行业三防笔记本丨亿道加固笔记本定制丨极端温度优势

工业笔记本是专为在恶劣环境条件下工作而设计的高度耐用的计算机设备。与传统消费者级笔记本电脑相比&#xff0c;工业笔记本在极端温度下展现出了许多优势。本文将探讨工业笔记本在极端温度环境中的表现&#xff0c;并介绍其优势。 耐高温性能: 工业笔记本具有更高的耐高温性…

安卓动态链接库文件体积优化探索实践

背景介绍 应用安装包的体积影响着用户下载量、安装时长、用户磁盘占用量等多个方面&#xff0c;据Google Play统计&#xff0c;应用体积每增加6MB&#xff0c;安装的转化率将下降1%。 安装包的体积受诸多方面影响&#xff0c;针对dex、资源文件、so文件都有不同的优化策略&…

【极数系列】Flink集成KafkaSource 实时消费数据(10)

文章目录 01 引言02 连接器依赖2.1 kafka连接器依赖2.2 base基础依赖 03 连接器使用方法04 消息订阅4.1 主题订阅4.2 正则表达式订阅4.3 Partition 列分区订阅 05 消息解析06 起始消费位点07 有界 / 无界模式7.1 流式7.2 批式 08 其他属性8.1 KafkaSource 配置项&#xff08;1&…

如何训练自己的模型

无论数据类型或目标如何&#xff0c;用于训练和使用 AutoML 模型的工作流都是相同的&#xff1a; 准备训练数据。 我们需要将需要训练的数据准备为jsonl格式&#xff0c;这种格式的特点就是每一行都是json的格式 {"prompt": "<prompt text>", "…

【初识爬虫+requests模块】

爬虫又称网络蜘蛛、网络机器人。本质就是程序模拟人使用浏览器访问网站&#xff0c;并将需要的数据抓取下来。爬虫不仅能够使用在搜索引擎领域&#xff0c;在数据分析、商业领域都得到了大规模的应用。 URL 每一个URL指向一个资源&#xff0c;可以是一个html页面&#xff0c;一…

配置git环境与项目创建

项目设计 名称&#xff1a;KOB 项目包含的模块 PK模块&#xff1a;匹配界面&#xff08;微服务&#xff09;、实况直播界面&#xff08;WebSocket协议&#xff09; 对局列表模块&#xff1a;对局列表界面、对局录像界面 排行榜模块&#xff1a;Bot排行榜界面 用户中心模块&…

从Kafka系统中读取消息数据——消费

从Kafka系统中读取消息数据——消费 消费 Kafka 集群中的主题消息检查消费者是不是单线程主题如何自动获取分区和手动分配分区subscribe实现订阅&#xff08;自动获取分区&#xff09;assign&#xff08;手动分配分区&#xff09; 反序列化主题消息反序列化一个类.演示 Kafka 自…

软件测试学习笔记-使用jmeter进行性能测试

性能测试&#xff1a;使用自动化工具&#xff0c;模拟不同的场景&#xff0c;对软件各项性能指标进行测试和评估的过程。 性能测试的目的&#xff1a; 评估当前系统的能力寻找性能瓶颈&#xff0c;优化性能评估软件是否能够满足未来的需要 性能测试和功能测试对比 焦点不同&…

基于FPGA的图像最近邻插值算法verilog实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将FPGA数据导入matlab显示图片&#xff0c;效果如下&#xff1a; 2.算法运行软件版本 vivado2019.2&#xff0c;matlab2022a 3.部分核心程序 ti…

【开源】SpringBoot框架开发高校学生管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生管理模块2.2 学院课程模块2.3 学生选课模块2.4 成绩管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学院课程表3.2.3 学生选课表3.2.4 学生成绩表 四、系统展示五、核心代码5.1 查询课程5.2 新…

服务器和CDN推荐

简介 陆云Roovps是一家成立于2021年的主机服务商&#xff0c;主要业务是销售美国服务器、香港服务器及国外湖北十堰高防服务器&#xff0c;还有相关CDN产品。&#xff08; 地址&#xff1a;roovps&#xff09; 一、相关产品

C语言之数据在内存中的存储

目录 1. 整数在内存中的存储2. 大小端字节序和字节序判断什么是大小端&#xff1f;为什么有大小端&#xff1f;练习1练习2练习3练习4练习5练习6 3. 浮点数在内存中的存储浮点数存的过程浮点数取得过程练习题解析 1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们已经…

ffmpeg的使用,安装,抽帧,加水印,截图,生成gif,格式转换,抓屏等

实际使用中总结的关于ffmpeg对视频的处理的记录文档 具体信息&#xff1a; http://ffmpeg.org/download.html 官网下载ffmpeg 关于ffmpeg的安装详细步骤和说明 装ffmpeg 方式,Linux和windows下的 http://bbs.csdn.net/topics/390519382 php 调用ffmpeg , http://bbs.csdn.net/t…

(篇九)MySQL常用内置函数

目录 ⌛数学函数 ⌛字符串函数 ⌛聚合函数 ⌛日期函数 &#x1f4d0;获取当前时间 &#x1f4d0;获取时间的某些内容 &#x1f4d0;​编辑 &#x1f4d0;格式化函数 &#x1f4cf;format类型&#xff1a; ⌛系统信息函数 ⌛类型转换函数 数学函数 字符串函数 聚合函…

SSH口令问题

SSH&#xff08;Secure Shell&#xff09;是目前较可靠、专为远程登录会话和其他网络服务提供 安全性的协议&#xff0c;主要用于给远程登录会话数据进行加密&#xff0c;保证数据传输的安全。 SSH口令长度太短或者复杂度不够&#xff0c;如仅包含数字或仅包含字母等时&#xf…

html5 audio video

DOMException: play() failed because the user didn‘t interact with the document first.-CSDN博客 不可用&#xff1a; 可用&#xff1a; Google Chrome Close AutoUpdate-CSDN博客

[C++] 如何使用Visual Studio 2022 + QT6创建桌面应用

安装Visual Studio 2022和C环境 [Visual Studio] 基础教程 - Window10下如何安装VS 2022社区版_visual studio 2022 社区版-CSDN博客 安装QT6开源版 下载开源版本QT Try Qt | 开发应用程序和嵌入式系统 | Qt Open Source Development | Open Source License | Qt 下载完成&…