廖作斌
(泉州師范學(xué)院)
作為圖像模式識(shí)別的一個(gè)典型案例,車牌識(shí)別算法和相對(duì)應(yīng)的系統(tǒng)雖然發(fā)展有一定時(shí)間了,國(guó)外會(huì)比國(guó)內(nèi)早些,但是截止目前為止,真正達(dá)到適用程度的系統(tǒng)仍很少,識(shí)別率和識(shí)別速度都有待進(jìn)一步提高,而且最為關(guān)鍵的是,業(yè)內(nèi)好的車牌識(shí)別算法往往都包含著利益關(guān)系,雖然在這一方面,優(yōu)秀的車牌識(shí)別算法比比皆是,但是基于這些算法實(shí)現(xiàn)車牌識(shí)別的卻少之又少,換句話說(shuō),就是理論上可以實(shí)現(xiàn),但是實(shí)際開(kāi)發(fā)又需另外考慮.目前,車牌識(shí)別已經(jīng)有了一些自動(dòng)化系統(tǒng).但是,這并不能完美解決國(guó)內(nèi)的車牌識(shí)別,主要由于我國(guó)標(biāo)準(zhǔn)車牌是由漢字、英文字母和數(shù)字組成,漢字的識(shí)別與字母和數(shù)字的識(shí)別有很大的不同,在漢字的識(shí)別上要?jiǎng)e字符復(fù)雜得多.而且在算法上各家公司都有自己獨(dú)自的算法,從側(cè)面可以看出在這一方面相當(dāng)?shù)牟唤y(tǒng)一,所以研究這一方面的算法對(duì)于實(shí)現(xiàn)各類智能化系統(tǒng)是相當(dāng)必要的.
選擇好的開(kāi)發(fā)工具或技術(shù)對(duì)于開(kāi)發(fā)一個(gè)實(shí)用的系統(tǒng)至關(guān)重要.一旦運(yùn)用一些關(guān)鍵性技術(shù),可以使系統(tǒng)開(kāi)發(fā)者更有余力去關(guān)注算法本身,而不必過(guò)多關(guān)心如何去具體實(shí)現(xiàn),而且可以使設(shè)計(jì)出的算法更加方便以及實(shí)用.
下面給出了車牌識(shí)別系統(tǒng)的關(guān)鍵技術(shù)組成,如圖1所示.
圖1 車牌識(shí)別系統(tǒng)關(guān)鍵技術(shù)組成
實(shí)現(xiàn)數(shù)字圖像處理系統(tǒng),OpenCV無(wú)疑就是巨人的肩膀.OpenCV的全稱是:Open Source Computer Vision Library,是1999年由 intel公司開(kāi)發(fā)的圖像處理和計(jì)算機(jī)視覺(jué)開(kāi)放源碼庫(kù),現(xiàn)在由Willow Garage實(shí)驗(yàn)室提供支持.它支持多平臺(tái),包括 windows,linux,max,并且他完全開(kāi)源.OpenCV提供了C++,C,Python接口(即將支持 java 接口),目前最新版本為2.4.3.
由Codejock公司設(shè)計(jì)開(kāi)發(fā),該公司成立于1998年,致力于開(kāi)發(fā)“用戶界面”的控件產(chǎn)品和開(kāi)發(fā)工具,能有效節(jié)約用戶的開(kāi)發(fā)時(shí)間和開(kāi)發(fā)成本,讓軟件界面更加精彩.Codejock是目前VC/VB和.NET開(kāi)發(fā)環(huán)境下最好的界面開(kāi)發(fā)組件之一.
被稱為如羽毛般輕的數(shù)據(jù)庫(kù).Sqlite是一種輕量級(jí)開(kāi)源數(shù)據(jù)庫(kù),具有很多不錯(cuò)的特點(diǎn).如:支持事件,不需要配置,不需要管理員,也不需要安裝.本身編譯成一個(gè)動(dòng)態(tài)鏈接庫(kù),沒(méi)有界面化管理,故可配合Navicat Premium進(jìn)行數(shù)據(jù)庫(kù)可視化管理.
目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它,它占用資源非常的低,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了.它能夠支持Windows/Linux/Unix等等主流的操作系統(tǒng),同時(shí)能夠跟很多程序語(yǔ)言相結(jié)合,比如C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款世界著名的開(kāi)源數(shù)據(jù)庫(kù)管理系統(tǒng)來(lái)講,它的處理速度比他們都快.
Xerces是由Apache組織所推動(dòng)的一項(xiàng)XML文檔解析開(kāi)源項(xiàng)目,她是一個(gè)開(kāi)放源代碼的XML語(yǔ)法分析器.利用XERCES,配合SQLite使用,便于封裝數(shù)據(jù)庫(kù).
車牌識(shí)別本質(zhì)上是建立在一系列數(shù)字圖像處理上,這部分也是一個(gè)車牌識(shí)別系統(tǒng)的核心.
2.1.1 圖像構(gòu)成
彩色圖像其實(shí)是由三通道組成,在數(shù)據(jù)部分由倒向的RGB組成,即BGRBGRBGR……假如直接使用彩色圖像進(jìn)行操作,將使數(shù)據(jù)操作量十分的龐大,故需要對(duì)圖像進(jìn)行二值化.
2.1.2 圖像處理
二值化前需先將圖片轉(zhuǎn)化為灰度圖像,即單通道圖像,灰度圖像和二值化圖像有非常大的區(qū)別,灰度圖像圖像數(shù)據(jù)有明亮之分,而二值化圖像像素?cái)?shù)據(jù)僅有0或255兩種.opencv中提供了將圖像轉(zhuǎn)為灰度圖像的函數(shù)cvCvtColor();
在二值化圖像前首先需先理解一個(gè)關(guān)鍵詞:閾值.閾值又可稱為臨界值,這個(gè)值需自己設(shè)定.
二值化如字面意思其實(shí)就是將一副灰度圖像轉(zhuǎn)化為僅有黑白兩種顏色的圖像,即圖像數(shù)據(jù)僅有0或255兩種.可用如下數(shù)學(xué)表達(dá)式表示,R即為閾值.
所以閾值的選擇至關(guān)重要,opencv中有提供canny算子的函數(shù)(邊緣檢測(cè)),但是閾值需自己提供.
2.1.3 自適應(yīng)閾值方法
AdaptiveThreshold(T,m_gray_image)小閾值用于邊緣控制連接,采用自適應(yīng)閾值方法,原理如下:
(1)傳入原圖像灰度值最大值和最小值的平均值t.
(2)將圖像分為兩部分,大于t的累加進(jìn)Allt1,小于等于t的累加進(jìn)Allt2中.并計(jì)算分別占有的像素點(diǎn)accountt1和accountt2.
(3)取 Allt1/accountt1,放入t1,即求平均值.
(4)取Allt2/accountt2,放入t2,即求平均值.(5)取t1和t2的平均值tnew.
(6)若tnew的值等于t,tnew即為所要的小閾值,返回;否則將tnew賦值給t進(jìn)行遞歸,執(zhí)行第二步.
為了確定出車牌的上下邊界,有種簡(jiǎn)易的方法,就是求圖中的矩形框,但是往往圖片中存在各種各樣的噪聲.所以不能單純的求矩形框,可以求出上下邊界,再求左右邊界.
2.2.1 水平細(xì)化
(1)首先需要將圖像進(jìn)行水平細(xì)化.將圖像細(xì)化,即將圖像中的右邊點(diǎn)減去他的左邊點(diǎn),找出隔壁的點(diǎn)和前一點(diǎn)的差值,即如果兩點(diǎn)之間相差的對(duì)比度高,即該點(diǎn)的圖像較清晰.
2.2.2 繪制水平方向直方圖
繪制水平方向直方圖以便于觀察,直方圖繪制思想是new一副高度跟源圖像相同的單通道黑色圖像,然后一行一行的掃描,如果每行將前num_h[j]的值賦為白色,這樣就形成了一副簡(jiǎn)單的直方圖.
2.2.3 確定車牌長(zhǎng)寬
搜索車牌區(qū)域,從上向下掃描,每次掃描20個(gè)像素點(diǎn),找出像素點(diǎn)最大值的起始處.這樣子就可以獲得車牌的高度,而寬度為plate_w =imgTest- >width*WITH_X–1.
2.2.4 確定具體起始點(diǎn)
拿一個(gè)車牌大小的矩形區(qū)域從左往右滑動(dòng),什么時(shí)候圈住的數(shù)據(jù)量最大的時(shí)候,就代表找到的車牌的左邊界;此時(shí),車牌左邊界的橫坐標(biāo)是k.
2.2.5 車牌歸一化
車牌識(shí)別后大小是不相同的,需用OpenCV提供的函數(shù)進(jìn)行歸一化.
2.2.6 字符分割
定位后的圖像應(yīng)該是由一個(gè)漢字和6個(gè)字符組成,字符包括漢字和數(shù)字.識(shí)別時(shí)必須根據(jù)每個(gè)字符的特征進(jìn)行匹配,故要完成識(shí)別,需先完成字符分割.
算法如下:
(1)從上到下對(duì)圖像逐行掃描,當(dāng)碰到第一個(gè)255的值(即黑色像素點(diǎn))時(shí),記錄它.然后從下到上對(duì)圖像逐行掃描,當(dāng)碰到第一個(gè)255的值時(shí),再次記錄.這樣就得到大致的高度.
(2)在這個(gè)高度范圍之內(nèi)自左向右逐列掃描,當(dāng)碰到第一個(gè)255的值時(shí),就認(rèn)為是字符分割的起始位置,然后繼續(xù)掃描,直到某一列沒(méi)有黑色像素點(diǎn),則掃描結(jié)束.
車牌識(shí)別系統(tǒng)的最后一步就是字符識(shí)別,關(guān)于識(shí)別,有兩種做法,一種是神經(jīng)網(wǎng)絡(luò)識(shí)別,一種是模板匹配算法,前者雖然識(shí)別率高,但是耗時(shí)長(zhǎng),后者效率高,識(shí)別率也不錯(cuò).推薦采用后者,模板匹配流程如圖2所示.
圖2 模板匹配過(guò)程
3.2.1 車牌特征值提取
車牌識(shí)別系統(tǒng)中的特征值可采用33個(gè)特征點(diǎn)存儲(chǔ),其中前25個(gè)為將圖像分割成25塊,然后將圖像每塊中黑點(diǎn)數(shù)作為他的特征值存取,后8個(gè)特征值是橫縱向8條直接所穿過(guò)的黑點(diǎn)數(shù).
由于車牌的字符沒(méi)有標(biāo)準(zhǔn)化的圖像可以比較,故需用大量的圖片來(lái)選取出最合適的字符圖像.
3.2.2 車牌特征值存儲(chǔ)
得到字符特征后需要字符特征值進(jìn)行存取,可采用SQLite+XML進(jìn)行存儲(chǔ),例如:
圖3 XML特征值串
字符識(shí)別是建立在字符分割并細(xì)化后,先提取細(xì)化后的字符存在結(jié)構(gòu)體中備用.
然后通過(guò)數(shù)據(jù)庫(kù)接口查詢數(shù)據(jù)庫(kù)中所有的字符,并將字符屬性存入XML作為返回值返回到主函數(shù)中進(jìn)行對(duì)比.對(duì)比的方法有很多,可采用如下3種方法.
(1)豪斯多夫最小距離判定,小小的改進(jìn)了下,算法如下:①設(shè)定LEN(X)=0,表示X字符模塊初始化;②從上到下,逐行掃描待檢測(cè)字符圖像像素,如果是255,記錄為p(x,y);否則繼續(xù)掃描.③在模板圖像上,以p(x,y)為中心的5×5領(lǐng)域內(nèi),搜索255,尋找與p(x,y)最近的點(diǎn),并且計(jì)算p(x,y)和該點(diǎn)的距離,此距離是待識(shí)別圖像和模板圖像在該點(diǎn)的最小距離.如果在5×5領(lǐng)域內(nèi)未搜索到,則認(rèn)為是20.
④將距離進(jìn)行累加進(jìn)LEN(X).
⑤判斷圖像是否掃描結(jié)束,如沒(méi)結(jié)束,轉(zhuǎn)2.
⑥取LEN(X)在所有字符中的最小值,對(duì)應(yīng)的模板就是要識(shí)別的結(jié)果.
(2)方差判定,公式如下:
取方差最小值所對(duì)應(yīng)得模板即是要識(shí)別的結(jié)果.
(3)取差值.
但是由于前兩種方法的時(shí)間效率太低,所以最后采用的是第三種方法.
該文針對(duì)目前我國(guó)車牌識(shí)別系統(tǒng)存在的問(wèn)題,研究并提出了一系列在車牌識(shí)別處理中的關(guān)鍵技術(shù)以及核心算法,利用這些關(guān)鍵技術(shù)和核心算法開(kāi)發(fā)的車牌自動(dòng)識(shí)別系統(tǒng)較普通的車牌識(shí)別系統(tǒng)具有更好的識(shí)別率,能夠?yàn)閷?lái)的智能化交通體系的建立提供一定的借鑒和參考.
[1]沈晶,等.VC++數(shù)字圖像處理典型案例詳解[M].北京:機(jī)械工業(yè)出版社,2012.
[2]Bradski G.Kaehler A.于仕琪,劉瑞禎 譯.學(xué)習(xí) OpenCV[M].北京:清華大學(xué)出版社,2009.47.
[3]于仕琪,劉瑞禎.OpenCV教程[M].北京:北京航空航天大學(xué)出版社,2007.89.
[4]馮偉興,等.Visual C++數(shù)字圖像模式識(shí)別技術(shù)詳解[M].北京:機(jī)械工業(yè)出版社,2010.136.
[5]謝鳳英,趙丹培.Visual C++數(shù)字圖像處理[M].北京:電子工業(yè)出版社,2011.145.
[6]劉海波,沈晶,郭聳.Visual C++數(shù)字圖像處理技術(shù)詳解[M].北京:機(jī)械工業(yè)出版社,2010.12.