原創置頂 大頭青年 最後發布於2018-05-26 20:04:55 閱讀數 3199 收藏
展開最近筆者學習霍夫線變換和lsd直線檢測演算法,有一些學習建議,希望可以給予大家一些幫助。
學習霍夫變換的感想
每個人理解的霍夫變換或許略有差異,但是最主要的是笛卡爾座標系跟極座標系的相互轉換。
霍夫變換分為標準霍夫變換(sht),多尺度霍夫變換(msht),累積概率霍夫變換(ppht)。
標準霍夫變換(sht),多尺度霍夫變換(msht)都由函式houghlines呼叫,累積概率霍夫變換(ppht)由houghlinesp呼叫。
笛卡爾座標和極座標
笛卡爾座標的點 <=> 極座標的曲線
在笛卡爾座標系:直線可由引數斜率和截距(m,b),表示。
在極座標系:可由引數極徑和極角(ρ,θ)表示。
(ρ,θ)就是一對霍夫空間的變數表示。直角座標系中乙個點(x0, y0)可以代表360°的直線的其中乙個點,我們把這個點旋轉360°的直線都用極座標(ρ,θ)表達出來,就是乙個在霍夫空間(ρ,θ)的正弦曲線(大家想象一下,乙個點的360°的直線的(ρ,θ)都不一樣,不一樣的(ρ,θ)組成了正弦曲線上的點)。同樣,直線上的其他點(xn,yn)也會構成一組關於ρ,θ的正弦曲線,這樣勢必存在乙個關於ρ,θ相交(即垂直點(r,θ))。
於是乎, 一條直線能夠通過在極座標下尋找交於一點的曲線數量來檢測,如果越多曲線交於一點,就意味著這個交點表示的直線由更多的點組成。我們可以通過設定直線上點的閾值來定義多少條曲線交於一點我們才認為檢測到了一條直線。
標準霍夫線變換能檢測直線,但是不能夠檢測直線兩端,概率霍夫線變換可以檢測到直線的兩端。如今霍夫變換可以檢測圓及其大部分的形狀。
下圖這是筆者的總結, 如有誤,望請告知。
標準霍夫變換本質上是把影象對映到它的引數空間(即霍夫空間)上,它需要計算所有的m個邊緣點,這樣它的運算量和所需記憶體空間都會很大。如果在輸入影象中只是處理m(m接下來大家學習理解霍夫變換檢測線的源**。
這是霍夫線變換的源**(有中文注釋,利於快速理解):
學習思考:1.檢測直線過程中一條比較粗的直線會被檢測成兩條分割的直線?
2.霍夫線變換有什麼缺點?如何優化?
學習lsd直線檢測的感想
lsd是一種區域性提取的演算法,執行速度比霍夫線變換hough要快。
但是有區域性演算法的缺點:
1.對於直線相交情況,因為設定了每個點是否used,因此每個點只能屬於一條直線,若有相交必有至少一條直線被割裂為兩條。
又因為其基於梯度,直線交點梯度值往往又較小(不被檢測為邊緣點),因此很有可能相交的兩條直線在交點處被割裂為四條線段。
2.由於區域性檢測演算法自增長的特點,對於長線段被遮擋、區域性模糊等原因經常割裂為多條直線。這些缺點在hough變換中不存在。
詳細跳轉至:
不懂lsd演算法原理的話,跳轉至:
學習lsd直線檢測源**:
以上是筆者的學習建議。
霍夫變換檢測直線
對於結構化道路的檢測,常用的方法是採用霍夫變換檢測道路中的直線段。一條直線可以看做是影象上的若干個畫素點組成,也可以用一條直線方程來表示,如 y kx b,那麼霍夫變換檢測直線段其實是將影象畫素點空間變換到引數空間,對於直線來說就是引數 k,b 也可以用來檢測其他形狀如圓和橢圓,只是引數空間表示不一...
霍夫變換檢測直線
對於線性目標提取時,霍夫變換是個很好的手段,博主在這裡做了 實驗,在乙個影象中畫上圓和矩形,通過霍夫變換提取矩形的邊緣。編譯環境為matlab2014a,如下。霍夫變換,找到矩形影象的邊界,用彩色表示出來,矩形和圓不重疊 clc clear all close all i zeros 256,256...
霍夫變換 檢測直線
將笛卡爾座標系的直線用統計展示 座標系a中的點 座標系b中的線 座標系a中的線 座標系b中的點 a中多點的連線 b中多曲線的交點 先理解這樣乙個思維 那麼x y座標系中,點a對應k b座標系的綠直線,點b對應k b座標系的紅直線,連線a b兩點的直線對應,紅綠直線的交點 這裡呼應了上一部分第4點 直...