圖象的邊緣是指圖象局部區(qū)域亮度變化顯著的部分,該區(qū)域的灰度剖面一般可以看作是一個(gè)階躍,既從一個(gè)灰度值在很小的緩沖區(qū)域內(nèi)急劇變化到另一個(gè)灰度相差較大的灰度值。圖象的邊緣部分集中了圖象的大部分信息,圖象邊緣的確定與提取對(duì)于整個(gè)圖象場(chǎng)景的識(shí)別與理解是非常重要的,同時(shí)也是圖象分割所依賴的重要特征,邊緣檢測(cè)主要是圖象的灰度變化的度量、檢測(cè)和定位,自從1959提出邊緣檢測(cè)以來(lái),經(jīng)過五十多年的發(fā)展,已有許多中不同的邊緣檢測(cè)方法。根據(jù)作者的理解和實(shí)踐,本文對(duì)邊緣檢測(cè)的原理進(jìn)行了描述,在此基礎(chǔ)上著重對(duì)Canny檢測(cè)算法的實(shí)現(xiàn)進(jìn)行詳述。
本文所述內(nèi)容均由編程驗(yàn)證而來(lái),在實(shí)現(xiàn)過程中,有任何錯(cuò)誤或者不足之處大家共同討論(本文不講述枯燥的理論證明和數(shù)學(xué)推導(dǎo),僅僅從算法的實(shí)現(xiàn)以及改進(jìn)上進(jìn)行原理性和工程化的描述)。
1、邊緣檢測(cè)原理及步驟
在之前的博文中,作者從一維函數(shù)的躍變檢測(cè)開始,循序漸進(jìn)的對(duì)二維圖像邊緣檢測(cè)的基本原理進(jìn)行了通俗化的描述。結(jié)論是:實(shí)現(xiàn)圖像的邊緣檢測(cè),就是要用離散化梯度逼近函數(shù)根據(jù)二維灰度矩陣梯度向量來(lái)尋找圖像灰度矩陣的灰度躍變位置,然后在圖像中將這些位置的點(diǎn)連起來(lái)就構(gòu)成了所謂的圖像邊緣(圖像邊緣在這里是一個(gè)統(tǒng)稱,包括了二維圖像上的邊緣、角點(diǎn)、紋理等基元圖)。
在實(shí)際情況中理想的灰度階躍及其線條邊緣圖像是很少見到的,同時(shí)大多數(shù)的傳感器件具有低頻濾波特性,這樣會(huì)使得階躍邊緣變?yōu)樾逼滦赃吘墸雌饋?lái)其中的強(qiáng)度變化不是瞬間的,而是跨越了一定的距離。這就使得在邊緣檢測(cè)中首先要進(jìn)行的工作是濾波。
1)濾波:邊緣檢測(cè)的算法主要是基于圖像強(qiáng)度的一階和二階導(dǎo)數(shù),但導(dǎo)數(shù)通常對(duì)噪聲很敏感,因此必須采用濾波器來(lái)改善與噪聲有關(guān)的邊緣檢測(cè)器的性能。常見的濾波方法主要有高斯濾波,即采用離散化的高斯函數(shù)產(chǎn)生一組歸一化的高斯核(具體見“高斯濾波原理及其編程離散化實(shí)現(xiàn)方法”一文),然后基于高斯核函數(shù)對(duì)圖像灰度矩陣的每一點(diǎn)進(jìn)行加權(quán)求和(具體程序?qū)崿F(xiàn)見下文)。
2)增強(qiáng):增強(qiáng)邊緣的基礎(chǔ)是確定圖像各點(diǎn)鄰域強(qiáng)度的變化值。增強(qiáng)算法可以將圖像灰度點(diǎn)鄰域強(qiáng)度值有顯著變化的點(diǎn)凸顯出來(lái)。在具體編程實(shí)現(xiàn)時(shí),可通過計(jì)算梯度幅值來(lái)確定。
3)檢測(cè):經(jīng)過增強(qiáng)的圖像,往往鄰域中有很多點(diǎn)的梯度值比較大,而在特定的應(yīng)用中,這些點(diǎn)并不是我們要找的邊緣點(diǎn),所以應(yīng)該采用某種方法來(lái)對(duì)這些點(diǎn)進(jìn)行取舍。實(shí)際工程中,常用的方法是通過閾值化方法來(lái)檢測(cè)。
2、Canny邊緣檢測(cè)算法原理
JohnCanny于1986年提出Canny算子,它與Marr(LoG)邊緣檢測(cè)方法類似,也屬于是先平滑后求導(dǎo)數(shù)的方法。本節(jié)對(duì)根據(jù)上述的邊緣檢測(cè)過程對(duì)Canny檢測(cè)算法的原理進(jìn)行介紹。
2.1 對(duì)原始圖像進(jìn)行灰度化
Canny算法通常處理的圖像為灰度圖,因此如果攝像機(jī)獲取的是彩色圖像,那首先就得進(jìn)行灰度化。對(duì)一幅彩色圖進(jìn)行灰度化,就是根據(jù)圖像各個(gè)通道的采樣值進(jìn)行加權(quán)平均。以RGB格式的彩圖為例,通?;叶然捎玫姆椒ㄖ饕校?/span>
方法1:Gray=(R+G+B)/3;
方法2:Gray=0.299R+0.587G+0.114B;(這種參數(shù)考慮到了人眼的生理特點(diǎn))
注意1:至于其他格式的彩色圖像,可以根據(jù)相應(yīng)的轉(zhuǎn)換關(guān)系轉(zhuǎn)為RGB然后再進(jìn)行灰度化;
注意2:在編程時(shí)要注意圖像格式中RGB的順序通常為BGR。
2.2 對(duì)圖像進(jìn)行高斯濾波
圖像高斯濾波的實(shí)現(xiàn)可以用兩個(gè)一維高斯核分別兩次加權(quán)實(shí)現(xiàn),也可以通過一個(gè)二維高斯核一次卷積實(shí)現(xiàn)。
1)高斯核實(shí)現(xiàn)
上式為離散化的一維高斯函數(shù),確定參數(shù)就可以得到一維核向量。
上式為離散化的二維高斯函數(shù),確定參數(shù)就可以得到二維核向量。
注意1:關(guān)于參數(shù)Sigma的取值詳見上篇博文。
注意2:在求的高斯核后,要對(duì)整個(gè)核進(jìn)行歸一化處理。
2)圖像高斯濾波
對(duì)圖像進(jìn)行高斯濾波,聽起來(lái)很玄乎,其實(shí)就是根據(jù)待濾波的像素點(diǎn)及其鄰域點(diǎn)的灰度值按照一定的參數(shù)規(guī)則進(jìn)行加權(quán)平均。這樣可以有效濾去理想圖像中疊加的高頻噪聲。
通常濾波和邊緣檢測(cè)是矛盾的概念,抑制了噪聲會(huì)使得圖像邊緣模糊,這回增加邊緣定位的不確定性;而如果要提高邊緣檢測(cè)的靈敏度,同時(shí)對(duì)噪聲也提高了靈敏度。實(shí)際工程經(jīng)驗(yàn)表明,高斯函數(shù)確定的核可以在抗噪聲干擾和邊緣檢測(cè)精確定位之間提供較好的折衷方案。這就是所謂的高斯圖像濾波,具體實(shí)現(xiàn)代碼見下文。
2.3 用一階偏導(dǎo)的有限差分來(lái)計(jì)算梯度的幅值和方向
關(guān)于圖像灰度值得梯度可使用一階有限差分來(lái)進(jìn)行近似,這樣就可以得圖像在x和y方向上偏導(dǎo)數(shù)的兩個(gè)矩陣。常用的梯度算子有如下幾種:
1)Roberts算子
上式為其x和y方向偏導(dǎo)數(shù)計(jì)算模板,可用數(shù)學(xué)公式表達(dá)其每個(gè)點(diǎn)的梯度幅值為:
2)Sobel算子
上式三個(gè)矩陣分別為該算子的x向卷積模板、y向卷積模板以及待處理點(diǎn)的鄰域點(diǎn)標(biāo)記矩陣,據(jù)此可用數(shù)學(xué)公式表達(dá)其每個(gè)點(diǎn)的梯度幅值為:
3)Prewitt算子 和Sobel算子原理一樣,在此僅給出其卷積模板。
4)Canny算法所采用的方法 在本文實(shí)現(xiàn)的Canny算法中所采用的卷積算子比較簡(jiǎn)單,表達(dá)如下:
其x向、y向的一階偏導(dǎo)數(shù)矩陣,梯度幅值以及梯度方向的數(shù)學(xué)表達(dá)式為:
求出這幾個(gè)矩陣后,就可以進(jìn)行下一步的檢測(cè)過程。
2.4 對(duì)梯度幅值進(jìn)行非極大值抑制 圖像梯度幅值矩陣中的元素值越大,說(shuō)明圖像中該點(diǎn)的梯度值越大,但這不不能說(shuō)明該點(diǎn)就是邊緣(這僅僅是屬于圖像增強(qiáng)的過程)。在Canny算法中,非極大值抑制是進(jìn)行邊緣檢測(cè)的重要步驟,通俗意義上是指尋找像素點(diǎn)局部最大值,將非極大值點(diǎn)所對(duì)應(yīng)的灰度值置為0,這樣可以剔除掉一大部分非邊緣的點(diǎn)(這是本人的理解)。
圖1 非極大值抑制原理
根據(jù)圖1 可知,要進(jìn)行非極大值抑制,就首先要確定像素點(diǎn)C的灰度值在其8值鄰域內(nèi)是否為最大。圖1中藍(lán)色的線條方向?yàn)镃點(diǎn)的梯度方向,這樣就可以確定其局部的最大值肯定分布在這條線上,也即出了C點(diǎn)外,梯度方向的交點(diǎn)dTmp1和dTmp2這兩個(gè)點(diǎn)的值也可能會(huì)是局部最大值。因此,判斷C點(diǎn)灰度與這兩個(gè)點(diǎn)灰度大小即可判斷C點(diǎn)是否為其鄰域內(nèi)的局部最大灰度點(diǎn)。如果經(jīng)過判斷,C點(diǎn)灰度值小于這兩個(gè)點(diǎn)中的任一個(gè),那就說(shuō)明C點(diǎn)不是局部極大值,那么則可以排除C點(diǎn)為邊緣。這就是非極大值抑制的工作原理。
作者認(rèn)為,在理解的過程中需要注意以下兩點(diǎn):
1)中非最大抑制是回答這樣一個(gè)問題:“當(dāng)前的梯度值在梯度方向上是一個(gè)局部最大值嗎?” 所以,要把當(dāng)前位置的梯度值與梯度方向上兩側(cè)的梯度值進(jìn)行比較;
2)梯度方向垂直于邊緣方向。
但實(shí)際上,我們只能得到C點(diǎn)鄰域的8個(gè)點(diǎn)的值,而dTmp1和dTmp2并不在其中,要得到這兩個(gè)值就需要對(duì)該兩個(gè)點(diǎn)兩端的已知灰度進(jìn)行線性插值,也即根據(jù)圖1中的g1和g2對(duì)dTmp1進(jìn)行插值,根據(jù)g3和g4對(duì)dTmp2進(jìn)行插值,這要用到其梯度方向,這是上文Canny算法中要求解梯度方向矩陣Thita的原因。 完成非極大值抑制后,會(huì)得到一個(gè)二值圖像,非邊緣的點(diǎn)灰度值均為0,可能為邊緣的局部灰度極大值點(diǎn)可設(shè)置其灰度為128。根據(jù)下文的具體測(cè)試圖像可以看出,這樣一個(gè)檢測(cè)結(jié)果還是包含了很多由噪聲及其他原因造成的假邊緣。因此還需要進(jìn)一步的處理。
2.5 用雙閾值算法檢測(cè)和連接邊緣
Canny算法中減少假邊緣數(shù)量的方法是采用雙閾值法。選擇兩個(gè)閾值(關(guān)于閾值的選取方法在擴(kuò)展中進(jìn)行討論),根據(jù)高閾值得到一個(gè)邊緣圖像,這樣一個(gè)圖像含有很少的假邊緣,但是由于閾值較高,產(chǎn)生的圖像邊緣可能不閉合,未解決這樣一個(gè)問題采用了另外一個(gè)低閾值。
在高閾值圖像中把邊緣鏈接成輪廓,當(dāng)?shù)竭_(dá)輪廓的端點(diǎn)時(shí),該算法會(huì)在斷點(diǎn)的8鄰域點(diǎn)中尋找滿足低閾值的點(diǎn),再根據(jù)此點(diǎn)收集新的邊緣,直到整個(gè)圖像邊緣閉合。
以上即為整個(gè)Canny邊緣檢測(cè)算法的原理分析,接下來(lái)我們進(jìn)行VC下的算法實(shí)現(xiàn)和效果分析
|