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