1 字符识别简介
字符识别是车牌识别中很重要的一部分,在模式识别中也扮演的很重要的角色。当然,我们可以用很多方法拉进行字符识别,比如:基于向量机(SVM),神经网络,小波等方法。当然基于模板匹配也是一种方法。模板匹配既简单有具有实效性。其中关键在于模板的选取。好的模板对字符识别的结果是决定性的。模板匹配的算法也是重要的。
2 模板匹配算法
首先本文识别的前提是模板字符是二值图像,背景黑色,字符为白色;同样待识别的字符同样如此。
我们将预处理后的待识别字符图像imageU与字符模板库中的字符图像imageT进行”与“运算得到共同部分图像imageV;将得到的共同部分图像与待识别字符进行逻辑”异或“运算,得到待识别字符图像多余部分imageX;将得到的共同部分与模板字符进行逻辑”异或“运算,得到模板图像多余部分imageW。
计算每个模板字符图像imageM中白像素个数T,待识别字符图像imageU的白像素个数U,imageU与imageT共同的部分imageV的白像素个数V,imageW的白像素个数W;imageX中白像素个数X;
构造判别函数表达式为:
其中TUV=(T+U+V)/3;
这样,相似系数最大max(Y)对应的模板M为待识别字符;
3 代码实现
由于需要模板库的支持,包含模板库和代码的所有内容可以下载:
%%%%%%%%%%%%%%%%%%%基于模板匹配的字符识别
templatePath='G:\licenseTemple\'; %路径因人而异
fileFormat='.bmp';
templateImage=zeros(40,20,36);
Timage=zeros(36,800);
for i=1:36 %读取模板
stri=num2str(i-1);
imagePath=[templatePath,stri,fileFormat];
tempImage=imread(imagePath);
templateImage(:,:,i)=tempImage;
clear imagePath stri tempImage;
end
characterImage=zeros(40,20,6);
Uimage=zeros(6,800);
characterPath='G:\matlab--wavlet\'; %路径因人而异
charFileFormat='.jpg';
for i=1:6%读取待识别字符
stri=num2str(i+1);
imagePath=[characterPath,stri,charFileFormat];
tempImage=imread(imagePath);
characterImage(:,:,i)=tempImage;
clear imagePath stri tempImage;
end
%V=zeros(1,36);
%5X=zeros(1,36);
%5W=zeros(1,36);
%U=zeros(1,6);
%T=zeros(1,36);
Y=zeros(1,36);
for i=1:6
U=length(find( characterImage(:,:,i))~=0);
for j=1:36
T=length(find( templateImage(:,:,j))~=0);
tempV=characterImage(:,:,i)& templateImage(:,:,j);
V=length(find(tempV)~=0);
tempW=xor(tempV,templateImage(:,:,j));
W=length(find(tempW)~=0);
tempX=xor(tempV,characterImage(:,:,i));
X=length(find(tempX)~=0);
TUV=(T+U+V)/3;
tempSum=sqrt(((T-TUV)*(T-TUV)+(U-TUV)*(U-TUV)+(V-TUV)*(V-TUV))/2);
Y(j)=V/(W/T*X/U*tempSum);
end
[MAX,indexMax]=max(Y);
stri=num2str(indexMax-1);
imagePath=[templatePath,stri,fileFormat];
image=imread(imagePath);
figure(i);
imshow(image);
clear imagePath indexMax;
end
识别效果还不错。但是有些相近的字符,比如:B 8 不能很好的识别。
毕竟模板匹配是有缺陷的,整体识别率90%,特征提取还需要优化。
最后希望大家多多提意见。