Canny邊緣檢測(cè)

引自:https://www.cnblogs.com/mightycode/p/6394810.html 作者:愛(ài)魚
http://www.cnblogs.com/techyan1990/p/7291771.html 作者:TechYan
https://www.cnblogs.com/Black-Small/p/3258463.html 作者:Black Small

Canny邊緣檢測(cè)算子是一種多級(jí)檢測(cè)算法司光。1986年由John F. Canny提出瓮恭,同時(shí)提出了邊緣檢測(cè)的三大準(zhǔn)則:

  • 1.低錯(cuò)誤率的邊緣檢測(cè):檢測(cè)算法應(yīng)該精確地找到圖像中的盡可能多的邊緣,盡可能的減少漏檢和誤檢。
  • 2.最優(yōu)定位:檢測(cè)的邊緣點(diǎn)應(yīng)該精確地定位于邊緣的中心椭迎。
  • 3.圖像中的任意邊緣應(yīng)該只被標(biāo)記一次,同時(shí)圖像噪聲不應(yīng)產(chǎn)生偽邊緣。

為了滿足這些要求,Canny使用了變分法烁涌。Canny檢測(cè)器中的最優(yōu)函數(shù)使用四個(gè)指數(shù)項(xiàng)的和來(lái)描述,它可以由高斯函數(shù)的一階導(dǎo)數(shù)來(lái)近似酒觅。
在目前常用的邊緣檢測(cè)方法中撮执,Canny邊緣檢測(cè)算法是具有嚴(yán)格定義的,可以提供良好可靠檢測(cè)的方法之一舷丹。由于它具有滿足邊緣檢測(cè)的三個(gè)標(biāo)準(zhǔn)和實(shí)現(xiàn)過(guò)程簡(jiǎn)單的優(yōu)勢(shì)抒钱,成為邊緣檢測(cè)最流行的算法之一。

Canny邊緣檢測(cè)算法的處理流程

  • 圖像灰度化:只有灰度圖才能進(jìn)行邊緣檢測(cè)
  • 使用高斯濾波器,以平滑圖像谋币,濾除噪聲仗扬。
  • 計(jì)算圖像中每個(gè)像素點(diǎn)的梯度強(qiáng)度和方向。
  • 應(yīng)用非極大值(Non-Maximum Suppression)抑制瑞信,以消除邊緣檢測(cè)帶來(lái)的雜散響應(yīng)厉颤。
  • 應(yīng)用雙閾值(Double-Threshold)檢測(cè)來(lái)確定真實(shí)的和潛在的邊緣穴豫。
  • 通過(guò)抑制孤立的弱邊緣最終完成邊緣檢測(cè)凡简。

1.圖像灰度化:

Canny算法通常處理的圖像為灰度圖,因此如果攝像機(jī)獲取的是彩色圖像精肃,那首先就得進(jìn)行灰度化秤涩。對(duì)一幅彩色圖進(jìn)行灰度化,就是根據(jù)圖像各個(gè)通道的采樣值進(jìn)行加權(quán)平均司抱。以RGB格式的彩圖為例筐眷,通常灰度化采用的方法主要有:
方法1:Gray=(R+G+B)/3;
方法2:Gray=0.299R+0.587G+0.114B;
注意1:至于其他格式的彩色圖像习柠,可以根據(jù)相應(yīng)的轉(zhuǎn)換關(guān)系轉(zhuǎn)為RGB然后再進(jìn)行灰度化匀谣;
注意2:在編程時(shí)要注意圖像格式中RGB的順序通常為BGR。

2.高斯濾波

為了盡可能減少噪聲對(duì)邊緣檢測(cè)結(jié)果的影響资溃,所以必須濾除噪聲以防止由噪聲引起的錯(cuò)誤檢測(cè)武翎。為了平滑圖像,使用高斯濾波器與圖像進(jìn)行卷積溶锭,該步驟將平滑圖像宝恶,以減少邊緣檢測(cè)器上明顯的噪聲影響。
其實(shí)在各個(gè)算法庫(kù)如Matlab趴捅、OpenCV等垫毙,在實(shí)現(xiàn)的時(shí)候,就是采用一個(gè)矩陣模板進(jìn)行加權(quán)運(yùn)算拱绑,拿圖像的八連通區(qū)域來(lái)說(shuō)综芥,中間點(diǎn)的像素值就等于八連通區(qū)的像素值的均值,這樣達(dá)到平滑的效果猎拨,該模板我們常成為高斯核膀藐。
根據(jù)上述分析可知,高斯核是整個(gè)求解的關(guān)鍵迟几。很顯然消请,它是通過(guò)二維高斯函數(shù)計(jì)算得來(lái)的。這里給出離散高斯核矩陣的計(jì)算公式类腮,

離散的高斯卷積核H: (2k+1)×(2k+1)維臊泰,其元素計(jì)算方法為:
其中Sigma為方差赞草,k確定核矩陣的維數(shù)。高斯卷積核大小的選擇將影響Canny檢測(cè)器的性能妇蛀。尺寸越大耐齐,檢測(cè)器對(duì)噪聲的敏感度越低,但是邊緣檢測(cè)的定位誤差也將略有增加需频。一般5x5是一個(gè)比較不錯(cuò)的trade off丁眼。
Lena原圖

Lena高斯模糊

3.計(jì)算圖像中每個(gè)像素點(diǎn)的梯度強(qiáng)度和方向

圖像的邊緣可以指向不同方向,因此經(jīng)典Canny算法用了四個(gè)梯度算子來(lái)分別計(jì)算水平昭殉,垂直和對(duì)角線方向的梯度苞七。但是通常都不用四個(gè)梯度算子來(lái)分別計(jì)算四個(gè)方向。常用的邊緣差分算子(如Rober挪丢,Prewitt蹂风,Sobel)計(jì)算水平和垂直方向的差分Gx和Gy。這樣就可以如下計(jì)算梯度模和方向:

梯度角度θ范圍從弧度-π到π乾蓬,然后把它近似到四個(gè)方向惠啄,分別代表水平,垂直和兩個(gè)對(duì)角線方向(0°,45°,90°,135°)任内∧於桑可以以±iπ/8(i=1,3,5,7)分割,落在每個(gè)區(qū)域的梯度角給一個(gè)特定值死嗦,代表四個(gè)方向之一趋距。

這里我選擇Sobel算子計(jì)算梯度。Sobel算法很簡(jiǎn)單越走,到處都可以找到棚品,就不列出代碼來(lái)了。相對(duì)于其他邊緣算子廊敌,Sobel算子得出來(lái)的邊緣粗大明亮铜跑。

Sobel算子 無(wú)閾值

4.非極大值(Non-Maximum Suppression)抑制

非極大值抑制是一種邊緣稀疏技術(shù),非極大值抑制的作用在于“瘦”邊骡澈。對(duì)圖像進(jìn)行梯度計(jì)算后锅纺,僅僅基于梯度值提取的邊緣仍然很模糊。對(duì)于標(biāo)準(zhǔn)3肋殴,對(duì)邊緣有且應(yīng)當(dāng)只有一個(gè)準(zhǔn)確的響應(yīng)囤锉。而非極大值抑制則可以幫助將局部最大值之外的所有梯度值抑制為0,對(duì)梯度圖像中每個(gè)像素進(jìn)行非極大值抑制的算法是:

  • 將當(dāng)前像素的梯度強(qiáng)度與沿正負(fù)梯度方向上的兩個(gè)像素進(jìn)行比較护锤。
  • 如果當(dāng)前像素的梯度強(qiáng)度與另外兩個(gè)像素相比最大官地,則該像素點(diǎn)保留為邊緣點(diǎn),否則該像素點(diǎn)將被抑制烙懦。

通常為了更加精確的計(jì)算驱入,在跨越梯度方向的兩個(gè)相鄰像素之間使用線性插值來(lái)得到要比較的像素梯度,現(xiàn)舉例如下:

如圖3-2所示,將梯度分為8個(gè)方向亏较,分別為E莺褒、NE、N雪情、NW遵岩、W、SW巡通、S尘执、SE,其中0代表045度,1代表4590度扁达,2代表-90~ -45度正卧,3代表-45~ 0度。像素點(diǎn)P的梯度方向?yàn)閠heta跪解,則像素點(diǎn)P1和P2的梯度線性插值為:
因此非極大值抑制的偽代碼描寫如下:
需要注意的是,如何標(biāo)志方向并不重要签孔,重要的是梯度方向的計(jì)算要和梯度算子的選取保持一致叉讥。
非極大值抑制

5.雙閾值檢測(cè)

在施加非極大值抑制之后,剩余的像素可以更準(zhǔn)確地表示圖像中的實(shí)際邊緣饥追。然而图仓,仍然存在由于噪聲和顏色變化引起的一些邊緣像素。為了解決這些雜散響應(yīng)但绕,必須用弱梯度值過(guò)濾邊緣像素救崔,并保留具有高梯度值的邊緣像素,可以通過(guò)選擇高低閾值來(lái)實(shí)現(xiàn)捏顺。如果邊緣像素的梯度值高于高閾值六孵,則將其標(biāo)記為強(qiáng)邊緣像素;如果邊緣像素的梯度值小于高閾值并且大于低閾值幅骄,則將其標(biāo)記為弱邊緣像素劫窒;如果邊緣像素的梯度值小于低閾值,則會(huì)被抑制拆座。閾值的選擇取決于給定輸入圖像的內(nèi)容主巍。

6.抑制孤立的弱邊緣

強(qiáng)邊緣點(diǎn)可以認(rèn)為是真的邊緣。弱邊緣點(diǎn)則可能是真的邊緣挪凑,也可能是噪聲或顏色變化引起的孕索。為得到精確的結(jié)果,后者引起的弱邊緣點(diǎn)應(yīng)該去掉躏碳。通常認(rèn)為真實(shí)邊緣引起的弱邊緣點(diǎn)和強(qiáng)邊緣點(diǎn)是連通的搞旭,而又噪聲引起的弱邊緣點(diǎn)則不會(huì)。所謂的滯后邊界跟蹤算法檢查一個(gè)弱邊緣點(diǎn)的8連通領(lǐng)域像素,只要有強(qiáng)邊緣點(diǎn)存在选脊,那么這個(gè)弱邊緣點(diǎn)被認(rèn)為是真是邊緣保留下來(lái)杭抠。

這個(gè)算法搜索所有連通的弱邊緣,如果一條連通的弱邊緣的任何一個(gè)點(diǎn)和強(qiáng)邊緣點(diǎn)連通恳啥,則保留這條弱邊緣偏灿,否則抑制這條弱邊緣。搜索時(shí)可以用廣度優(yōu)先或者深度優(yōu)先算法钝的,我在這里實(shí)現(xiàn)了應(yīng)該是最容易的深度優(yōu)先算法翁垂。一次連通一條邊緣的深度優(yōu)先算法如下:

  • 1.準(zhǔn)備一個(gè)棧s,一個(gè)隊(duì)列q硝桩,設(shè)聯(lián)通指示變量connected為假沿猜。從圖像的第一個(gè)點(diǎn)開始,進(jìn)入2碗脊。
  • 2.如果這個(gè)點(diǎn)是弱邊界點(diǎn)并且沒(méi)有被標(biāo)記啼肩,把它標(biāo)記,并把它作為第一個(gè)元素放入棧s中衙伶,同時(shí)把它放入記錄連通曲線的隊(duì)列q祈坠,進(jìn)入3。如果這個(gè)點(diǎn)不是弱邊界或者已經(jīng)被標(biāo)記過(guò)矢劲,到圖像的下一個(gè)點(diǎn)赦拘,重復(fù)2。
  • 3.從棧s中取出一個(gè)元素芬沉,查找它的8像素領(lǐng)域躺同。如果一個(gè)領(lǐng)域像素是弱邊界并且沒(méi)有被標(biāo)記過(guò),把這個(gè)領(lǐng)域像素標(biāo)記丸逸,并加入棧s中蹋艺,同時(shí)加入隊(duì)列q。同時(shí)查找領(lǐng)域?qū)?yīng)的強(qiáng)邊界圖椭员,如果有一個(gè)像素是強(qiáng)邊界车海,表示這條弱邊界曲線和強(qiáng)邊界聯(lián)通,設(shè)置connected為真隘击。重復(fù)3直到棧中沒(méi)有元素了侍芝。如果connected為假,則依次從隊(duì)列q中取出每個(gè)元素埋同,清空標(biāo)記州叠。如果connected為真,保留標(biāo)記凶赁。
  • 4.清空隊(duì)列q咧栗,設(shè)置connected為假逆甜,移動(dòng)到圖像的下一個(gè)點(diǎn),到2致板。

7.結(jié)果

下面是對(duì)Lena圖計(jì)算Canny邊緣檢測(cè)的梯度模圖和二值化圖交煞,高斯半徑2,高閥值100斟或,低閥值50素征。


Canny檢測(cè)梯度模圖
Canny檢測(cè)梯度二值圖

作為對(duì)比,下面是用一階差分和Sobel算子對(duì)原圖計(jì)算的結(jié)果萝挤,閥值100御毅。由于一階差分的梯度值相對(duì)較小,我對(duì)一階差分的梯度值放大了一定倍數(shù)怜珍,使得它和Sobel的梯度值保持同樣的水平端蛆。
一階差分梯度模圖
一階差分梯度二值圖
Sobel梯度模圖
Sobel梯度二值圖

很明顯,Canny邊緣檢測(cè)的效果是很顯著的酥泛。相比普通的梯度算法大大抑制了噪聲引起的偽邊緣今豆,而且是邊緣細(xì)化,易于后續(xù)處理揭璃。對(duì)于對(duì)比度較低的圖像晚凿,通過(guò)調(diào)節(jié)參數(shù),Canny算法也能有很好的效果瘦馍。


原圖
Canny梯度模,高斯半徑2应役,低閥值30情组,高閥值100
Canny梯度二值化圖,高斯半徑2箩祥,低閥值30院崇,高閥值100

原圖
Canny梯度模,高斯半徑1袍祖,低閥值40底瓣,高閥值80
Canny梯度二值化圖,高斯半徑1蕉陋,低閥值40捐凭,高閥值80
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凳鬓,隨后出現(xiàn)的幾起案子茁肠,更是在濱河造成了極大的恐慌,老刑警劉巖缩举,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垦梆,死亡現(xiàn)場(chǎng)離奇詭異匹颤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)托猩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門印蓖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人京腥,你說(shuō)我怎么就攤上這事赦肃。” “怎么了绞旅?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵摆尝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我因悲,道長(zhǎng)堕汞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任晃琳,我火速辦了婚禮讯检,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卫旱。我一直安慰自己人灼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布顾翼。 她就那樣靜靜地躺著投放,像睡著了一般。 火紅的嫁衣襯著肌膚如雪适贸。 梳的紋絲不亂的頭發(fā)上灸芳,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音拜姿,去河邊找鬼烙样。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蕊肥,可吹牛的內(nèi)容都是我干的谒获。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼壁却,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼批狱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起儒洛,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤精耐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后琅锻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卦停,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡向胡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惊完。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片僵芹。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖小槐,靈堂內(nèi)的尸體忽然破棺而出拇派,到底是詐尸還是另有隱情,我是刑警寧澤凿跳,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布件豌,位于F島的核電站,受9級(jí)特大地震影響控嗜,放射性物質(zhì)發(fā)生泄漏茧彤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一疆栏、第九天 我趴在偏房一處隱蔽的房頂上張望曾掂。 院中可真熱鬧,春花似錦壁顶、人聲如沸珠洗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)许蓖。三九已至,卻和暖如春调衰,著一層夾襖步出監(jiān)牢的瞬間蛔糯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工窖式, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人动壤。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓萝喘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親琼懊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阁簸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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