利用Opencv中的Houghline方法進(jìn)行直線檢測—python語言
成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括鼓樓網(wǎng)站建設(shè)、鼓樓網(wǎng)站制作、鼓樓網(wǎng)頁制作以及鼓樓網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,鼓樓網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到鼓樓省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!這是給Python部落翻譯的文章,請(qǐng)?jiān)谶@里看原文。
在圖像處理中,霍夫變換用來檢測任意能夠用數(shù)學(xué)公式表達(dá)的形狀,即使這個(gè)形狀被破壞或者有點(diǎn)扭曲。
下面我們將看到利用HoughLine算法來闡述霍夫變化進(jìn)行直線檢測的原理,把此算法應(yīng)用到特點(diǎn)圖像的邊緣檢測是可取的。邊緣檢測方法請(qǐng)參考這篇文章–邊緣檢測。
Houghline算法基礎(chǔ)
直線可以表示為y=mx+c,或者以極坐標(biāo)形式表示為r=xcosθ+ysinθ,其中r是原點(diǎn)到直線的垂直距離,θ是水平軸順時(shí)針方向到垂直線的夾角(這個(gè)方向取決于坐標(biāo)的形式,在OpenCV就是采用這種極坐標(biāo)形式)。
因此任意的曲線都可以用兩個(gè)參數(shù)(r,θ)表示。
HoughLine算法原理:
例子:
假設(shè)一幅100x100的圖像,在圖像中間有一條水平直線。設(shè)直線的第一個(gè)點(diǎn)的坐標(biāo)為(x,y),在直線方程中,令參數(shù)θ=0,12,⋯,180,觀查參數(shù)r變化。對(duì)每一個(gè)參數(shù)對(duì)(r,θ),在累加器中將(r,θ)對(duì)應(yīng)的單元格中的值遞增1,比如現(xiàn)在在累加器中,某個(gè)單元(50,90)的值等于1,其它的值也如此。
對(duì)于直線上的第二個(gè)點(diǎn),重復(fù)上述操作。將得到的參數(shù)對(duì)(r,θ)的對(duì)應(yīng)值繼續(xù)遞增,然后(50,90)對(duì)應(yīng)的值等于2。實(shí)現(xiàn)上我們是對(duì)參數(shù)對(duì)(r,θ)進(jìn)行投票,對(duì)直線上的每一個(gè)點(diǎn)重復(fù)上述操作,對(duì)每一個(gè)點(diǎn),單元格(50,90)對(duì)應(yīng)的值會(huì)遞增,或者說投票給參數(shù)對(duì)(50,90),而會(huì)或者不會(huì)投票給其它參數(shù)對(duì)。以這種方式,最后單元格(50,90)的值將會(huì)是大的值。然后搜索累加器的大值,將會(huì)找到參數(shù)對(duì)(50,90)。也就是說,在圖像中找到了到原點(diǎn)距離為50,角度為90的一條直線。
上述算法的過程被封裝成OpenCV函數(shù)cv2.HoughLines(),函數(shù)返回(r,θ)的一個(gè)數(shù)組,其中r的單位為像素,θ的單位為弧度。
# Python program to illustrate HoughLine # method for line detection import cv2 import numpy as np # Reading the required image in # which operations are to be done. # Make sure that the image is in the same # directory in which this python program is img = cv2.imread('xyz.jpg') # Convert the img to grayscale gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # Apply edge detection method on the image edges = cv2.Canny(gray,50,150,apertureSize = 3) # This returns an array of r and theta values lines = cv2.HoughLines(edges,1,np.pi/180, 200) # The below for loop runs till r and theta values # are in the range of the 2d array for r,theta in lines[0]: # Stores the value of cos(theta) in a a = np.cos(theta) # Stores the value of sin(theta) in b b = np.sin(theta) # x0 stores the value rcos(theta) x0 = a*r # y0 stores the value rsin(theta) y0 = b*r # x1 stores the rounded off value of (rcos(theta)-1000sin(theta)) x1 = int(x0 + 1000*(-b)) # y1 stores the rounded off value of (rsin(theta)+1000cos(theta)) y1 = int(y0 + 1000*(a)) # x2 stores the rounded off value of (rcos(theta)+1000sin(theta)) x2 = int(x0 - 1000*(-b)) # y2 stores the rounded off value of (rsin(theta)-1000cos(theta)) y2 = int(y0 - 1000*(a)) # cv2.line draws a line in img from the point(x1,y1) to (x2,y2). # (0,0,255) denotes the colour of the line to be #drawn. In this case, it is red. cv2.line(img,(x1,y1), (x2,y2), (0,0,255),2) # All the changes made in the input image are finally # written on a new image houghlines.jpg cv2.imwrite('houghlines3.jpg', img)
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。