Opencv实战(3)详解霍夫变换

霍夫变换

Opencv实战系列指路前文:
Opencv(1)读取与图像操作
Opencv(2)绘图与图像操作

文章目录

  • 霍夫变换
    • 1.霍夫线变换
      • 1.1 原理
      • 1.2 HoughLines()
    • 2.霍夫圆变换
      • 2.1 原理
      • 2.2 HoughCircles()

最基本的霍夫变换是从黑白图像中检测直线(线段)

霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。

1.霍夫线变换

1.1 原理

图像空间点——>参数空间线,图像空间点共线——>参数空间线交点, 参数空间点——>图像空间线

1.2 HoughLines()

void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 )
  • 第二个参数 存储线条,每线条由 $ (\rho , \theta) $表示
  • 第三个参数 rho 距离精度(步长) $ \rho $
  • 第四个参数 theta 角度精度 $ \theta $

2.霍夫圆变换

2.1 原理

$ (x_0-a)2+(y_0-b)2=R^2 $

  1. 从平面坐标到极坐标转换三个参数 C ( a 0 , b 0 , r ) C(a_0,b_0,r) C(a0,b0,r) a0 ,b0是圆心
  2. 图像空间点—>参数空间圆锥,图像空间点共圆—>圆锥截面圆交点, 三维空间点—>图像空间圆

2.2 HoughCircles()

基本原理

  1. 噪声敏感——>中值滤波
  2. 基于图像梯度,检测边缘发现可能圆心,从可能圆心计算最佳半径

霍夫梯度法

  1. 计算图像中每个像素点的梯度方向和大小。可以使用Sobel算子或其他边缘检测算法来计算梯度。
  2. 对于每个像素点,根据其梯度方向和大小,在参数空间中生成可能的直线或圆的参数。对于直线,参数通常是斜率和截距;对于圆,参数通常是圆心坐标和半径。
  3. 对于每个生成的参数组合,统计通过该参数组合的像素点数量。这可以通过累加器数组来实现,数组的每个元素对应一个参数组合,值表示通过该参数组合的像素点数量。
  4. 根据累加器数组的结果,找到可能存在的直线或圆的参数。可以设置一个阈值来筛选出像素点数量大于阈值的参数组合,即为检测到的直线或圆。
  5. 根据检测到的直线或圆的参数,在原始图像上绘制检测结果。
void HoughCircles(InputArray image,OutputArray circles, int method, double dp, double minDist, double param1=100,double param2=100, int minRadius=0, int maxRadius=0 )
  • method : CV_HOUGH_GRADIENT

  • dp : 如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器便有输入图像一半那么大的宽度和高度。

  • minDist :为霍夫变换检测到的圆的圆心之间的最小距离

  • param1 :传递给canny边缘检测算子的高阈值

  • param2 :越小,可以检测更多根本不存在的圆;越大,能通过检测的圆更加接近完美的圆形

connectedComponentsWithStats()

int cv::connectedComponentsWithStats(InputArray image,OutputArray labels,OutputArray stats,OutputArray centroids,int connectivity = 8, int ltype = CV_32S );

retval : 返回值是连通区域的数量。
labels : labels是一个与image一样大小的矩形(labels.shape = image.shape),其中每一个连通区域会有一个唯一标识,标识从0开始。
stats :stats会包含5个参数分别为x,y,h,w,s。分别对应每一个连通区域的外接矩形的起始坐标x,y;外接矩形的wide,height;s其实不是外接矩形的面积,实践证明是labels对应的连通区域的像素个数。
centroids : 返回的是连通区域的质心。

c++

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

python

在这里插入图片描述

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

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

相关文章

C 嵌入式系统设计模式 13:中断模式

本书的原著为:《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》,讲解的是嵌入式系统设计模式,是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述访问硬件的设计模式之六&…

闲扯B-Tree和B+Tree的异同

我们今天要聊一个比较硬的话题: 一个 / 传说中的 / 惊天动地的 / 牛逼的 / 大家都听说过的 / 却又很少实际深入接触到的 / 但又基本每天都在使用的数据结构。(大家注意看上一句话的定语) 我记得我最先接触B树是在大学学数据结构的时候&#x…

能在手机上运行,仅仅0.5B大小的小语言模型MobiLlama

模型介绍 该模型基于LLaMA-7B架构设计,旨在能够在边缘设备上高效运行,无需将数据发送到远程服务器或云端处理。如智能手机、平板电脑、智能手表等。MobiLlama模型虽然体积小、对资源的需求低,但仍能提供高精度的语言理解和生成能力。项目还提…

redis是单线程,为什么这么快?

redis是纯内存操作,C语言编写,执行速度非常快。 采用单线程,避免不必要的上下文切换,不用考虑线程安全问题。 采用I/O多路复用模型,非阻塞I/O。 例如:bgsave和bgrewriteaof都是在后台执行操作&#xff0…

软考50-上午题-【数据库】-SQL访问控制

一、SQL访问控制 数据控制,控制的是用户对数据的存储权力,由DBA决定。 DBA:数据库管理员。 DBMS数据控制应该具有一下功能: 1-1、授权语句格式 说明: 示例: 1-2、收回权限语句格式 示例: PUBLI…

亿道信息新品EM-T195轻薄型工业平板,隆重登场!

EM-T195是一款轻巧但坚固的平板电脑,仅 650克重、10.5mm毫米厚,即使没有额外的便携配件进行辅助,您也可以轻松将其长时间随身携带。耐用性外壳完全密封,防尘防潮;出色的坚固性和可靠性,使T195天生适合在苛刻…

雾锁王国服务器怎么建?雾锁王国服务器搭建方法

雾锁王国Enshrouded服务器搭建怎么搭建?非常简单,阿里云计算巢雾锁王国程序,可以一键搭建雾锁王国多人联机服务器,腾讯云是基于雾锁王国镜像系统,阿里云服务网aliyunfuwuqi.com汇总雾锁王国服务器搭建,超简…

面试经典150题【31-40】

文章目录 面试经典150题【31-40】76.最小覆盖字串36.有效的数独54.螺旋矩阵48.旋转图像73.矩阵置零289.生命游戏383.赎金信205.同构字符串290.单词规律242.有效的字母异位词 面试经典150题【31-40】 76.最小覆盖字串 基本思路很简单,就是先移动右边到合适位置。再移…

在from子句中使用子查询

目录 查询每个部门的编号、名称、位置、部门人数、平均工资 多表查询分组统计 子查询分组统计 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 为了解释这种查询的作用,下面做一个简单的查询 查询每个部门的编号、名称、…

ViewModel 原理

在现代Android应用开发中,ViewModel是架构组件库的一个关键部分,它在提高应用的稳定性和性能方面发挥着重要作用。在这篇文章中,我们将深入探讨ViewModel的工作原理和最佳实践。 ViewModel简介 ViewModel是Android Jetpack架构组件的一部分…

图论(算法竞赛、蓝桥杯)--Dijkstra算法最短路

1、B站视频链接&#xff1a;D02 最短路 Dijkstra 算法_哔哩哔哩_bilibili 题目链接&#xff1a;【模板】单源最短路径&#xff08;弱化版&#xff09; - 洛谷 #include <bits/stdc.h> using namespace std; #define INF 2147483647 int n,m,s,a,b,c; const int N100010…

c++学习记录 vector容器—赋值操作

函数原型&#xff1a; vector& operator(const vector& vec); //重载等号操作符assign(beg,end); //将[beg,end)区间中的数据拷贝赋值给本身assign(n,elem); //将n个el…