一開始總是糾結於hough變換把影象中的點對映到另乙個參考係中的直線中,是怎麼實現的。即我怎麼知道影象中的點事對映到哪些直線中的。。。。。後面終於明白,其做法是將對映到另乙個參考係的直線離散化,通過求直線上每個點,來構成直線,從而表達出原影象此點所在的所有直線。至於最後是選擇對映到極座標系中是因為減少運算量。本來無邊無際的直線,都可以用有邊有界的模和角度來表示。
hough 變換是基於點-線的對偶性思想。
在影象 xy 裡,所有過點(x ,y)的直線的方程為
y = px + q (1)
其中 p 為斜率, q為截距,它也可以改寫成如式(2)的形式:
q = −px+ y (2)
式(2)可以看作為引數空間 pq 中過點(p ,q)的一條直線。
如圖下所示,在影象空間中 xy 中過點(xi , yi)的直線方程可以寫成yi=pxi+q,也可以寫成q=-pxi+yi,後者表示在引數空間pq中的一條直線。同理對於(xj , yj)也可以寫成上式形式。如下圖:
由此可知,在影象空間中共線的點對應在引數空間裡面相交的線,反過來,在引數空間裡面相交於同乙個點的所有直線在影象空間裡面都有共線的點與之對應,這就是點-線的對偶性。
hough 變換就是根據這樣的關係把空間裡面的檢測問題轉換到引數空間,通過引數空間裡面進行簡單的累計統計來完成直線的檢測任務。
在表示式(2)直線方程時候,如果直線接近豎直方向,則會由於
p
的值都接近無窮而使得計算量增大
,此時我們使用直線的極座標方程來表示直線,如下圖,其方程如式(3) ,
根據這個方程,對於任意一組(λ,θ)都對應一條直線。即原來的點-線對偶性變成了現在的點-正弦曲線對偶性,如圖所示,圖(a)表示影象空間xy 中的5個點,在圖(b)引數空間中對應著5條曲線,這裡的θ為[−90 , +90 ],λ的取值範圍為
由圖可知,影象空間中各個點可以看作它們在引數空間裡面的對應曲線。在圖(b)中,曲線 1,3,5 都過 k 點,這表示在圖(a)中點 1,3,5 處於同一條直線上,同理,圖(a)中點 2,3,4 處於同一條直線上,在圖(b)中它們對應的曲線2,3,4 都通過點 l。
hough 變換的具體實現步驟如下:
(1) 建立乙個引數(λ,θ) 空間的二維的陣列,該陣列相當於乙個累加器。
(2) 順序搜尋影象中所有目標(黑色)畫素,對於每乙個目標畫素,在引數空間中根據式(3)找到對應位置,然後在累加器的對應位置加 1。
(3) 求出引數空間(累加器)中最大值,其位置為(λ',θ')。
(4) 通過引數空間位置(λ',θ') ,根據式(3)找到影象空間中相對應的直線引數。
對於直線hough變換過程,可以這麼認為。依次遍歷影象的所有畫素,對每個畫素判斷是否滿足某個特定條件,若滿足,則經過該畫素的所有直線區域的計數器加1。為了得到經過某個畫素的所有直線區域,可以依次用
θ的所有可能取值(例如θ可以以1度為增量,從-90度取到+90度),根據(3)式求出
λ的值,從而得到很多組(λ,θ),就對應了所有經過此畫素的直線。
下面是實現方式:
為避免hough變換程式中多次計算三角函式值,可以採用先用陣列儲存每個可能的三角函式值,再用查詢表的方法查詢對應三角函式值,從而提高效率。示例如下:
double sin_value[180];
double cos_value[180];
for(int i=-90; i<90; i++)
hough變換的主要流程如下:
for(y=0; y
}
}
上面只是簡單的計算流程,在實際應用中,可以根據畫素點的灰度值、畫素點的範圍等來判斷是否計算當前點對應的所有(λ,θ) Hough變換原理
hough變換原理 一 簡單介紹 hough變換是影象處理中從影象中識別幾何形狀的基本方法之一。hough變換的基本原理在於利用點與線的對偶性,將原始影象空間的給定的曲線通過曲線表達形式變為引數空間的乙個點。這樣就把原始影象中給定曲線的檢測問題轉化為尋找引數空間中的峰值問題。也即把檢測整體特性轉化為...
Hough變換原理
hough變換原理 一 簡單介紹 hough變換是影象處理中從影象中識別幾何形狀的基本方法之一。hough變換的基本原理在於利用點與線的對偶性,將原始影象空間的給定的曲線通過曲線表達形式變為引數空間的乙個點。這樣就把原始影象中給定曲線的檢測問題轉化為尋找引數空間中的峰值問題。也即把檢測整體特性轉化為...
Hough變換原理
霍夫變換於1972年提出,最開始用於影象的直線檢測,後來拓展到圓,曲線等的檢測 對於一條直線y kx b,x,y 就是乙個點.若轉換為b xk y,是不是也可以將 k,b 看作另乙個空間中的點?這個空間就是k b引數空間 在x y影象空間中的一點,對應k b空間的一條直線 而x y影象空間中的兩點連...