【图像处理】Hough变换检测直线与圆的原理

news2024/11/27 16:44:16

霍夫变换的基本原理

霍夫变换(Hough Transform)可以理解为图像处理中的一种特征提取技术,通过投票算法检测具有特定形状的物体。霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间中的一个点形成峰值,从而把检测任意形状的问题转化为统计峰值问题。(把这句话背下来吧)

直线检测

背景知识

高中的时候我们都学过笛卡尔坐标系 (x, y) 也就是直角坐标系,在这个坐标系中可以有很多种方法来表示一条直线,例如点斜式 y − b = k ∗ ( x − a ) y - b = k*(x - a) yb=k(xa) 或者两点式 y − y 2 = y 1 − y 2 x 1 − x 2 ∗ ( x − x 2 ) y - y_2 = \frac{y_1 - y_2}{x_1 - x_2}*(x - x_2) yy2=x1x2y1y2(xx2) ,但是在霍夫变换中我们使用的是另外一种表示方法即极坐标系,使用两个变量 ( r , θ ) (r, \theta) (r,θ) 来表示一条直线,具体地 r r r 为一条直线到原点的距离, θ \theta θ 为该直线的垂线与 x 轴的夹角。

img img img

hough变换检测直线的流程

怎么来检测一条直线呢?我们可以取需要检测的图像上的 N 个点,为每个点假设 n 个方向的直线(空间中经过一个点的直线有无数条),通常 n = 180 ,分别计算这 n 条直线的 ( r , θ ) (r, \theta) (r,θ) 坐标,既可以得到 n 个坐标,N 个点就是 N*n 个 ( r , θ ) (r, \theta) (r,θ) 坐标。

那么如果有多个点在一条直线上,那么这几个点在 θ \theta θ 的某个取值 θ i \theta_i θi 处的 r i r_i ri 相等,如果图中只有这条直线的话,那么 θ = θ i \theta = \theta_i θ=θi 时的 $r_i $ 的统计量是最多的,找到这个 θ i \theta_i θi 就意味着找到了这条直线。

拓展到一张图中有多条直线的情况,我们可以设置一个阈值来选择前 k 个统计量的 ( r i , θ i ) (r_i, \theta_i) (ri,θi) 来检测 k 条直线。当然还有相邻两条直线的拼接或者长度要超过某个阈值的直线才需要输出的问题,这些就要看怎么去实现了,不是我们这篇文章的要点,这些功能在 opencv 中都有实现,需要的可以去了解。

下面拿一个博客中的例子来说明:

img

如果空间中有3个点,如何判断这三个点在不在一个直线上?这个例子中,对于每个点均求过该点的6条直线的 ( r , θ ) (r,\theta) (r,θ) 坐标,共求了3*6个 ( r , θ ) (r,\theta) (r,θ) 坐标。可以发现在 θ = 60 \theta = 60 θ=60 时,三个点的 r 都近似为80.7,由此可判定这三个点都在直线(80.7,60)上。

通过 ( r , θ ) (r, \theta) (r,θ) 坐标系可以更直观表示这种关系,如果对于一个给定点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) ,我们在极坐标系下画出经过该点的所有直线的极坐标表示,将得到一条正弦曲线。下图是直角坐标系下的三个点在极坐标系下绘出的图:图中三个点的 ( r , θ ) (r, \theta) (r,θ) 曲线汇集在一起,该交点就是同时经过这三个点的直线。

img

hough变换检测圆的流程

检测直线的时候我们使用 ( r , θ ) (r, \theta) (r,θ) 来表示一条直线,在检测圆时我们是使用 ( a , b , r ) (a,b,r) (a,b,r) 来表示确定一个圆心为 ( a , b ) (a,b) (a,b) 半径为 r r r 的圆。

当某个圆过点 ( x , y ) (x,y) (x,y) 时,满足 ( x − a ) 2 + ( y − b ) = r 2 (x - a)^2 + (y - b) = r^2 (xa)2+(yb)=r2 ,所以过点 ( x , y ) (x,y) (x,y) 的所有圆可以表示为 ( a ( i ) , b ( i ) , r ( i ) ) (a^{(i)},b^{(i)}, r^{(i)}) (a(i),b(i),r(i)) 。与上面检测直线的原理一样,要检测三个点是否在同一个圆上,首先计算过第一个点的所有圆表示为 ( a 1 ( i ) , b 1 ( i ) , r 1 ( i ) ) (a_1^{(i)},b_1^{(i)}, r_1^{(i)}) (a1(i),b1(i),r1(i)) ,过第二个点的所有圆表示为 ( a 2 ( i ) , b 2 ( i ) , r 2 ( i ) ) (a_2^{(i)},b_2^{(i)}, r_2^{(i)}) (a2(i),b2(i),r2(i)) ,过第三个点的所有圆表示为 ( a 3 ( i ) , b 3 ( i ) , r 3 ( i ) ) (a_3^{(i)},b_3^{(i)}, r_3^{(i)}) (a3(i),b3(i),r3(i)) ,如果这三个点在同一个圆上,那么存在一个值 ( a k , b k , r k ) (a_k, b_k, r_k) (ak,bk,rk) 是三个点的所有圆表示中都存在的,也就是说这三个点同时在圆 ( a k , b k , r k ) (a_k, b_k, r_k) (ak,bk,rk) 上。

下面借助这张图来形象理解:

先说说怎么表示过点 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) 的所有圆的表示。当 r 1 r_1 r1 确定时,根据 $(x_1 - a_1)^2 + (y_1 - b_1) = r_1^2 $ ,即 ( a 1 , b 1 ) (a_1,b_1) (a1,b1) 的轨迹则变成了以 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) 为圆心 r 1 r_1 r1 为半径的圆,取完所有的 r 1 i r_1^i r1i ( a 1 ( i ) , b 1 ( i ) , r 1 ( i ) ) (a_1^{(i)},b_1^{(i)}, r_1^{(i)}) (a1(i),b1(i),r1(i)) 的轨迹便如图中的一个圆锥,三个点的所有圆表示形成的圆锥的交点 A 所对应的那个 ( a k , b k , r k ) (a_k, b_k, r_k) (ak,bk,rk) 便是经过这三个点的圆。img

椭圆或者其他形状同理,只要找到一种表示即可将在一个空间中的形状问题变换到另一个空间的点统计问题。

拓展

图像处理中,在使用霍夫线变换之前,要首先对图像进行边缘检测,即霍夫线变换的直接输入只能是边缘二值图像。

参考资料

Hough变换检测原理

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

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

相关文章

菜菜学paddle第七篇:目标检测的基本概念

一、什么是目标检测? 在前面的几篇中,我们学习了使用卷积神经网络进行图像分类,比如手写数字识别是用来识别0~9这十个数字。与图像分类处理单个物体的识别不同,目标检测它识别的不仅是物体,还是多个物体,…

[附源码]Python计算机毕业设计高校教务管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

Spring之IOC

IoC(Inverse of Control:控制反转)是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由Spring框架来管理。 IoC 在其他语言中也有应用,并非 Spirng 特有。 IoC 容器是 Spring 用来实现 IoC 的载体&#xff0…

服务攻防-应用协议RsyncSSHRDPFTP漏洞批扫口令猜解

目录 测试思路 (一)口令猜解——SSH&RDP&FTP Demo: (二)配置不当-未授权访问-Rsync 文件备份 尝试读取src文件 (三)协议漏洞-应用软件-FTP&Proftpd 搭建 (四)协议漏…

音视频- iOS使用metal渲染图像(一)

概要 本文主要总结一下Metal的基本使用,用来渲染拍照的到的图像,其中涉及到的有UIKit中的MTKView,Metal中负责渲染的几个类,使用MSL(Metal Shading Language)编写着色器,最终将图片渲染出来…

Python 绘制极坐标图(玫瑰花图优化)

风速的玫瑰花图可见 Matlab 绘制风速、风向统计玫瑰花图 在今天的这边博文,选用Python工具,绘制玫瑰花图,并对图进行优化。 example 1 【不规则宽度】N = 20 theta = np.linspace(0.0,2*np.pi,N,endpoint=False)

Jmeter(十五):jmeter场景的运行方式(GUI运行和命令行运行)命令行相关参数

jmeter场景的运行方式(GUI运行和命令行运行) 运行方式: GUI运行:通过图形界面方式运行,该运行方式的可视化界面及监听器动态展示 结果都比较消耗负载机资源,建议大并发时不用,一般进行脚本调试; 命令行运…

【PTA-训练day17】L2-029 特立独行的幸福 + L1-071 前世档案

L2-029 特立独行的幸福 - 递归/模拟 判断素数 PTA | 程序设计类实验辅助教学平台 思路&#xff1a; 第一层循环是边界循环 for(int il;i<r;i)枚举每一个i 第二层循环是判断这个i是不是幸福数st数组 判定 i 这个数在迭代过程中是否出现循环 如果出现循环及时跳出比如&…

【TypeScript系列】【一篇就够】TypeScript知识点总结(二)

12 面向对象简介 简而言之&#xff0c;面向对象就是程序之中所有的操作都需要通过对象来完成。 举例来说&#xff0c; 操作浏览器要使用windows对象&#xff1b;操作网页要使用document对象&#xff1b;操作控制台要使用console对象。一切操作都要通过对象&#xff0c;也就是…

nacos--扩展--03--系统参数

nacos–扩展–03–系统参数 1、Nacos Server 配置参数位置&#xff1a;{nacos.home}/conf/application.properties里注意&#xff1a;如果参数名后标注了(-D)的&#xff0c;则表示是 JVM 的参数&#xff0c;需要在{nacos.home}/bin/startup.sh里进行相应的设置。 案例&#xf…

测试用例等级怎么划分?别再傻傻的一脸懵逼

我们都知道测试工程师最基本的能力便是编写测试用例&#xff0c;可是看似简单的用例&#xff0c;后面其实蕴含这个很多人忽略的细节&#xff0c;今天就来说测试里面所蕴含的很多细节。 很多时候不只是测试和测试用例息息相关&#xff0c;开发&#xff0c;产品也有的时候对于测试…

C/C++程序的断点调试 - CodeBlocks

本文以CodeBlocks为例&#xff0c;简述C/C程序断点调试的基本方法和过程。其它的IDE环境&#xff0c;大同小异。 本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载&#xff0c;但需要注明原作者"海洋饼干叔 叔"&#xff1b;本文不允许…

单链表翻转-链表篇

leetcode206单链表的翻转 题目&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出…

如何指定标签在页面中显示的位置

如何指定标签在页面中显示的位置 在HTML页面设计中常常需要调整标签&#xff08;元素&#xff09;的位置&#xff0c;那么&#xff0c;如何指定标签在页面中显示的位置呢&#xff1f; 使用标签的align属性指定标签在页面中显示的位置&#xff0c;如align"left|right|cen…

02加锁源码分析-ReentrantReadWriteLock原理-AQS-并发编程(Java)

文章目录3.1 加锁3.1.1 读锁加锁3.1.1.1 tryAcquireShared()3.1.1.2 readerShouldBlock()3.1.1.3 fullTryAcquireShared()3.1.1.4 doAcquireShared()3.1.2 写锁加锁3.1.2.1 tryAcquire()3.1.2.2 acquireQueued()3.2 加锁示意图3.2.1 先写锁在读锁3.2.2 先读锁在写锁后记3.1 加锁…

全网惟一面向软件测试人员的Python基础教程-Python数据类型中有那些故事呢?

全网惟一面向软件测试人员的Python基础教程 起点&#xff1a;《python软件测试实战宝典》介绍 第一章 为什么软件测试人员要学习Python 第二章 学Python之前要搞懂的道理 第三章 你知道Python代码是怎样运行的吗&#xff1f; 第四章 Python数据类型中有那些故事呢&#xff1f;…

PHP+Laravel框架RabbitMQ简单使用

RabbitMQ安装教程请转到&#xff1a;RabbitMQ安装教程&#xff08;超详细&#xff09; 1、创建生产者 在app/Http/Controllers里创建一个php控制器文件&#xff0c; namespace App\Http\Controllers;use App\Http\Controllers\Controller; //引入amqp扩展 use PhpAmqpLib\Co…

铁路轨道交通智慧管理系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

sklearn基础篇(九)-- 主成分分析(PCA)

1 引言 降维是对数据高维度特征的一种预处理方法。降维是将高维度的数据保留下最重要的一些特征&#xff0c;去除噪声和不重要的特征&#xff0c;从而实现提升数据处理速度的目的。在实际的生产和应用中&#xff0c;降维在一定的信息损失范围内&#xff0c;可以为我们节省大量的…

机器学习项目中Xgboost深入理解(二)梯度及GB的理解

Xgboost 与 GBDT同源&#xff0c;那么所谓的梯度是什么意思呢&#xff1f;G、B又代表什么。 1. 梯度Gradient 梯度是一个向量&#xff08;矢量&#xff09;&#xff0c;表示梯度是方向导数在某一点的最大值。理解为某函数&#xff08;可以指损失函数&#xff09;在某点处的方…