Hough(霍夫)变换识别各种图形(直线、圆、椭圆、任意闭合图形)

时间:2024-11-10 22:56:30

前提: 在霍夫变换之前,我们要对图像进行边缘检测,提取出图像的边缘,然后检测图像的边缘是否为目标图形(直线、圆、椭圆、任意闭合图形)。

霍夫曼变换,用于识别形如 (*) 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 xy平面中,直线方程: (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 ab平面,那么 a − b a-b ab平面上的一个点 ( a , b ) (a,b) (a,b)便对应 x − y x-y xy平面上的一个直线 y = a x + b y=ax+b y=ax+b。那么能否在 a − b a-b ab平面上找到一个显著的点 ( a , b ) (a,b) (a,b)来确定直线 y = a x + b y=ax+b y=ax+b呢?

a − b a-b ab平面,将 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=xbxy(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 xy内直线 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=x0bx0y0a=x1bx1y1(1.4)
(1.4)的上、下两式分别对应平面 a − b a-b ab上的两条直线,且两条直线交汇于点(a,b)。

这样,平面 a − b a-b ab上的点 ( a , b ) (a,b) (a,b)便对应平面 x − y x-y xy上的直线(1.1)。

由于(1.3)的表示形式可能出现 x = 0 x=0 x=0的情况,无法计算,于是我们采用极坐标平面来进行变换。

1.2极坐标下的霍夫曼直线识别

对于参数平面,不再采用 x − y x-y xy平面,而采取极坐标平面,极坐标平面 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+y02 sin(θ+β0)=x02+y02 cos(θβ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 xy平面上的一个点 ( 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+y12 sin(θ+β1)=x12+y12 cos(θβ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+y02 sin(θ+β0)r=x12+y12 sin(θ+β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 xy上的点 ( 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 xy平面上一条直线上的两个点 ( 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 xy平面上直线 y = a x − b y=ax-b y=axb的参数 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} (xa)2+(yb)2=r2(1.10)
根据1.2、1.3节中的思路,取参数空间 a − b − r a-b-r abr,当确定一个点 ( 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} (x0a)2+(y0b)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(xa)+2(yb)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