影象處理————霍夫(HOUGH)變換
霍夫(HOUGH)變換
霍夫變換是影象處理中用來從影象中分離出具有某種相同特徵的幾何形狀(通常,直線,圓等)的常用方法。經典的霍夫變換常用來檢測直線,圓,橢圓等。
為什麼要進行霍夫變換,當然是為了實現某種目的,比如檢測,(廢話)。它是利用影象全域性特性而將邊緣畫素連線起來組成區域封閉邊界的一種方法。在預先知道區域形狀的條件下,利用霍夫變換可以方便地得到邊界曲線而將不連續的邊緣畫素點連線起來。
霍夫變換的主要優點是受噪聲和曲線間斷的影響小。利用霍夫變換還可以直接檢測某些已知形狀的目標
霍夫變換的基本思想是點 —— 線的對偶性(duality),當然這只不過是所有人都這樣說了,所謂線的對偶性就是線與線的某種變換之後的對應或者對映關係,實際上霍夫變換是直角座標系空間線與變換域空間的線的對映關係,考慮傅立葉變換?當然就是說變換的目的就是便於分析。具體原理如下:
在影象空間XY裡,所有過點(x,y)的直線都滿足方程:
y = px + q
它也可寫成:q = -px + y可以認為是引數空間PQ中過點(p’, q’)的一條直線。在影象空間中共線的點對應在引數空間裡相交的線。
在影象空間中共線的點對應在引數空間裡相交的線.反過來,在引數空間中相交於同一個點的所有直線在影象空間裡都有共線的點與之對應。這就是點——線的對偶性。當然一般選取變換空間是時用的是極座標空間(為什麼?因為影象空間中垂直的直線p趨近於無窮!),霍夫變換根據這些關係把在影象空間中的檢測問題轉換到引數空間裡,通過在引數空間裡進行簡單的累加統計完成檢測任務在具體計算時,需要在引數空間PQ裡建一個2-D的累加陣列。設這個累加陣列為A(p, q),如圖所示,其中[pmin, pmax]和[qmin, qmax] 分別為預期的斜率和截距的取值範圍。開始時置陣列A為零,然後對每一個影象空間中的給定點,讓p取遍P軸上所有可能的值,並根據式q = -px + y算出對應的q。再根據p和q的值(設都已經取整)對A累加:A(p, q)=A(p, q)+1。 累加結束後,根據A(p,q)的值就可知道有多少點是共線的,即A(p, q) 的值就是在(p, q) 處共線點的個數。同時(p, q) 值也給出了直線方程的引數,使我們得到了點所在的線。
具體實現步驟:
1)、構造一個P、Q空間的二維累加陣列A(p,q)
2)、從f(x,y)的指定區域中取(xi,yi),按方程q=-pxi+yi在[pmin,pmax]中遍取可能的p值計算得到可能的q值。
3)、在對應的位置計算A(p,q) =A(p,q)+1
4)、重複2)、3)直到將從f(x,y)的指定區域中的所有點取完。此時,A(p,q)陣列中最大值所對應的p,q就是方程y=px+q中的p、q值。
5)、根據y=px+q繪出f(x,y)中的直線
區域的選擇:來自確認存在直線的區域。
座標的選擇:來自對存在的直線引數的估測。
霍夫變換不僅可用來檢測直線和連線處在同一條直線上的點,也可以用來檢測滿足解析式f(x, c)=0形式的各類曲線,並把曲線上的點連線起來,這裡x是一個座標向量,在2-D影象中是一個2-D向量,c是一個係數向量,它可以根據曲線的不同從2-D到3-D,4-D,…。換句話說,對寫得出方程的圖形都可利用霍夫變換檢測
例如圓周的檢測。圓的一般方程是:
(x - a)^2 + (y - b) ^2 = r^2
式中有3個引數a,b, r,所以需要在引數空間裡建立一個3-D的累加陣列A,其元素可寫為A(a, b, r) 。我們可讓a和b依次變化而根據上式算出r,並對A累加:A(a, b, r) = A(a, b, r) + 1。所以其原理與檢測直線上的點相同,只是複雜性增加了。
從理論上來說,計算量和累加器尺寸隨引數個數的增加是指數增加的,所以實際中霍夫變換最適合於檢測較簡單(即其解析表示式只含有較少引數)曲線上的點。
設圓的半徑r為已知,問題轉化到2-D引數空間,如下圖。原來引數的軌跡為整個圓錐部分表面,如果r已知,則引數的軌跡是半徑為r的圓周。這裡影象空間中的邊界和引數空間裡的軌跡都是圓周,所以這裡是圓周——圓周對偶性。
至於程式碼,在MATLAB工具箱中本身集成了hough變換的函式,SO。。。。就不貼了