霍夫變換(直線檢測演算法)

2021-07-05 08:48:16 字數 3952 閱讀 6182



霍夫變換是影象變換中的經典手段之一,主要用來從影象中分離出具有某種相同特徵的幾何形狀(如直線,圓等)。霍夫變換尋找直線與圓的方法相比其他方法可以更好的減少雜訊干擾。經典的霍夫變換常用來檢測直線、圓、橢圓等。

在實際應用中,y=k*x+b形式的

直線方程

沒有辦法表示x=c形式的直線(這時候,

直線的斜率

為無窮大)。所以實際應用中,是採用

引數方程

p=x*cos(theta)+y*sin(theta)。這樣,影象平面上的乙個點就對應到引數p---theta平面上的一條

曲線上。其它的還是一樣。

霍夫變換演算法思想:

以直線檢測為例,每個畫素座標點經過變換都變成都直線特質有貢獻的統一度量,乙個簡單

的例子如下:一條直線在影象中是一系列離散點的集合,通過乙個直線的離散極座標公式,

可以表達出直線的離散點幾何等式如下:

x *cos(theta) + y * sin(theta)  = r 其中角度theta指r與x軸之間的夾角,r為到直線幾何垂

直距離。任何在直線上點,x, y都可以表達,其中 r, theta是常量。該公式圖形表示如下:

然而在實現的影象處理領域,影象的畫素座標p(x, y)是已知的,而r, theta則是我們要尋找的變數。如果我們能繪製每個(r, theta)值根據畫素點座標p(x, y)值的話,那麼就從影象笛卡

爾座標系統轉換到極座標霍夫空間系統,這種從點到曲線的變換稱為直線的霍夫變換。變換

通過量化霍夫引數空間為有限個值間隔等分或者累加格仔。當霍夫變換演算法開始,每個畫素

座標點p(x, y)被轉換到(r, theta)的曲線點上面,累加到對應的格仔資料點,當乙個波峰出現時候,說明有直線存在。

opencv霍夫變換使用方法——邊緣檢測+霍夫變換求出影象中的直線

p205霍夫變換

opencv中文論壇中的霍夫變換教程:

霍夫線變換

1.霍夫線變換是一種用來尋找直線的方法。

2.用霍夫變換之前,首先要對影象進行邊緣檢測的處理,也即霍夫線變換的直接輸入只能是邊緣二值影象。

它是如何實現的?

1.眾所周知,一條直線在影象二維空間可由兩個變數表示。

a。在笛卡爾座標系:可由引數:(m,b)斜率和截距表示

b。在極座標系:可由引數:(r,θ)極徑和極角表示

對於霍夫變換,我們將用極座標系來表示直線。因此直線的表示式可為:

θ + y sinθ

2.一般來說對於點(x0,y0),我們可以將通過這個點的一族直線統一定義為:

這就意味著每一對(r

θ, θ

)代表一條通過(x0,y0)的直線。

3.如果對於乙個給定點(x0,y0)我們在極座標對極徑極角平面繪出所有通過它的直線,將得到一條正弦曲線。例如,對於給定點x0 = 8,y0 = 6,我們可以繪出下圖:

4.我們可以對影象中所有的點進行上述操作。如果兩個不同點進行上述操作後得到的曲線在平面θ-r相交,這就意味著它們通過同一條直線。

eg。接著上面的例子我們繼續對點:x1 = 9, y1 = 4 和點 x2 = 12,y2 = 3繪圖,得到下圖

這三條曲線在θ-r平面相交於點(0.925, 9.6)。

5.以上材料說明什麼呢?這意味著一般來說,一條直線能夠通過在平面θ-r尋找教育一點的曲線數量來檢測。越多曲線交於一點也就意味著這個交點表示的直線由更多的點組成。一般來說我們可以通過設定直線上點的閾值來定義,多少條曲線交於一點我們才認為是檢測到了一條直線。

6.這就是霍夫變換要做的,它追蹤影象中每個點對應曲線間的交點。如果交於一點的曲線的數量超過了閾值,那麼可以認為這個交點所代表的引數對(θ,r

θ)在原影象中為一條直線。

標準霍夫線變換和統計概率霍夫線變換:

opencv實現了以下兩種霍夫線變換:

a。標準霍夫線變換

原理在上面的部分已經說明了。他能給我們提供一組引數對(θ,r

θ)的集合來表示檢測到的直線

在opencv中,通過函式houghlines來實現

b。統計概率霍夫線變換

這是執行起來效率更高的霍夫線變換。它輸出檢測到的直線的端點(x0,y0,x1,y1

) 在opencv中,它通過函式houghlinesp來實現

實現過程:

1.載入

mat

src=

imread

(filename,0

);

if

(src

.empty

())

2.用canny運算元對影象進行邊緣檢測

canny

(src

,dst,50

,200,3

);

3.標準霍夫線變換

a。首先,要執行變換

vector

<

vec2f

>

lines

;

houghlines

(dst

,lines,1

,cv_pi

/180

,100,0

,0);

帶有以下自變數:

dst:邊緣檢測的輸出影象。它應該是個灰度圖,但事實上是個二值化圖。

lines:儲存著檢測到的直線的引數對(r,

θ)的容器。 

*rho:引數極徑r 以畫素值為單位的解析度。我們使用1畫素。

theta:引數極角

θ以弧度為單位的解析度。我們使用1度(即cv_pi/180)

threshold:要檢測出一條直線所需最少的曲線交點

srn and stn:引數預設為零。

b。通過畫出檢測到的直線來顯示結果。

for

(size_ti=

0;i<

lines

.size

();i

++)

4.統計概率霍夫變換

a。首先,要執行變換

vector

<

vec4i

>

lines

;

houghlinesp

(dst

,lines,1

,cv_pi

/180,50

,50,10

);

帶有以下自變數:

dst:邊緣檢測的輸出影象。它應該是個灰度圖,但事實上是個二值化圖。

lines:儲存著檢測到的直線的引數對(x

start,y

start,x

end,y

end)的容器

rho:引數極徑r 以畫素值為單位的解析度。我們使用1畫素。

theta:引數極角

θ以弧度為單位的解析度。我們使用1度(即cv_pi/180)

threshold:要檢測出一條直線所需最少的曲線交點

*minlinlength:能組成一條直線的最少點的數量。點數量不足的直接將被拋棄。

maxlinegap:能被認為在一條直線上的亮點的最大距離。

b。通過畫出檢測到的直線來顯示結果。

for

(size_ti=

0;i<

lines

.size

();i

++)

霍夫變換檢測直線

對於結構化道路的檢測,常用的方法是採用霍夫變換檢測道路中的直線段。一條直線可以看做是影象上的若干個畫素點組成,也可以用一條直線方程來表示,如 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點 直...