引自: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ì)算公式类腮,
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è)方向之一趋距。
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)舉例如下:
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è)的效果是很顯著的酥泛。相比普通的梯度算法大大抑制了噪聲引起的偽邊緣今豆,而且是邊緣細(xì)化,易于后續(xù)處理揭璃。對(duì)于對(duì)比度較低的圖像晚凿,通過(guò)調(diào)節(jié)參數(shù),Canny算法也能有很好的效果瘦馍。