前提: 在霍夫变换之前,我们要对图像进行边缘检测,提取出图像的边缘,然后检测图像的边缘是否为目标图形(直线、圆、椭圆、任意闭合图形)。
霍夫曼变换,用于识别形如
f(x,α)=0(*)形式的图形边缘,其中
x={x,y,…}为自变量向量,
α={a,b,…}为参数向量,对就像(1.1)那样。
1.霍夫变换识别直线
1.1引言
在
x−y平面中,直线方程:
y=ax+b(1.1)
确定了参数
a、
b便确定了直线(1.1)。
考虑: 构建一个参数平面——
a−b平面,那么
a−b平面上的一个点
(a,b)便对应
x−y平面上的一个直线
y=ax+b。那么能否在
a−b平面上找到一个显著的点
(a,b)来确定直线
y=ax+b呢?
取
a−b平面,将
a、
b视为自变量,
x、
y视为变量,则(1.1)变换为
a=xb−xy(1.2)
思路: 设
(x0,y0)、
(x1,y1)是平面
x−y内直线
y=ax+b上的两个点,则
(x0,y0)、
(x1,y1)均满足(1,1),即
{y0=ax0+by1=ax1+b(1.3)
将(1.3)变形,得到
{a=x0b−x0y0a=x1b−x1y1(1.4)
(1.4)的上、下两式分别对应平面
a−b上的两条直线,且两条直线交汇于点(a,b)。
这样,平面
a−b上的点
(a,b)便对应平面
x−y上的直线(1.1)。
由于(1.3)的表示形式可能出现
x=0的情况,无法计算,于是我们采用极坐标平面来进行变换。
1.2极坐标下的霍夫曼直线识别
对于参数平面,不再采用
x−y平面,而采取极坐标平面,极坐标平面
r−θ下的直线方程为
r=xcosθ+ysinθ(1.5)
其中,
x、
y为参数,
r、
θ为自变量。与1.1节中的讨论一致,确定了点
(r,θ),则确定了直线(1.1)。
设点
(x0,y0)和
(x1,y1)为直线(1.1)上的点,则该两点同时满足直线(1.1)对应的极坐标方程
{r=x0cosθ+y0sinθr=x1cosθ+y1bsinθ(1.6)
观察(1.6),可以解出
r和
θ。但故事就这么简单就结束,好像有点“索然无味”
我们观察
r=x0cosθ+y0sinθ有
r=x0cosθ+y0sinθ=x02+y02
sin(θ+β0)=x02+y02
cos(θ−β0)(1.7)
其中,
tanβ0=x0/y0。(1.7)说明,原
x−y平面上的一个点
(x0,y0),对应
r−θ平面上的一个正弦(余弦)曲线。而对于点
(x1,y1)则有
r=x1cosθ+y1sinθ=x12+y12
sin(θ+β1)=x12+y12
cos(θ−β1)(1.8)。其中,
tanβ1=x1/y1。
(1.6)、(1.7)和(1.8)可归结为
{r=x02+y02
sin(θ+β0)r=x12+y12
sin(θ+β1)(1.9)
其中,
tanβ0=x0/y0,
tanβ1=x1/y1。
(1.9)表示,平面
x−y上的点
(x0,y0)和
(x1,y1)分别对应平面
r−θ上的一条正弦(余弦)曲线。而这两条正弦(余弦)曲线的交点
(r,θ)便是极坐标下直线方程(1.5)的参数。
小结: Hough变换的核心思想就是,
x−y平面上一条直线上的两个点
(x0,y0)、
(x1,y1),分别对应参数平面上的两条直线。参数平面上两条线(若为
r−θ平面,则为正、余弦线)的交点,即为
x−y平面上直线
y=ax−b的参数
a和
b(若是极坐标平面,即为
r和
θ)。
1.3识别圆形
圆形坐标
(x−a)2+(y−b)2=r2(1.10)
根据1.2、1.3节中的思路,取参数空间
a−b−r,当确定一个点
(x0,y0)时,对应超平面
(x0−a)2+(y0−b)2=r2(1.11) 即,以点
(a=x0,b=y0)为圆心,半径为
r的一个圆锥。So,给定待识别圆形上的三个点
(x0,y0)、
(x1,y1)和
(x2,y2),那么对应下图右图的三个圆锥。这三个圆锥的共同交叉点
(a′,b′,c′)便是(1.10)的参数。
图片借用自https://blog.csdn.net/jiangsgyx/article/details/83755739
依照上面的原理,我们在实际计算的时候需要一个“三维累加器”(后面讲),显然带来计算上维度的增加。于是有人提出了,在(1.10)对
x求导,得到
2(x−a)+2(y−b)dxdy=0(1.12)
这样就将(1.10)中的三个待定参数降为两个。但是,微分运算会损失信息,导致算法的精度下降。
Note: 但这种改进的Hough变换检测圆的方法其检测精度并不高,原因在于,此种方法利用了边界斜率。从本质上讲,边界斜率其实是用曲线在某一点的弦的斜率来代替的,这种情况下,要保证不存在误差,只有在弦长为零的情况。但在数字图像中,曲线的表现形式是离散的,其在某一点处的斜率指的是此点右向n步斜率或是左向n步斜率。如果弦长过小了,斜率的量化误差就会增大。这种方法比较适用于干扰较少的完整圆形目标。https://blog.csdn.net/jiangsgyx/article/details/83755739
1.4任意图形的识别
记形状物边界上的点为
(x,y),形状物内任意确定一个点
(xc,yc)为参考点。从边界上的点
(x,y)到参考点
(xc,yc)的距离为
r。
r是
ψ的函数,
ψ为边界点
(x,y)的梯度方向。(这里有点类似傅里叶描述子,参见我没写完的blog。没写完,当然是看不见了。)
α是
(xc,yc)到边界
(x,y)连线的角度。如此,
(xc,yc)与
(x,y)的几何关系便简单了,它们应满足
{xc=x+rcosαyc=y+rsinα(1.13)
由于
r和
α都是与
(x,y)相关,而
(x,y)直接对应该点的梯度方向
ψ,故
r和
α为
ψ的函数,即
r(ψ)和
α(ψ),于是(1.13)为
{xc=x+r(ψ)cosα(ψ)yc=y+r(ψ)sinα(ψ)(1.14)
考虑形状上任意点
(xi,yi)都对应自己的梯度方向
ψi,而
ψi显然有
ψi∈[0,2π)。
我们现在已知标准形状R,已知内部选定的参考点
(xc,yc)。根据
{ψi}的划分,填写表-1.
于是,对
|
|
表-1 |
|
|
ψ1 |
(r1,α1) |
(r12,α12) |
… |
(r1m,α1m) |
ψ2 |
(r2,α2) |
(r22,α22) |
… |
(r2m,α2m) |
… |
… |
… |
… |
|
ψn |
(rn,αn) |
(rn2,αn2) |
… |
(rnm,αnm) |
为了方面理解,我认为,表-1可以简化为表-2
|
表-2 |
|
ψ1 |
(r1,α1) |
|
ψ2 |
(r2,α2) |
|
… |
… |
|
ψn |
(rn,αn) |
|
填写好表-2后,在待检测的边缘上依次取点
{(xi,yj)},由点
{(xi,yj)}得到
ψi′,按照临近原则,取到
ψi对应的
(ri,αi),并根据(1.14)计算
(xc′,yc′)。
在区域
A(x,y)中,执行
A(xc′,yc′)=A(xc′,yc′)+1(1.15)
即累加投票。如果
(xc′,yc′)的值相对足够显著,且与
(xc,yc)近似,则认为图形匹配。
推荐阅读
https://blog.csdn.net/shenziheng1/article/details/75307410
https://blog.csdn.net/tercel_zhang/article/details/79928687