hough变换检测圆周_hough变换是如何检测出直线和圆的?
(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/
hough变换检测圆周_hough变换是如何检测出直线和圆的?相关推荐
- hough变换检测圆周_hough变换原理以及实现(转载)
原理链接如下:陌归:霍夫(Hough)变换之直线检测 代码链接:Ganso:Fundamentals--从车道线检测谈到霍夫变换 同样是一篇讲解原理的番外,这一篇主要讲解CV中常用的霍夫变换的数学原理 ...
- hough变换是如何检测出直线和圆的
(I)直线篇 1 直线是如何表示的? 对于平面中的一条直线,在笛卡尔坐标系中,常见的有点斜式,两点式两种表示方法.然而在hough变换中,考虑的是另外一种表示方式:使用(r,theta)来表示一条直线 ...
- hough变换检测圆周_用点Hough变换实现圆检测的方法
图像中圆的检测及其参数确定是计算机视觉和模式识 别中一项重要任务.常用的圆检测技术有形状分析法.环路积分微分法[1].圆变换()HoughCHT [2]等.是目前应用CHT 最为广泛的圆检测方法,该方 ...
- hough变换检测圆周_Python OpenCV 霍夫变换
霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体.Hough变换是图像处理中从图像中识别几何形状的基本方法之一.Hough变换的基本原 ...
- 直线/曲线检测:Randon变换与Hough变换
一. Randon 变换 Radon变换简介 Tips: Radon变换的基本原理: 一个平面内沿不同的直线(直线与原点的距离为d,方向角为alfa)对f(x,y)做线积分,得到的像F(d,alfa) ...
- MATLAB仿真高速目标检测-基于keystone变换的微弱目标检测
MATLAB仿真高速目标检测-基于keystone变换的微弱目标检测 高速目标检测具有跨距离走动,不易相参积累,而相参积累时间内,目标的距离走动不能超过半个距离单元,对于高距离分辨雷达或观测高速目标的 ...
- 逆clarke变换_是clarke变换还是clark
匿名用户 1级 2017-06-01 回答 是clarke变换还是clark 第三,关于abc坐标系,这是最重要的:四,:派克变换的初步推导:先推倒从abc系到静止的xyz系的过度矩阵M1,:这三个基 ...
- 理解离散傅立叶变换(一. 傅立叶变换的由来)
理解离散傅立叶变换(一) ------傅立叶变换的由来 关于傅立叶变换,不管是书本还是在网上可以非常easy找到关于傅立叶变换的描写叙述,可是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生 ...
- opencv-python:16_形态学处理【二】(开操作、闭操作、形态学梯度、顶帽变换、黑帽变换,去除皮肤镜中的毛发噪音、cv2.morphologyEx())
形态学处理[二] 开操作.闭操作.形态学梯度.顶帽变换.黑帽变换 相关函数有:cv2.morphologyEx().cv2.getStructuringElement() 有趣的应用:去除皮肤镜中的毛 ...
- Matlab 伪彩色处理方法总结(密度分割法、灰度级变换法、频域变换法)
伪彩色处理方法总结 伪彩色处理是将黑白图像转换为彩色图像,方法分为空域变换及频域变换.空域变换其基本原理是构建颜色映射函数,将灰度值转换为彩色值.因为人眼对彩色图像的分辨能力大于黑白图像,所以伪彩色处 ...
最新文章
- 网络流24题(2) P4014 分配问题
- Linux state 方式 安装nginx 服务
- 安卓队列缓存文件,包括断点续传
- ScriptManager同时存在于两个dll中的问题
- IOCP配合AcceptEx的例子
- SQL Server 2005 在只有MDF文件的情况下恢复(丢失日志文件)
- PCB设计中焊盘的种类,你都见过几种?
- Relatively Prime Powers CodeForces - 1036F (莫比乌斯函数容斥)
- Java中使用Map and Fold进行功能性编程
- 双向(端)链表、栈、队列
- 为什么在实际的 kaggle 比赛中 gbdt 和 random forest 效果非常好?
- phylip软件_进化树专题(五)| 密码子分区软件介绍
- 电脑上怎么做pdf文件_怎么编辑pdf文件内容?什么工具可以编辑pdf?
- Single Number III
- Atitit. Class 元数据的反射操作 api apache 工具
- 04748JAVA语言程序设计实践考试复习
- Unicode 字符编码表
- IDEA格式化HTML页面
- MovieLens数据集
- [QCTF2018]X-man-Keyword