近日遇到乙個需求,要從點雲資料中提取空間平面。看了看計算機圖形學中關於直線檢測的霍夫變換的原理,自己寫了乙個用於三維空間點中進行平面檢測的霍夫變換演算法。
先說從最簡單的,xy平面影象中,提取直線的霍夫變換開始。
假如xy平面上存在一條直線,用方程y=kx+b來表示。那麼在kb平面上就可以用乙個點(k,b)來對應xy平面上的這條直線。這個變換可以反過來,已知xy平面上有乙個點(x0,y0),所有過該點的直線都肯定滿足:y0=k·x0+b。改寫一下就是:b= x0·k + y0,在kb平面上是一條直線。
假如xy平面上存在一系列的點p1,p2,...構成一條直線,那麼對每乙個點都進行霍夫變換,最終會在kb平面上得到乙個直線族,直線族相交於一點(k0,b0),就是所要尋找的直線y=k0·x+b0。
上述演算法原理上可行,但是實際中有兩個嚴重問題:1 平行與y軸的直線斜率k不存在;2 k、b的取值範圍都是(-∞,+∞),程式設計中不可能接受這麼大的平面。
因此直線檢測的霍夫變換用的是法線式直線方程:p=x·cosθ+y·sinθ。θ是法線角度,p是直線到原點距離。很明顯的,θ∈(0,π), p∈(-max(|p1,p2,...|),max(|p1,p2,...|)),在給定一堆點座標的前提下,這兩個引數都是有界的。
最終,為了檢測出直角座標x-y中由點所構成的直線,將p-θ平面分割為許多小格。根據直角座標中每個點的座標(x,y),在θ∈ (0,π)範圍內內以小格的步長計算各個p值,所得值落在某個小格內,便使該小格的累加記數器加1。當直角座標中全部的點都變換後,對小格進行檢驗,計數值最大的小格,其(θ,p)值對應於直角座標中所求直線。
理解直線檢測的原理之後,就可以推廣到三維空間平面檢測。關鍵在於尋找合適的平面方程形式,讓方程引數取值範圍有明確的邊界。參考法線式直線方程,這裡我選擇用點法式平面方程:xsinθcosφ+ysinθsinφ+zcosθ=r。其中r為原點到平面距離,θ為平面法向量天頂角,φ為平面法向量方位角,上述概念不清楚的話可以去參考球座標系。
對於給定的一系列xyz空間點(p1,p2,...),很明顯,θ∈(0,π),φ∈(-π,+π),r∈(0,max(|p1,p2,...|)),我們可以確定乙個有界三維霍夫空間(θ,φ,r),把該空間細分為許多小格仔。對於每乙個空間點座標(x0,y0,z0),按照θ∈(0,π),φ∈(-π,+π)的取值範圍去遍歷計算r = x0·sinθcosφ+y0·sinθsinφ+z0·cosθ,所得值落在某個小格內,便使該小格的累加記數器加1。完成全部霍夫變換後,取計數值最大的小格,對應的(θ,φ,r)值就可以得到xyz空間內的平面。
霍夫變換(直線檢測演算法)
霍夫變換是影象變換中的經典手段之一,主要用來從影象中分離出具有某種相同特徵的幾何形狀 如直線,圓等 霍夫變換尋找直線與圓的方法相比其他方法可以更好的減少雜訊干擾。經典的霍夫變換常用來檢測直線 圓 橢圓等。在實際應用中,y k x b形式的 直線方程 沒有辦法表示x c形式的直線 這時候,直線的斜率 ...
Hough Transform 霍夫變換檢測直線
hough transform 霍夫變換檢測直線 從理論到 再從 到理論 1 理論之通俗理解 1.在影象中檢測直線的問題,其實質是找到構成直線的所有的畫素點。那麼問題就是從找到直線,變成找到符合y mx c的所有 x,y 的點的問題。2.進行座標系變化y mx c,變成c xm b。直線上的點 x1...
霍夫變換檢測直線
對於結構化道路的檢測,常用的方法是採用霍夫變換檢測道路中的直線段。一條直線可以看做是影象上的若干個畫素點組成,也可以用一條直線方程來表示,如 y kx b,那麼霍夫變換檢測直線段其實是將影象畫素點空間變換到引數空間,對於直線來說就是引數 k,b 也可以用來檢測其他形狀如圓和橢圓,只是引數空間表示不一...