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://xiahunao.cn/news/2776968.html

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

相关文章

【java苍穹外卖项目实战一】苍穹外卖项目介绍

文章目录 1、项目介绍1、项目概述2、 产品原型3、技术选型 1、项目介绍 在开发苍穹外卖这个项目之前&#xff0c;我们需要全方位的来介绍一下当前我们学习的这个项目。接下来&#xff0c;我们将从项目简介、产品原型、技术选型三个方面来介绍苍穹外卖这个项目。 1、项目概述 …

阿里云服务器租用价格表_2024一年_1个月_1小时收费价格表

2024年阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…

MySQL 升级脚本制作

当数据库更新字段后或添加一些基础信息&#xff0c;要对生产环境进行升级&#xff0c;之前都是手动编写sql&#xff0c;容易出错还容易缺失。 通过 Navcat 工具的数据库结构同步功能和数据同步功能完成数据库脚本的制作。 一、结构同步功能 1、选择 工具–结构同步&#xff1…

NOVATEK显示技术系列之CEDSCHPI Training差异简介

CEDS的数据封包格式&#xff1a;首先CEDS数据封包包括三个部分&#xff1a; Training Pattern即Phase1Control Data 即 Phase2RGB Data 即Phase3 Power on Timing&#xff1a; 工作原理&#xff1a; Power ON时&#xff0c;TCON会发Training Pattern&#xff0c;当COF接受Tr…

STC系列单片机的中断系统

目录 一、中断系统的定义 二、STC15系列单片机的中断请求源及结构图 三、中断查询表以及触发方式 四、在keil c中如何声明中断函数 五、外部中断 六、基于STC15芯片实战中断系统的使用 &#xff08;1&#xff09;外部中断2/外部中断3来检测门的开关状态 &#xff08;2&a…

架构之模板方法等模式的使用

目录 一、程序编写背景 二、编程思路讲解 - 类图 - 实现逻辑 - 工厂模式 - 模板方法模式 接口类&#xff08;代码&#xff09;抽象类&#xff08;代码&#xff09;具体实现类&#xff08;代码&#xff09;工厂类&#xff08;代码&#xff09;注册类&#xff08;代码&…

Vue3 常用的10个组合式 API

2024-01-025,917阅读6分钟 Vue.js是一个用于开发Web应用程序的强大JavaScript框架。Vue 2 于 2023 年 12 月 31 日停止维护。而通过Vue 3&#xff0c;组合式API增强了我们利用Vue的能力&#xff0c;使我们的代码更具模块性和可读性。下面分享10个常用的Vue3组合式API&#xff…

[office] excel如何计算毛重和皮重的时间间隔 excel计算毛重和皮重时间间隔方法 #笔记#学习方法

excel如何计算毛重和皮重的时间间隔 excel计算毛重和皮重时间间隔方法 在日常工作中经常会到用excel&#xff0c;有时需要计算毛重和皮重的时间间隔&#xff0c;具体的计算方式是什么&#xff0c;一起来了解一下吧 在日常工作中经常会到用excel&#xff0c;在整理编辑过磅数据…

美创科技与河南金融信创生态实验室签署战略合作协议

2024年1月31日&#xff0c;由普惠通科技与河南省科学院物理所、北京交通大学、中国金融电子化集团重庆金融认证中心联合发起成立中部地区第一家金融信创生态实验室运营公司&#xff08;即河南豫科普惠通信创科技有限公司&#xff09;与杭州美创科技股份有限公司战略合作签约仪式…

【python】学习笔记02-判断语句

2.1 布尔类型和比较运算符 1. 在Python中&#xff0c;可以表示真假的数据类型是&#xff1a; 布尔类型&#xff0c;字面量True表示真&#xff0c;字面量False表示假 2. 除了可以定义布尔类型外&#xff0c;还可以通过____计算得到布尔类型&#xff1f; 通过<比较运算符>…

精雕细琢的文档体验:Spring Boot 与 Knife4j 完美交汇

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 精雕细琢的文档体验&#xff1a;Spring Boot 与 Knife4j 完美交汇 前言Knife4j 与 Swagger 的区别1. 特性与优劣势对比&#xff1a;Knife4j&#xff1a;Swagger&#xff1a; 2. 选择 Knife4j 的理由&a…

STL之stack+queue的使用及其实现

STL之stackqueue的使用及其实现 1. stack&#xff0c;queue的介绍与使用1.1stack的介绍1.2stack的使用1.3queue的介绍1.4queue的使用 2.stack&#xff0c;queue的模拟实现2.1stack的模拟是实现2.2queue的模拟实现 3.总结 所属专栏&#xff1a;C“嘎嘎" 系统学习❤️ &…

话题:IT行业有哪些证书含金量高?

IT行业有哪些证书含金量高? 1. 以下是一些在IT行业中我认为具有高含金量的证书&#xff1a; 思科认证&#xff08;Cisco Certifications&#xff09;&#xff1a;思科认证是由网络领域的著名厂商——Cisco公司推出的&#xff0c;是互联网领域的国际权威认证。这个认证体系包含…

如何像工程师一样阅读 - 快速阅读技术书籍的9个技巧

0. 目的 在看了 Read Like an Engineer: 9 Tips for Reading Technical Books Fast 之后&#xff0c; 记录一些个人的看法&#xff0c;并在这篇英文文章上作为实验&#xff0c; 记录一下正确的阅读方法。 1. 第一次阅读 1.1 生词表 parcel of the job: 工作中必不可少的部分…

使用cocos2d-console初始化一个项目

先下载好cocos2d-x的源码包 地址 https://www.cocos.com/cocos2dx-download 这里使用的版本是 自己的电脑要先装好python27 用python安装cocos2d-console 看到项目中有个setup.py的一个文件 python setup.py 用上面的命令执行一下。 如果执行正常的话回出现上面的图 然后…

Vue事件中如何使用 event 对象

在Vue中&#xff0c;事件处理函数常常需要获取事件触发时的相关信息&#xff0c;比如鼠标位置、按键信息等。而要获取这些信息&#xff0c;就需要使用event对象。那么在Vue的事件中如何正确使用event对象呢&#xff1f;接下来就来详细介绍一下。 首先&#xff0c;在Vue的事件中…

通过遵循最佳做法来提高 EDA 和 HPC 应用程序的 Azure NetApp 文件性能

介绍 Azure NetApp 文件是一项托管存储解决方案&#xff0c;适用于各种方案&#xff0c;包括高性能计算 (HPC) 基础结构。 低延迟和每秒高 I/O 操作数 (IOPS) 对于大规模企业而言是一种很好的组合。 假设你就职于一家半导体公司。 你的任务是设计公司的集成电路芯片&#xff…

P59---第二阶段B C 相电流

P59---第二阶段B C 相电流

curl8.6.0 - CURLE_PEER_FAILED_VERIFICATION

文章目录 curl8.6.0 - CURLE_PEER_FAILED_VERIFICATION概述笔记END curl8.6.0 - CURLE_PEER_FAILED_VERIFICATION 概述 在看一个开源工程, 里面用到了curl和openssl, 但是工程使用vcpkg来管理的包, 用CMake来编译 依赖太多了, win10 编译选项为 vs2019 x64/Win32(或者Ninja)…

STM32F1 - 标准外设库_规范

STM32F10x_StdPeriph_Lib_V3.6.0 1> 头文件包含关系2> .c文件内部结构3> 宏定义位置4> 位掩码bit mask5> .c文件中定义私有变量 1> 头文件包含关系 1个头文件stm32f10x.h 就把整个MCU以及标准外设库&#xff0c;就管理了&#xff1b; 2> .c文件内部结构 …