1.車牌預(yù)處理
車牌預(yù)處理過(guò)程的好壞直接影響到車牌圖像進(jìn)行后期處理過(guò)程,比如車牌字符分割等。車牌預(yù)處理也是盡可能的消除噪聲,減少后期處理帶來(lái)的不必要的麻煩。
輸入的車牌是24Bit的BMP真彩色圖像,車牌照有黃底黑字,藍(lán)底白字等顏色,為了將這些車牌圖像一并處理,就要先將車牌進(jìn)行灰度化處理,然后進(jìn)行二值化(黑白)處理。
4-1 原始圖像
將采集的車牌圖像進(jìn)行預(yù)處理,為了方便起見(jiàn),這里采用的是BMP格式的圖片,我將采集的車牌圖像進(jìn)行了裁剪處理,裁剪后的圖片如下:
由于中國(guó)大部分的車牌是第一個(gè)是漢字,第二個(gè)到第七個(gè)是字母或數(shù)字,這就可以將車牌圖像識(shí)別過(guò)程分成兩部分處理,第一部分是識(shí)別漢字的過(guò)程,第二部分是識(shí)別字母和數(shù)字的過(guò)程,由于漢字筆畫較多,同字母或數(shù)字的處理過(guò)程有所不同。所以我這里就先處理字母或數(shù)字的過(guò)程。
除漢字外,在第一個(gè)字母和第二個(gè)數(shù)字的中間有個(gè)一點(diǎn),所以在字符分割的時(shí)候要考慮去掉中間的點(diǎn)。車牌圖像總體來(lái)說(shuō)比較清晰,大型民用車,牌照為黃底黑字,小型民用車,牌照為藍(lán)底白字,由于字符與背景顏色對(duì)比比較明顯,所以將車牌分割開(kāi)來(lái)比較容易。由于有些車牌的上面和下面也有螺絲之類的東西將車牌固定,所以在將車牌分割的時(shí)候,通過(guò)水平掃描跳躍點(diǎn)的方法,可以去除掉,以便最后將車牌進(jìn)行分割,去除這些干擾。
在RGB模型中,如果R=G=B時(shí),則彩色表示一種灰度顏色,其中R=G=B的值叫灰度值,因此,灰度圖像每個(gè)像素只需一個(gè)字節(jié)存放灰度值(又稱強(qiáng)度值、亮度值),灰度范圍為0-255。一般有四種方法對(duì)彩色圖像進(jìn)行灰度化。
1. 分量法。就是將每個(gè)分量上的顏色值即RGB3種顏色提取出來(lái)。即:將彩色圖像中的三分量的亮度作為三個(gè)灰度圖像的灰度值,可根據(jù)應(yīng)用需要選取一種灰度圖像。f1(i,j)=R(i,j) f2(i,j)=G(i,j) f3(i,j)=B(i,j)其中fk(i,j)(k=1,2,3)為轉(zhuǎn)換后的灰度圖像在(i,j)處的灰度值。
2.最大值法。選取彩色圖像中的三分量中(RGB)的顏色的最大值作為灰度圖的灰度值。即:f(i,j)=max(R(i,j),G(i,j),B(i,j))。
3.平均值法。 將彩色圖像中的三分量亮度求平均得到一個(gè)灰度圖f(i,j)=(R(i,j)+G(i,j)+B(i,j))/3。
4.加權(quán)平均法。根據(jù)重要性及其它指標(biāo),將三個(gè)分量以不同的權(quán)值進(jìn)行加權(quán)平均。由于人眼對(duì)綠色的敏感最高,對(duì)藍(lán)色敏感最低,因此,按下式對(duì)RGB三分量進(jìn)行加權(quán)平均能得到較合理的灰度圖像。f(i,j)=0.30R(i,j)+0.59G(i,j)+0.11B(i,j))。
以上四種處理過(guò)程,在車牌預(yù)處理的過(guò)程中,我選擇加權(quán)平均值法。效果如下:
圖4-2 原始圖像
圖4-3灰度圖像
如上圖,是將圖中的原始圖像進(jìn)行加權(quán)平均值處理后的灰度圖像。
關(guān)鍵代碼如下:
for(i = 0;i < Height; i++)
{
for(j= 0;j < Width*3; j+=3)
{
ired =(unsigned char*)lpDibBits + LineBytes* i + j + 2;
igreen= (unsigned char*)lpDibBits + LineBytes * i + j + 1;
iblue =(unsigned char*)lpDibBits + LineBytes* i + j ;
lpdest[i*Width+ j/3]= (unsigned char)((*ired)*0.299 + (*igreen)*0.588 + (*iblue)*0.114);//加權(quán)平均值計(jì)算處理
}
}
二值化處理。二值化處理即將BMP圖像進(jìn)行黑白處理,使背景與字符區(qū)分開(kāi)。由于灰度化后的圖像是0-255之間的顏色值。而進(jìn)行二值化處理的過(guò)程就是將此圖像的顏色分成黑色值0和白色值255兩種顏色。為了將背景與車牌字符分開(kāi),要設(shè)定一個(gè)閾值。設(shè)定閾值是關(guān)鍵。如果選取的二值化的閾值不當(dāng)則就有可能不能將車牌圖像中的背景與文字進(jìn)行明顯分開(kāi),所以這時(shí)二值化的閾值選取就顯得非常重要。根據(jù)試驗(yàn),我設(shè)定的閾值為125。二值化后的效果如下:
4-7 二值化后圖像
如上圖是測(cè)試藍(lán)底白字和黃底黑字的車牌圖像的二值化后的效果。通過(guò)將圖像進(jìn)行二值化后,可以明顯將背景與車牌字符進(jìn)行分開(kāi)。
二值化處理的關(guān)鍵代碼如下:
for(i = 0; i < Height; i++)// 每行
{
for(j = 0; j < Width; j++)// 每列
{
// 指向DIB第i行,第j個(gè)象素的指針
lpSrc = (unsigned char*)lpDibBits+LineBytes *(lHeight - 1 - i) + j;
// 判斷是否小于閾值
if ((*lpSrc) < bThre)
{
*lpSrc = 0; // 直接賦值為0,即黑色
}
else
{
*lpSrc = 255; // 直接賦值為255,即白色
}
}
}
2.字符分割
由于車牌圖像做了細(xì)化處理后,可以進(jìn)行水平掃描和垂直掃描將字符分開(kāi),水平掃描確定圖片的上下限,垂直掃描可以確定圖片中字符的左右坐標(biāo)。根據(jù)車牌的特征,先將車牌圖像進(jìn)行水平掃描跳躍點(diǎn),即水平相鄰的兩個(gè)像素,如果不相同則認(rèn)為有一個(gè)跳躍點(diǎn),記錄次數(shù)加1,由于車牌上面有時(shí)候會(huì)有兩個(gè)白點(diǎn),所以通過(guò)判斷跳躍點(diǎn)的個(gè)數(shù),可以將上面的兩個(gè)白點(diǎn)去掉[9]。如圖,掃描處理的跳躍點(diǎn)統(tǒng)計(jì)如下:
圖4-10 原始圖像,上面有兩個(gè)白點(diǎn)
	
圖4-11水平掃描跳躍點(diǎn)的個(gè)數(shù)統(tǒng)計(jì)
統(tǒng)計(jì)結(jié)果:4 4 4 0 0 14 14 16 20 24 24 24 24 22 20 24 26 28 28 30 2626 24 20 20 22 22 22 26 20 20 22 24 20 20 20 20 2 0 4 4 6 4像素。掃描結(jié)果數(shù)量個(gè)數(shù)為的車牌高度的個(gè)數(shù)。
從上往下查找,根據(jù)實(shí)驗(yàn)結(jié)果,設(shè)置當(dāng)水平跳躍點(diǎn)超過(guò)10個(gè)的時(shí)候,作為車牌字符截取的上限。當(dāng)從下往上查找,當(dāng)跳躍點(diǎn)超過(guò)8個(gè)的時(shí)候可以作為車牌字符截取的下限。通過(guò)上面的過(guò)程,基本可以確定車牌的上部和下部。同樣,分割車牌字符左右邊界時(shí),通過(guò)垂直掃描過(guò)程,由于數(shù)字和字母具有連通性,所以分割數(shù)字和字母比較容易。通過(guò)垂直掃描過(guò)程,統(tǒng)計(jì)黑色像素點(diǎn)的個(gè)數(shù),由于兩個(gè)字符之間沒(méi)有黑像素,所以可以作為字符分割的界限。垂直掃描過(guò)程如下圖:
	
陜 A . 5 P 0 7 2
圖4-12 垂直掃描車牌字符黑像素個(gè)數(shù)統(tǒng)計(jì)
通過(guò)上面的統(tǒng)計(jì)可以很容易的把字符作用邊界進(jìn)行分割開(kāi)來(lái)。通過(guò)水平掃描跳躍點(diǎn)和垂直掃描像素點(diǎn),可以分開(kāi)字符。但是其中還有些問(wèn)題。比如有些漢字不是聯(lián)通性,如“陜”字,左耳旁和右邊的“夾”字,有時(shí)候掃描的時(shí)候會(huì)有空隙,所以我這里在掃描第一個(gè)漢字的時(shí)候,要多加一些處理,當(dāng)“陜”的左耳旁的寬度不為總寬度的1/12時(shí)候,我繼續(xù)向下掃描,直到找到為零的像素。還有就是A與5之間會(huì)有一個(gè)“.”號(hào),這個(gè)可以通過(guò)掃描的寬度不為寬度的3/8時(shí),我可以認(rèn)為是中間的“.”號(hào)。所以通過(guò)以上的處理,基本能把大部分的車牌圖像字符進(jìn)行分割。字符分割后的效果如下圖所示:
圖4-13字符分割圖像
字符分割關(guān)鍵代碼如下:
//如果距離少于寬度的1/12,則計(jì)為無(wú)效
intwid = lWidth/13;
intxx=0,pos=0;
intflag = 0;
intsuccess = 0;
	for(i=0;i 
	{ 
	while(VCount[i]==0)i++; 
	if((i-1)<0) 
	posi[k++]=i; 
	else 
	posi[k++]=i-1; 
	xx=0; 
	while(VCount[i]!=0&& i 
	if(flag==0) 
	{ 
	pos= i; 
	while(VCount[i]==0){i++;xx++;} 
	if(xx < (wid/4)) 
	{ 
	str.Format("xx=%d wid/4=%d i=%dposi[k-1]=%d",xx,wid/4,i,posi[k-1]); 
	MessageBox("漢字有分割"+str); 
	xx=0; 
	while(VCount[i]!=0){i++;xx++;} 
	if(xx<=8) 
	{ 
	xx= 0; 
	while(VCount[i]==0){i++;xx++;} 
	if(xx<(lWidth/16)) 
	while(VCount[i]!=0 && i<(lWidth/8)) i++; 
	} 
	} 
	else 
	{ 
	i= pos; 
	} 
	} 
	flag=1; 
	if(i>= lWidth) 
	{ 
	posi[k++]=i-1; 
	} 
	else 
	{ 
	posi[k++]=i+1; 
	} 
	//如果是字符第二個(gè)和第三個(gè)字符中間的點(diǎn),去除。如果是1,寬度增加 
	if(posi[k-1]-posi[k-2]<=wid) 
	{ 
	if(i<=(lWidth/8*3)) 
	{ 
	intx = posi[k-1]-posi[k-2]; k=k-2; 
	str.Format("%d%d %d %d",x,wid,i,BottomLine-TopLine); 
	} 
	else 
	{ 
	posi[k-1]= posi[k-1]+wid/3; 
	posi[k-2]= posi[k-2]-wid/3; 
	} 
	} 
	if(k>=14) 
	{ 
	success= 1; 
	break; 
	} 
	} 
	if(success== 0) 
	{ 
	MessageBox("字符分隔出錯(cuò),程序結(jié)束識(shí)別過(guò)程!"); 
	} 
	3.歸一化處理 
	字符分割的好壞關(guān)系到后面歸一化處理關(guān)鍵。如果字符分割不成立,歸一化處理過(guò)程也就不能成功。剛開(kāi)始實(shí)驗(yàn)的時(shí)候,我先進(jìn)行的細(xì)化處理,然后再進(jìn)行歸一化處理,但是歸一化處理后有,字符基本失去了原來(lái)的骨架結(jié)構(gòu),所以我這里先進(jìn)行歸一化處理。 
	所謂歸一化處理,就是為了在分割字符時(shí),字符大小不相同,所以要將字符歸一化為25×50像素大小的圖像。圖像x軸縮放比率為 ,y軸縮放比率為 ,原圖像寬度和高度為lWidth,lHeight[12]??s放比率由公式: 
	在放大或縮小圖像過(guò)程中,產(chǎn)生的像素可能在原圖中不能找到相應(yīng)的像素點(diǎn)。這樣就必須采用插值處理的方法。一般插值處理的方法有兩種,一種是直接賦值為與它最相鄰的像素值,另一種則通過(guò)插值算法來(lái)計(jì)算相應(yīng)像素值。第一種方法計(jì)算過(guò)程較簡(jiǎn)單效率高,但是效果不是很好,比如有時(shí)候會(huì)出現(xiàn)馬賽克現(xiàn)象;所以,這里采用第二種方法,雖然預(yù)算量有點(diǎn)復(fù)雜,但是最后歸一化后的字符不會(huì)失真。對(duì)后面做細(xì)化處理過(guò)程做好了鋪墊。通過(guò)實(shí)驗(yàn)得出,采用雙線性插值法比最近鄰插值法效果好,所以本文中歸一化采用雙線性插值法。 
	 
	圖4-14 上面為原圖像二值化后的結(jié)果,下面圖像為歸一化后的結(jié)果 
	歸一化關(guān)鍵代碼如下: 
	//針對(duì)圖像每行進(jìn)行操作 
	for(i= 0; i < NewHeight; i++) 
	{ 
	//針對(duì)圖像每列進(jìn)行操作 
	for(j= 0; j < NewWidth; j++) 
	{ 
	//指向新DIB第i行,第j個(gè)象素的指針 
	//注意此處寬度和高度是新DIB的寬度和高度 
	lpDst = (char*)lpNewDIBBits + NewLineBytes * (NewHeight - 1 - i) + j; 
	x= j / fXZoomRatio; 
	y= i / fYZoomRatio; 
	if(tag) 
	{ //tag=1,則執(zhí)行以下的最近鄰插值代碼 
	i0= (LONG) (y + 0.5); 
	j0= (LONG) (x + 0.5); 
	//判斷是否在源圖范圍內(nèi) 
	if((j0 >= 0) && (j0 < Width) && (i0 >= 0) && (i0< Height)) 
	{ 
	//指向源DIB第i0行,第j0個(gè)象素的指針 
	lpSrc = (char*)lpTempDIBBits + LineBytes * (Height - 1 - i0) + j0; 
	*lpDst= *lpSrc; 
	} 
	else 
	{ 
	//對(duì)于源圖中沒(méi)有的象素,直接賦值為255 
	*((unsigned char*)lpDst) = 255; 
	} 
	} 
	else 
	{//否則,執(zhí)行下面的雙線性插值代碼 
	doublem = x - LONG(x);//X方向的小數(shù)部分 
	doublen = y - LONG(y);//Y方向的小數(shù)部分 
	unsignedchar rd, ld, lu, ru;//r:右;l:左;d:下;u:上 
	unsignedchar pix; 
	ld= *((char *)lpTempDIBBits + LineBytes * (Height - 1 - LONG(y)) + LONG(x));//左下角點(diǎn)的像素值 
	rd= *((char *)lpTempDIBBits + LineBytes * (Height - 1 - LONG(y)) + LONG(x) +1);// 右下角點(diǎn)的像素值 
	lu= *((char *)lpTempDIBBits + LineBytes * (Height - 1 - LONG(y) - 1) +LONG(x));// 左上角點(diǎn)的像素值 
	ru= *((char *)lpTempDIBBits + LineBytes * (Height - 1 - LONG(y) - 1) + LONG(x) +1);// 右上角點(diǎn)的像素值 
	pix= (1 - m) * (1 - n) * ld + (1 - m) * n * lu + m * n * ru + m * (1 - n) * rd;//雙線性插值,得到變換后的像素 
	*((unsigned char*)lpDst) = pix;//將像素值賦給目的圖片 
	} 
	} 
	} 
	4.細(xì)化處理 
	對(duì)圖像的喜歡過(guò)程實(shí)際是求圖像骨架的過(guò)程。骨架是二維二值目標(biāo)的重要描述,它指圖像中央的骨骼部分,是描述圖像幾何及拓?fù)湫再|(zhì)的重要特征之一。細(xì)化算法有很多。按照迭代方法,分為兩類,一類是非迭代過(guò)程,一類是迭代過(guò)程。非迭代算法有基于距離變換的方法等。迭代方法是通過(guò)重復(fù)刪除像素邊緣,直到得到單獨(dú)像素寬度的圖像為止?,F(xiàn)在用的比較多的細(xì)化算法有Hilditch、Pavlidis、Rosenfeld細(xì)化算法和索引表細(xì)化算法等[13]。下面主要介紹這四種算法。 
	Hilditch、Pavlidis、Rosenfeld細(xì)化算法:這類算法則是在程序中直接運(yùn)算,根據(jù)運(yùn)算結(jié)果來(lái)判定是否可以刪除點(diǎn)的算法,差別在于不同算法的判定條件不同。 
	其中Hilditch算法比較適用于二值圖像,是用的比較普遍的細(xì)化算法,在本文中我用了該算法后發(fā)現(xiàn)會(huì)有馬賽克效果,所以本文中沒(méi)有引用該算法; Pavlidis算法用位運(yùn)算進(jìn)行特定模式的匹配,所得的骨架是8連接的,使用于0-1二值圖像 ;Rosenfeld算法是一種并行細(xì)化方法,所得的骨架形態(tài)是8-連接的,使用于0-1二值圖像 。 后兩種算法的效果要更好一些,但是處理某些圖像時(shí)效果一般,第一種算法適用性強(qiáng)一些[13]。 
	索引表細(xì)化算法:經(jīng)過(guò)預(yù)處理后得到待細(xì)化的圖像是0、1二值圖像。像素值為1的是需要細(xì)化的部分,像素值為0的是背景區(qū)域。基于索引表的算法就是依據(jù)一定的判斷依據(jù),產(chǎn)生一個(gè)表,然后根據(jù)要細(xì)化的點(diǎn)的八個(gè)鄰域的情況進(jìn)行匹配,若表中元素是1,若表中元素是1,則刪除該點(diǎn)(改為背景),若是0則保留。因?yàn)橐粋€(gè)像素的8個(gè)鄰域共有256種可能情況,因此,索引表的大小一般為256種。 
	車牌圖像進(jìn)行預(yù)處理后,細(xì)化處理是關(guān)系到后面能否正確提取字符特征值的關(guān)鍵,所以本文中在比較了幾種細(xì)化方法后,使用Rosenfeld骨架細(xì)化的方法,細(xì)化處理后可以得到圖像中字符的基本骨架,不會(huì)破壞原來(lái)的連通性。 
	Rosenfeld細(xì)化過(guò)程主要是保持原來(lái)圖像的連通性 
	通過(guò)歸一化 后,再將圖像進(jìn)行細(xì)化,基本保存了字符特征的骨架特征。所以后面就是要進(jìn)行的字符特征提取操作。Rosenfeld效果如下所示: 
	 
	4-19大小歸一化后再細(xì)化的圖像 
	5.字符特征提取 
	字符特征提取的好壞,直接影響字符識(shí)別的結(jié)果。字符特征提取是一個(gè)字符識(shí)別過(guò)程必不可少的過(guò)程。目前,字符特征提取的方法很多,比如:基于網(wǎng)格像素統(tǒng)計(jì)方法[5],基于筆畫,輪廓,骨架特征等。我之前做了基于網(wǎng)格像素統(tǒng)計(jì)的方法,通過(guò)實(shí)驗(yàn),發(fā)現(xiàn)識(shí)別能力比較差,不能達(dá)到預(yù)想的結(jié)果。 
	針對(duì)上面的結(jié)果,我參考何兆成等人的方法,在字符細(xì)化后的基礎(chǔ)上,通過(guò)統(tǒng)計(jì)字符筆畫斜率特征,字符側(cè)面深度等特征作為字符提取的特征,得到22個(gè)特征值。具體統(tǒng)計(jì)方法如下: 
	(1)基于筆畫斜率的累計(jì)特征提取 
	字符最具代表性的特征是筆畫,不同的字符有不同的筆畫數(shù)量,形態(tài),長(zhǎng)度等,所以可將筆畫的斜率累計(jì)值作為特征進(jìn)行特征值提取。筆畫斜率有正斜率,負(fù)斜率,零斜率三部分,分別統(tǒng)計(jì)字符零斜率,正斜率,負(fù)斜率的累加和。斜率的統(tǒng)計(jì)過(guò)程,例如從字符左邊掃描,當(dāng)前的掃描點(diǎn)為 ,下一個(gè)掃描點(diǎn)為為 。斜率K值計(jì)算如下: 
	通過(guò)上面的過(guò)程,從字符左側(cè)開(kāi)始計(jì)算斜率特征,可以得到3個(gè)特征。我這里從字符左右上下四個(gè)方向統(tǒng)計(jì)斜率特征可以得到12個(gè)特征值。 
	(2)拐點(diǎn)幅度累計(jì)特征提取 
	在字符中字符的拐點(diǎn)含有豐富的特征。所以統(tǒng)計(jì)拐點(diǎn)幅度特征累計(jì)和,可以得到4個(gè)特征值。拐點(diǎn)幅度特征 計(jì)算如下: 
	(3)字符輪廓深度特征提取 
	不同的字符在輪廓上有著明顯差異。比如“S”和“C”。如下圖中的“S”字符,從右側(cè)掃描深度的時(shí)候有著有很多的凹凸信息。而字符“C”從右側(cè)掃描的過(guò)程中,字符的中間凹陷比較明顯。所以通過(guò)掃描字符四個(gè)方向的輪廓深度,也能得到4個(gè)輪廓特征值。 
	(4)字符跳躍點(diǎn)統(tǒng)計(jì) 
	由于字符“1”和“B”從左側(cè)掃描過(guò)程中基本上沒(méi)有區(qū)別。所以,為了更準(zhǔn)確些。我這里通過(guò)統(tǒng)計(jì)字符水平掃描跳躍點(diǎn)和垂直掃描字符跳躍點(diǎn)來(lái)區(qū)分。很明顯,字符“1”和字符“B”水平和垂直方向的跳躍點(diǎn)有明顯的差別。以上過(guò)程可以得到2個(gè)字符特征。 
	通過(guò)以上分析總共可以得到22個(gè)字符特征值。將這些特征進(jìn)行訓(xùn)練,即可得到所需的結(jié)果。關(guān)鍵代碼如下(計(jì)算左邊的特征值為例): 
	if(left[i]==-1) 
	{ 
	while(left[i] == -1) i++; 
	} 
	begin=i;i=Height-1; 
	if(left[i] == -1) 
	{ 
	while(left[i] == -1) i--; 
	} 
	end = i; 
	for(i=begin;i<=end;i++) 
	{ 
	if(left[i] == -1) 
	left[i] = left[i+1]; 
	} 
	//掃描深度 
	for(i=begin;i<=end;i++) 
	{ 
	feature[4] += left[i]; 
	} 
	feature[4]=feature[4]/10; 
	double *leftradio = new double[end-begin]; 
	for(i=0;i 
	leftradio[i]=0; 
	int n=0; 
	for(i=begin;i<=(end-4);i++) 
	{ 
	//如果斜率為零 
	if(left[i] == left[i+4]) 
	{ 
	feature[0]++; 
	leftradio[n]=0; 
	} 
	else 
	{ 
	leftradio[n] =(left[i]-left[i+4])/4.0; 
	if(leftradio[n] <0) //如果斜率小于0 
	feature[1]++; 
	else //斜率大于0 
	feature[2]++; 
	} 
	n++; 
	} 
	for(i=1;i 
	{ 
	feature[3] +=fabs(leftradio[i]-leftradio[i-1]); 
	} 
	5.神經(jīng)網(wǎng)絡(luò)訓(xùn)練 
	通過(guò)提取的特征值,識(shí)別的算法有很多,包括分類器算法,模板匹配算法,基于概率統(tǒng)計(jì)的Bayes分類器算法,聚類分析算法等。我這里采用的是BP神經(jīng)網(wǎng)絡(luò)分類器算法。 
	將提取的特征值,輸入層為22個(gè)特征,隱含層為80個(gè)特征,輸出層為34個(gè)特征。這里去除字母“I”和“O”。字符0-9,24個(gè)字母一共34個(gè)輸出。說(shuō)明:由于有34個(gè)輸出,所以這里理想情況下輸出結(jié)果為33個(gè)0和一個(gè)1.只是1在第i個(gè)輸出。i對(duì)應(yīng)的數(shù)字編號(hào)如0則對(duì)應(yīng)0,1對(duì)應(yīng)1,9對(duì)應(yīng)9,字符“A”對(duì)應(yīng)10,字符“B”對(duì)應(yīng)11,依次類推,字符“Z”對(duì)應(yīng)33。 
	Matlab創(chuàng)建網(wǎng)絡(luò)及訓(xùn)練的代碼實(shí)現(xiàn)如下: 
	%創(chuàng)建BP網(wǎng)絡(luò) 
	net_1=newff(minmax(p),[80,34],{'tansig','purelin'},'traingdm') 
	%當(dāng)前輸入層權(quán)值和閾值 
	inputWeights=net_1.IW{1,1}; 
	inputbias=net_1.b{1}; 
	%當(dāng)前網(wǎng)絡(luò)層權(quán)值和閾值 
	layerWeights=net_1.LW{2,1}; 
	layerbias=net_1.b{2}; 
	%設(shè)置訓(xùn)練參數(shù) 
	net_1.trainParam.show = 50; 
	net_1.trainParam.lr = 0.01; %學(xué)習(xí)率 
	net_1.trainParam.mc = 0.9; 
	net_1.trainParam.epochs = 10000;%訓(xùn)練次數(shù) 
	net_1.trainParam.goal = 1e0; %目標(biāo)誤差 
	%調(diào)用 TRAINGDM 算法訓(xùn)練 BP 網(wǎng)絡(luò) 
	[net_1,tr]=train(net_1,p,q); 
	 
	6.車牌圖像識(shí)別結(jié)果測(cè)試 
	因?yàn)檐嚺浦械臐h字與字母數(shù)字的結(jié)構(gòu)以及骨架不同,所以漢字的識(shí)別過(guò)程需要另外再做處理,所以本文處理的是車牌除漢字外的車牌圖像識(shí)別過(guò)程。通過(guò)最終的測(cè)試實(shí)驗(yàn)結(jié)果,數(shù)字的識(shí)別結(jié)果正確率比較高,字符的識(shí)別正確率比較低一點(diǎn)(由于訓(xùn)練用的英文字符比較少)。 
	 
	識(shí)別結(jié)果

- 
                                RGB
                                +關(guān)注
關(guān)注
4文章
820瀏覽量
61284 - 
                                BMP
                                +關(guān)注
關(guān)注
0文章
48瀏覽量
17663 
原文標(biāo)題:車牌識(shí)別步驟及部分代碼
文章出處:【微信號(hào):C_Expert,微信公眾號(hào):C語(yǔ)言專家集中營(yíng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
【超值干貨】 揭秘車牌識(shí)別算法
移動(dòng)端車牌識(shí)別SDK算法
高效的PC端車牌識(shí)別在人工智能機(jī)器人領(lǐng)域的應(yīng)用
移動(dòng)端車牌識(shí)別與PC端車牌識(shí)別有什么區(qū)別解析
基于DSP的圖像處理在車牌識(shí)別中的應(yīng)用
常用車牌定位算法淺析
車牌識(shí)別算法的關(guān)鍵技術(shù)及研究
    
車牌定位算法的研究及設(shè)計(jì)
    
車牌識(shí)別原理解析
多種特征的車牌定位算法
    
車牌識(shí)別技術(shù)的發(fā)展及意義_車牌識(shí)別系統(tǒng)原理介紹
    
          
        
        
解析車牌識(shí)別技術(shù),融合多種算法的原理和過(guò)程
                
 
           
            
            
                
            
評(píng)論