郭志彪,段為
(中國移動通信集團廣東有限公司,廣州 510623)
基于OpenCV的邊緣檢測技術(shù)研究
郭志彪,段為
(中國移動通信集團廣東有限公司,廣州 510623)
邊緣檢測是圖像分析識別前必不可少的環(huán)節(jié),是一種重要的圖像預(yù)處理技術(shù)?;仡檲D像邊緣檢測技術(shù)的發(fā)展歷程,討論一些典型的邊緣檢測算法的特點,分析其機理和優(yōu)劣,并對其中的Canny算法進行優(yōu)化并通過OpenCV實現(xiàn)。
邊緣檢測;機器視覺;圖像處理;OpenCV
數(shù)字圖像邊緣檢測技術(shù)是信息科學(xué)近年來發(fā)展最為迅速的學(xué)科之一。而圖像邊緣作為圖像最基本的特征之一,在圖像分割、圖像識別以及其他圖像相關(guān)的各個領(lǐng)域有著廣泛的應(yīng)用,邊緣檢測是圖像處理和機器視覺中的一個重要分支,在圖像分析中有著重要的意義。
隨著計算機技術(shù)的發(fā)展和普及,數(shù)字圖像處理也迎來了迅猛發(fā)展的時期。對數(shù)字圖像的處理已廣泛應(yīng)用到各個領(lǐng)域。而邊緣信息作為重要的圖像特征信息,許多學(xué)者采用不同的方法研究如何提取圖像的邊緣。目前,常用的邊緣檢測算子有以下幾種:Sobel算子、Isotropic Sobel算子、Roberts算子、Prewitt算子。
1.1 Sobel 算子
Sobel算子基本步驟是先對圖像進行平滑處理,消除噪聲的影響,然后再作微分運算。Sobel算子平滑處理時使用的積卷核如圖1。選擇中心點為錨點,對周圍像素的灰度進行加權(quán)平均,找出變化明顯的邊緣點。但使用該算子容易造成邊緣不連續(xù),丟失細節(jié)。
圖1 Sobel算子的卷積因子
1.2 Isotropic Sobel 算子
Isotropic Sobel算子是Sobel算子的另一種形式,基本原理與Sobel算子相似,主要區(qū)別在于Isotropic Sobel算子在檢測不同方向的邊沿時使用同一梯度幅值。
1.3 算子Roberts
Roberts算子是利用局部差分算子尋找邊緣的算子,使用2×2的卷積模板對圖像進行加權(quán)平均。由圖2可知,該算子是利用對角線方向相鄰的兩像素之差進行梯度幅值檢測的。但該算法只考慮對角線方向的像素,忽略了水平方向與垂直方向。無法檢測水平相鄰像素或垂直相鄰像素灰度值變化的局部邊緣。而且,在該算子中像素點是直接參與運算,導(dǎo)致該算子對噪聲較敏感。
圖2 Roberts算子的卷積因子
1.4 算子Prewitt
Prewitt算子與Sobel算子相似,同樣利用3×3模板計算差分算子,根據(jù)在邊緣點處達到極值這一現(xiàn)象進行邊緣的檢測。卷積因子如圖3。Prewitt算子需要人為指定閾值,對噪聲有抑制作用,但同時容易造成邊緣誤判,邊緣定位精度不是很高。
圖3 Prewitt算子的卷積因子
綜上所述,現(xiàn)有的邊緣檢測算子各有優(yōu)缺點,本研究利用OpenCV函數(shù)庫中的函數(shù),力求提高邊緣檢測的精度。本研究主要實現(xiàn)的目標(biāo)是對邊緣復(fù)雜的物體進行精準(zhǔn)的邊緣檢測。
邊緣檢測系統(tǒng)主要由加載源圖像、圖像轉(zhuǎn)成灰度并模糊化降噪、用Canny算子檢測邊緣、尋找輪廓、繪出輪廓組成。
圖4 系統(tǒng)結(jié)構(gòu)框圖
系統(tǒng)首先加載源圖像,其次,對圖像進行灰度化以及模糊化去噪,然后利用Canny算子檢測邊緣,最后不斷逼近邊緣尋找輪廓并將輪廓繪出。
3.1 灰度化及模糊化去噪
研究使用cvtColor函數(shù)實現(xiàn)圖像的灰度化。函數(shù)聲明為:
void cvtColor(InputArray src,OutputArray dst,int code,int dstCn=0)
src和dst分別是源圖像和輸出圖像;code是一個掩碼,表示源圖像和輸出圖像之間的轉(zhuǎn)化模式。最后的dstCn表示dst圖像的波段數(shù),默認值為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ù)實現(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表示錨點坐標(biāo),如果為負數(shù),則取核的中心為錨點,borderType用于推斷圖像外部像素的某種邊界模式。默認為BORDER_DEFAULT。
本函數(shù)使用歸一化濾波器對圖像進行降噪處理,基本原理為獲取圖像某一像素點相鄰的像素值,對相鄰像素值進行加權(quán)平均計算,最后輸出的像素值為相鄰像素的加權(quán)平均值。
3.2 利用Canny 算子檢測邊緣
研究使用Canny函數(shù)實現(xiàn)圖像的邊緣檢測。函數(shù)聲明為:
void Canny(InputArray image,OutputArray edges,double threshold1,double threshold2,int apertureSize=3,bool L2gradi?ent=false);
其中image和edges分別是源圖像和輸出圖像;threshold1表示第一個閾值,threshold2表示第二個閾值;apertureSize表示應(yīng)用Sobel算子的孔徑大小,默認為3;L2gradient為計算圖像梯度的標(biāo)識,默認為false。
Canny邊緣算子基本原理是先利用高斯平滑濾波器降噪,然后采用“非極大抑制”技術(shù)確定邊緣?;静襟E為消除噪聲,計算梯度幅值和方向,非極大值抑制,滯后閾值。
首先,Canny算子對圖像使用高斯平滑濾波濾波器進行降噪。然后使用一階偏導(dǎo)的有限差分來計算梯度的幅值和方向,使用卷積模板圖5。接著使用非極大值抑制技術(shù)來保留局部梯度最大的點以確定邊緣,先將中心點像素M與沿著梯度線的像素相比。如果M的梯度值低于沿梯度線的兩個相鄰像素梯度值則令M=0(見式(3))。最后對圖像進行滯后閾值。指定高低兩個閾值作用于非極大值抑制圖像,獲取兩個閾值邊緣圖像。對于高閾值邊緣圖像,假邊緣較少,但不連續(xù),可在高閾值邊緣圖像的8鄰點位置尋找可連接邊緣,利用在高閾值邊緣圖像收集的邊緣在低閾值邊緣圖像上連接成輪廓。
圖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ù)組,每個輪廓contours[i]對應(yīng)4個hierarchy元素;mode為輪廓的檢索模式;method為輪廓的近似辦法;offset為輪廓點的偏移量,可設(shè)置為任意值。
首先,用多個頂點表達輪廓。然后用Freeman鏈碼記錄起點,以及從起點出發(fā)的連續(xù)位移。接著,在查找到輪廓后,用三種方式組織輪廓根(1)列表;(2)雙層結(jié)構(gòu);(3)樹型結(jié)構(gòu)。對于縱向,列表只有一層,雙層結(jié)構(gòu)有一或兩層,而樹型結(jié)構(gòu)可能有一層或多層。要遍歷所有的輪廓,可以使用遞歸的方式,基本原理為無限逼近Canny算子提取的邊緣。
本研究首先加載源圖像,對源圖像進行灰度化、模糊化(使用歸一化濾波器)降噪。接著使用Canny算子檢測邊緣,最后以不斷逼近邊緣的方式提取輪廓并畫出來。算法的具體實現(xiàn)如下:建立一個Mat類型對象,加載源圖像。調(diào)用灰度化函數(shù)cvtColor(),模糊化函數(shù)blur()進行降噪。調(diào)用輪廓提取函數(shù)findcontours()函數(shù),提取輪廓并保存在輪廓數(shù)組中。調(diào)用drawcontours ()函數(shù),將輪廓畫出。
本研究改寫并調(diào)用OpenCV函數(shù)庫中的函數(shù),在Visual Studio 2015平臺編程實現(xiàn)了物體的邊緣檢測,實驗結(jié)果見下圖。
圖6 源圖像
圖7 去噪后的圖像
圖8 邊緣檢測效果圖
圖9 繪制輪廓
圖6所示為源圖像,圖7為灰度化、模擬化后的圖像,經(jīng)多次實驗得出降噪時,內(nèi)核大小為3,錨點位于中心時效果最好。圖8為使用Canny算子的邊緣檢測效果圖。經(jīng)實驗當(dāng)初第一滯后性閾值與第二滯后性閾值比值為1:2時效果最好。圖9為輪廓提取的效果圖。由以上圖得出,本邊緣檢測法精確度較高,抗噪能力和邊緣定位能力都比較好,抑制了虛假邊緣。
本研究利用OpenCV函數(shù)庫中的函數(shù)。運用Can?ny算子,實現(xiàn)物體的邊緣檢測,研究注重于解決邊緣復(fù)雜的物體檢測精度低,誤判率高的問題,提高抗干擾能力和邊緣定位能力。得到比較理想的檢測效果。具有一定的實用價值。
[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),陳會茹.一種基于改進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-),男,廣東廣州人,工程師,碩士,研究方向為計算機、物聯(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-),男,山西人,工程師,碩士,研究方向為ICT、物聯(lián)網(wǎng)、大數(shù)據(jù)、云計算技術(shù)等
Edge Detection;Machine Vision;Image Processing;OpenCV