tft每日頭條

 > 生活

 > cv初學教程

cv初學教程

生活 更新时间:2024-08-17 23:11:49

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

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

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

一::如何實現霍夫變換?

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

衆所周知, 一條直線在圖像二維空間可由兩個變量表示. 例如:

A:在笛卡爾坐标系: 可由參數: (m,b) 斜率和截距表示.

B:在極坐标系: 可由參數:

cv初學教程(CV學習筆記十五:直線檢測)1

極徑和極角表示

cv初學教程(CV學習筆記十五:直線檢測)2

對于霍夫變換, 我們将用 極坐标系 來表示直線. 因此, 直線的表達式可為:

cv初學教程(CV學習筆記十五:直線檢測)3

化簡得到

cv初學教程(CV學習筆記十五:直線檢測)4

2:一般來說對于點(x,y)我們可以将通過這個點的一族直線統一定義為:

cv初學教程(CV學習筆記十五:直線檢測)5

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

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

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

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

cv初學教程(CV學習筆記十五:直線檢測)6

隻繪出滿足下列條件的點

cv初學教程(CV學習筆記十五:直線檢測)7

cv初學教程(CV學習筆記十五:直線檢測)8

.

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

如果兩個不同點進行上述操作後得到的曲線在平面(r,の)

相交, 這就意味着它們通過同一條直線. 例如, 接上面的例子我們繼續對點: (9,4),(12,3),繪圖, 得到下圖:

cv初學教程(CV學習筆記十五:直線檢測)9

這三條曲線在 (r,の), 平面相交于點

cv初學教程(CV學習筆記十五:直線檢測)10

,坐标表示的是參數對(r,の) 或者是說點

cv初學教程(CV學習筆記十五:直線檢測)11

cv初學教程(CV學習筆記十五:直線檢測)12

cv初學教程(CV學習筆記十五:直線檢測)13

組成的平面内的的直線.

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

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

舉個例子:

cv初學教程(CV學習筆記十五:直線檢測)14

如上圖,假定在一個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的這個值已經記了兩票了,以此類推,遍曆完整個8*8的像素空間的時候ρ = (9√2)/2就記了5票, 别的ρ值的票數均小于5票,所以得到該直線在這個8*8的像素坐标中的極坐标方程為 (9√2)/2=x*Cos45° y*Sin45°,到此該直線方程就求出來了。(PS:但實際中θ的取值不會跨度這麼大,一般是PI/180)。

實驗代碼:

cv初學教程(CV學習筆記十五:直線檢測)15

這裡主要用到兩個函數:

①: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初學教程(CV學習筆記十五:直線檢測)16

,其函數原型為:HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]])

image參數表示邊緣檢測的輸出圖像,該圖像為單通道8位二進制圖像。

rho參數表示參數極徑 r 以像素值為單位的分辨率,這裡一般使用 1 像素。

theta參數表示參數極角の以弧度為單位的分辨率,這裡使用 1度。

threshold參數表示檢測一條直線所需最少的曲線交點。

lines參數表示儲存着檢測到的直線的參數對

cv初學教程(CV學習筆記十五:直線檢測)17

的容器,也就是線段兩個端點的坐标。

minLineLength參數表示能組成一條直線的最少點的數量,點數量不足的直線将被抛棄。

maxLineGap參數表示能被認為在一條直線上的亮點的最大距離。

實驗結果分析:

cv初學教程(CV學習筆記十五:直線檢測)18

cv初學教程(CV學習筆記十五:直線檢測)19

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

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved