Hough變換在opencv中的應用

2021-06-18 05:13:56 字數 2517 閱讀 6498

霍夫曼變換是一種可以檢測出某種特殊形狀的演算法,opencv中用霍夫曼變換來檢測出影象中的直線、橢圓和其他幾何圖形。由它改進的演算法,可以用來檢測任何形狀的圖形。

找到通過足夠多數量的畫素點的所有直線,它分析每個單獨的畫素,並識別出所有的可能經過它的直線。

當同一條直線穿過許多點,便意味著這條線的存在足夠明顯。

累加器就是用來記錄某條直線被識別了多少次,霍夫曼最直接的想法是,計算所有可能的直線,找出重複數量最多的那幾條,重複次數就是識別的閾值。

hough transform演算步驟(以直線為例):

直線公式: y = ax – b

稱(x,y)為影象空間的座標,(a,b)為引數空間

1. 在影象上找出所有可能的特徵點

2. 對於每個特徵點

1. 對於每個a,計算通過(x,y)的所有直線(a,b)     

2. 在累加器的(a,b)位置上加一

重複步驟2,直到所有的特徵點都計算完畢

1. 找到累加器裡的最大值

2. 將每乙個極大值,對映回上代表的每一條直線

opencv實際採用的是極座標(r,s),以左上角為原點:

r = xcos(s) + ysin(s)

**:

// 選擇特徵點 (x, y)

int x = 50, y = 30;

// 計算通過它的所有直線

for(inti = 0; i < 180; i++)

由上面的數學原理可知,hough轉換是乙個運算耗時,需要大量記憶體的演算法

為了改進原演算法,提出了乙個優化方案,即概率霍夫曼變換

在原演算法的基礎上做了少許的修改

1. 不再逐行掃瞄畫素點,而是隨機挑選

2. 某個直線達到投票值後,掃瞄並移除所有經過的點,這次掃瞄結束後還可以得到線段長度

3. 增加兩個引數:線段最小長度、組成連續線段的最大畫素間隔

演算法複雜度增加,但是參與投票的畫素點少了,補償了整個演算法的複雜度。

霍夫曼變換也可用於檢測其他幾何體,事實上只要是可以用引數方程表示的東西都可以用hough進行檢測

r^2 = (x – a)^2 + (y – b)^2

方程有3個引數,需要3維累加器,如同直線檢測:

// 對某個特徵點 (怎麼選擇是一種優化)

int x, y;

for(a = 0; a < max_a; a++)

for(b = 0; b < max_b; b++)

維度變高後,複雜度和可靠度都會變壞,因為精確定位區域性峰值變的困難了,opencv做了優化,比如只增加圓環梯度方向上的累加器,對結果求直方圖而非極值,峰值對應的是檢測到的園的半徑

雖然很難用引數表示一些形狀,但原理是相同的:建立乙個累加器,用來表示所有可能在目標形狀上的位置

為了檢測無法被引數化的(沒有解析模型)不規則形狀泛化hough變換被提出,generalized hough transform(ght)

廣義hough變換,如果再考慮旋轉和縮放就需要在更高維度上搜尋.

定義任意形狀的表示引數:

x,y,r,s,a,thea,其中,xy為形狀內的乙個參考點,s是縮放因子,thea是方向

分為兩大步ab

計算r-table,r是到原點的距離,a是梯度與x軸的夾角(0-180),%代表該點切線(梯度垂直)方向與x軸的夾角

r-table是r-table[%] = (r,a),(r',a')

%1 : (r1, a1), (r1',a1')

%2 : (r2, a2), (r2', a2')

… : …

%n : (rn, an), (rn', an')

1. 選取參考點(xc,yc)

2. 初始化r-table為空

3. 對每個邊緣點,計算(r,a)值

1. r = sqrt((x-xc)^2 + (y-yc)^2)

1. a = tan'((y-yc)/(x-xc))

4. 計算%(切線),並將(r,a)加入與%最接近的%i

5. 重複4、5,直到所有的邊緣點都已經加入r-table

1. 建立2維的hough table h(xc, yc),初始化為0

2. 針對每乙個邊緣點,計算切線(垂直梯度)夾角%

3. 在r-table中,查詢最接近%的%i,對其內的所有(r,a),計算對應的原點(xc,yc)

xc = x + rcos(a)

yc = y + rsin(a)

4.     將h(xc, yc)累加1,重複2、3,直到所有的邊緣點都完成檢測

5.     找出h(xc,yc)中的區域性最大值,其(xc,yc)即為檢測出來的形狀

上面的過程沒考慮旋轉thea和縮放因子,考慮內的h變為

h(xc, yc, thea, s)

b中的3步驟改為

xc = x + r.scos(a + thea)

yc = y + r.ssin(a + thea)

ght占用記憶體大,計算複雜,單匹配固定形狀的精度高,也許在未來能有更優化的版本

opencv中Hough變換引數詳解

分享一下我老師大神的人工智慧教程。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!此函式是opencv影象變換函式中的乙個,主要用來訪問霍夫變換的兩個演算法 標準霍夫變換 sht 和累計概率霍夫變換 ppht cvseq cvhonghlines2 cvarr imag...

Hough變換原理

hough變換原理 一 簡單介紹 hough變換是影象處理中從影象中識別幾何形狀的基本方法之一。hough變換的基本原理在於利用點與線的對偶性,將原始影象空間的給定的曲線通過曲線表達形式變為引數空間的乙個點。這樣就把原始影象中給定曲線的檢測問題轉化為尋找引數空間中的峰值問題。也即把檢測整體特性轉化為...

Hough變換原理

hough變換原理 一 簡單介紹 hough變換是影象處理中從影象中識別幾何形狀的基本方法之一。hough變換的基本原理在於利用點與線的對偶性,將原始影象空間的給定的曲線通過曲線表達形式變為引數空間的乙個點。這樣就把原始影象中給定曲線的檢測問題轉化為尋找引數空間中的峰值問題。也即把檢測整體特性轉化為...