(I)直线篇

1 直线是如何表示的?
对于平面中的一条直线,在笛卡尔坐标系中,常见的有点斜式,两点式两种表示方法。然而在hough变换中,考虑的是另外一种表示方式:使用(r,theta)来表示一条直线。其中r为该直线到原点的距离,theta为该直线的垂线与x轴的夹角。如下图所示。

2 如果坐标系中有多个点,又怎样识别出哪些点在一条直线上呢?
使用hough变换来检测直线的思想就是:为每一个点假设n个方向的直线,通常n=180,此时检测的直线的角度精度为1°,分别计算这n条直线的(r,theta)坐标,得到n个坐标点。如果要判断的点共有N个,最终得到的(r,theta)坐标有N*n个。有关这N*n个(r,theta)坐标,其中theta是离散的角度,共有180个取值。
最重要的地方来了,如果多个点在一条直线上,那么必有这多个点在theta=某个值theta_i时,这多个点的r近似相等于r_i。也就是说这多个点都在直线(r_i,theta_i)上。
3 下面拿个例子说明: 

如果空间中有3个点,如何判断这三个点在不在一个直线上,如果在,这条直线是的位置为?

这个例子中,对于每个点均求过该点的6条直线的(r,theta)坐标,共求了3*6个(r,theta)坐标。可以发现在theta=60时,三个点的r都近似为80.7,由此可判定这三个点都在直线(80.7,60)上。
通过 r0theta 坐标系可以更直观表示这种关系,如下图:图中三个点的(r,theta)曲线汇集在一起,该交点就是同时经过这三个点的直线。

在实际的直线检测情况中,如果超过一定数目的点拥有相同的(r,theta)坐标,那么就可以判定此处有一条直线。在r0theta 坐标系图中,明显的交汇点就标示一条检测出的直线。
如下图,可以判定出平面上的点共构成了两条直线,即检测出两条直线。


4 代码:
在matlab中提供了hough变换的代码,有hough,houghlines,houghpeaks,具体的使用可以在help中查到。

(II)圆篇

继使用hough变换检测出直线之后,顺着坐标变换的思路,提出了一种检测圆的方法。
1 如何表示一个圆?
与使用(r,theta)来表示一条直线相似,使用(a,b,r)来确定一个圆心为(a,b)半径为 r  的圆。
2 如何表示过某个点的所有圆?
某个圆过点(x1,y1),则有:(x1-a1)^2 + (y1-b1)^2 = r1^2 。
那么过点(x1,y1)的所有圆可以表示为(a1(i),b1(i),r1(i)),其中r1∈(0,无穷),每一个 i 值都对应一个不同的圆,(a1(i),b1(i),r1(i))表示了无穷多个过点(x1,y1)的圆。
3 如何确定多个点在同一个圆上?
如(2)中说明,过点(x1,y1)的所有圆可以表示为(a1(i),b1(i),r1(i)),过点(x2,y2)的所有圆可以表示为(a2(i),b2(i),r2(i)),过点(x3,y3)的所有圆可以表示为(a3(i),b3(i),r3(i)),如果这三个点在同一个圆上,那么存在一个值(a0,b0,r0),使得 a0 = a1(k)=a2(k)=a3(k) 且b0 = b1(k)=b2(k)=b3(k) 且r0 =  r1(k)=r2(k)=r3(k),即这三个点同时在圆(a0,b0,r0)上。
从下图可以形象的看出:

首先,分析过点(x1,y1)的所有圆(a1(i),b1(i),r1(i)),当确定r1(i)时 ,(a1(i),b1(i))的轨迹是一个以(x1,y1,r1(i))为中心半径为r1(i)的圆。那么,所有圆(a1(i),b1(i),r1(i))的组成了一个以(x1,y1,0)为顶点,锥角为90度的圆锥面。
三个圆锥面的交点A 既是同时过这三个点的圆。
4 怎样用代码实现检测圆的过程?
 上面的分析虽然很简单,但是用代码实现起来就麻烦了,首先过每一个点的(a(i),b(i),r(i))都有无穷多个,若是要检测的点很多,要两两比较所有的(a,b,r)值是否相等实在是一个巨大的运算量。
……未完待续……
转自:http://blog.163.com/yuyang_tech/blog/static/21605008320130233343990/

转载于:https://www.cnblogs.com/wangduo/p/5009723.html

hough变换是如何检测出直线和圆的?相关推荐

  1. hough变换是如何检测出直线和圆的

    (I)直线篇 1 直线是如何表示的? 对于平面中的一条直线,在笛卡尔坐标系中,常见的有点斜式,两点式两种表示方法.然而在hough变换中,考虑的是另外一种表示方式:使用(r,theta)来表示一条直线 ...

  2. 【图像检测-道路检测】基于hough变换实现道路检测直线检测附matlab代码

    1 内容介绍 随着遥感技术和计算机技术的飞速发展,遥感图像的采集变得越来越容易,遥感图像中的物体特征识别及检测变得越来越重要,直线是图像中物体基本的特征之一,研究图像中直线的检测算法对计算机视觉和模式 ...

  3. 基于Python利用OpenCV实现Hough变换的形状检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 今天我们将学习如何借助霍夫变换技术来检测图像中的直线和圆. 什么是 ...

  4. 图像分割实战之基于Hough变换提取图像中的直线

    图像分割的依据是基于图像中各区域具有不同的特性(比如,灰度.颜色.纹理).图像分割的目的是将图像划分成若干具有相近或相同特性的子区域,以便继续在分割成的相关区域中提取目标,并进而根据目标的特征或结构信 ...

  5. Hough变换的方法检测直线段,效果良好

    转自pund, Hough_Grd 程序下载地址:点击下图,并在下图所示的路径下寻找 实验1效果 距离方向图 检测出的直线段 实验2 效果 没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自 ...

  6. Hough变换原始形式-直线检测

    1.直角坐标系与极坐标系中的直线表示 1.1 直角坐标系与极坐标系 中的点的表示及它们之间相互关系 极坐标系(polar coordinates)是指在平面内由极点O.极轴L和极径r组成的坐标系,下图 ...

  7. 直线/曲线检测:Randon变换与Hough变换

    一. Randon 变换 Radon变换简介 Tips: Radon变换的基本原理: 一个平面内沿不同的直线(直线与原点的距离为d,方向角为alfa)对f(x,y)做线积分,得到的像F(d,alfa) ...

  8. hough变换检测直线 matlab,Matlab实现Hough变换检测图像中的直线

    Hough变换的原理: 将图像从图像空间变换至参数空间,变换公式如下: 变换以后,图像空间与参数空间存在以下关系: 图像空间中的一点在参数空间是一条曲线,而图像空间共线的各点对应于参数空间交于一点的各 ...

  9. 【车道线识别】基于matlab hough变换道路检测直线检测【含Matlab源码 2074期】

    ⛄一.Hough变换图片车道线检测简介 1 引言 随着人们生活水平的提高, 科技的不断进步, 智能驾驶技术逐渐受到了研究者们的广泛研究和关注.先进驾驶辅助系统 (Advanced Driver Ass ...

  10. 基于边缘检测与Hough变换的车道线检测

    基于边缘检测与Hough变换的车道线检测 第一章:绪论 1.1 研究意义及背景 高速公路的通行里程是一个国家发展水平的重要标志之一.高速公路具有车辆通行能力大.交通事故少.经济效益高的特点,它的不断发 ...

最新文章

  1. RenderMonkey基本使用方法
  2. 学习笔记84—[深度学习]神经网络反向传播(BackPropagation)
  3. Ubuntu 12.10 安装 JDK1.7.0_15
  4. BeanFactory 和ApplicationContext 有什么区别?
  5. cpu漏洞linux修复,【图片】为什么linux mint上cpu漏洞直到现在也没完全修复?_linux吧_百度贴吧...
  6. 安卓设备刷linux发行版,绝对精华,大牛教你在Android系统上安装linux发行版
  7. cpu开核_新锐龙让AMD重返巅峰,但逆袭的50年里这些CPU也不应忘记
  8. ActiveRecord.JS 与 Google Gears
  9. python数据显示为什么只能显示最后一个变量,Python变量和简单数据类型,之,的
  10. 分享帝国CMS采集教程(图文详解)
  11. window 下 win10 jdk8安装与环境变量的配置(超级详细)
  12. 响应国家号召,摆摊秘籍,摆摊必看《城市地摊财富秘籍》新版目录
  13. python结束运行快捷键_Pycharm2017常用快捷键
  14. yapi 数据库隔天数据就全没了_Yapi 部署
  15. jboot 增加llog4j日志
  16. 豆瓣社区:《如何高效学习》应用与心得
  17. 面试- 阿里-. 大数据题目- 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?...
  18. 基于Curator的Zookeeper操作实战
  19. 全名k歌自定义图文链接(卡片)
  20. 大学为什么选择学习安卓软件开发?

热门文章

  1. paip.mysql备份慢的解决
  2. C#.NET com组件的编写
  3. paip.按键精灵调用其它程序及DLL以及EXE命令行的方法
  4. Julia: ...的作用,有意思!
  5. 合规不利于安全的五种情形
  6. 2017:社保再选管理人基金公司争“主力”
  7. C# 同一应用程序域不同线程之间的参数传递方式
  8. 达摩院年终发布:2022十大科技趋势
  9. 【手写字母识别】基于matlab GUI ELMAN+BP神经网络手写大写字母(A-O)识别【含Matlab源码 785期】
  10. 【财务预警】基于matlab BP神经网络财务预警【含Matlab源码 494期】