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