Hough 变换
作用
霍夫变换是常用的图像变换,用于在图像中寻找直线、圆、椭圆等这类具有相同特征的几何图形。在许多应用场合中,都需要实现对特定形状物体的快速定位,而霍夫变换由于其对方向和噪声不敏感,因此在这类应用中发挥着重要作用。
原理
霍夫变换最基本的思想通俗讲就是将图像中所有可能出现的几何图形位置进行遍历,以直线检测为例,就是在整幅图像中进行扫描所有可能的直线,看图像中的像素点对各直线的贡献。下面以直线为例,形象地进行介绍:
图 1.霍夫变换示意图
如图1所示,矩形点阵表示图像,黑色的点表示边缘的像素点。霍夫变换即在图中寻找所有可能的直线(如蓝色和红色线条),通过计算像素对直线的贡献,来判断是否存在直线。这里像素对直线的贡献的定义,即该图像中像素与直线所交的点的数量。
如图1中所示,我们可以很直观地判断,两条红色直线所在的位置才是原图像中像素点所表示的两条直线位置,而原图对这两条直线的贡献也最大。霍夫变换的关键就是需要总结应该怎么去找这两条直线,寻找一种方式,即能节省资源,又能获得很高效率,并且不漏检任何一条可能的直线。
霍夫变换找直线简单来说分为以下几步:
1. 计算边缘图像;
2. 进行霍夫变换(对每一个边缘的点计算所有可能的经过该点的直线方程);
3. 寻找其中贡献最大的几条直线的参数。
为了能够直观地理解霍夫变换的原理以及实际应用的整个过程,在下面的描述过程中,我以一副图像为例进行讲述。原图如下,这是一幅网上随便找的图片,反正直线多就好啦:
图 2原图
一、边缘图像
边缘图像的求取方法很多,简单的复杂的都有。常见的就是实用一些‘canny’、‘sobel’、‘prewitt’等算子求边缘;复杂的有进行傅里叶变换,然后通过高通滤波提取高频分量,然后再进行傅里叶反变换重构图像提取边缘信息;还有通过Garbor变换、小波等工具进行多尺度分析来提取边缘。总之方法很多,作为一个预备过程,这里不进行过多介绍。下图所示为对原图像进行计算边缘后求得的边缘图像:
图 3边缘图像
在实际的应用过程中,经过简单的边缘提取可能会导致一条较粗的直线会最终提取为两条直线。比如在上述边缘图像中,直线被两侧的边缘所包围,这时候两侧的边缘都可能会检测成直线。这时候对边缘图像进行简答的形态学处理就能有更好的效果,相应地,在提取直线参数的时候也可以进行一些优化。
二、计算霍夫空间(霍夫变换)
进行霍夫变换最重要的就是将所有可能的直线参数化。我们知道,任意一条经过点 的直线都必须满足方程,该式可以转化为。因此经过点的所有直线就是空间中的一条直线,只有是这条直线上的点都满足上述方程。因此如果总共有个边缘像素点,它们在空间中就有条线,并且会有交点,如下图所示:
图 4 空间两直线相交
对于图中两条直线的交点,我们可以理解为同时经过点和的直线,该直线方程为。因此,如果交于一点的直线越多,那么说明原图像对该直线的贡献最大。但是在空间去寻找可能出现的直线很难用计算机实现,因为交点出现的位置任意,范围是整个二维平面。因此,我们将这个直线方程进行转换,用极坐标进行表示,原直线方程就可以表示为:
其中表示直线到坐标原点的距离;表示直线到坐标原点垂线的角度,示意图如下:
图 5直线到极坐标系转换
固定变量和,则原方程就是一个和的方程,该方程对应为空间中对应的是一条正弦曲线。直观来理解,这些直线就是绕坐标进行旋转,并且由于直线的对称性,直线的方程旋转角度后将出现重复。由于图像本身的尺寸是已知的,因此图像中的直线方程用极坐标表示时变量最大也就是图像对角线的长度,如下图4中所示:
图 6最大的取值
因此对于宽为m,高为n的图像,所有的直线方程在空间上的取值范围为:
这是一个有界的矩形区域,里面由一条条正弦曲线组成,大致的形状如下图所示:
图 7 Hough空间示意
图像中粗线条的曲线代表的就是一条条的直线方程,每计算出一条曲线,该曲线的路径上的对应像素灰度就加1。因此,如果有一个像素点被多条曲线相交,那么该点处的像素灰度值就会很高,原图对该点所表示的直线贡献度也高。
在本例程中对边缘图像进行霍夫变换,求得的霍夫空间的图像如下图:
图 8 霍夫空间图像
从图中我们可以看到,图中有多处亮点,位于许多正弦曲线的交点处。这些亮点就是我们下一步需要提取的目标,即原图中存在的直线参数。
三、直线参数提取
在霍夫图像中提取直线参数实质就是进行图像分割,此时分割方式的选取将直接影响直线提取的数量和精确程度。常见的由进行排序后提取固定直线数量的方法,也有基于区域分割的方式等。这些方法针对不同场合有不同的应用,每种方法都有各自的优缺点。这里我使用了一个固定的阈值进行分割,提取高于阈值的像素点。将提取出来的像素点根据其对应的坐标就可以知道该点对应的直线参数和。根据参数,在原图上绘出这些直线,效果如下:
图 9检测结果图
蓝色线条是检测得到的结果,从图中可知,有部分直线没有检测出来;也有部分直线被检测成两条。在边缘检测那节中就介绍过,可以通过适当的方式来消除这些重复的直线,这里介绍一种:对边缘图像进行形态学处理(闭操作),将两侧的边缘合成一条;在检测直线时进行基于区域的分析,求得各区域块之后计算每一个区域的中心坐标,作为直线的参数。这样相邻的直线就不会变检测为两条了,具体操作比较简单这里就不进行介绍了。
其它几何图形的检测方式与直线类似,在后续的博客中再慢慢举例叙述。
Hough 变换的更多相关文章
- hough变换检测线和圆
参考:http://blog.163.com/yuyang_tech/blog/static/21605008320130233343990/ 这篇介绍的基本思想. http://www.cnblog ...
- OpenCV2马拉松第22圈——Hough变换直线检測原理与实现
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/27220445 收入囊中 Hough变换 概率Ho ...
- hough变换是如何检测出直线和圆的?
(I)直线篇 1 直线是如何表示的?对于平面中的一条直线,在笛卡尔坐标系中,常见的有点斜式,两点式两种表示方法.然而在hough变换中,考虑的是另外一种表示方式:使用(r,theta)来表示一条直线. ...
- Hough变换在opencv中的应用
霍夫曼变换(Hough Transform)的原理 霍夫曼变换是一种可以检测出某种特殊形状的算法,OpenCV中用霍夫曼变换来检测出图像中的直线.椭圆和其他几何图形.由它改进的算法,可以用来检测任何形 ...
- Matlab实现Hough变换检測图像中的直线
Hough变换的原理: 将图像从图像空间变换至參数空间.变换公式例如以下: 变换以后,图像空间与參数空间存在下面关系: 图像空间中的一点在參数空间是一条曲线,而图像空间共线的各点相应于參数空间交于一点 ...
- Hough变换-理解篇
Hough变换-理解篇 霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体.该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符 ...
- Hough变换的基本思考
一,概念: Hough变换用于在图像中检测特定性状,如线,圆,矩形等,广泛用于图像识别领域. 二,原理: 1,Hough变换直线检测: 一条直接的方程可表示为:y = a*x + b ,当a,b固定时 ...
- 查找图像中椭圆轮廓的快速随机hough变换
查找图像中椭圆轮廓的快速随机hough变换 图像中椭圆轮廓的查找在视频监控等领域有着广泛的应用,经典hough变换给我们提供了一种查找各种图形轮廓的方法,特别是在直线查找方面具有非常高的精确度.但是由 ...
- Hough变换原理
Hough变换原理 一.简单介绍 Hough变换是图像处理中从图像中识别几何形状的基本方法之一.Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的 ...
- 利用Hough变换识别图像中的直线
引入 近期看到2015年数学建模A题太阳影子定位中的第四问,需要根据附件中视频里的直杆的太阳影子的变化确定拍摄地点.其实确定拍摄地点这个问题并不是十分困难,因为有前三问的铺垫,我们已经得出了太阳影子长 ...
随机推荐
- abstract 和 interfaces 的用法注意事项
abstract : abstract class calssname{} 1.abstract也可也修饰普通的类,这样的目的是为了防止用这个类来创建对象: 2.abstract中的abstract ...
- Error Domain=kCLErrorDomain Code=0 "The operation couldn’t be completed.
地图定位 错误:使用CoreLocation获取地理位置信息,报错 Error Domain=kCLErrorDomain Code=0 "The operation couldn’t be ...
- MariaDB的双主
MariaDB(mysql)之主主复制 一.主主复制说明 MySQL主主复制结构区别于主从复制结构.在主主复制结构中,两台服务器的任何一台上面的数据库存发生了改变都会同步到另一台服务器上, ...
- 搭建高性能计算环境(十)、应用软件的安装之Wien2k
1,首先安装fftw .tar.gz cd fftw- ./configure --prefix=/opt/fftw- --enable-shared --enable-float --enable- ...
- POJ C程序设计进阶 编程题#3 : 排队游戏
编程题#3:排队游戏 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 在幼儿 ...
- 关于MongoDb Replica Set的故障转移集群——理论篇
自从10 gen用Replica Set取代Master/Slave方案后生活其实已经容易多了,但是真正实施起来还是会发现各种各样的小问题,如果不小心一样会栽跟头. 在跟Replica Set血拼几天 ...
- 使用java8的lambda将list转为map(转)
常用方式 代码如下: public Map<Long, String> getIdNameMap(List<Account> accounts) { return accoun ...
- 【转】mysql字符串函数
对于针对字符串位置的操作,第一个位置被标记为1(即:第一个字母索引为1). ASCII(str) 返回字符串str的 最左面字符的ASCII代码值.如果str是空字符串, 返回0.如果str是NULL ...
- PHP错误处理
错误的分类: 1.语法错误 2.运行时错误 3.逻辑错误 调试方法:1.注释法 2.输出法 error_reporting(E_ALL & ~E_NOTICE & ~E_WAR ...
- mamp pro
MAMP PRO Settings and Files /Library/Application Support/appsolute/MAMP PRO ~/Library/Application Su ...