王富豪,蔡吉飛,董傲楠,李雨興,楊明旭(北京印刷學(xué)院 機(jī)電工程學(xué)院,北京 102600)
關(guān)鍵字:OpenCV;表面缺陷;手套包裝盒
隨著新冠疫情在全世界爆發(fā),手套的使用量在大幅度增加。因此,手套包裝盒的需求隨之增多。但是部分手套盒存在質(zhì)量問題,可能出現(xiàn)表面有污漬,紙張損壞等各種問題。如果這些有問題的手套盒銷售到客戶端,則會(huì)帶來許多隱患。因此,在手套未出售之前檢查出破損的手套盒勢(shì)在必行。現(xiàn)在檢測(cè)手套包裝盒主要靠人工檢測(cè),這一檢測(cè)方法繁瑣復(fù)雜,效率非常低。除此之外,有許多企業(yè)使用數(shù)字圖像處理技術(shù)進(jìn)行缺陷檢測(cè)。目前,國(guó)內(nèi)做了大量的研究和探索工作,并且使用數(shù)字圖像處理技術(shù)已經(jīng)有了比較成型的檢測(cè)體系,但是使用傳統(tǒng)的圖像處理操作不方便,所編寫的代碼量比較大。本文著重介紹的另一種方式是通過使用OpenCV來自動(dòng)地檢測(cè)手套包裝盒的缺陷位置以及缺陷形狀,OpenCV庫(kù)是一款在最近幾年非常流行的免費(fèi)開源計(jì)算機(jī)視覺庫(kù),在庫(kù)中存在許多豐富的計(jì)算機(jī)視覺庫(kù),庫(kù)中提供大量的圖像處理函數(shù)[1],可以自動(dòng)檢測(cè)出有破損的手套包裝盒,可以大幅度提升檢測(cè)效率。手套包裝盒如圖1所示。
圖1 手套包裝盒
數(shù)字圖像信號(hào)處理技術(shù)核心是指通過微處理器把相機(jī)中捕獲下來的模擬圖像信號(hào)自動(dòng)轉(zhuǎn)化輸出為一組數(shù)字信號(hào),再通過數(shù)字計(jì)算機(jī)軟件對(duì)數(shù)字圖像信號(hào)進(jìn)行處理,然后控制圖像亮度變化、圖像灰度增強(qiáng)、圖像復(fù)原、圖像重建、圖像形態(tài)學(xué)處理、圖像分割、邊緣模糊檢測(cè)、圖像編碼轉(zhuǎn)換和圖像匹配處理等一系列處理手段。在工業(yè)相機(jī)所捕獲的圖像樣本中,主要特征包括了目標(biāo)信息、背景信息和圖像噪聲,但是在我們對(duì)圖像進(jìn)行處理加工的這個(gè)過程中,應(yīng)該對(duì)其某些重要特征信息更加關(guān)注,把這些過分關(guān)注的部分稱為目標(biāo),其余的則稱為背景。在圖像處理過程中,需要對(duì)目標(biāo)進(jìn)行預(yù)處理,可以減少或消除由于噪聲產(chǎn)生的圖像質(zhì)量下降[2]。進(jìn)行圖像預(yù)處理后則可以將圖像轉(zhuǎn)化為標(biāo)準(zhǔn)的圖像,然后進(jìn)行圖像二值化、邊緣檢測(cè)、缺陷提取等操作。
使用OpenCV提供的計(jì)算機(jī)視覺庫(kù),對(duì)圖像進(jìn)行處理,從而可以得到算法流程如下所示。程序流程:1)讀取并顯示原圖像;2)圖像平滑操作;3)圖像二值化;4)Canny邊緣檢測(cè);5)缺陷特征提取;6)與模板進(jìn)行匹配。
圖像噪聲平滑算法主要功能是用來去除圖像信號(hào)中所摻雜的圖像噪聲,盡可能用減少圖像噪聲信息來提高圖像平滑的算法質(zhì)量。圖像噪聲平滑方法的本質(zhì)是采用低通濾波,攔阻高頻信號(hào)的圖像噪聲信息,從而可以留下一些低頻噪聲有用的信號(hào)。但是由于圖像噪聲的圖像邊緣信號(hào)屬于圖像高頻信息,因此算法在做圖像平滑運(yùn)算時(shí),會(huì)盡可能把這些邊緣信息模糊化,而圖像邊緣信息對(duì)平滑圖像噪聲來說也非常重要。因此,在應(yīng)用平滑濾波處理時(shí),需要注意保持圖像上原有的信息。常見使用的平滑濾波的方法一般有高斯濾波法、中值濾波法、均值平滑濾波法等[3]。
中值濾波實(shí)際上是非線性的平滑濾波在頻率合適的情況下,可以完全克服線性平滑濾波,從而帶來圖像細(xì)節(jié)的模糊問題。中值濾波算法是一種以窗口內(nèi)其中一個(gè)相鄰像素點(diǎn)為濾波中心的方式,將該窗口上所有相鄰像素點(diǎn)中的所有像素灰度值均按照數(shù)值從小到大的規(guī)則進(jìn)行濾波排序,然后每次只會(huì)取消一個(gè)空間的值,作為該濾波中心像素最小的灰度值[4]。設(shè)h(x,y)為圖像的任意像素點(diǎn),p(x,y)為原始像素點(diǎn),h(x,y)經(jīng)過非線性變換得到新像素點(diǎn),則中值濾波對(duì)應(yīng)的數(shù)學(xué)表達(dá)式為:
中值濾波可以減少與典型值差異較大值對(duì)結(jié)果的影響。
高斯濾波函數(shù)屬于線性濾波方法,通過高斯函數(shù)來選擇權(quán)值,使用這種濾波方法對(duì)系統(tǒng)消除正態(tài)分布上的高斯噪聲非常有效。高斯模板的權(quán)重值按照距離來設(shè)置,離模板中心越遠(yuǎn),高斯模板權(quán)重值就越小;離模板中心距離越近,高斯權(quán)重值越大[5]。其中(x,y)為任意的像素點(diǎn),根據(jù)實(shí)際需求可以得到二維高斯濾波函數(shù)表達(dá)式為:
常見的高斯模板如圖2所示:均值越大,對(duì)圖像的平滑作用越好,均值越小,圖像細(xì)節(jié)丟失的則越少。
圖2 高斯模板
均值濾波為線性濾波,算法比較簡(jiǎn)單,抗噪性能差。均值濾波技術(shù)是采用一個(gè)灰度奇數(shù)點(diǎn)作為可滑動(dòng)的灰度窗口,窗口內(nèi)兩端相鄰的灰度兩個(gè)像素中心點(diǎn)將所對(duì)應(yīng)的兩個(gè)灰度值點(diǎn)相加得到灰度平均值,用這個(gè)灰度平均值點(diǎn)代替灰度值點(diǎn)。如果在滑動(dòng)窗口各個(gè)像素點(diǎn)設(shè)定權(quán)重,則稱其為灰度加權(quán)均值濾波[6],圖3為均值濾波的模板。
圖3 均值濾波模板
OpenCV提供平滑濾波函數(shù)的原型為:void cvSmooth(const CvArr*src,CvArr*dst, int smoothtypes=Cv_MEDIAL,int parami=3,int param2=0,double param3=0,double param4=0)
對(duì)圖像閾值分割可以有效區(qū)分背景和目標(biāo)部分,為后續(xù)圖像處理提高缺陷識(shí)別的精度。設(shè)原始圖像為f(x,y),則根據(jù)實(shí)際情況和劃分準(zhǔn)則在f(x,y)找到其閾值為T,根據(jù)閾值可以把圖像分割為兩部分[7]。分割后的圖像為:
通常選取b0=0,則代表為黑色,b1=1,則代表為白色,即所謂的圖像二值化。
OpenCV提供的閾值分割函數(shù)為:cvThreshold(src,dst,threshold,max_value,threshold_thpe)
常見使用的一階微分邊緣算子有Roberts算子、Sobel算子、Prewitt算子、Canny算子等。本文采用Canny算子[8]。Canny算子選擇的判斷準(zhǔn)則如下:1)Canny算子的檢測(cè)性能比較好,檢測(cè)效果比較好,不容易出現(xiàn)誤檢或漏檢的現(xiàn)象。2)可以很好的對(duì)缺陷物件進(jìn)行定位和識(shí)別。3)最少的邊緣相應(yīng)次數(shù),可以同時(shí)保證邊緣只有一個(gè)像素的響應(yīng)[9]。
cvCanny函數(shù)的原型如下:void cvCanny(const Cv Arr*image,Cv A rr*edges, double threshold1,double threshold2,int aperture_size=3)
1)首先導(dǎo)入核心工具包OpenCV,由于手套包裝盒為流水線,需要導(dǎo)入錄制視頻,使用cv2.videoCapture( )導(dǎo)入視頻。2)把視頻轉(zhuǎn)化為每一幀處理,即把視頻轉(zhuǎn)化為圖片,使用指令cv2.cvtColor( )進(jìn)行灰度值轉(zhuǎn)化。3)為了區(qū)分缺陷位置,使用cv2.threshold( )進(jìn)行預(yù)處理,然后使用cv2.findContours( )找到所有的輪廓位置。4)過濾干擾物品,使用cv2.contourArea( )函數(shù)計(jì)算所檢測(cè)物品的面積,只有當(dāng)面積大于某一值時(shí),才認(rèn)為是包裝盒的待檢測(cè)面,使用cv2.boundingRect( )函數(shù)做缺陷部位的外接矩形。5)當(dāng)定位到待檢測(cè)面時(shí),判斷包裝盒表面是否有缺陷,然后重復(fù)上面操作,使用外接矩形定位到缺陷的位置。6)識(shí)別缺陷的種類,可以通過外接矩形的長(zhǎng)和寬比例或灰度值來判斷,即通過cv2.calcHist( )函數(shù)得到缺陷的灰度直方圖,根據(jù)分布情況即可以判斷其種類。
1)目前使用數(shù)字圖像處理進(jìn)行缺陷檢測(cè)已經(jīng)比較成熟,手套包裝盒上的缺陷也可以使用此方法進(jìn)行檢測(cè),即不適用OpenCV亦可進(jìn)行缺陷檢測(cè),但是操作過程比較繁瑣。
2)OpenCV庫(kù)是一款開源的計(jì)算機(jī)視覺庫(kù),代碼庫(kù)里面包含許多已經(jīng)被封裝設(shè)計(jì)好的函數(shù),開發(fā)者一般只需要直接調(diào)用該函數(shù)即可。直接使用OpenCV庫(kù)可以有效減少軟件開發(fā)者的編寫工作量,并且由于使用的OpenCV庫(kù)具有很好的軟件移植性,可以很方便的把軟件程序直接嵌入到系統(tǒng),使整個(gè)系統(tǒng)更加具有靈活性。