計算機視覺中經常需要識別或者定位某些幾何圖形,比如直線、圓、橢圓,還有其他一些圖形。檢測直線的霍夫變換提供了在影象中尋找直線的一種演算法,是最簡單的一種情形,後來發展到檢測圓、橢圓、還有一般圖形的霍夫變換,其核心思想是把影象中屬於某種圖形的點集(二維)對映到乙個點(可以是高維)上,這個點記錄了點集中點的數目,使得程式通過搜尋峰值找到該點,這個點就是後面要說到的圖形的引數,而該引數的範圍就叫做引數空間。霍夫變換不僅能夠識別出影象中有無需要檢測的圖形,而且能夠定位到該影象(包括位置、角度等),這就非常有用了。接下來將通過分析從簡單到複雜的霍夫變換,匯出霍夫變換的實質。
直線:檢測直線的霍夫變換使用含極座標引數的直線表示型式簡稱極座標式(不是極座標方程,因為還是在笛卡爾座標下表示)——
其中的兩個引數的意義如下圖:
為什麼要用極座標式而不直接用一般形式:ax+by=c(歸一化可以去掉引數c),或者其他的如斜截式、截距式呢?首先它們都會遇到奇異情況,比如c=0,斜率=無窮大,其中乙個截距=0;再乙個是某些形式的引數空間不是閉的,比如斜截式的斜率k,取值範圍從0到無窮大,給量化搜尋帶來了困難。而極座標式就妙在距離和角度兩個引數都是有界的,而且正余弦函式也有界不會發生奇異情況。
直線霍夫變換有兩個引數,且這兩個引數通過極座標式相關聯,所以程式在投票階段(圖形點集轉換到乙個點)只需要遍歷其中乙個,搜尋峰值在二維引數空間進行。
圓:霍夫變換檢測圓使用圓的標準式就可以了——
我們發現圓的方程又比直線多了乙個引數,這三個引數通過上面的方程相關聯,因此在投票階段需要遍歷其中兩個,搜尋峰值在三維引數空間進行。如果影象比較大,那麼這樣的遍歷搜尋是相當耗時的,所以為了滿足實時性後來又發展出其他檢測圓的霍夫變換,比如概率霍夫變換,結合梯度資訊的霍夫變換。
霍夫變換檢測橢圓如果使用橢圓的標準式,那麼將會有五個引數,它們通過標準式相關,檢測圓就已經相當耗時了,如果再用這中方程形式處理勢必失去實際用途。
ballard (1981)一般化了霍夫變換(hough,1962),利用圖形梯度量加快演算法速度,形成了廣義霍夫變換。
透過前面的檢測直線、圓、廣義霍夫變換,已經可以提取出霍夫變換的乙個本質——給出圖形的乙個描述模式,比如圖形點集的方程、函式、**等,然後利用這個模式加上遍歷引數空間,把屬於該模式的圖形點集投射到引數空間的乙個點(實際的離散情況一般不會完美的集中到一點),這個點記錄的是圖形點數目。
廣義霍夫變換之所以能處理任意形狀的圖形並不是找到了可以表示任意圖形的方程(這是不可能的),而是使用表的形式描述一種圖形,把圖形邊緣點座標儲存在一張表中,那麼該圖形就確定下來了,所以其實無論是直線(其實是線段)、圓、橢圓還是其他形狀的幾何圖形,都可以使用同一方法處理,所不同的是這時候的圖形是自定義的,是實在的,而代數方程表示的模式是連續的、抽象的,圓的方程只有一種,但自定義的圓卻是無窮的,只要你認為它足夠圓了就可以。當然兩種表示都會有各自的優勢和侷限。有了表之後就需要找到一種可以把圖形點集投射到引數空間的一點的轉換演算法,例如直線和圓霍夫變換通過方程(函式)及遍歷把點集進行投射,使得屬於某直線或圓的點集中到乙個點;那麼僅有一張描述圖形邊緣座標點的表如何進行投射呢?我們可以把這張表看作是模板,進行模板匹配,大部分的點匹配成功也就可以理解為這些點都投射到乙個點上,不過這時候不需要再搜尋引數空間峰值了,這種模式可以認為是引數間沒有任何關聯,所以是完全的遍歷。但有旋轉加上縮放的情況模板匹配型的霍夫變換是十分耗時的,也可以想象成因為引數不相關所以增加遍歷搜尋時間。ballard (1981)的廣義霍夫變換最精妙之處在於為引數增加了兩個關聯,使得有平移和旋轉(無縮放)的情況只需要遍歷乙個引數,三個引數分別是圖形的中心座標(橫縱),旋轉角度(相對參考圖形),ballard的演算法預先把參考圖形邊緣點對中心的徑向量儲存起來,利用待搜尋圖形邊緣點的梯度方向(用相對座標軸的角度表示)作為索引找到相應的徑向量,加上該量後就完成了投射,所以要遍歷的引數只有旋轉角度,所以說有兩個關聯。當然如果加上縮放就要遍歷兩個引數,這也只是和霍夫檢測圓的規模一樣而已。這種廣義霍夫變換的圖形表不再是直接儲存座標,而是邊緣點的梯度加上徑向量,給出了這些量同樣的也就能夠表示出一種圖形了。然而這種廣義霍夫變換也是有缺陷的,不少後來者提出了改進方法,這不在本文討論範圍。
再來強調一次,霍夫變換就是通過圖形的一種表示模式,加上一種轉換方法,把圖形的點集投射到乙個點上以便檢測。我們已經能夠知道,引數個數越少,需要遍歷的引數個數約少(關聯越多),引數空間越小則處理速度越快。所以設計一種合理的轉換方法非常關鍵。
對於一種圖形,在現實世界中可以有多種形變,線性的如:平移、旋轉、透視;非線性的如:徑變、切變、扭曲。每多考慮一種形變都會增加引數,比如把橢圓看作是圓的透視形變,結果多了兩個引數,理論上可以去遍歷每乙個引數空間,但這不能滿足實時性要求,所以引數之間約束(關聯)越多則處理速度越快,ballard的廣義霍夫變換就是例子,這就需要發揮主觀創造力了。
OpenCV 霍夫線變換 霍夫圓變換
關於霍夫變換在官方文件opencv249裡的描述如下 api如下 void houghlines inputarray image,outputarray lines,double rho,double theta,int threshold,double srn 0,double stn 0 vo...
缺點 霍夫圓 霍夫變換
霍夫變換是一種特徵提取,被廣泛應用在影象分析 電腦視覺以及數字影像處理。霍夫變換是用來辨別找出物件中的特徵,例如 線條。他的演算法流程大致如下,給定乙個物件 要辨別的形狀的種類,演算法會在引數空間中執行投票來決定物體的形狀,而這是由累加空間 accumulator space 裡的區域性最大值來決定...
霍夫變換 Hough Transform
霍夫變換的主要作用是從影象中檢測出具有某種相同特徵的幾何形狀,如直線 圓等。霍夫變換的基本原理 例如檢測情景為直線檢測。我們知道,在直角座標系下,直線方程表示為y k x b 其中k,b 為引數,表示直線的斜率和截距。那麼,對於直角座標系下的某個特定點 x 0,y0 過該點的任意直線方程為y0 k ...