霍夫变换原理说明
霍夫變換原理說明
在直角坐標系上有一點 B B B,經過這個點有一條直線, ρ \rho ρ為原點到該直線的距離,垂足是點 A A A,這個線段與x軸的夾角為 θ \theta θ。如下圖1所示:
圖1思考1:能不能用 ( ρ , θ ) (\rho,\theta) (ρ,θ)來表示經過點 B B B的一條直線呢?
我們先來看圖2,對于點 B B B,假定它的坐標是 ( x 0 , y 0 ) (x_0,y_0) (x0?,y0?),那么向量 O B ? = ( x 0 , y 0 ) \vec{OB}=(x_0,y_0) OB=(x0?,y0?), O O O是原點。
而在 O A ? \vec{OA} OA方向上的單位向量為 e ^ = ( cos ? θ , sin ? θ ) \hat{e}=(\cos \theta, \sin \theta) e^=(cosθ,sinθ),所謂單位向量就是長度為1的向量。
圖2在高數中,一個向量 a ? \vec{a} a與一個單位向量 e ^ \hat{e} e^的向量乘積等于 a ? \vec{a} a在 e ^ \hat{e} e^方向上的投影,如下圖3所示:
向量的投影具體解釋請參考同濟大學第七版的下冊的第八章第一節。
圖3按照這個性質, O B ? \vec{OB} OB和 e ^ \hat{e} e^的向量乘積 O B ? ? e ^ \vec{OB} \cdot \hat{e} OB?e^,就是 O B ? \vec{OB} OB在單位向量 e ^ \hat{e} e^方向上的投影,這個投影是什么呢?顯然是 ρ \rho ρ。
所以
ρ = O B ? ? e ^ = ( x 0 , y 0 ) ? ( cos ? θ , sin ? θ ) = x 0 cos ? θ + y 0 sin ? θ \rho = \vec{OB} \cdot \hat{e}=(x_0,y_0) \cdot (\cos\theta, \sin\theta)=x_0 \cos\theta + y_0 \sin\theta ρ=OB?e^=(x0?,y0?)?(cosθ,sinθ)=x0?cosθ+y0?sinθ
上面只是證明了點 B B B滿足這個式子,那直線上的其他點是否也滿足這個公式呢?
我們在直線上任取一點 C ( x 1 , y 1 ) C(x_1,y_1) C(x1?,y1?),有 O C ? = ( x 1 , y 1 ) \vec{OC}=(x_1,y_1) OC=(x1?,y1?)。
圖4同理, O C ? \vec{OC} OC在單位向量 e ^ \hat{e} e^上的投影是
ρ = O C ? ? e ^ = ( x 1 , y 1 ) ? ( cos ? θ , sin ? θ ) = x 1 cos ? θ + y 1 sin ? θ \rho = \vec{OC} · \hat{e} = (x_1,y_1) \cdot (\cos\theta,\sin\theta)=x_1 \cos\theta + y_1 \sin\theta ρ=OC?e^=(x1?,y1?)?(cosθ,sinθ)=x1?cosθ+y1?sinθ
由此可以知道,直線上的任一點 ( x , y ) (x,y) (x,y)都滿足:
ρ = x cos ? θ + y sin ? θ \rho = x \cos\theta + y \sin\theta ρ=xcosθ+ysinθ
所以,只要 ( ρ , θ ) (\rho,\theta) (ρ,θ)確定,那么直線也就唯一確定。
思考2:一個點 ( x , y ) (x,y) (x,y)為什么對應無數個 ( ρ , θ ) (\rho,\theta) (ρ,θ)呢?
原因很簡單,過一個點有無數條直線,每條直線都會對應一個 ( ρ , θ ) (\rho,\theta) (ρ,θ),如圖5所示。
圖5如果放到 ( ρ , θ ) (\rho,\theta) (ρ,θ)坐標系,就會形成一條曲線,如圖6所示:
圖6我們稱 ( ρ , θ ) (\rho,\theta) (ρ,θ)坐標系為霍夫空間。
所以,直角坐標系的一點 ( x , y ) (x,y) (x,y)對應霍夫空間的一條正弦曲線 ρ = x cos ? θ + y sin ? θ \rho=x \cos\theta+y \sin\theta ρ=xcosθ+ysinθ。
同理過點 C C C也有無數條直線,對應著無數個 ( ρ , θ ) (\rho,\theta) (ρ,θ)。
圖7也會形成一條曲線,如圖8所示:
圖8思考3:霍夫空間兩條曲線的相交點意味著什么?
意味著兩點確定的一條直線。
圖8給出的相交點 ( ρ 3 , θ 3 ) (\rho_3, \theta_3) (ρ3?,θ3?),對應著圖7的紅色直線。
所以,我們可以通過霍夫空間中兩個或以上曲線的相交點,來找到 ( x , y ) (x,y) (x,y)空間的一條直線,這就是霍夫變換檢測直線的原理。
圖9思考4:根據上面的原理,實際又是怎么操作的呢?(也就是課程中參數空間劃分網格統計的內容)
給個例子:現有如圖的的7個點。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-kfmRm2Hv-1603519480748)(picts/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20191119182005.png)]
按照霍夫變換原理,對于點 ( x 0 , y 0 ) (x_0,y_0) (x0?,y0?),需要轉換成霍夫空間的一條曲線,我們不可能保存曲線上的所有點 ( ρ , θ ) (\rho, \theta) (ρ,θ),畢竟計算機存儲空間有限,那我們只取特定 θ \theta θ上的曲線點。
第一步: θ \theta θ離散化
下面 θ \theta θ在-90°~90°的范圍(因為 θ \theta θ的周期是180°,當然你也可以在0° ~ 180°的范圍內取值),以45°的步長(步長自己取,要精度高,就取小一點)取5個值:-90°,-45°,0°,45°,90°。因為-90°和90°是同一條線,所以可以去掉其中之一,這里選擇去掉-90°。
第二步:計算 ρ \rho ρ
最后,將 ( x 0 , y 0 ) (x_0,y_0) (x0?,y0?)和 θ \theta θ各個取值代入 ρ = x cos ? θ + y sin ? θ \rho=x \cos\theta+y \sin\theta ρ=xcosθ+ysinθ,求出 ρ \rho ρ,如下圖。
圖11譬如,點 ( 2 , 0 ) (2,0) (2,0)在 θ \theta θ取-45°(也就是 ? π 4 -\frac{\pi}{4} ?4π?)時, ρ = 2 × cos ? ( ? π 4 ) + 0 × sin ? ( ? π 4 ) = 2 ≈ 1.4 \rho=2 \times \cos (-\frac{\pi}{4}) + 0 \times \sin (-\frac{\pi}{4}) = \sqrt{2} \approx 1.4 ρ=2×cos(?4π?)+0×sin(?4π?)=2?≈1.4,對應到上表第一行第一個數值,其他數值依次類推。
第三步:統計 ( ρ , θ ) (\rho,\theta) (ρ,θ)出現的次數
通過圖11已經將點的坐標轉換到霍夫空間,統計所有 ( ρ , θ ) (\rho,\theta) (ρ,θ)出現過的次數,如下圖:
圖12圖12里面有很多 ( ρ , θ ) (\rho,\theta) (ρ,θ)情況都出現過(有的出現1次,有的出現2次,有的出現3次),但并不是所有點我們都要,因為這樣檢出的直線會很多,我們可以設置個閾值,出現次數大于閾值的我們才要。
假定閾值為2,也就是找出現次數大于2的霍夫空間點,這樣會篩選出次數為3的兩個霍夫空間點: ( ρ , θ ) = (\rho,\theta)= (ρ,θ)= (2,0°) 和 ( ρ , θ ) = (\rho,\theta)= (ρ,θ)= (3,90°) 。
對應到坐標空間的兩條直線:
2 = x cos ? 0 + y sin ? 0 , 即 x = 2 2 = x \cos 0 + y \sin0, \quad 即 x = 2 2=xcos0+ysin0,即x=2
和
3 = x cos ? π 2 + y sin ? π 2 , 即 y = 3 3 = x \cos \frac{\pi}{2} + y \sin \frac{\pi}{2}, \quad 即 y = 3 3=xcos2π?+ysin2π?,即y=3
所以最后檢出的兩條直線如下圖:
總結
- 上一篇: [3]Java开发实习面试打卡
- 下一篇: 数据挖掘一般流程及模型整理