CV學習筆記(十六):直線檢測

作者:雲時之間
來源:知乎
鏈接:https://zhuanlan.zhihu.com/p/127950044
編輯:王萌


在這一篇文章中我們將學習使用OpenCV中的 HoughLines 函數和 HoughLinesP 函數來檢測圖像中的直線.

在這個函數中,使用的是霍夫變換(Hough Transform) 這是計算機視覺中從圖像中識別幾何形狀的基本方法之一,應用很廣泛,也有很多改進算法。主要是用來從圖像中分離出具有某種相同特徵的幾何形狀(如,直線,圓等)。

最基本的霍夫變換是從黑白圖像中檢測直線(線段)。也就是今天我們要學習的內容.

一:如何實現霍夫變換?

在這裏我摘抄Bradski的< 學習OpenCV>來進行霍夫變換的推導

衆所周知, 一條直線在圖像二維空間可由兩個變量表示. 例如:
A:在笛卡爾座標系: 可由參數: (m,b) 斜率和截距表示.
B:在極座標系: 可由參數:
圖片


極徑和極角表示
CV學習筆記(十六):直線檢測

對於霍夫變換, 我們將用 極座標系 來表示直線. 因此, 直線的表達式可爲:
CV學習筆記(十六):直線檢測

化簡得到
CV學習筆記(十六):直線檢測

2:一般來說對於點(x,y)我們可以將通過這個點的一族直線統一定義爲:
CV學習筆記(十六):直線檢測

這就意味着每一對 (r,の),代表一條通過點(x,y) 的直線.

3:如果對於一個給定點(x,y)

我們在極座標對極徑極角平面繪出所有通過它的直線, 將得到一條正弦曲線. 例如, 對於給定點

(x=8,y=6),我們可以繪出下圖

CV學習筆記(十六):直線檢測

只繪出滿足下列條件的點

CV學習筆記(十六):直線檢測
CV學習筆記(十六):直線檢測

4:我們可以對圖像中所有的點進行操作.

如果兩個不同點進行上述操作後得到的曲線在平面(r,の)相交, 這就意味着它們通過同一條直線. 例如, 接上面的例子我們繼續對點: (9,4),(12,3),繪圖, 得到下圖:

CV學習筆記(十六):直線檢測

CV學習筆記(十六):直線檢測
組成的平面內的的直線.

那麼以上的材料要說明什麼呢? 這意味着一般來說, 一條直線能夠通過在平面(r,の),尋找交於一點的曲線數量來檢測. 越多曲線交於一點也就意味着這個交點表示的直線由更多的點組成. 一般來說我們可以通過設置直線上點的閾值 來定義多少條曲線交於一點我們才認爲 檢測 到了一條直線.

綜上所述:這就是霍夫線變換要做的. 它追蹤圖像中每個點對應曲線間的交點. 如果交於一點的曲線的數量超過了 閾值, 那麼可以認爲這個交點所代表的參數對(r,の)在原圖像中爲一條直線.

舉個例子:

CV學習筆記(十六):直線檢測

如上圖,假定在一個8*8的平面像素中有一條直線,並且從左上角(1,8)像素點開始分別計算θ爲0°、45°、90°、135°、180°時的ρ.

圖中可以看出ρ分別爲1、(9√2)/2、8、(7√2)/2、-1,並給這5個值分別記一票,同理計算像素點(3,6)點θ爲0°、45°、90°、135°、180°時的ρ,再給計算出來的5個ρ值分別記一票,此時就會發現ρ = (9√2)/2的這個值已經記了兩票了.

以此類推,遍歷完整個88的像素空間的時候ρ = (9√2)/2就記了5票, 別的ρ值的票數均小於5票,所以得到該直線在這個88的像素座標中的極座標方程爲 (9√2)/2=xCos45°+ySin45°,到此該直線方程就求出來了。(PS:但實際中θ的取值不會跨度這麼大,一般是PI/180)。

二:實驗代碼

CV學習筆記(十六):直線檢測

這裏主要用到兩個函數:

①:HoughLines函數是標準霍夫線變換函數,該函數的功能是通過一組參數對 (r,の)
的集合來表示檢測到的直線,

其函數原型爲:
HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]])

image參數表示邊緣檢測的輸出圖像,該圖像爲單通道8位二進制圖像。
rho參數表示參數極徑 r 以像素值爲單位的分辨率,這裏一般使用1像素。
theta參數表示參數極角の以弧度爲單位的分辨率,這裏使用1度。
threshold參數表示檢測一條直線所需最少的曲線交點。
lines參數表示儲存着檢測到的直線的參數對 (r,の)的容器 。
srn參數、stn參數默認都爲0。如果srn = 0且stn = 0,則使用經典的Hough變換。
min_theta參數表示對於標準和多尺度Hough變換,檢查線條的最小角度。
max_theta參數表示對於標準和多尺度Hough變換,檢查線條的最大角度。






opencv的HoughLinesP函數是統計概率霍夫線變換函數,該函數能輸出檢測到的直線的端點

CV學習筆記(十六):直線檢測

其函數原型爲:

HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]])

image參數表示邊緣檢測的輸出圖像,該圖像爲單通道8位二進制圖像。
rho參數表示參數極徑 r 以像素值爲單位的分辨率,這裏一般使用 1 像素。
theta參數表示參數極角の以弧度爲單位的分辨率,這裏使用 1度。
threshold參數表示檢測一條直線所需最少的曲線交點。
lines參數表示儲存着檢測到的直線的參數的容器,也就是線段兩個端點的座標。
minLineLength參數表示能組成一條直線的最少點的數量,點數量不足的直線將被拋棄。
maxLineGap參數表示能被認爲在一條直線上的亮點的最大距離。





三:實驗結果分析:

CV學習筆記(十六):直線檢測

對於簡單的圖形還是處理的很充分的,但是對於稍微複雜的圖像,依舊是無能爲力.這也是傳統算法的侷限性所在,泛化能力較差.

四:參考資料

①:
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html
②:
https://blog.csdn.net/leonardohaig/article/details/87907462


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章