文/劉軍偉
近年來,智能識別成為各領域的焦點,眾多行業(yè)都采用新型的識別系統(tǒng)對圖形、圖像進行有效識別,一方面提升行業(yè)工作的效率;另一方面提升信息在互聯(lián)網(wǎng)環(huán)境中的安全防護程度。計算機和互聯(lián)網(wǎng)技術的發(fā)展,尤其是計算機視覺技術的快速革新,推動智能識別系統(tǒng)在供給端逐步深入研發(fā)。而當前計算機領域用于圖形、圖像識別研究的主要有C或C++語言、Matlab和Python軟件工具等,基于這些編程語言和軟件工具,才開發(fā)出了OpenCV這一具有非常強大兼容性的計算機視覺庫。文章基于OpenCV對圖形進行顏色、形狀輪廓的識別研究,并結合試驗流程分步驟設計圖形識別系統(tǒng),從而形成一套完整的圖形識別方式,以便用于實際生產與生活當中,讓技術服務于生產與生活。
OpenCV全稱是Open Source Computer Vision Library(開源計算機視覺庫),是基于BSD許可而發(fā)行的一種跨平臺計算機視覺庫,它可以在諸多計算機操作系統(tǒng)上得以運行,如用戶較多的Windows和OS系統(tǒng),同時還提供了多語言的借口,可以在不同的軟件上提取運行,如 Python、Ruby、MATLAB ,避免了軟件工具的大空間、運行慢的弊端,真正實現(xiàn)了圖形、圖像處理的高效化和輕量化。之所以OpenCV可以具有如此強大的功能,是因為OpenCV由眾多C函數(shù)和少部分C++構成,包括了近三百個C函數(shù)跨平臺的中高層API,最重要的是它既具有獨立的視覺庫,又可以加載其他外部視覺庫,從而保證了OpenCV在強大的函數(shù)算法下能夠實現(xiàn)對圖形、圖像的高水平處理。
圖1:圖形識別系統(tǒng)框架設計
如今的社會到處充斥著各類字符、圖形、圖像信息,對這些龐雜的信息進行有效識別,從而可以對信息進行分類、存儲、管理和應用,因而,基于快速發(fā)展的計算機視覺技術對圖形識別進行深入研究已成為計算機智能識別中的一個分支,對簡單圖形的有效是被是智能識別的基礎,也是關鍵。對于圖形的識別研究已經有相當長的一段歷史,從第一臺計算機誕生起,人們便賦予了其基本的圖形識別能力,如掃描、復印等等,而現(xiàn)在,這些基本的圖形識別已經不足以滿足計算機應用領域發(fā)展的需求,很多領域需要具有更強大識別功能的系統(tǒng)。對于圖形的識別包含對圖形整體的識別和對圖形局部的識別,當然,局部特征是識別圖形的關鍵所在,只有通過算法分割、獲取圖形更多的局部信息,才可以更好的展現(xiàn)出圖形識別系統(tǒng)的優(yōu)勢。
在互聯(lián)網(wǎng)技術高速發(fā)展的時代,非常符合人們視覺認知與審美習慣的圖形已成為人們日常生產生活中信息處理與傳遞的重要載體,字符、圖形、圖像,從簡到繁,他們所蘊含的信息在儲量上也會有著很大的差別,越復雜的圖形往往識別難度越大。在現(xiàn)階段,用于圖形識別的方式主要有局部算子提取、灰度級提取等,運用這些方式,可以有效識別各種圖形,如商標、照片等。當然,目前在圖形識別研究中由于研究目的和方向不同,學者采用的方法也多種多樣,具體而言,根據(jù)識別的層次不同,可以將識別方式劃分為兩類:其一是對圖形特征進行描述的方法,譬如Freeman鏈碼表示法、不變矩特征描述算子、傅里葉算子和Blum圖形骨架法等,這些方法會對圖形的色彩、輪廓等具體屬性進行描述;其二是先對圖形進行特征提取而后進行識別的方法,這類方法彌補了圖形特征描述的不足,在細節(jié)描述的基礎上結合了相關特征區(qū)域的提取,從而提高圖形識別的精準度。如圖1所示。
基于OpenCV設計圖形識別系統(tǒng),首先需要遵循OpenCV的運行程序,在計算機函數(shù)算法的基礎上整合各個步驟,分類聚合,形成一個完整而又科學的圖形識別系統(tǒng)。系統(tǒng)的形成在于環(huán)境,硬件與軟件環(huán)境是系統(tǒng)設計的基礎,因而,圖形識別系統(tǒng)的第一步要搭建圖形識別環(huán)境,具體的圖形識別環(huán)境包括一些兩個部分:
盡管在上文中提及到OpenCV有著非常強大的兼容性,可以在不同的操作系統(tǒng)上和軟件工具中運行,但是還是要采用恰當?shù)慕涌?,才能夠讓OpenCV順暢運行。本文所用的軟件為OpenCV3.3版,在Java已經建好項目的Eclipse開發(fā)環(huán)境中解壓OpenCV壓縮包中的build文件,選擇OpenCV-x86包導入,并選擇與電腦操作系統(tǒng)相對于的OpenCV-300庫導入到現(xiàn)有項目中,這些準備工作完成之后,便可以在現(xiàn)有項目環(huán)境下運行OpenCV。
表1:各顏色H、S、V取值范圍
圖2:識別原圖
圖3:保留紅色區(qū)域圖
對圖形進行預處理,是為了提高后面OpenCV圖形識別處理的速度和質量。圖形的預處理包括兩方面內容,一方面是對圖形的像素值進行處理;另一方面是對圖形的顏色空間進行處理。首先采用OpenCV-Java庫中的函數(shù)Imgproc.resize(src,dst,dsize)對圖形的像素值進行處理,也就是用函數(shù)命令將圖形縮小,其中,函數(shù)命令中scr為原圖,dst 為圖形輸出。
之后,同樣采用相應的函數(shù)命令對圖形的顏色空間進行處理。相較于對圖形像素值的處理而言,對圖形顏色空間的處理較為繁瑣,因為在OpenCV所默認對圖形作出處理的是BGR顏色空間,但是現(xiàn)在多為可以把任何像素顏色都表示為紅、藍、綠組合的RGB類型圖形,所以需要將RGB類型的圖形轉換為BGR模型,但又由于光環(huán)境的影響,RGB模型不能夠將顏色進行細致的區(qū)分,這就需要采用HSV模型來對圖形的顏色進行比較細致的區(qū)分。HSV是一種可以根據(jù)顏色的直觀特性而創(chuàng)建的顏色空間,其具體參數(shù)為H(色調)、S(飽和度)、V(明度),其中色調與飽和度用來表示顏色信息,明度是表示像素的一個單獨參數(shù),在具體操作中可以忽略明度這一參數(shù),只關注色調與飽和度這兩個與顏色信息有關的參數(shù)。因為HSV顏色空間中的顏色在H、S與V方面都有著明確的取值范圍,便非常容易將圖形的顏色進行分割 (各顏色三個分量 H、S、V 取值范圍請見表1)。將識別度不高的BGR再次轉換為HSV模型,具體通過cvtColor這一方法對進行圖形模型的轉換,其各步驟函數(shù)命令分別為“Imgproc.cvtColor (imageResized, HSVImg,Imgproc .COLOR_RGB2BGR ) ”、“Imgproc.cvtColor(imageResized, HSVImg, Imgproc.COL-OR_BGR2HSV)”,其中圖形導入的命令為imageResized ;圖形輸出的命令為HSVImg。在顏色空間轉換完成之后,利用H與S的范圍取值對圖形顏色進行預區(qū)分。圖2、圖3分別為是原圖和經過提取只保留紅色區(qū)域后的圖形影像。
讀取圖形信息是繼圖形預處理之后對圖形進行的識別工作,具體的讀取包括三大步驟,即圖形顏色的識別、圖形形狀的識別、圖形擬合檢驗。第一階段是圖形的顏色讀取,包括以下步驟:
(1)獲取經過預處理的圖形像素點的H、S和V的值,并在HSV顏色空間內遍歷圖形的像素點,以便通過具體的H、S、V取值來辨別圖形上的顏色,進而精準獲取各種顏色對應的像素點,同時累計其具體個數(shù)。具體說來,在獲取圖形像素各顏色H、S、V的值時,采用的函數(shù)代碼為:
double[]clone = HSVImg.get(i, j).clone();
int h= (int)clone[0];
int s = (int)clone[1];
int v = (int)clone[2];
(2)在獲取圖形各顏色像素點值之后,通過設置閾值來進一步將圖形的顏色進行分割,設定閾值是為了避免在圖形顏色識別過程中受到光影的干擾。文章根據(jù)圖形的顏色屬性,將閾值界值設定為200,也就是說當閾值大于等于200時,說明圖形中有該種顏色;閾值小于200時,則說明圖形中沒有此種顏色。之后,用OpenCV中的Scalar類對圖形顏色進行辨別,得到各種顏色取值的大小限值。比如,在分割圖形顏色之后,綠色的最大值為Scalar Maxval=new Scalar(77,255,255);// 綠色最大值;其最小值為Scalar minval=new Scalar(35,43,46);// 綠色最小值。在得到各顏色的大小限值之后,采用函數(shù) Core.bitwise_and()將分割后得到的區(qū)域顏色圖形保存到局部變量rdst當中。之后,將顏色分割之后的區(qū)域圖形輸出,便得到了顏色分離之后的圖形,對其他顏色的分割與上述對綠色分割的過程相同,反復操作,將函數(shù)命令中的主題顏色替換即可。在獲取各顏色像素點值的基礎上按顏色區(qū)域對圖形進行分割,如此便完成了對圖形第一階段的識別工作,但為了圖形識別有著較高的質量,還需要對上述識別結果的基礎上進行第二階段的識別。第二階段的識別是形狀識別,這一識別過程要求圖形必須是三通道圖像,所以需要將保存在局部變量rdst中的各顏色圖形轉為三通道圖像,具體函數(shù)命令為 rdst.convertTo( rdst, CvType.CV_8UC3),以便于后期進行灰度化處理,在將各顏色圖形格式轉換完畢之后,相繼進行以下步驟對圖形的形狀進行識別:
在第一階段顏色識別中,經分割所獲取的各顏色區(qū)域圖形難免會存在噪點,為了盡可能避免光影環(huán)境對圖形識別試驗的干擾,需要在圖形形狀識別之前進行濾波除燥處理,用中值濾波器去除干擾因素,中值濾波器是一種典型的低通濾波器,可以在除噪的同時使之前分割的各顏色圖形保持邊緣特性。濾波除燥所對應的OpenCV方法是medianBlur。
OpenCV對圖形形狀的識別是環(huán)環(huán)相扣的,前一步驟是后一步驟的必要充分條件。將已經轉換好格式的各顏色圖形進行灰度化處理,為之后的二值化奠定前提條件。圖形灰度化處理的函數(shù)命令為:
Imgproc.cvtColor(imageResized,HSVImg,I mgproc.COL-OR_BGR2GARY),通過這一函數(shù)將原先彩色圖形中的三個參數(shù)即H、S、V的數(shù)據(jù)取量降低,從而使得各顏色圖形中的每個像素點只包含灰度信息,其值域為[0,255]。
圖形的二值化處理是對已經進行灰度處理而獲得的圖形設置合理的閾值,以進一步降低函數(shù)的運算量。所謂的二值化處理,其實是采用 threshold方法把整個圖形處理為只包含黑、白兩值的像素點,其中黑值為0,白值為1,這相對于灰度像素值再次降低,對圖形的識別更加方便快捷,經二值化處理后得到的圖形可以中幾何學的概念進行特征描述和分析。
但是,二值化處理之后的圖形仍然會存在一些雜點,這些雜點會對接下來的試驗產生一定程度的干擾,可以利用背景膨脹將雜點去掉,以保證試驗的高精準。背景膨脹所對應的方法是dilate,一般來講,背景膨脹是用結構元進行膨脹或者進行腐蝕運算,其原理為當結構元的原點像素經過待膨脹的經二值化處理后的圖形中所有白值(即值為1)像素點時,結構元所有白值像素點所對應的待膨脹二值化處理后的圖形像素這便設定為1,這樣經過背景膨脹后的圖形便將絕大部分微小的雜點去除掉。算上對圖形的預處理,圖形經過HSV顏色空間轉化、各顏色區(qū)域提取、濾波處理、灰度化處理、二值化處理和背景膨脹,得到了較為精準的各顏色區(qū)域圖形,且函數(shù)運算量大大降低,這為下一步的圖形識別做好了充分的準備。除燥二值化圖如圖4所示。
對圖形的識別最后一個環(huán)節(jié)是對圖形輪廓的捕獲和擬合,具體說來,首先需要找到圖形的輪廓,這就要用腐蝕函數(shù),即Imgproc.erode將圖形中那些零散不連通的像素點去除掉,而后在用膨脹函數(shù)命令Imgproc.dilate 把現(xiàn)有的圖形輪廓連通。在本文實驗中體現(xiàn)為:采用上述提及的濾波、膨脹等函數(shù)命令將干擾圖形輪廓的像素點去掉、將并不封閉的輪廓去掉。具體的函數(shù)命令為:采用Imgproc.findContours獲取圖形的輪廓,而后用命令:
將干擾輪廓識別的雜點以及其他不成型的輪廓去除掉。而后,用findContours命令提取目標圖形輪廓,這樣提取出來的輪廓圖像是一張二值圖像,也就是說只有黑值和白值,但是輸出的圖像顯示的是每一個連通區(qū)域輪廓點的集合,要想更真切的看清圖形的輪廓,還需要采用 drawContours 方法把點集合成的輪廓畫出來。
在將輪廓捕獲出來之后,下一步便需要對捕獲的輪廓進行擬合,擬合的過程也稱之為輪廓逼近。OpenCV中有大量的用于輪廓擬合的函數(shù),如minAreaRect、isContourConvex、boundingRect、contourArea、convexHull、minEnclosing-Circle、moments、ap-proxPolyDP等等,這些函數(shù)方法各有偏重,需要在具體的試驗中根據(jù)所捕獲圖形輪廓的特征選擇最恰當?shù)暮瘮?shù)用來實現(xiàn)擬合。本文在上述步驟中所捕獲的圖形輪廓由散點集合而成的線段居多,因而選擇 approxPolyDP 這一方法對輪廓進行逼近處理。在逼近處理的過程中,線段的長度可以根據(jù)具體實際情況進行調整,一般而言,線段的長短不同,所擬合出來的輪廓對于線段數(shù)量的需求也就不同,用長度為12.0的線段對前面的輪廓進行逼近,而逼近圓形、三角形和矩形所用線段的數(shù)量分別是8條、3條和4條,而且從逼近的過程來看,用于逼近的線段之間有著明顯的界限,這說明對圓形和簡單多邊圖形實現(xiàn)了較好的識別。輪廓擬合的內在原理是:用函數(shù)Imgproc.approxPolyDP 對圖形輪廓進行擬合處理之后,可以通過函數(shù)polyShape.toArray().length獲取輪廓凸點個數(shù)及凸點彼此間的距離,根據(jù)凸點位置、凸點個數(shù)、凸點彼此間的距離判斷圖形的具體形狀。
本文基于OpenCV,在大量實驗的基礎上,對一些簡單的圖形進行識別;并遵循實驗邏輯整合步驟形成完整合理是圖形識別系統(tǒng),最后結果顯示,按照該流程系統(tǒng)對圖形的識別精準度可達到99%以上。實驗過程中,用Java調用OpenCV,并注重實驗的細節(jié)處理,如顏色空間、圖形格式、濾波處理等等,這些細節(jié)性的處理在圖形識別系統(tǒng)中非常關鍵,對識別精準度影響巨大,所以,在具體的實驗中,要統(tǒng)籌處理識別系統(tǒng)的各個步驟?;贠penCV所設計的圖形識別系統(tǒng)可應用于實際生成生活之中,如交通信號識別、門禁識別等等。但本實驗中存在的不足是沒有對較為復雜的圖形進行識別研究,在今后的研究中,將嘗試擴大圖形識別的范圍、增加識別的難度,一方面檢驗本文所設計圖形識別系統(tǒng)的可重復性,另一方面促進智能識別工作的進步。
圖4:除燥二值化圖