1. 程式人生 > >霍夫變換原理

霍夫變換原理

看到網上一堆講原理講得亂七八糟還抄襲的部落格,把自己看懵了……轉手一wiki發現寫得很清晰,這裡貼上來供學習。

對於直角座標系(笛卡爾座標系)平面的一條直線的斜截式:
y = k 0 x +

b 0 y=k_0 x+b_0

這裡將 ( k 0 ,

b 0 ) (k_0 ,b_0 ) 看做引數空間 ( k , b
) (k,b)
中的一點,我們知道當直線與x軸垂直時,k為無窮大,因此斜截式無法表示全部的直線。用Hesse normal form來表示直線的引數這裡是將引數的表示換了,而不是將直線從直角座標系換到極座標系

所以: k = c o s θ s i n θ k =-\frac{cos\theta} {sin\theta } , b = r s i n θ b = \frac{r}{sin\theta} ,代入原斜截式方程得到方程的表示式如下:

y = c o s θ s i n θ x + r s i n θ y = -\frac{cos\theta}{sin\theta} x + \frac{r}{sin\theta}

整理可得 r = x c o s θ + y s i n θ r=xcos\theta + ysin\theta ,因此,給定一個點 ( x 0 , y 0 ) (x_0,y_0) ,通過該點的所有直線的集合(引數是斜率和截距,這裡用ρ、θ表示)表示為:

r = x 0 c o s θ + y 0 s i n θ = x o 2 + y 0 2 ( x 0 x 0 2 + y 0 2 + y 0 x 0 2 + y 0 2 ) = x 0 2 + y 0 2 ( c o s γ c o s θ + s i n γ s i n θ ) = x 0 2 + y 0 2 c o s ( θ γ ) r=x_0cos\theta_ + y_0sin\theta\\=\sqrt{x_o^2+y_0^2}(\frac{x_0}{\sqrt{x_0^2+y_0^2}}+\frac{y_0}{\sqrt{x_0^2+y_0^2}})\\=\sqrt{x_0^2+y_0^2}(cos\gamma cos\theta + sin\gamma sin\theta ) \\= \sqrt{x_0^2+y_0^2}cos(\theta-\gamma)

因此,判斷兩個點是否共線的問題,在經過霍夫變換之後,變成判斷通過兩點的所有直線是否相交的問題。又因為通過一個點的所有直線在(r,θ)平面上代表一條曲線,畫出任意兩個點的兩條曲線,若相交,就表示這兩個點在同一條直線上。