图像分割-Hough变换
君骨书生 2020-10-15 数字图像处理
# Hough变换
# Hough变换检测直线
检测直线,针对图像上的边缘点,找出其共线的点集及其直线方程.
对于直角坐标系中的一条直线l,原点到该直线的垂直距离是ρ,垂线与x轴的夹角为θ,可以用ρ,θ表示该直线
直线方程为:
ρρρ2=xcosθ+ysinθ=xρx0+yρy0=xx0+yy0=[x,y][x0,y0]Tρ2=[x,y][x0,y0]T表示从零点到l上任意一点(x,y)构成的向量在从零点到垂点构成的向量上的向量投影,显然(32)为恒等式,即(29)恒成立.
所以l这条直线用极坐标表示(ρ,θ),就是一个点.直角坐标系中的一条直线,对应极坐标系中一个点.
线到点的变换,就是Hough变换.
# Hough变换检测直线的原理
在直角坐标系中,有任意过一点(x0,y0)至直线系,这些直线满足:
ρ=x0cosθ+y0sinθ=(x02+y02)21sin(θ+ϕ)其中:
ϕ=arctan(x0y0)
直角坐标系→极坐标系 | 极坐标系→直角坐标系 |
---|---|
这些直线在极坐标系中对应的点(ρ,θ)构成一条正弦曲线 | 反之,正弦曲线上的一点对应直角坐标系中过(x0,y0)的一条直线 |
![]() | ![]() |
如果图像中有若干个点,过每个点的直线系分别对应于极坐标下的一条曲线
- 如果这些正弦曲线有一个共同的交点(ρ′,θ′),则这些点共线
- 且该直线方程为:
ρ′=xcosθ′+ysinθ′
- 相当于该直线l上的每一个点的过点直线系放在极坐标成为正弦曲线,这些正弦曲线因为在直角坐标系都有共有的一条直线l,因此这些正弦曲线在极坐标系中有一个共交必过点。
# Hough变换的具体实现
Hough变换的实现步骤如下:
- 在ρ,θ极值范围内对其分别进行m,n等分,并设一个二维数组A(m,n),用来统计交点计数值.
- 对图像上的所有边缘点做Hough变换,求每个点在θj(j=0,1,...,n−1)Hough变换后的ρi,判断(ρi,θj)与哪个元素对应,则改数组元素值加1.
- 比较数组元素值的大小,最大值所对应的(ρi,θj),就是这些共线点对应的直线方向的参数.
- 在ρ,θ极值范围内对其分别进行m,n等分,并设一个二维数组A(m,n),用来统计交点计数值.
算法特点:
- 对ρ,θ量化过粗,直线参数就不精确,过细则计算量增加,因此,对ρ,θ的量化要兼顾参数量化精度和计算量.
- Hough变换检测直线的抗噪性能强,能够将断开的边缘连接起来.
# Hough变换检测曲线
# Hough变换的扩展
Hough变换不只对直线,也可以用于圆:
圆的方程为(x−a)2+(y−b)2=R2
与直线相比,圆的参数有a,b,R三个,这时参数空间就增加到三维.
若按照直线处理,运算量较大
解决途径:
- 若已知图的边缘(当然图中还有其他非圆的边沿点混在一起),而且边缘方向已知,则可以减少一维,把上式对x取导数,有
2(x−a)+2(y−b)dxdy=0- (36)式表示参数a,b不独立,只需要用两个参数(例如a和R)组成参数空间,计算量就缩减很多.
Hough变换不只对直线,也可以用于椭圆:
椭圆的方程为a2(x−x0)2+b2(y−y0)2=1
取导数有:
a2x−x0+b2y−y0dxdy=0- 已知道椭圆上一点,则只有三个独立参数,只需要从(a,b,x0,y0)中选取三个参数进行检测.
对于任意曲线,
- 在形状物中可确定一个任意点(xc,yc)为参考点,从边界上任一点(x,y)到参考点(xc,yc)的长度为r,它是ϕ的函数,其中ϕ是(x,y)边界点上的梯度方向.
- 通常把r表示为ϕ的参数方程r(ϕ),(xc,yc)到边界连线的角度为α(ϕ),则(xc,yc)应该满足
xc=x+r(ϕ)cosayc=y+r(ϕ)sina- 对于某已知的边界R,可以按ϕ的大小列成一个二维表格,即ϕi∼(a,r)表,ϕi确定后可以查出a和r,经过(38)可算得(xc,yc)
- 对已知形状建立了R表格后,开辟一个二维存储区,对未知图像个点都来查已建立的R表,然后计算(xc,yc),若未知图像各店计算出的(xc,yc)很集中,就表示已经找到该形状的边界,集中的程度就是找最大值.
# 具体算法步骤
对将要寻找的某物边界建立R表,这是一个二维表,以ϕi的步进值求r和α;
在需要判断被测图像中有无已知某物时,也可对该图某物各点在内存中建立一存储区,存储内容是累加的,把xc,yc从最小到最大用步进表示,并作为地址,记作A(xcmin∼max,ycmin∼max),存储阵列内容初始化为零.
对图像边界上每一点(xi,yi),计算ϕ(x),查原来的R计算(xc,yc)
xc=x+r(ϕ)cos[a(ϕ)]yc=y+r(ϕ)sin[a(ϕ)]使相应的存储阵列A(xc,yc)加1.
在这列中找一最大值,就找出了图像中符合要找的某物体边界.
# 图书文献
MOOC《数字图像处理》——武汉大学——7. 图像分割