EGGN 512 Lecture-13 Hough

来源:互联网 发布:windows地图可以卸载吗 编辑:程序博客网 时间:2024/06/01 10:07

Hough变换是一种根据边缘来对可能的的参数曲线(直线、圆锥曲线等)位置进行“投票”的方法。
检测直线
众所周知,直线在坐标空间中可以表示为

y=mx+b

给定一个点(x0,y0),可以知道所有通过该点的直线都满足方程
y0=mx0+b

变换该方程的表示形式,将其转换到参数空间,得到
b=x0m+y0

所有通过点(x0,y0)的直线所含有的两个参数mb都要满足上述方程。如下图所示。
这里写图片描述
经过蓝色点(x1,y1)的直线在参数空间中由蓝色的直线表示,红色点(x2,y2)也是如此。红色直线和蓝色直线的交点(m,b)就是同时通过(x1,y1)(x2,y2)的直线的参数,直线方程为y=mx+b
这是此算法的最基本的原理,下面是具体步骤。
首先,初始化一个二维的累加计数器数组A(m,b),将所有元素初始化为0
然后,对于所给定的每一个边界基元(x,y)(图像的边界基元可以事先用canny算法等提取)扫描每一个m0,通过方程b=x0m+y0计算其相应的b0的值,将这一对(m0,b0)的计数器加1。
最后,在累加计数器数组A(m,b)中寻找局部最大值,这些最大值所对应的(m,b)的值即为所检测到的直线的参数。
这里写图片描述
如图所示,其中10为某一个最大值,这表示有10个点为10所在的(m,b)的值“投票”,这一组(m,b)应该代表一条检测到的直线。
在现实使用中,由于累加计数器数组A的维数是有限的,而某些直线可能会有斜率m无穷大的情况。为避免此种情况,通常将直线方程表示为极坐标系下的如下形式。
ρ=xcosθ+ysinθ

这里写图片描述
此时的累加器数组的两个维度为ρθ,其他步骤均相似。
另外,在使用极坐标系时,我们如果知道每个边界基元的梯度方向,将能够减少算法复杂度。由于梯度的角度已经给出了直线的大概角度,因此,可以只利用梯度附近的一个范围内的θ值来计算向应得ρ值。
检测圆形
圆的方程为如下形式
(xx0)2+(yy0)2=r2

此时需要建立的累加计数器数组A应该有三个维度,分别为圆心坐标x0y0和半径r
对于每一个给定的边界基元(x,y),计算每一个可能的圆心所对应的半径的数值,并增加相应累加计数器数组A的数目。最后寻找局部最大值,其对应的位置即为所检测到的圆形。
检测抛物线
与检测圆形类似,只需要将方程形式改为抛物线方程即可,如下。
yy0=a(xx0)2

Hough变换是一种有效的形状提取算法,也有其相应的优缺点。
优点:

  1. 算法实现容易
  2. 对于噪声和缺失点稳定性好

缺点:

  1. 需要仔细选择累加器的区间范围
    由于累加器的坐标都是整数,可是通过方程计算的结果可能并不是整数(如探测直线时计算出的ρ,涉及三角函数运算),因此,对于计算所得到结果应该近似地为哪一个区间进行“投票”需要仔细考虑。小的区间间隔当然可以得到更高的精度,但也意味着运行时间的增长,同时每个区间的累加计数会相应减少,寻找局部最大值变得困难。
0 0