OpenCV(Python)學(xué)習(xí)-霍夫變化直線和圓檢測

概述

? ? ? ? 了解霍夫變換以及該方法如何檢測圖片中的直線,學(xué)習(xí)了解cv2.Canny料祠、cv2.HoughLines改衩、cv2.HoughLinesP。

原理

? ? ? ? 我理解的霍夫變化就是運(yùn)用數(shù)學(xué)知識中關(guān)于極坐標(biāo)與向量的知識表示出所有可以表達(dá)出圖形的公式侍筛。我們最初接觸到的一元一次函數(shù)都是運(yùn)用表達(dá)直線的萤皂,表達(dá)通式為y=k * x + b,這里用(k, b)就可以表示一條直線匣椰。而在極坐標(biāo)中可以表示為r=x * COSθ + y * SINθ裆熙。用(r,θ)兩個(gè)參數(shù)表示一條直線。采用極坐標(biāo)而不采用一元一次函數(shù)是因?yàn)閗值和b值在任意一個(gè)象限里都會(huì)出現(xiàn)負(fù)數(shù)不便于計(jì)算禽笑,而用極坐標(biāo)r值永遠(yuǎn)是大于等于0的數(shù)入录,θ就可以用0~360度表示方便計(jì)算。其中r表示直線到原點(diǎn)的最短距離佳镜,θ表示x軸與原點(diǎn)到直線最短距離的夾角纷跛。在Python語言中,OpenCV的霍夫直線檢測函數(shù)如下:

lines = cv2.HoughLines(image, rho, theta, thresh,?[, lines[, srn[, stn[, min_theta[, max_theta]]]]])

????????* ? ? ?lines是輸出檢測到的直線的向量邀杏,每條直線用(r,θ)表示贫奠。r表示直線到原點(diǎn)(就是圖片的左上角)的距離。θ表示直線的旋轉(zhuǎn)角度望蜡。

????????* ? ? ?image是指輸入的色深8位或者單通道灰度圖片唤崭,否者運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。

????????* ? ? ?rho是指以像素為單位累加器的分辨距離值脖律。

????????* ? ? ?theta是指以用弧度表示的角度谢肾。

????????* ? ? ? thresh是指累加器閾值參數(shù),只有落在直線上的像素點(diǎn)數(shù)大于thresh值才會(huì)返回直線小泉。

????????* ? ? ? ?srn 是對于多個(gè)范圍的霍夫變化芦疏,它是距離分辨率rho的除數(shù)冕杠。估算的距離分辨率是rho,精確的計(jì)算的分辨率是rho/srn酸茴。如果 srn 和 stn 都是0分预,則使用的是經(jīng)典霍夫變化。否則這兩個(gè)參數(shù)必須是正數(shù)薪捍。

????????* ? ? ? ?stn 是對于多范圍的霍夫變化笼痹,他是角度分辨率theta的除數(shù)。

????????* ? ? ? ?min_theta用于經(jīng)典和多范圍霍度變化酪穿,指檢測直線的最小角度凳干,值的范圍是0到max_theta。

????????* ? ? ? ?max_theta用于經(jīng)典和多范圍霍度變化被济,指檢測直線的最大角度救赐,值的范圍是min_theta到pi之間。

? ? ? ? 這個(gè)方法可以檢測到直線只磷,但是得到的是直線经磅,而在現(xiàn)實(shí)應(yīng)用中,需要識別的更多的線段喳瓣。所以我還要學(xué)習(xí)了解一下cv2.HoughLinesP方法。

lines = cv2.HoughLinesP(image赞别,rho畏陕,theta,threshold[, lines[, minLineLength[, maxLineGap]]])

? ? ? ? 這個(gè)方法中前面四個(gè)參數(shù)跟cv2.HoughLines方法中的用法相同仿滔,詳細(xì)記錄一下minLineLength和maxLineGap惠毁。

? ? ? ? * ?lines返回值是以(x1,y1崎页,x2鞠绰,y2)4個(gè)元素的向量為元素的列表。(x1飒焦,y1)和(x2蜈膨,y2)表示一條線段的起點(diǎn)和終點(diǎn)。

? ? ? ? * ?minLineLength指最小的線段長度牺荠,小于該參數(shù)的直線被舍棄掉翁巍,認(rèn)為不合格。

? ? ? ? * ?maxLineGap指同一條線上的最大間斷值休雌。

步驟:

? ? ? ? 1. 讀取圖片后灶壶,先要將圖片轉(zhuǎn)換為灰度圖。

? ? ? ? image = cv2.imread(‘hl.jpg')

? ? ? ? gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)



原圖

? ? ? ? ?

灰度圖

????????2. 用cv2.Canny()進(jìn)行邊緣檢測

? ? ? ? ? ? edges = cv2.Canny(gray, 90,110)

? ? ? ? ? ??


邊緣圖

? ? ? ? 3.運(yùn)用霍夫直線識別來識別如片中的直線杈曲。

? ? ? ? ? ? lines = cv2.HoughLines(edges驰凛,1胸懈,np.pi/180,200) ? ?

或者使用cv2.HoughLinesP()方法。

? ? ? ? ? ? lines = cv2.HoughLineP(edges, 1恰响,np.pi/180趣钱,200,20渔隶,10)

? ? ? ? 4.?對檢測到的直線在原圖中標(biāo)記出來羔挡。

? ? ? ? ? 圖5解釋了為什么x1,y1间唉,x2绞灼,y2是下圖中這種寫法〕室埃可以保證檢測到的單條直線畫滿整幅圖低矮。

????????????

將檢測到的直線畫在原圖上
圖5


cv2.HoughLines效果圖

????????cv2.HoughLinesP()方法的返回值是(x1,y1被冒,x2军掂,y2),因此畫到原圖中的代碼如下。

???????? for line in lines:

???????????????? x1 = int(round(line[0][0]))

?????????????? y1 = int(round(line[0][1]))

????????????? x2 = int(round(line[0][2]))

???????????? y2 = int(round(line[0][3]))

??????????? cv2.line(img,(x1,y1),(x2,y2),(255,0,0),2)

????????cv2.imshow('HoughLinesP',img)

????????cv2.waitKey(0)

cv2.HoughLinesP方法實(shí)現(xiàn)的效果昨悼。

總結(jié)

? ? ? ? ? ? 霍夫變換檢測直線方法只有將參數(shù)設(shè)置合適蝗锥,才有可能達(dá)到想要的效果,還是有一定的不足率触,使用時(shí)還是根據(jù)具體情況來選擇應(yīng)用终议。
????????????

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市葱蝗,隨后出現(xiàn)的幾起案子穴张,更是在濱河造成了極大的恐慌,老刑警劉巖两曼,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件皂甘,死亡現(xiàn)場離奇詭異,居然都是意外死亡悼凑,警方通過查閱死者的電腦和手機(jī)偿枕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來户辫,“玉大人益老,你說我怎么就攤上這事〈缒” “怎么了捺萌?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我桃纯,道長酷誓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任态坦,我火速辦了婚禮盐数,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伞梯。我一直安慰自己玫氢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布谜诫。 她就那樣靜靜地躺著漾峡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喻旷。 梳的紋絲不亂的頭發(fā)上生逸,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音且预,去河邊找鬼槽袄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锋谐,可吹牛的內(nèi)容都是我干的遍尺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涮拗,長吁一口氣:“原來是場噩夢啊……” “哼乾戏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起多搀,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤歧蕉,失蹤者是張志新(化名)和其女友劉穎灾部,沒想到半個(gè)月后康铭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赌髓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年从藤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锁蠕。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夷野,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荣倾,到底是詐尸還是另有隱情悯搔,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布舌仍,位于F島的核電站妒貌,受9級特大地震影響通危,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜灌曙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一菊碟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧在刺,春花似錦逆害、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至隙姿,卻和暖如春梅垄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背输玷。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工队丝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人欲鹏。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓机久,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赔嚎。 傳聞我的和親對象是個(gè)殘疾皇子膘盖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容