郭志彪,段為
(中國移動通信集團(tuán)廣東有限公司,廣州 510623)
基于OpenCV的邊緣檢測技術(shù)研究
郭志彪,段為
(中國移動通信集團(tuán)廣東有限公司,廣州 510623)
邊緣檢測是圖像分析識別前必不可少的環(huán)節(jié),是一種重要的圖像預(yù)處理技術(shù)。回顧圖像邊緣檢測技術(shù)的發(fā)展歷程,討論一些典型的邊緣檢測算法的特點(diǎn),分析其機(jī)理和優(yōu)劣,并對其中的Canny算法進(jìn)行優(yōu)化并通過OpenCV實(shí)現(xiàn)。
邊緣檢測;機(jī)器視覺;圖像處理;OpenCV
數(shù)字圖像邊緣檢測技術(shù)是信息科學(xué)近年來發(fā)展最為迅速的學(xué)科之一。而圖像邊緣作為圖像最基本的特征之一,在圖像分割、圖像識別以及其他圖像相關(guān)的各個(gè)領(lǐng)域有著廣泛的應(yīng)用,邊緣檢測是圖像處理和機(jī)器視覺中的一個(gè)重要分支,在圖像分析中有著重要的意義。
隨著計(jì)算機(jī)技術(shù)的發(fā)展和普及,數(shù)字圖像處理也迎來了迅猛發(fā)展的時(shí)期。對數(shù)字圖像的處理已廣泛應(yīng)用到各個(gè)領(lǐng)域。而邊緣信息作為重要的圖像特征信息,許多學(xué)者采用不同的方法研究如何提取圖像的邊緣。目前,常用的邊緣檢測算子有以下幾種:Sobel算子、Isotropic Sobel算子、Roberts算子、Prewitt算子。
1.1 Sobel 算子
Sobel算子基本步驟是先對圖像進(jìn)行平滑處理,消除噪聲的影響,然后再作微分運(yùn)算。Sobel算子平滑處理時(shí)使用的積卷核如圖1。選擇中心點(diǎn)為錨點(diǎn),對周圍像素的灰度進(jìn)行加權(quán)平均,找出變化明顯的邊緣點(diǎn)。但使用該算子容易造成邊緣不連續(xù),丟失細(xì)節(jié)。
圖1 Sobel算子的卷積因子
1.2 Isotropic Sobel 算子
Isotropic Sobel算子是Sobel算子的另一種形式,基本原理與Sobel算子相似,主要區(qū)別在于Isotropic Sobel算子在檢測不同方向的邊沿時(shí)使用同一梯度幅值。
1.3 算子Roberts
Roberts算子是利用局部差分算子尋找邊緣的算子,使用2×2的卷積模板對圖像進(jìn)行加權(quán)平均。由圖2可知,該算子是利用對角線方向相鄰的兩像素之差進(jìn)行梯度幅值檢測的。但該算法只考慮對角線方向的像素,忽略了水平方向與垂直方向。無法檢測水平相鄰像素或垂直相鄰像素灰度值變化的局部邊緣。而且,在該算子中像素點(diǎn)是直接參與運(yùn)算,導(dǎo)致該算子對噪聲較敏感。
圖2 Roberts算子的卷積因子
1.4 算子Prewitt
Prewitt算子與Sobel算子相似,同樣利用3×3模板計(jì)算差分算子,根據(jù)在邊緣點(diǎn)處達(dá)到極值這一現(xiàn)象進(jìn)行邊緣的檢測。卷積因子如圖3。Prewitt算子需要人為指定閾值,對噪聲有抑制作用,但同時(shí)容易造成邊緣誤判,邊緣定位精度不是很高。
圖3 Prewitt算子的卷積因子
綜上所述,現(xiàn)有的邊緣檢測算子各有優(yōu)缺點(diǎn),本研究利用OpenCV函數(shù)庫中的函數(shù),力求提高邊緣檢測的精度。本研究主要實(shí)現(xiàn)的目標(biāo)是對邊緣復(fù)雜的物體進(jìn)行精準(zhǔn)的邊緣檢測。
邊緣檢測系統(tǒng)主要由加載源圖像、圖像轉(zhuǎn)成灰度并模糊化降噪、用Canny算子檢測邊緣、尋找輪廓、繪出輪廓組成。
圖4 系統(tǒng)結(jié)構(gòu)框圖
系統(tǒng)首先加載源圖像,其次,對圖像進(jìn)行灰度化以及模糊化去噪,然后利用Canny算子檢測邊緣,最后不斷逼近邊緣尋找輪廓并將輪廓繪出。
3.1 灰度化及模糊化去噪
研究使用cvtColor函數(shù)實(shí)現(xiàn)圖像的灰度化。函數(shù)聲明為:
void cvtColor(InputArray src,OutputArray dst,int code,int dstCn=0)
src和dst分別是源圖像和輸出圖像;code是一個(gè)掩碼,表示源圖像和輸出圖像之間的轉(zhuǎn)化模式。最后的dstCn表示dst圖像的波段數(shù),默認(rèn)值為0,可從參數(shù)code中推斷。
code的模式包括:CV_RGB2GRAY,CV_BGR2YCrCb,CV_RGB2YCrCb,CV_YCrCb2BGR,CV_YCrb2-RGB,CV_BGR2HSV,CV_RGB2HSV,CV_HSV2BGR, CV_HSV2RGB
研究使用blur函數(shù)實(shí)現(xiàn)圖像的歸一化塊平滑操作。函數(shù)聲明為:
void blur(InputArray src,OutputArray dst,Size ksize,Point an?chor=Point(-1,-1),int borderType=BORDER_DEFAULT);
src和dst分別是源圖像和輸出圖像;ksize用于定義內(nèi)核大??;anchor表示錨點(diǎn)坐標(biāo),如果為負(fù)數(shù),則取核的中心為錨點(diǎn),borderType用于推斷圖像外部像素的某種邊界模式。默認(rèn)為BORDER_DEFAULT。
本函數(shù)使用歸一化濾波器對圖像進(jìn)行降噪處理,基本原理為獲取圖像某一像素點(diǎn)相鄰的像素值,對相鄰像素值進(jìn)行加權(quán)平均計(jì)算,最后輸出的像素值為相鄰像素的加權(quán)平均值。
3.2 利用Canny 算子檢測邊緣
研究使用Canny函數(shù)實(shí)現(xiàn)圖像的邊緣檢測。函數(shù)聲明為:
void Canny(InputArray image,OutputArray edges,double threshold1,double threshold2,int apertureSize=3,bool L2gradi?ent=false);
其中image和edges分別是源圖像和輸出圖像;threshold1表示第一個(gè)閾值,threshold2表示第二個(gè)閾值;apertureSize表示應(yīng)用Sobel算子的孔徑大小,默認(rèn)為3;L2gradient為計(jì)算圖像梯度的標(biāo)識,默認(rèn)為false。
Canny邊緣算子基本原理是先利用高斯平滑濾波器降噪,然后采用“非極大抑制”技術(shù)確定邊緣。基本步驟為消除噪聲,計(jì)算梯度幅值和方向,非極大值抑制,滯后閾值。
首先,Canny算子對圖像使用高斯平滑濾波濾波器進(jìn)行降噪。然后使用一階偏導(dǎo)的有限差分來計(jì)算梯度的幅值和方向,使用卷積模板圖5。接著使用非極大值抑制技術(shù)來保留局部梯度最大的點(diǎn)以確定邊緣,先將中心點(diǎn)像素M與沿著梯度線的像素相比。如果M的梯度值低于沿梯度線的兩個(gè)相鄰像素梯度值則令M=0(見式(3))。最后對圖像進(jìn)行滯后閾值。指定高低兩個(gè)閾值作用于非極大值抑制圖像,獲取兩個(gè)閾值邊緣圖像。對于高閾值邊緣圖像,假邊緣較少,但不連續(xù),可在高閾值邊緣圖像的8鄰點(diǎn)位置尋找可連接邊緣,利用在高閾值邊緣圖像收集的邊緣在低閾值邊緣圖像上連接成輪廓。
圖5 Canny算子的卷積因子
3.3 尋找輪廓
研究使用findContours函數(shù)來尋找物體輪廓,函數(shù)聲明為:
void findContours(InputOutputArray image,OutputArrayO?fArrays contours,OutputArray hierarchy,int mode,int method, Point offset=Point());
其中image表示源圖像;contours為輪廓數(shù)組,每個(gè)輪廓contours[i]對應(yīng)4個(gè)hierarchy元素;mode為輪廓的檢索模式;method為輪廓的近似辦法;offset為輪廓點(diǎn)的偏移量,可設(shè)置為任意值。
首先,用多個(gè)頂點(diǎn)表達(dá)輪廓。然后用Freeman鏈碼記錄起點(diǎn),以及從起點(diǎn)出發(fā)的連續(xù)位移。接著,在查找到輪廓后,用三種方式組織輪廓根(1)列表;(2)雙層結(jié)構(gòu);(3)樹型結(jié)構(gòu)。對于縱向,列表只有一層,雙層結(jié)構(gòu)有一或兩層,而樹型結(jié)構(gòu)可能有一層或多層。要遍歷所有的輪廓,可以使用遞歸的方式,基本原理為無限逼近Canny算子提取的邊緣。
本研究首先加載源圖像,對源圖像進(jìn)行灰度化、模糊化(使用歸一化濾波器)降噪。接著使用Canny算子檢測邊緣,最后以不斷逼近邊緣的方式提取輪廓并畫出來。算法的具體實(shí)現(xiàn)如下:建立一個(gè)Mat類型對象,加載源圖像。調(diào)用灰度化函數(shù)cvtColor(),模糊化函數(shù)blur()進(jìn)行降噪。調(diào)用輪廓提取函數(shù)findcontours()函數(shù),提取輪廓并保存在輪廓數(shù)組中。調(diào)用drawcontours ()函數(shù),將輪廓畫出。
本研究改寫并調(diào)用OpenCV函數(shù)庫中的函數(shù),在Visual Studio 2015平臺編程實(shí)現(xiàn)了物體的邊緣檢測,實(shí)驗(yàn)結(jié)果見下圖。
圖6 源圖像
圖7 去噪后的圖像
圖8 邊緣檢測效果圖
圖9 繪制輪廓
圖6所示為源圖像,圖7為灰度化、模擬化后的圖像,經(jīng)多次實(shí)驗(yàn)得出降噪時(shí),內(nèi)核大小為3,錨點(diǎn)位于中心時(shí)效果最好。圖8為使用Canny算子的邊緣檢測效果圖。經(jīng)實(shí)驗(yàn)當(dāng)初第一滯后性閾值與第二滯后性閾值比值為1:2時(shí)效果最好。圖9為輪廓提取的效果圖。由以上圖得出,本邊緣檢測法精確度較高,抗噪能力和邊緣定位能力都比較好,抑制了虛假邊緣。
本研究利用OpenCV函數(shù)庫中的函數(shù)。運(yùn)用Can?ny算子,實(shí)現(xiàn)物體的邊緣檢測,研究注重于解決邊緣復(fù)雜的物體檢測精度低,誤判率高的問題,提高抗干擾能力和邊緣定位能力。得到比較理想的檢測效果。具有一定的實(shí)用價(jià)值。
[1]Rivero-Castillo D,Pijeira H,Assun?ao P.Edge Detection Based on Krawtchouk Polynomials.Journal of Computational and Applied Mathematics,2015,284:244-250.
[2]Liu X,Fang S.A Convenient and Robust Edge Detection Method Based on Ant Colony Optimization.Optics Communications,2015, 353:147-157.
[3]Hao F,Shi JF,Zhang ZS,Chen RW,Zhu SQ.Canny Edge Detection Enhancement By General Auto-regression Model and Bi-dimensional Maximum Conditional Entropy.Optik,2014,125(15):3946-3953.
[4]Li H,Liao X,Li C,et al.Edge Detection of Noisy Images Based on Cellular Neural Networks.Communications in Nonlinear Science and Numerical Simulation,2011,16(9):3746-3759.
[5]Li HQ,Liao XF,Li CD,Huang HY,Li CJ.Edge Detection Of Noisy Images Based on Cellular Neural Networks.Communications in Nonlinear Science and Numerical Simulation,2011,16(9):3746-3759.
[6]郭平,趙剛,張晶.基于Matlab數(shù)字圖像處理的方法應(yīng)用教學(xué)[J].山東工業(yè)技術(shù),2015(8):270-271.
[7]許宏科,秦嚴(yán)嚴(yán),陳會茹.一種基于改進(jìn)Canny的邊緣檢測算法[J].紅外技術(shù),2014,36(3):210-214
Research on Edge Detection Based on OpenCV
GUO Zhi-biao,DUAN Wei
(China Mobile Communications Group Guangdong Co.,Ltd.,Guangzhou 510623)
Edge detection is an indispensable step before image analysis and recognition,which is an important technology in the image preprocessing procedure.Chiefly reviews the development of the edge detection methods,discusses the characteristic of some typical edge detection algo?rithms.The Canny algorithm is optimized and implemented with OpenCV.
郭志彪(1977-),男,廣東廣州人,工程師,碩士,研究方向?yàn)橛?jì)算機(jī)、物聯(lián)網(wǎng)及ICT行業(yè)應(yīng)用等
2017-02-20
2017-05-20
1007-1423(2017)15-0029-04
10.3969/j.issn.1007-1423.2017.15.007
段為(1981-),男,山西人,工程師,碩士,研究方向?yàn)镮CT、物聯(lián)網(wǎng)、大數(shù)據(jù)、云計(jì)算技術(shù)等
Edge Detection;Machine Vision;Image Processing;OpenCV