- 个人主页: 同学来啦
- 版权: 本文由【同学来啦】原创、在CSDN首发、需要转载请联系博主
- 如果文章对你有帮助,欢迎关注、点赞、收藏和订阅专栏哦
在计算机视觉识别系统中,图像内容通常用图像特征进行描述,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在。在许多应用场合中,通常需要快速准确地检测出直线或者圆等形状,霍夫变换(Hough Transform)作为一种从图像识别几何形状的有效解决方法,受到广泛应用。本文将着重介绍霍夫变换的发展史、技术原理和使用方法等内容。
霍夫变换的发展历史可分为三个阶段:
初期发展阶段
1959年,Paul Hough基于气泡室(Bubble Chamber)图片解析需要发明了霍夫变换(Hough Transform),并于1962年发表了名为“Method and Means for Recognizing Complex Patterns”(中文名称:辨识复杂图案的方法及手段)的专利,其中描述的就是最初形态的霍夫变换。在该专利中,在笛卡尔坐标系下任一条直线均可以由斜率和截距来表示,然后由于垂线的斜率无限大会导致无界变换空间(unbounded transform space)的问题。
推广应用阶段
1972年,霍夫变换由Richard Duda & Peter Hart进行了推广使用,将霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题。
开始流行阶段
1981年,因为Dana H. Ballard 的一篇期刊论文 “Generalizing the Hough transform to detect arbitrary shapes”,让霍夫变换开始流行于计算机视觉界。该文描述了使用模板匹配原理对霍夫变换进行修改,通过了解其形状并旨在其找出图像中的位置和方向,这种改变使得霍夫变换能够检测用其模型描述的任意对象,通过查找模型在图像中的位置来解决图像中查找对象的问题。利用广义霍夫变换(GHT),找到模型位置的问题转换为寻找将模型映射到图像中的变换参数的问题。给定变换参数的值,就可以确定模型在图像中的位置。
霍夫变换是图像处理中的一种特征提取技术,该过程在一个参数空间通过计算累计结果的局部最大值得到一个符合特定形状的集合作为霍夫变换结果。
霍夫变换可用于隔离图像中特定形状的特征的技术,主要应用在图像分析、计算机视觉和数字图像处理领域。目的是通过投票程序在特定类型的形状内找到对象的不完美实例。这个投票程序是在一个参数空间中进行的,在这个参数空间中,候选对象被当作所谓的累加器空间中的局部最大值来获得,所述累加器空间由用于计算霍夫变换的算法明确地构建。最基本的霍夫变换是从黑白图像中检测直线(线段)。Hough变换主要优点是能容忍特征边界描述中的间隙,并且相对不受图像噪声的影响。
霍夫变换主要分为霍夫直线变换与霍夫圆变换两种,下面分别对其进行介绍。
在笛卡尔坐标系中,直线可由斜截式方程表示,即有:
y = m x + b (1) y=mx+b\tag{1} y=mx+b(1)
笛卡尔坐标系 | 霍夫空间 | |
---|---|---|
变量与参数互换 | 变量( x , y x,y x,y)参数( m , b m,b m,b) y = m x + b y=mx+b y=mx+b | 变量( m , b m,b m,b)参数( x , y x,y x,y) b = x m + y b=xm+y b=xm+y |
直线→点 | 直线 y = m x + b y=mx+b y=mx+b | 点( m , b m,b m,b) |
点→直线 | 多条经过点( x , y x,y x,y)的直线 y = m i ∗ x + b i y=m_i*x+b_i y=mi∗x+bi | 一条直线,斜率为 − x -x −x,截距为 y y y,经过( m i , b i m_i,b_i mi,bi) |
当直线斜率不存在(或无限大),即 m m m值接近于无限值时,该情形已不能用斜截式来表示,此时需要用到极坐标法,即有:
r = x c o s θ + y s i n θ (2) r=xcosθ+ysinθ\tag{2} r=xcosθ+ysinθ(2)
其中 r r r是原点到直线上最近点的距离, θ θ θ是x轴与连接原点和最近点直线之间的夹角。如下图所示。
笛卡尔坐标系 | 霍夫空间 | |
---|---|---|
变量与参数互换 | 变量( x , y x,y x,y)参数( θ , r θ,r θ,r) r = x c o s θ + y s i n θ r=xcosθ+ysinθ r=xcosθ+ysinθ | 变量( θ , r θ,r θ,r)参数( x , y x,y x,y) |
直线→点 | 直线 r = x c o s θ + y s i n θ r=xcosθ+ysinθ r=xcosθ+ysinθ | 点( θ , r θ,r θ,r) |
点→直线 | 多条经过点( x , y x,y x,y)的直线 r i = x ∗ c o s θ i + y ∗ s i n θ i r_i=x*cosθ_i+y*sinθ_i ri=x∗cosθi+y∗sinθi | 一条曲线,经过( θ i , r i θ_i,r_i θi,ri) |
霍夫圆变换的基本思路是认为图像上每一个非零像素点都有可能是一个潜在的圆上的一点,跟霍夫线变换一样,也是通过投票生成累积坐标平面,设置一个累积权重来定位圆。
在笛卡尔坐标系中圆的方程为:
( x − a ) 2 + ( y − b ) 2 = r 2 (3) (x-a)^2+(y-b)^2=r^2\tag{3} (x−a)2+(y−b)2=r2(3)
其中(a,b)是圆心,r是半径,亦可表述为:
x = a + r c o s θ x=a+rcosθ x=a+rcosθ
y = b + r s i n θ y=b+rsinθ y=b+rsinθ
即有:
a = x − r c o s θ a=x-rcosθ a=x−rcosθ
b = y − r s i n θ b=y-rsinθ b=y−rsinθ
实际上问题转换成求解经过像素点最多的 (a,b,r) 参数对。但发现(a,b,r)的参数空间特别大,计算量特别大,故一般使用霍夫梯度法来解决圆的变换。
如上图所示,如果我们对一个圆求梯度,那么圆上所有的点的梯度的方向均朝向圆心
基于此有如下实现步骤: