您好,登錄后才能下訂單哦!
這篇文章主要介紹了Python OpenCV Hough直線檢測(cè)算法如何實(shí)現(xiàn)的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Python OpenCV Hough直線檢測(cè)算法如何實(shí)現(xiàn)文章都會(huì)有所收獲,下面我們一起來看看吧。
核心要點(diǎn):圖像坐標(biāo)空間、參數(shù)空間、極坐標(biāo)參數(shù)空間 -> (極坐標(biāo))參數(shù)空間表決
給定一個(gè)點(diǎn),我們一般會(huì)寫成y=ax+b的形式,這是坐標(biāo)空間的寫法;我們也可以寫成b=-xa+y的形式,這是參數(shù)空間的寫法。也就是說,給定一個(gè)點(diǎn),那么經(jīng)過該點(diǎn)的直線的參數(shù)必然滿足b=-xa+y這一條件,也就是必然在參數(shù)空間中b=-xa+y這條直線上。如果給定兩個(gè)點(diǎn),那么這兩點(diǎn)確定的唯一的直線的參數(shù),就是參數(shù)空間中兩條參數(shù)直線的交點(diǎn)。
由于上述寫法不適合處理水平或垂直的直線,我們可以使用極坐標(biāo)的形式描述直線,即ρ=xcosθ+ysinθ,其中ρ是從原點(diǎn)到直線的垂直距離,θ是由這條垂直線和水平軸形成的角度(以逆時(shí)針方向測(cè)量),
如下圖所示:
因此,任何垂直線θ=0,水平線θ=90°。那么極坐標(biāo)參數(shù)空間中的曲線交點(diǎn)就是由兩個(gè)點(diǎn)確定的一條直線,如下圖所示。
現(xiàn)在讓我們看看Hough變換是如何處理直線的。任何一條線都可以用這兩個(gè)參數(shù)來表示(ρ,θ)。
首先創(chuàng)建一個(gè)二維數(shù)組,即累加器,用來保存兩個(gè)參數(shù)的值,然后最初將其設(shè)置為全0。讓行表示ρ,列表示θ。數(shù)組的尺寸取決于所需的精度。假設(shè)希望角度的精度為1度,則需要180列,枚舉0°-179°的所有情況。對(duì)于ρ,可能的最大距離是圖像的對(duì)角線長度。因此,以一個(gè)像素的精度計(jì)算,行數(shù)可以是圖像的對(duì)角線長度。
枚舉所有的點(diǎn),對(duì)于每一個(gè)點(diǎn),將所有經(jīng)過這一點(diǎn)的直線對(duì)應(yīng)的參數(shù)(ρ,θ)在參數(shù)空間中找到對(duì)應(yīng)位置,令該位置的累加器加1,即投票。這一過程如下圖所示。
枚舉完成所有點(diǎn)之后,累加器中值最大的(若干個(gè))參數(shù)組合(ρ,θ)就是經(jīng)過點(diǎn)最多的(若干條)直線,如下圖所示,兩條直線對(duì)應(yīng)累加器中最亮的兩個(gè)點(diǎn)。
總的來說,對(duì)于多個(gè)點(diǎn),我們可以用(離散)參數(shù)空間表決的方法,記錄每個(gè)點(diǎn)對(duì)應(yīng)的允許的參數(shù)組合,求得那些被允許次數(shù)最多的參數(shù)組合,就是最多點(diǎn)經(jīng)過的直線。
在圖像矯正任務(wù)中,我們經(jīng)過Canny算子檢測(cè)出了若干邊緣點(diǎn),這些點(diǎn)主要集中在四個(gè)邊界上,因此我們只需要使用Hough直線檢測(cè),求出四條直線,就能確定四個(gè)邊界。
cv.HoughLines()封裝了上述步驟,該函數(shù)原型為:
cv.HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]) -> lines
參數(shù):
lines:數(shù)組,每一個(gè)元素都是一條直線對(duì)應(yīng)的(ρ, θ),ρ以像素為單位,θ以弧度為單位。
image:輸入圖像,需要是二值圖像,所以在應(yīng)用hough變換之前應(yīng)用閾值或canny邊緣檢測(cè)。
rho:ρ的精度。
theta:θ的精度。
threshold:閾值,得票數(shù)高于該值的線才被認(rèn)為是線,由于投票數(shù)取決于線上的點(diǎn)數(shù),所以它代表了應(yīng)該被檢測(cè)到的線的最小點(diǎn)數(shù)。
下面是具體代碼:
def hough_detect(image_path): # 讀取圖像并轉(zhuǎn)換為灰度圖像 image = cv2.imread(image_path) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 使用Canny算子檢測(cè)邊緣 edges = canny_detect(image_path, False) # 使用Hough檢測(cè)直線 lines = cv2.HoughLines(edges, 1, np.pi/180, 200) # 繪制直線 for line in lines: rho, theta = line[0] a = np.cos(theta) b = np.sin(theta) x0 = a * rho y0 = b * rho x1 = int(x0 + 1000*(-b)) y1 = int(y0 + 1000*(a)) x2 = int(x0 - 1000*(-b)) y2 = int(y0 - 1000*(a)) cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) cv2.imshow('line,jpg', image) cv2.waitKey() hough_detect('images/2.jpeg')
效果:
關(guān)于“Python OpenCV Hough直線檢測(cè)算法如何實(shí)現(xiàn)”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Python OpenCV Hough直線檢測(cè)算法如何實(shí)現(xiàn)”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。