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

news2025/1/20 5:55:57

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.coloradmin.cn/o/1441634.html

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

相关文章

CentOS7集群安装JDK1.8

准备工作 1、提前安装三台虚拟机&#xff0c;可以参考:https://mp.csdn.net/mp_blog/creation/editor/136010108 2、三台虚拟机分别配置免密登录&#xff0c;参考&#xff1a;https://blog.csdn.net/LSW_JAVADP/article/details/121757927 安装 JDK 一、官网下载对应JDK 自…

快速入门Safetensors

快速入门Safetensors 什么是Safetensors架构常用操作速度对比彩蛋 Safetensors官方网址 什么是Safetensors Safetensors是一种新的简单格式&#xff0c;用于安全存储张量(与pickle相反)&#xff0c;而且速度仍然很快(零拷贝)。 架构 常用操作 # pip install safetensors# L…

形态学算法之边界提取的简单python实现——图像处理

原理 图像处理中的边界提取是一项基本而重要的任务&#xff0c;主要用于识别和提取图像中物体的轮廓或边界。 具体流程 1.边缘检测 边界提取的第一步通常是边缘检测。边缘是图像亮度变化显著的地方&#xff0c;是物体与背景或不同物体间的分界线。边缘检测算法通过识别图像中…

最近vscode链接Autodl出现的问题

最近vscode链接Autodl出现的问题 一、问题的概述 在使用vscode连接autodl远程服务器的时候&#xff0c;在vscode的右下角出现了&#xff0c;以下的问题提示&#xff1a; 远程主机可能不符合glibc和libstdc VS Code服务器的先决条件 二、问题的原因 vscode版本过高的问题&…

代码随想录第15题三数之和去重理解

在代码随想录第15题中&#xff0c;对三数之和三元组进行去重时&#xff0c;出现了这样一行代码 nums[i]!nums[i-1] 是为了对和为0的三元组进行去重。 为什么要这样写&#xff0c;为什么敢这样写&#xff0c;下面进行分析。 如上图所示&#xff0c;本题采用了双指针法。i为从…

零基础学Python(9)— 流程控制语句(下)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。流程控制语句是编程语言中用于控制程序执行流程的语句&#xff0c;本节课就带大家认识下Python语言中常见的流程控制语句&#xff01;~&#x1f308; 目录 &#x1f680;1.while循环 &#x1f680;2.for循环 &#x1…

JAVA设计模式之建造者模式详解

建造者模式 1 建造者模式介绍 建造者模式 (builder pattern), 也被称为生成器模式 , 是一种创建型设计模式. 定义: 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 **建造者模式要解决的问题 ** 建造者模式可以将部件和其组装过程分开…

【GoogleAdmob接入后续】app-ads.txt以及部署Firebase Hosting

目录 一、创建app-ads.txt 二、部署Firebase Hosting云服务&#xff08;仅仅使用它作为一个公开的站点来让Google Admob能访问到app-ads.txt&#xff09; 三、收尾工作 一、创建app-ads.txt 创建txt文件&#xff0c;命名app-ads&#xff0c;后缀txt&#xff0c;内容需去到G…

【QT】day6

#include "home.h" #include "ui_home.h"Home::Home(QWidget *parent): QWidget(parent), ui(new Ui::Home) {ui->setupUi(this);// 从配置文件读取用户名QSettings settings("kim", "ad");username settings.value("usernam…

Python 数据可视化:配色方案

1、引言 在这篇文章中&#xff0c;我们将研究Python的一些配色方案&#xff0c;主要是Seaborn库。这将采用 Python Notebook 格式&#xff0c;其中包括绘图的代码。 2、实验数据 首先导入必要的库&#xff1a; import pandas as pd import seaborn as sns import matplotlib…

腾讯云游戏服务器购买入口,详细配置精准报价

2024年更新腾讯云游戏联机服务器配置价格表&#xff0c;可用于搭建幻兽帕鲁、雾锁王国等游戏服务器&#xff0c;游戏服务器配置可选4核16G12M、8核32G22M、4核32G10M、16核64G35M、4核16G14M等配置&#xff0c;可以选择轻量应用服务器和云服务器CVM内存型MA3或标准型SA2实例&am…

Backtrader 文档学习- Plotting

Backtrader 文档学习- Plotting 虽然回测是一个基于数学计算的自动化过程&#xff0c;还是希望实际通过可视化验证。无论是使用现有算法回测&#xff0c;还是观察数据驱动的指标&#xff08;内置或自定义&#xff09;。 凡事都要有人完成&#xff0c;绘制数据加载、指标、操作…

Vuex介绍和使用

1. 什么是Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式和库。它解决了在大型 Vue.js 应用程序中共享和管理状态的问题&#xff0c;使得状态管理变得更加简单、可预测和可维护。 在 Vue.js 应用中&#xff0c;组件之间的通信可以通过 props 和事件进行&#xff0c…

微信小程序(三十四)搜索框-带历史记录

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.搜索框基本模板 2.历史记录基本模板 3.细节处理 源码&#xff1a; index.wxml <!-- 1.点击搜索按钮a.非空判断b.历史记录&#xff08;去重&#xff09;c.清空搜索框d.去除前后多余空格2.删除搜索 3.无搜索…

【制作100个unity游戏之24】unity制作一个3D动物AI生态系统游戏3(附项目源码)

最终效果 文章目录 最终效果系列目录前言随着地面法线旋转在地形上随机生成动物不同部位颜色不同最终效果源码完结系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第24篇中,我们将探索如何用unity制作一…

肯尼斯·里科《C和指针》第13章 高级指针话题(3)命令行参数

处理命令行参数是指向指针的指针的另一个用武之地。有些操作系统&#xff0c;包括UNIX和MS-DOS&#xff0c;让用户在命令行中编写参数来启动一个程序的执行。这些参数被传递给程序&#xff0c;程序按照它认为合适的任何方式对它们进行处理。 13.4.1 传递命令行参数 这些参数如何…

BestEdrOfTheMarket:一个针对AVEDR绕过的训练学习环境

关于BestEdrOfTheMarket BestEdrOfTheMarket是一个针对AV/EDR绕过的训练学习环境&#xff0c;广大研究人员和信息安全爱好者可以使用该项目研究和学习跟AV和EDR绕过相关的技术知识。 支持绕过的防御技术 1、多层API钩子&#xff1b; 2、SSH钩子&#xff1b; 3、IAT钩子&#x…

比较6*6范围内7个点182个结构的顺序

( A, B )---6*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有6个节点&#xff0c;训练集AB各由6张二值化的图片组成&#xff0c;让A中有7个点&#xff0c;让B全是0&#xff0c;收敛误差7e-4&#xff0c;收敛199次&#xff0c;统计迭代次数平均值并排序。 得到顺序为 用6个点的结构标…

【开源】JAVA+Vue.js实现在线课程教学系统

目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2.3 课时管理模块2.4 课程交互模块2.5 系统基础模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示4.1 管理后台4.2 用户网页 五、样例代码5.1 新增课程类型5.2 网站登录5.3 课…

初识NodeJS

本文主要基于极客时间《Nodejs开发实战》课程。 本篇&#xff08;一&#xff09;为课程的第二篇——技术预研篇。 什么是Nodejs? 来源官网&#xff1a; Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型&#x…