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

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

霍夫曼变换,用于识别形如 (*) f ( x , α ) = 0 f(\bold{x},\bold{\alpha})=0 \tag{*} 形式的图形边缘,其中 x = { x , y ,   } \bold{x}=\{x,y,\dots\} 为自变量向量, α = { a , b ,   } \bold{\alpha}=\{a,b,\dots\} 为参数向量,对就像(1.1)那样。

1.霍夫变换识别直线

1.1引言

x y x-y 平面中,直线方程: (1.1) y = a x + b y=ax+b \tag{1.1}
确定了参数 a a b b 便确定了直线(1.1)。

考虑: 构建一个参数平面—— a b a-b 平面,那么 a b a-b 平面上的一个点 ( a , b ) (a,b) 便对应 x y x-y 平面上的一个直线 y = a x + b y=ax+b 。那么能否在 a b a-b 平面上找到一个显著的点 ( a , b ) (a,b) 来确定直线 y = a x + b y=ax+b 呢?

a b a-b 平面,将 a a b b 视为自变量, x x y y 视为变量,则(1.1)变换为 (1.2) a = b x y x a = \frac{b}{x}-\frac{y}{x} \tag{1.2}

思路: ( x 0 , y 0 ) (x_0,y_0) ( x 1 , y 1 ) (x_1,y_1) 是平面 x y x-y 内直线 y = a x + b y=ax+b 上的两个点,则 ( x 0 , y 0 ) (x_0,y_0) ( x 1 , y 1 ) (x_1,y_1) 均满足(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}
将(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}
(1.4)的上、下两式分别对应平面 a b a-b 上的两条直线,且两条直线交汇于点(a,b)。

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

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

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

对于参数平面,不再采用 x y x-y 平面,而采取极坐标平面,极坐标平面 r θ r - \theta 下的直线方程为
(1.5) r = x c o s θ + y s i n θ r = xcos\theta+ysin\theta \tag{1.5}
其中, x x y y 为参数, r r θ \theta 为自变量。与1.1节中的讨论一致,确定了点 ( r , θ ) (r,\theta) ,则确定了直线(1.1)。

设点 ( x 0 , y 0 ) (x_0,y_0) ( x 1 , y 1 ) (x_1,y_1) 为直线(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}
观察(1.6),可以解出 r r θ \theta 。但故事就这么简单就结束,好像有点“索然无味”

我们观察 r = x 0 c o s θ + y 0 s i n θ r = x_0cos\theta+y_0sin\theta
(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}
其中, t a n β 0 = x 0 / y 0 tan\beta_0=x_0/y_0 。(1.7)说明,原 x y x-y 平面上的一个点 ( x 0 , y 0 ) (x_0,y_0) ,对应 r θ r-\theta 平面上的一个正弦(余弦)曲线。而对于点 ( x 1 , y 1 ) (x_1,y_1) 则有
(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} 。其中, t a n β 1 = x 1 / y 1 tan\beta_1=x_1/y_1

(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}
其中, t a n β 0 = x 0 / y 0 tan\beta_0=x_0/y_0 t a n β 1 = x 1 / y 1 tan\beta_1=x_1/y_1
(1.9)表示,平面 x y x-y 上的点 ( x 0 , y 0 ) (x_0,y_0) ( x 1 , y 1 ) (x_1,y_1) 分别对应平面 r θ r-\theta 上的一条正弦(余弦)曲线。而这两条正弦(余弦)曲线的交点 ( r , θ ) (r,\theta) 便是极坐标下直线方程(1.5)的参数。

小结: Hough变换的核心思想就是, x y x-y 平面上一条直线上的两个点 ( x 0 , y 0 ) (x_0,y_0) ( x 1 , y 1 ) (x_1,y_1) ,分别对应参数平面上的两条直线。参数平面上两条线(若为 r θ r-\theta 平面,则为正、余弦线)的交点,即为 x y x-y 平面上直线 y = a x b y=ax-b 的参数 a a b b (若是极坐标平面,即为 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}
根据1.2、1.3节中的思路,取参数空间 a b r a-b-r ,当确定一个点 ( x 0 , y 0 ) (x_0,y_0) 时,对应超平面 (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} 即,以点 ( a = x 0 , b = y 0 ) (a=x_0,b=y_0) 为圆心,半径为 r r 的一个圆锥。So,给定待识别圆形上的三个点 ( x 0 , y 0 ) (x_0,y_0) ( x 1 , y 1 ) (x_1,y_1) ( x 2 , y 2 ) (x_2,y_2) ,那么对应下图右图的三个圆锥。这三个圆锥的共同交叉点 ( a , b , c ) (a',b',c') 便是(1.10)的参数。
在这里插入图片描述
图片借用自https://blog.csdn.net/jiangsgyx/article/details/83755739

依照上面的原理,我们在实际计算的时候需要一个“三维累加器”(后面讲),显然带来计算上维度的增加。于是有人提出了,在(1.10)对 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}
这样就将(1.10)中的三个待定参数降为两个。但是,微分运算会损失信息,导致算法的精度下降。

Note: 但这种改进的Hough变换检测圆的方法其检测精度并不高,原因在于,此种方法利用了边界斜率。从本质上讲,边界斜率其实是用曲线在某一点的弦的斜率来代替的,这种情况下,要保证不存在误差,只有在弦长为零的情况。但在数字图像中,曲线的表现形式是离散的,其在某一点处的斜率指的是此点右向n步斜率或是左向n步斜率。如果弦长过小了,斜率的量化误差就会增大。这种方法比较适用于干扰较少的完整圆形目标。https://blog.csdn.net/jiangsgyx/article/details/83755739

1.4任意图形的识别

在这里插入图片描述
记形状物边界上的点为 ( x , y ) (x,y) ,形状物内任意确定一个点 ( x c , y c ) (x_c,y_c) 为参考点。从边界上的点 ( x , y ) (x,y) 到参考点 ( x c , y c ) (x_c,y_c) 的距离为 r r r r ψ \psi 的函数, ψ \psi 为边界点 ( x , y ) (x,y) 的梯度方向。(这里有点类似傅里叶描述子,参见我没写完的blog。没写完,当然是看不见了。) α \alpha ( x c , y c ) (x_c,y_c) 到边界 ( x , y ) (x,y) 连线的角度。如此, ( x c , y c ) (x_c,y_c) ( 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}

由于 r r α \alpha 都是与 ( x , y ) (x,y) 相关,而 ( x , y ) (x,y) 直接对应该点的梯度方向 ψ \psi ,故 r r α \alpha ψ \psi 的函数,即 r ( ψ ) r(\psi) α ( ψ ) \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}

考虑形状上任意点 ( x i , y i ) (x_i,y_i) 都对应自己的梯度方向 ψ i \psi_i ,而 ψ i \psi_i 显然有 ψ i [ 0 , 2 π ) \psi_i \in [0,2\pi)

我们现在已知标准形状R,已知内部选定的参考点 ( x c , y c ) (x_c,y_c) 。根据 { ψ i } \{\psi_i\} 的划分,填写表-1.

于是,对

表-1
ψ 1 \psi_1 ( r 1 , α 1 ) (r_1,\alpha_1) ( r 1 2 , α 1 2 ) (r_1^2,\alpha_1^2) \dots ( r 1 m , α 1 m ) (r_1^m,\alpha_1^m)
ψ 2 \psi_2 ( r 2 , α 2 ) (r_2,\alpha_2) ( r 2 2 , α 2 2 ) (r_2^2,\alpha_2^2) \dots ( r 2 m , α 2 m ) (r_2^m,\alpha_2^m)
\dots \dots \dots \dots
ψ n \psi_n ( r n , α n ) (r_n,\alpha_n) ( r n 2 , α n 2 ) (r_n^2,\alpha_n^2) \dots ( r n m , α n m ) (r_n^m,\alpha_n^m)

为了方面理解,我认为,表-1可以简化为表-2

表-2
ψ 1 \psi_1 ( r 1 , α 1 ) (r_1,\alpha_1)
ψ 2 \psi_2 ( r 2 , α 2 ) (r_2,\alpha_2)
\dots \dots
ψ n \psi_n ( r n , α n ) (r_n,\alpha_n)

填写好表-2后,在待检测的边缘上依次取点 { ( x i , y j ) } \{(x_i,y_j)\} ,由点 { ( x i , y j ) } \{(x_i,y_j)\} 得到 ψ i \psi'_i ,按照临近原则,取到 ψ i \psi_i 对应的 ( r i , α i ) (r_i,\alpha_i) ,并根据(1.14)计算 ( x c , y c ) (x_c',y_c')
在区域 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}
即累加投票。如果 ( x c , y c ) (x_c',y_c') 的值相对足够显著,且与 ( x c , y c ) (x_c,y_c) 近似,则认为图形匹配。

推荐阅读
https://blog.csdn.net/shenziheng1/article/details/75307410
https://blog.csdn.net/tercel_zhang/article/details/79928687

猜你喜欢

转载自blog.csdn.net/weixin_42624824/article/details/85558594