91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文解讀經(jīng)典霍夫變換(Hough Transform)

新機(jī)器視覺 ? 來源:CSDN技術(shù)社區(qū) ? 作者:YuYunTan ? 2021-04-22 11:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

引言

本文講述霍夫變換的一些內(nèi)容,并加入一些理解性東西,參考了部分博客等相關(guān)性內(nèi)容。希望能對(duì)霍夫變換有所了解,也希望看到的人如果發(fā)現(xiàn)錯(cuò)誤及時(shí)幫忙糾正。博主水平有限,還望賜教。

歷史和簡介

歷史

霍夫變換(Hough Transform)是在1959年由氣泡室(Bubble Chamber)照片的機(jī)器分析而發(fā)明,發(fā)明者Paul Hough在1962年獲得美國專利,被命名為Method and Means for Recognizing Complex Patterns(用于識(shí)別復(fù)雜圖案的方法和手段)。該專利對(duì)直線采用斜截距參數(shù)化,但由于斜率可能變成無窮大,這有可能導(dǎo)致無限變換空間(unbounded transform space)。

現(xiàn)在使用的霍夫變換是1972年由Richard Duda和Peter Hart所發(fā)明,稱為“廣義霍夫變換[GHT]”(Use of the Hough Transformation to Detect Lines and Curves in Pictures,1972)。

然后1981年在Dana H. Ballard的計(jì)算機(jī)視覺社區(qū)中出現(xiàn)一篇文章名為 Generalizing the Hough transform to detect arbitrary shapes,從而推廣開來。

該文描述了使用模板匹配原理對(duì)霍夫變換進(jìn)行修改。要知道霍夫變換最初是為了分析定義的形狀(如線、圓、橢圓等)而開發(fā)。通過了解其形狀并旨在其找出圖像中的位置和方向,這種改變使得霍夫變換能夠檢測用其模型描述的任意對(duì)象。這將圖像中查找對(duì)象(用模型描述)的問題通過查找模型在圖像中的位置來解決。利用廣義霍夫變換(GHT),找到模型位置的問題轉(zhuǎn)換為尋找將模型映射到圖像中的變換參數(shù)的問題。給定變換參數(shù)的值,就可以確定模型在圖像中的位置。

后來產(chǎn)生了更多霍夫變換的變體和擴(kuò)展,比如KHT,3DKHT,這里不細(xì)致說明。

簡介

霍夫變換是一個(gè)特征提取技術(shù)。其可用于隔離圖像中特定形狀的特征的技術(shù),應(yīng)用在圖像分析、計(jì)算機(jī)視覺和數(shù)字圖像處理領(lǐng)域。目的是通過投票程序在特定類型的形狀內(nèi)找到對(duì)象的不完美實(shí)例。這個(gè)投票程序是在一個(gè)參數(shù)空間中進(jìn)行的,在這個(gè)參數(shù)空間中,候選對(duì)象被當(dāng)作所謂的累加器空間中的局部最大值來獲得,所述累加器空間由用于計(jì)算霍夫變換的算法明確地構(gòu)建。最基本的霍夫變換是從黑白圖像中檢測直線(線段)。Hough變換主要優(yōu)點(diǎn)是能容忍特征邊界描述中的間隙,并且相對(duì)不受圖像噪聲的影響。

原理

霍夫變換最簡單的是檢測直線。我們知道,直線的方程表示可以由斜率和截距表示(這種表示方法,稱為斜截式),如下所示:

如果用參數(shù)空間表示則為,即用斜率和截距就能表示一條直線。

但是這樣會(huì)參數(shù)問題,垂直線的斜率不存在(或無限大),這使得斜率參數(shù)的值接近于無限。為此,為了更好的計(jì)算,Richard O. Duda和Peter E. Hart在1971年4月,提出了Hesse normal form(Hesse法線式)

其中是原點(diǎn)到直線上最近點(diǎn)的距離(其他人可能把這記錄為,下面也可以把r看成參數(shù)),是軸與連接原點(diǎn)和最近點(diǎn)直線之間的夾角。如圖1所示。

a8349580-a29b-11eb-aece-12bb97331649.png

圖1

因此,可以將圖像的每一條直線與一對(duì)參數(shù)相關(guān)聯(lián)。這個(gè)參數(shù)平面有時(shí)被稱為霍夫空間,用于二維直線的集合。

在概念上,霍夫變換很接近Radon變換有人將之看成同一變換的不同形式

經(jīng)過Hough變換,將圖像空間中的一個(gè)點(diǎn)映射到Hough空間,如圖2所示。

a83eda7c-a29b-11eb-aece-12bb97331649.png

圖2

圖2:固定一個(gè)點(diǎn)(3,4),在角度取時(shí),r的取值范圍情況. 該圖是用matlab繪制,代碼如下

% 一個(gè)點(diǎn)的坐標(biāo)為(3,4)

x=3;

y=4;

%將給定的一個(gè)定點(diǎn)映射到霍夫變換空間

theta=0:pi/200:2*pi;% 角度

r=x*cos(theta)+y*sin(theta);

plot(theta,r);%繪圖

set(gca,‘XTick’,[0:pi/10:2*pi]); % 修改x軸坐標(biāo)間隔

xlabel(‘變量 heta’)

ylabel(‘變量r’)繼續(xù)正題內(nèi)容,圖2顯示了經(jīng)過定點(diǎn)時(shí)的關(guān)系。顯示了在極坐標(biāo)對(duì)極徑極角平面繪出所有通過該定點(diǎn)的直線, 將得到一條正弦曲線。正弦曲線的形狀取決于,點(diǎn)到所定義原點(diǎn)的距離。通常,越大,正弦曲線的振幅越大,反之則會(huì)越小。

所以我們可以得到一個(gè)結(jié)論,給定平面中的單個(gè)點(diǎn),那么通過該點(diǎn)的所有直線的集合對(duì)應(yīng)于平面中的正弦曲線,這對(duì)于該點(diǎn)是獨(dú)特的。一組兩個(gè)或更多點(diǎn)形成一條直線將產(chǎn)生在該線的處交叉的正弦曲線。因此,檢測共線點(diǎn)的問題可以轉(zhuǎn)化為找到并發(fā)曲線的問題。

例子1

考慮下面三個(gè)點(diǎn),這里顯示為黑點(diǎn)

a850da10-a29b-11eb-aece-12bb97331649.png

圖3

該圖顯示了Hough變換的第一步,三點(diǎn)和六個(gè)可能的角度分組。最左邊的圖像顯示正在轉(zhuǎn)換的第一個(gè)點(diǎn)。首先,繪制不同角度的線條,全部經(jīng)過第一點(diǎn)。這些顯示為實(shí)線。其次,對(duì)于每條實(shí)線,找到也將原點(diǎn)平分的垂線(法線,或者說連接原點(diǎn)垂直于線段的線),這些顯示為虛線。然后找到虛線的長度和角度。這些值顯示在圖表下方的表格中。這對(duì)被轉(zhuǎn)換的三個(gè)點(diǎn)中的每一個(gè)都重復(fù)該過程。然后將結(jié)果繪制成圖,有時(shí)稱為霍夫空間圖。

a8637ec2-a29b-11eb-aece-12bb97331649.png

圖4

這顯示一個(gè)霍夫空間圖,三點(diǎn)和六個(gè)可能的角度。這是前面表格中數(shù)據(jù)的一個(gè)簡單圖表。線彼此交叉的點(diǎn)表示由作為變換輸入的三個(gè)點(diǎn)形成的線的角度和距離.

圖4顯示的曲線相交的點(diǎn)給出距離和角度。該距離和角度表示與被測試點(diǎn)相交的線。在圖4中,所示的線條在粉紅點(diǎn)相交; 這對(duì)應(yīng)于圖3中的實(shí)線粉紅線,其穿過所有三個(gè)點(diǎn)。

在圖像分析上下文,邊緣段的點(diǎn)(一個(gè)或多個(gè))的坐標(biāo)在圖像中是已知的,并且因此作為參數(shù)線等式中的常量,而與是未知變量是我們要尋找的。如果我們繪制由每個(gè)定義的可能值,笛卡爾圖像空間中的點(diǎn)映射到極性霍夫參數(shù)空間中的曲線(即正弦曲線)。這個(gè)點(diǎn)到曲線的變換是直線的霍夫變換。當(dāng)在霍夫參數(shù)空間中查看時(shí),在笛卡爾圖像空間中共線的點(diǎn)變得很明顯,因?yàn)樗鼈儺a(chǎn)生在相同點(diǎn)相交的曲線。

例子2

以下是顯示包含兩條粗線的光柵圖像上的霍夫變換結(jié)果的不同示例。

a86ad758-a29b-11eb-aece-12bb97331649.png

該變換的結(jié)果存儲(chǔ)在矩陣中。單元格值表示通過任意點(diǎn)的曲線數(shù)量。更高的單元格值變得更亮。兩個(gè)明顯的亮點(diǎn)是兩條線的霍夫參數(shù)。從這些點(diǎn)的位置,可以確定輸入圖像中兩條線的圖像中心的角度和距離。

霍夫變換提取直線如何實(shí)現(xiàn)?實(shí)現(xiàn)機(jī)理是為何???

通過將霍夫參數(shù)空間量化為有限間隔或累加器單元來實(shí)現(xiàn)變換。隨著算法的運(yùn)行,每個(gè)算法都把轉(zhuǎn)換為一個(gè)離散化的曲線,并且沿著這條曲線的累加器單元被遞增。累加器陣列中產(chǎn)生的峰值表示圖像中存在相應(yīng)的直線的有力證據(jù)。??注意,現(xiàn)在我們考慮的是直線的霍夫變換(先不去考慮圓,圓的情況稍后簡單說明)。累加器陣列的維度是二維的(也就是r和)。

用霍夫變換檢測圓時(shí),累加器是三維累加器,目前不去論述

那么對(duì)于圖像來說,處的每個(gè)像素及其鄰域,霍夫變換算法被用于確定該像素是否有足夠的直線證據(jù)。如果是,它將計(jì)算該線的參數(shù),然后查找參數(shù)落入的累加器箱,并增加該箱的值(投票值)。通過查找具有最高值的箱,通常通過查找累加器空間中的局部最大值,可以提取最可能的線,并且讀出它們的(近似的)幾何定義。

找到這些峰的最簡單方法是通過應(yīng)用某種形式的閾值,但其他技術(shù)可能在不同情況下產(chǎn)生更好的結(jié)果 - 確定找到哪些行以及有多少。由于返回的行不包含任何長度信息,因此通常有必要在下一步中查找圖像的哪些部分與哪些行匹配。此外,由于邊緣檢測步驟中存在缺陷誤差,通常會(huì)在累加器空間中出現(xiàn)錯(cuò)誤,這可能使得找到合適的峰值以及適當(dāng)?shù)木€條變得非常重要。

線性霍夫變換的最終結(jié)果是類似于累加器的二維陣列(矩陣),該矩陣的一個(gè)維度是量化角度,另一個(gè)維度是量化距離r。矩陣的每個(gè)元素的值等于位于由量化參數(shù)表示的線上的點(diǎn)或像素的總和。所以具有最高值的元素表示輸入圖像中代表最多的直線。在某些論文中,可能把累計(jì)器單元的結(jié)果認(rèn)為是投票值。換句話說,將每個(gè)交點(diǎn)看成一次投票,也就是說,所有點(diǎn)都如此進(jìn)行計(jì)算后,可以設(shè)置一個(gè)閾值,投票大于這個(gè)閾值的可以認(rèn)為是找到的直線。下圖是從一個(gè)博客摘用。

a89bb418-a29b-11eb-aece-12bb97331649.png

a8a30ac4-a29b-11eb-aece-12bb97331649.png

a8ac7f64-a29b-11eb-aece-12bb97331649.png

分別為原圖,閾值為30,20時(shí)候檢測到的直線。對(duì)于大于閾值的點(diǎn),有其Hough space的參數(shù)對(duì)通過逆映射我們可以得到圖像空間中的直線:

實(shí)現(xiàn)使用的例子說明描述

霍夫變換可用于識(shí)別最適合一組給定邊緣點(diǎn)的曲線的參數(shù)。該邊緣描述通常從諸如Roberts Cross,Sobel或 Canny邊緣檢測器的特征檢測算子獲得,并且可能是嘈雜的,即其可能包含對(duì)應(yīng)于單個(gè)整體特征的多個(gè)邊緣片段。此外,由于邊緣檢測器的輸出僅限定圖像中的特征的位置,所以霍夫變換進(jìn)一步是確定兩個(gè)特征是什么(即檢測其具有參數(shù)(或其他)的特征描述)以及 它們有多少個(gè)存在于圖像中。

為了詳細(xì)說明霍夫變換,我們從兩個(gè)閉合矩形的簡單圖像開始。

簡單閉合矩形

a8b9ad88-a29b-11eb-aece-12bb97331649.png

使用 Canny邊緣檢測器可產(chǎn)生一組邊界描述的這個(gè)部分,如圖8所示。

a8c2a154-a29b-11eb-aece-12bb97331649.png

這里我們看到了圖像中的整體邊界,但是這個(gè)結(jié)果并沒有告訴我們這個(gè)邊界描述中的特征的身份(和數(shù)量)。在這種情況下,我們可以使用Hough(線檢測)變換來檢測該圖像的八個(gè)單獨(dú)的直線段,從而確定對(duì)象的真實(shí)幾何結(jié)構(gòu)。

如果我們使用這些邊緣/邊界點(diǎn)作為Hough變換的輸入,則會(huì)在笛卡爾空間中的每個(gè)邊緣點(diǎn)的極坐標(biāo)空間中生成一條曲線。當(dāng)被視為強(qiáng)度圖像時(shí),累加器陣列看起來像圖9所示

a8d21350-a29b-11eb-aece-12bb97331649.png

圖9

可以利用直方圖 均衡技術(shù)使得圖像可以讓我們看到包含在低強(qiáng)度像素值中的信息模式,如圖10所示。

a9019aee-a29b-11eb-aece-12bb97331649.png

注意,雖然和是概念上的極坐標(biāo),但是累加器空間以橫坐標(biāo)和縱坐標(biāo)的矩形繪制 。請(qǐng)注意,累加器空間環(huán)繞圖像的垂直邊緣,因此實(shí)際上只有8個(gè)實(shí)際峰值。

由梯度圖像中的共線點(diǎn)生成的曲線在霍夫變換空間中的峰中相交。這些交點(diǎn)表征原始圖像的直線段。有許多方法可用于從累加器陣列中提取這些亮點(diǎn)或局部最大值。例如,一個(gè)簡單的方法涉及閾值處理,然后 對(duì)累加器陣列圖像中孤立的亮點(diǎn)集群進(jìn)行一些細(xì)化處理。這里我們使用相對(duì)閾值來提取,對(duì)應(yīng)于原始圖像中的每條直線邊緣的點(diǎn)。(換句話說,我們只采用累加器數(shù)組中的那些局部最大值,其值等于或大于全局最大值的某個(gè)固定百分比。)

從Hough變換空間(即,反霍夫變換)映射回笛卡爾空間產(chǎn)生一組圖像主題的線描述。通過將該圖像疊加在原始的反轉(zhuǎn)版本上,我們可以確認(rèn)霍夫變換找到兩個(gè)矩形的8個(gè)真實(shí)邊的結(jié)果,并且因此揭示了遮擋場景的基礎(chǔ)幾何形狀。

從Hough變換空間(即,反霍夫變換)映射回笛卡爾空間產(chǎn)生一組圖像主題的線描述。通過將該圖像疊加在原始的反轉(zhuǎn)版本上(見圖11),我們可以確認(rèn)霍夫變換找到兩個(gè)矩形的8個(gè)真實(shí)邊的結(jié)果,并且因此揭示了遮擋場景的基礎(chǔ)幾何形狀。

a90d346c-a29b-11eb-aece-12bb97331649.png

圖11

請(qǐng)注意,在這個(gè)簡單的例子中,檢測到的和原始圖像線的對(duì)齊精度顯然不完美,這取決于累加器陣列的量化。(還要注意許多圖像邊緣有幾條檢測線,這是因?yàn)橛袔讉€(gè)附近的霍夫空間峰值具有相似的線參數(shù)值,存在控制這種效應(yīng)的技術(shù),但這里沒有用來說明標(biāo)準(zhǔn)霍夫變換。)

還要注意,由霍夫變換產(chǎn)生的線條的長度是無限的。如果我們希望識(shí)別產(chǎn)生變換參數(shù)的實(shí)際線段,則需要進(jìn)一步的圖像分析以便查看這些無限長線的哪些部分實(shí)際上具有點(diǎn)。

為了說明Hough技術(shù)對(duì)噪聲的魯棒性,Canny邊緣描述已被破壞(由椒鹽噪聲引起), 在Hough變換之前,如圖12所示。

a91559f8-a29b-11eb-aece-12bb97331649.png

圖12

繪制在霍夫空間的結(jié)果如圖13所示。

a91f87fc-a29b-11eb-aece-12bb97331649.png

圖13

將這個(gè)結(jié)果反霍夫變換(并將它覆蓋在原來的結(jié)果上,見圖14)

a92b55fa-a29b-11eb-aece-12bb97331649.png

圖14

圖14:相對(duì)閾值設(shè)置為40%。

可以通過變換圖像來研究Hough變換對(duì)特征邊界中的間隙的敏感性(使用了畫圖工具進(jìn)行編輯,見圖15)

a936aa40-a29b-11eb-aece-12bb97331649.png

圖15

然后我們?cè)賹⑵渥儞Q到霍夫變換空間,表示為圖16所示。

a9417754-a29b-11eb-aece-12bb97331649.png

圖16

然后使用40%的相對(duì)閾值去對(duì)圖像反霍夫變換(同樣也是疊加在原圖上

a9744b2a-a29b-11eb-aece-12bb97331649.png

圖17

在這種情況下,因?yàn)槔奂悠骺臻g沒有接收到前面例子中的條目數(shù)量,只能找到7個(gè)峰值,但這些都是結(jié)構(gòu)相關(guān)的線。

前面的例子都不是自然實(shí)例。下面展示自然實(shí)例的例子。

城市場景

在第一種情況下,我們有一個(gè)城市場景,這些建筑物被霧遮住,見圖18。

a97c893e-a29b-11eb-aece-12bb97331649.png

圖18

如果我們想要找到建筑物的真實(shí)邊緣,邊緣檢測器(例如Canny)無法很好地恢復(fù)這些信息,如圖19所示。

a9898166-a29b-11eb-aece-12bb97331649.png

圖19

但是,霍夫變換可以檢測到一些表示遮擋區(qū)域內(nèi)建筑物邊緣的直線。原始圖像的直方圖均衡累加器空間表示如圖20所示。

a9975cc8-a29b-11eb-aece-12bb97331649.png

圖20

如果我們將相對(duì)閾值設(shè)置為70%,我們會(huì)得到如圖21所示的反霍夫變換圖像。

a9aa8956-a29b-11eb-aece-12bb97331649.png

圖21

這里只能檢測到幾條長邊,并且在很多線條或邊緣片段幾乎共線的地方存在很多重復(fù)。應(yīng)用更大的相對(duì)閾值(即50%)會(huì)產(chǎn)生如圖22所示效果。

a9c0183e-a29b-11eb-aece-12bb97331649.png

圖22

會(huì)產(chǎn)生更多的預(yù)期線條,但會(huì)以許多共線邊緣碎片產(chǎn)生的許多虛假線條為代價(jià)。

最后一個(gè)例子來自遙感應(yīng)用。在這里,我們想要檢測圖像中的街道

遙感應(yīng)用

a9cd7826-a29b-11eb-aece-12bb97331649.png

圖23

圖23顯示了一個(gè)合理的矩形城市扇區(qū)(rectangular city sector)。我們可以使用Canny邊緣檢測器來檢測該圖像,如圖24所示。

a9fa91b2-a29b-11eb-aece-12bb97331649.png

圖24

但是,街道信息不能單獨(dú)用作邊緣檢測器的輸出。

圖25表明霍夫線檢測器能夠恢復(fù)這些信息中的一些。但由于原始圖像的對(duì)比度較差,因此確定了一組有限的特征(即街道)。

aa04d6cc-a29b-11eb-aece-12bb97331649.png

圖25

實(shí)現(xiàn)算法描述

摘取一篇博客的算法描述:

初始化空間,表示在該參數(shù)表示的直線上的像素點(diǎn)的個(gè)數(shù))

對(duì)于每一個(gè)像素點(diǎn),在參數(shù)空間中找出滿足的對(duì),然后令

統(tǒng)計(jì)所有的大小,取出的參數(shù) (τ是預(yù)設(shè)的閾值)

但我覺得這并不是十分完整的算法流程。所以我將其改進(jìn)描述如下

讀取原始圖并轉(zhuǎn)換成灰度圖,采用邊緣檢測算子(如Canny)轉(zhuǎn)換成二值化邊緣圖像

然后對(duì)該圖像進(jìn)行霍夫變換

先使用峰值檢測函數(shù),找到大于閾值的霍夫變換單元(局部最大值應(yīng)該最可能是線,步長和量化會(huì)影響效果)

將上述識(shí)別出的一組候選峰,需要確定與其相關(guān)的線段及其起始點(diǎn)和終止點(diǎn)(這需要一定的算法,很多論文對(duì)此都做了改進(jìn),諸如蝴蝶形狀寬度,峰值走廊)

然后描繪于原圖(或結(jié)果圖)上

代碼實(shí)現(xiàn)

matlab版本

原圖

aa155d44-a29b-11eb-aece-12bb97331649.png

圖26

%讀取圖像

I = imread(‘huofu.jpg’);

% 轉(zhuǎn)換成灰度圖

grayI = rgb2gray(I);

% 創(chuàng)建二進(jìn)制圖像

BW = edge(grayI,‘canny’);

% 使用二值圖像創(chuàng)建Hough變換。

[H,T,R] = hough(BW);

imshow(H,[],‘XData’,T,‘YData’,R,。。。

‘InitialMagnification’,‘fit’);

xlabel(‘ heta’), ylabel(‘

ho’);

axis on, axis normal, hold on;

% 在圖像的霍夫變換中查找峰值

P = houghpeaks(H,5,‘threshold’,ceil(0.3*max(H(:))));

x = T(P(:,2)); y = R(P(:,1));

plot(x,y,‘s’,‘color’,‘white’);

% 找到線條并繪制它們

lines = houghlines(BW,T,R,P,‘FillGap’,5,‘MinLength’,7);

figure, imshow(I), hold on

max_len = 0;

for k = 1:length(lines)

xy = [lines(k).point1; lines(k).point2];

plot(xy(:,1),xy(:,2),‘LineWidth’,2,‘Color’,‘green’);

% 繪制線條的開始和結(jié)束

plot(xy(1,1),xy(1,2),‘x’,‘LineWidth’,2,‘Color’,‘yellow’);

plot(xy(2,1),xy(2,2),‘x’,‘LineWidth’,2,‘Color’,‘red’);

% 確定最長線段的端點(diǎn)

len = norm(lines(k).point1 - lines(k).point2);

if ( len 》 max_len)

max_len = len;

xy_long = xy;

end

end

% 通過為青色著色來突出顯示最長的線段

plot(xy_long(:,1),xy_long(:,2),‘LineWidth’,2,‘Color’,‘cyan’);

運(yùn)行結(jié)果

圖27

只是個(gè)示范使用,參數(shù)可自調(diào)。

python實(shí)現(xiàn)

#! python2

# coding: utf-8

import numpy as np

import matplotlib.pyplot as plt

from skimage.transform import hough_line

from skimage.draw import line

img = np.zeros((100, 150), dtype=bool)

img[30, :] = 1

img[:, 65] = 1

img[35:45, 35:50] = 1

rr, cc = line(60, 130, 80, 10)

img[rr, cc] = 1

img += np.random.random(img.shape) 》 0.95

out, angles, d = hough_line(img)

fix, axes = plt.subplots(1, 2, figsize=(7, 4))

axes[0].imshow(img, cmap=plt.cm.gray)

axes[0].set_title(‘Input image’)

axes[1].imshow(

out, cmap=plt.cm.bone,

extent=(np.rad2deg(angles[-1]), np.rad2deg(angles[0]), d[-1], d[0]))

axes[1].set_title(‘Hough transform’)

axes[1].set_xlabel(‘Angle (degree)’)

axes[1].set_ylabel(‘Distance (pixel)’)

plt.tight_layout()

plt.show()

運(yùn)行結(jié)果

圖28

Opencv實(shí)現(xiàn)

opencv的關(guān)于霍夫變換提取的函數(shù)可以在Opencv的該文檔見到 Opencv關(guān)于houghlines函數(shù) ??博主電腦安裝的是opencv2.4.13版本,代碼是來自于淺墨大神(毛星云)的代碼實(shí)現(xiàn)。

//-----------------------------------【頭文件包含部分】---------------------------------------

// 描述:包含程序所依賴的頭文件

//----------------------------------------------------------------------------------------------

#include 《opencv2/opencv.hpp》

#include 《opencv2/imgproc/imgproc.hpp》

//-----------------------------------【命名空間聲明部分】---------------------------------------

// 描述:包含程序所使用的命名空間

//-----------------------------------------------------------------------------------------------

using namespace cv;

//-----------------------------------【main( )函數(shù)】--------------------------------------------

// 描述:控制臺(tái)應(yīng)用程序的入口函數(shù),我們的程序從這里開始

//-----------------------------------------------------------------------------------------------

int main()

{

//【1】載入原始圖和Mat變量定義

Mat srcImage = imread(“1.jpg”); //工程目錄下應(yīng)該有一張名為1.jpg的素材圖

Mat midImage, dstImage;//臨時(shí)變量和目標(biāo)圖的定義

//【2】進(jìn)行邊緣檢測和轉(zhuǎn)化為灰度圖

Canny(srcImage, midImage, 50, 200, 3);//進(jìn)行一此canny邊緣檢測

cvtColor(midImage, dstImage, CV_GRAY2BGR);//轉(zhuǎn)化邊緣檢測后的圖為灰度圖

//【3】進(jìn)行霍夫線變換

vector《Vec2f》 lines;//定義一個(gè)矢量結(jié)構(gòu)lines用于存放得到的線段矢量集合

HoughLines(midImage, lines, 1, CV_PI / 180, 150, 0, 0);

//【4】依次在圖中繪制出每條線段

for (size_t i = 0; i 《 lines.size(); i++)

{

float rho = lines[i][0], theta = lines[i][1];

Point pt1, pt2;

double a = cos(theta), b = sin(theta);

double x0 = a*rho, y0 = b*rho;

pt1.x = cvRound(x0 + 1000 * (-b));

pt1.y = cvRound(y0 + 1000 * (a));

pt2.x = cvRound(x0 - 1000 * (-b));

pt2.y = cvRound(y0 - 1000 * (a));

line(dstImage, pt1, pt2, Scalar(55, 100, 195), 1, CV_AA);

}

//【5】顯示原始圖

imshow(“【原始圖】”, srcImage);

//【6】邊緣檢測后的圖

imshow(“【邊緣檢測后的圖】”, midImage);

//【7】顯示效果圖

imshow(“【效果圖】”, dstImage);

waitKey(0);

return 0;

}

運(yùn)行結(jié)果

aadbd62c-a29b-11eb-aece-12bb97331649.png

aaf855ae-a29b-11eb-aece-12bb97331649.png

ab06cf3a-a29b-11eb-aece-12bb97331649.png

圖30

淺提霍夫變換提取圓

我們可以使用這個(gè)相同的程序來檢測具有分析描述的其他特征。例如,在圓圈的情況下,參數(shù)方程為

其中a和b是圓心的坐標(biāo)并且是半徑。在這種情況下,算法的計(jì)算復(fù)雜度開始增加,因?yàn)槲覀儸F(xiàn)在在參數(shù)空間和三維累加器中有三個(gè)坐標(biāo)。(通常,累加器陣列的計(jì)算和大小隨著參數(shù)數(shù)量的增加而多項(xiàng)式增加,因此,基本霍夫技術(shù)僅適用于簡單曲線。)

步驟

它的算法步驟如下:

首先創(chuàng)建累加器空間,由每個(gè)像素單元格構(gòu)成。最初每個(gè)單元格都設(shè)置為0。

然后對(duì)于每個(gè)圖像中的邊緣點(diǎn),按照?qǐng)A方程將那些可能是一個(gè)圓中心的單元格值進(jìn)行累加。這些單元格在等式中由字母a表示。

然后在前面的步驟中由每個(gè)可能找到的值a,區(qū)找到滿足等式的所有可能值b

搜索累加器空間中的局部最大值。這些單元格表示算法檢測到的圓圈。?? 如果我們不知道事先定位的圓的半徑,可以使用三維累加器空間來搜索具有任意半徑的圓。當(dāng)然,這在計(jì)算上更加昂貴。

該方法還可以檢測部分位于累加器空間外部的圓,只要該圓的區(qū)域內(nèi)仍有足夠的圓。

霍夫變換提取圓的一些實(shí)現(xiàn)鏈接

-matlab關(guān)于霍夫變換提取圓

Matlab圓提取(https://ww2.mathworks.cn/help/images/ref/imfindcircles.html)

-關(guān)于opencv的提取圓(給出了C++,C和Python)

Opencv官方文檔關(guān)于圓提取(https://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html?highlight=HoughCircles)

- python實(shí)現(xiàn)提取圓

Python圓提取(https://scikit-image.org/docs/dev/api/skimage.transform.html)

淺提廣義霍夫變換

當(dāng)我們希望隔離的特征的形狀不具有描述其邊界的簡單解析方程時(shí),使用廣義Hough變換。在這種情況下,我們不使用曲線的參數(shù)方程,而是使用查找表來定義邊界位置和方向與霍夫參數(shù)之間的關(guān)系。(必須使用原型形狀在初步階段計(jì)算查找表值。)

例如,假設(shè)我們知道所需特征的形狀和方向。(見下圖)我們可以在特征中指定一個(gè)任意參考點(diǎn),其中定義了特征的形狀(即r從邊界到這個(gè)參考點(diǎn)的法線的距離和角度ω。我們的查找表(即 R表)將由這些距離和方向?qū)M成,由邊界的方向ω索引

ab31ea44-a29b-11eb-aece-12bb97331649.png

圖31

圖31:R表組件的描述。

霍夫變換空間現(xiàn)在是根據(jù)圖像中形狀的可能位置來定義的,即可能的范圍。換句話說,轉(zhuǎn)換定義為:

ab3e708e-a29b-11eb-aece-12bb97331649.png

(對(duì)于特定的已知方向,β值和來自于表值)。如果所需特征的方向未知,則該過程變得復(fù)雜,因?yàn)槲覀儽仨毻ㄟ^引入額外參數(shù)來擴(kuò)展累加器,以考慮方向。

基本霍夫變換的限制

霍夫變換只有在大量投票落入正確的分箱時(shí)才有效,因此可以在背景噪音中輕松檢測分箱。這意味著垃圾箱不能太小,否則有些選票會(huì)落入鄰近垃圾箱,從而降低主垃圾箱的可見度。

另外,當(dāng)參數(shù)數(shù)量很大時(shí)(也就是說,當(dāng)我們使用通常超過三個(gè)參數(shù)的霍夫變換時(shí)),單個(gè)分箱中投的平均投票數(shù)非常低,而這些分箱對(duì)應(yīng)的實(shí)際數(shù)字在圖像中的投票數(shù)量并不一定比其鄰居多得多。復(fù)雜性以一定的速率增加,其中每個(gè)附加參數(shù)是圖像空間的大小和m是參數(shù)的數(shù)量。因此,必須非常小心地使用Hough變換來檢測線條或圓圈以外的任何其他內(nèi)容。

最后,霍夫變換的大部分效率取決于輸入數(shù)據(jù)的質(zhì)量:為了使霍夫變換高效,必須檢測邊緣。在噪聲圖像上使用Hough變換是一個(gè)非常棘手的問題,一般而言,之前必須使用降噪階段。在圖像被斑點(diǎn)破壞的情況下(如雷達(dá)圖像中的情況),Radon變換有時(shí)更適合檢測線,因?yàn)樗ㄟ^求和來衰減噪聲。

結(jié)語

本博文主要描述基本經(jīng)典的霍夫變換,描述了霍夫變換如何提取直線及其原理,展示了部分例子和代碼實(shí)現(xiàn),也擴(kuò)展了一部分霍夫變換的簡單描述,希望能對(duì)看者有所借鑒。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 光柵
    +關(guān)注

    關(guān)注

    0

    文章

    296

    瀏覽量

    27987
  • 邊緣檢測
    +關(guān)注

    關(guān)注

    0

    文章

    94

    瀏覽量

    18420
  • 累加器
    +關(guān)注

    關(guān)注

    0

    文章

    50

    瀏覽量

    9668

原文標(biāo)題:一文解讀經(jīng)典霍夫變換(Hough Transform)

文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于LockAI視覺識(shí)別模塊:C++輪廓檢測

    。 讀取圖像幀:從攝像頭中獲取實(shí)時(shí)視頻幀。 預(yù)處理:將圖像轉(zhuǎn)換為灰度圖、降噪等操作。 特征檢測:執(zhí)行邊緣檢測、變換等算法。 結(jié)果繪制:在原圖上繪制檢測到的特征。 顯示結(jié)果:將處理后的圖像輸出到屏幕
    發(fā)表于 05-22 10:05

    電路基礎(chǔ)知識(shí)最全匯總,看這篇就夠了!(建議收藏)

    。 5.電路的斷路與短路 電路的斷路處:I=0,U≠0 電路的短路處:U=0,I≠0 。 二、基爾霍夫定律 1.幾個(gè)概念 支路:是電路的個(gè)分支。結(jié)點(diǎn):三條(或三條以上)支路的聯(lián)接點(diǎn)稱為結(jié)點(diǎn)
    發(fā)表于 05-08 14:18

    種無刷直流電機(jī)耳信號(hào)與定子繞組關(guān)系自學(xué)習(xí)方法

    的關(guān)系。提出了種無刷直流電機(jī)耳信號(hào)與定子繞組關(guān)系自學(xué)習(xí)方法,該方法通過不同的繞組通電組合將電機(jī)轉(zhuǎn)子依次轉(zhuǎn)到6個(gè)不同的位置并記錄對(duì)應(yīng)的耳信號(hào),然后得出耳信號(hào)與定子繞組的對(duì)應(yīng)關(guān)系。
    發(fā)表于 03-25 15:15

    LC濾波器設(shè)計(jì)與制作 [日 森榮二]

    本書主要介紹了濾波器的種類和特性,低通濾波器的經(jīng)典設(shè)計(jì),巴特沃思型低通濾波器的設(shè)計(jì),切比雪型低通濾波器的設(shè)計(jì),白塞爾型低通濾波器的設(shè)計(jì),高斯型低通濾波器的設(shè)計(jì),高通濾波器的設(shè)計(jì)方法, 帶通濾波器
    發(fā)表于 03-06 15:04

    尼韋爾與華龍航空簽署合作備忘錄

    近日,尼韋爾與華龍航空在中東及北非商務(wù)航空展(MEBAA)上共同簽署了份合作備忘錄,標(biāo)志著雙方將進(jìn)步深化在航空服務(wù)與技術(shù)開發(fā)等領(lǐng)域的合作關(guān)系。 此次簽約不僅是對(duì)雙方過去合作成果的肯定,更是
    的頭像 發(fā)表于 12-24 13:43 ?719次閱讀

    福田卡汽車新能源技術(shù)戰(zhàn)略解讀

    近日,以“讓每公里更美好”為主題的福田卡汽車技術(shù)戰(zhàn)略暨全新產(chǎn)品發(fā)布會(huì)在福田汽車X實(shí)驗(yàn)室舉行。行業(yè)領(lǐng)導(dǎo)、戰(zhàn)略合作伙伴及廣大媒體等300余名嘉賓出席本次活動(dòng)。會(huì)上,福田卡汽車詳細(xì)解讀
    的頭像 發(fā)表于 12-23 15:43 ?762次閱讀

    尼韋爾計(jì)劃分拆航空航天業(yè)務(wù)

    近日,尼韋爾公司已正式將分拆航空航天業(yè)務(wù)的計(jì)劃納入其未來發(fā)展戰(zhàn)略之中。這重大決策標(biāo)志著尼韋爾在優(yōu)化業(yè)務(wù)結(jié)構(gòu)、提升市場競爭力方面邁出了重要步。
    的頭像 發(fā)表于 12-18 10:33 ?741次閱讀

    奧托立廣州新工廠正式開業(yè)

    近日,奧托立在廣州隆重舉辦了廣州奧托立汽車安全系統(tǒng)有限公司新工廠的開業(yè)典禮。這是奧托立工廠產(chǎn)能提升建設(shè)的重要里程碑式時(shí)刻,這標(biāo)志著奧托立在汽車安全系統(tǒng)的產(chǎn)能邁上
    的頭像 發(fā)表于 12-11 09:58 ?1118次閱讀

    解讀SPI

    讓我們回顧下,我們學(xué)習(xí)了串口通訊(優(yōu)點(diǎn)是全雙工,缺點(diǎn)是只能點(diǎn)對(duì)點(diǎn)通訊) 另外還學(xué)習(xí)了IIC通訊(優(yōu)點(diǎn)是主多從通訊,缺點(diǎn)是半雙工) 技巧:看個(gè)總線是半雙工還是全雙工就看有幾根數(shù)據(jù)線 那有沒有總線是以全雙工,
    的頭像 發(fā)表于 11-19 11:37 ?1088次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>解讀</b>SPI

    經(jīng)典傅里葉變換與快速傅里葉變換的區(qū)別

    經(jīng)典傅里葉變換與快速傅里葉變換(FFT)在多個(gè)方面存在顯著的區(qū)別,以下是對(duì)這兩者的比較: 、定義與基本原理 經(jīng)典傅里葉
    的頭像 發(fā)表于 11-14 09:37 ?1327次閱讀

    歐姆定律和基爾霍夫定律的區(qū)別

    歐姆定律和基爾霍夫定律是電路學(xué)中兩個(gè)重要的定律,它們各自描述了電路中不同的現(xiàn)象和規(guī)律。以下是它們之間的主要區(qū)別: 、定義與內(nèi)容 歐姆定律 定義:描述電流、電壓和電阻之間關(guān)系的基本定律。 內(nèi)容:電流
    的頭像 發(fā)表于 10-28 15:19 ?1451次閱讀

    尼韋爾宣布與谷歌云達(dá)成合作

    近日,尼韋爾(Honeywell)宣布與谷歌云(Google Cloud)達(dá)成合作,共同將生成式人工智能Gemini引入工業(yè)領(lǐng)域。這合作標(biāo)志著尼韋爾在高科技和制造領(lǐng)域的又次重要
    的頭像 發(fā)表于 10-23 17:36 ?829次閱讀

    博威合金攜手貝肯(中國)亮相埃森焊接展,打造焊材定制化解決方案

    博威合金與貝肯(中國)在埃森焊接展展出的系列焊接材料解決方案,充分展現(xiàn)了其在研發(fā)、制造和應(yīng)用中的深度融合,精準(zhǔn)匹配了新能源汽車、鋁罐車、自行車等產(chǎn)業(yè)的差異化焊接需求。
    的頭像 發(fā)表于 08-15 15:03 ?751次閱讀
    博威合金攜手貝肯<b class='flag-5'>霍</b><b class='flag-5'>夫</b>(中國)亮相埃森焊接展,打造焊材定制化解決方案

    節(jié)點(diǎn)電位法適用于什么的電路

    節(jié)點(diǎn)電位法(Node Voltage Method)是電路分析中的種基本方法,主要用于求解線性電路中的節(jié)點(diǎn)電壓。該方法基于基爾霍夫電流定律(Kirchhoff's Current Law,KCL
    的頭像 發(fā)表于 08-06 17:06 ?1855次閱讀

    尼韋爾考慮對(duì)Quantinuum進(jìn)行IPO

    據(jù)知情人士透露,尼韋爾公司正積極探索在2025年前將旗下量子計(jì)算公司Quantinuum在美國進(jìn)行首次公開募股(IPO)的可行性。目前,尼韋爾已與多家銀行機(jī)構(gòu)就這潛在IPO展開了早期磋商,并計(jì)劃為Quantinuum尋求高
    的頭像 發(fā)表于 07-29 16:38 ?813次閱讀
    主站蜘蛛池模板: 免费看片免| 日本乱理论片免费看 | 在线免费观看色片 | 97久久草草超级碰碰碰 | 欧美性极品高清 | 国产三级a三级三级野外 | 亚洲午夜久久影院 | 未满十八18周岁禁止免费国产 | 免费高清特级毛片 | 欧美猛交xxx呻吟 | 久久免费视频2 | 亚洲一区免费看 | 亚洲精品乱码久久久久久蜜桃图片 | 末发育娇小性色xxxxx视频 | 91视频免费观看 | 韩国三级观影久久 | 张柏芝三级无删减在线观看 | 狠狠色丁香婷婷综合小时婷婷 | 网女色| 欧美怡红院免费全视频 | 欧美日本俄罗斯一级毛片 | 日韩高清一级 | 成人午夜大片免费视频77777 | 男人日女人免费视频 | 亚洲一本高清 | 色婷婷视频在线 | 亚洲国产精品自在现线让你爽 | 精品福利视频网 | 一级aaa毛片 | 超级乱淫视频播放日韩 | 精品毛片视频 | 日本大片网 | 大尺度在线播放 | 久久sp | 激情久久久久久久久久 | 婷婷六月综合 | 久久艹人人艹 | www.四虎| 免费一级片视频 | 丁香六月在线 | 亚洲邪恶天堂影院在线观看 |