字符识别方法目前主要有基于模板匹配算法和基于人工神经网络算法。
基于模板匹配算法:首先将分割后的字符二值化,并将其尺寸大小缩放为字符数据库中模板的大小,然后与所有的模板进行匹配,最后选最佳匹配作为结果。
基于人工神经元网络的算法有两种:
一种是先对待识别字符进行特征提取,再用所获得特征来训练神经网络分配器;
另一种是直接把待处理图像输入网络,由网络自动实现特征提取直至识别出结果。
本节所介绍的字符识别是基于模板匹配的算法,简单讲,兵分两路走:
1.一路是对分割出来的车牌字符进行二值化(在上一讲字符分割中已经完成),尺寸规范化(参考尺寸:[110 55])。
实现代码
%------定位 1. 将读取的字符信息分别赋值给7个数组
han_zi = bw( 1:y,fenge(1):fenge(2));
zi_mu = bw( 1:y,fenge(3):fenge(4));
zm_sz_1 = bw( 1:y,fenge(5):fenge(6));
zm_sz_2 = bw( 1:y,fenge(7):fenge(8));
shuzi_1 = bw( 1:y,fenge(9):fenge(10));
shuzi_2 = bw( 1:y,fenge(11):fenge(12));
shuzi_3 = bw( 1:y,fenge(13):fenge(14));
%------修正各个字符的尺寸大小 2. 规范七个字符的尺寸
%[110 55]指定目标图像的高度与宽度,bilinear采用双线性插值算法
xiuzhenghanzi = imresize(han_zi, [110 55],'bilinear');
xiuzhengzimu = imresize(zi_mu, [110 55],'bilinear');
xiuzhengzm_sz_1 = imresize(zm_sz_1,[110 55],'bilinear');
xiuzhengzm_sz_2 = imresize(zm_sz_2,[110 55],'bilinear');
xiuzhengshuzi_1 = imresize(shuzi_1,[110 55],'bilinear');
xiuzhengshuzi_2 = imresize(shuzi_2,[110 55],'bilinear');
xiuzhengshuzi_3 = imresize(shuzi_3,[110 55],'bilinear');
2.另一路就是将模板读入、灰度化、二值化和尺寸规范化(要与上一步操作的参数一致)。
实现代码:
%-------导入汉字模板:桂、贵、京、苏、粤
Gui_lin = imread('汉字模板库\Gui_lin.bmp'); % 1. 读取汉字模板
Gui_zhou = imread('汉字模板库\Gui_zhou.bmp');
Jing = imread('汉字模板库\Jing.bmp');
Su = imread('汉字模板库\Su.bmp');
Yue = imread('汉字模板库\Yue.bmp');
%-----------------------------
s0 = imread('数字模板库\0.bmp'); % 2. 读取字母和数字模板
s1 = imread('数字模板库\1.bmp');
s2 = imread('数字模板库\2.bmp');
s3 = imread('数字模板库\3.bmp');
s4 = imread('数字模板库\4.bmp');
s5 = imread('数字模板库\5.bmp');
s6 = imread('数字模板库\6.bmp');
s7 = imread('数字模板库\7.bmp');
s8 = imread('数字模板库\8.bmp');
s9 = imread('数字模板库\9.bmp');
zA = imread('字母模板库\A.bmp');
zB = imread('字母模板库\B.bmp');
zC = imread('字母模板库\C.bmp');
zD = imread('字母模板库\D.bmp');
zE = imread('字母模板库\E.bmp');
zF = imread('字母模板库\F.bmp');
zG = imread('字母模板库\G.bmp');
zH = imread('字母模板库\H.bmp');
zJ = imread('字母模板库\J.bmp');
zK = imread('字母模板库\K.bmp');
zL = imread('字母模板库\L.bmp');
zM = imread('字母模板库\M.bmp');
zN = imread('字母模板库\N.bmp');
zP = imread('字母模板库\P.bmp');
zQ = imread('字母模板库\Q.bmp');
zR = imread('字母模板库\R.bmp');
zS = imread('字母模板库\S.bmp');
zT = imread('字母模板库\T.bmp');
zU = imread('字母模板库\U.bmp');
zV = imread('字母模板库\V.bmp');
zW = imread('字母模板库\W.bmp');
zX = imread('字母模板库\X.bmp');
zY = imread('字母模板库\Y.bmp');
zZ = imread('字母模板库\Z.bmp');
%-----------------------------
%------录入 % 2. 录入操作
Hanzi = Luru_hanzi (Gui_lin,Gui_zhou,Jing,Su,Yue); % 汉字
Shuzi_Zimu = Luru_ShuziZimu (s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,zA,zB...
,zC,zD,zE,zF,zG,zH,zJ,zK,zL,zM,zN,zP,zQ,zR,zS,zT,zU,zV,zW,zX,zY,zZ);
%数字、字母
其中,录入操作实现函数主要包含:灰度处理,尺寸规范和二值化。字母数字与汉字的录入方法一样。里面用到的graythresh函数,它的相关介绍及用法,也有作过详解:
https://blog.csdn.net/weixin_43958974/article/details/84898270
function Hanzi = Luru_hanzi (Gui_lin,Gui_zhou,Jing,Su,Yue)
Hanzi(:,:,1) =imresize(im2bw(Gui_lin,graythresh(rgb2gray(Gui_lin))),[110 55],'bilinear');
Hanzi(:,:,2) =imresize(im2bw(Gui_zhou,graythresh(rgb2gray(Gui_zhou))),[110 55],'bilinear');
Hanzi(:,:,3) =imresize(im2bw(Jing,graythresh(rgb2gray(Jing))),[110 55],'bilinear');
Hanzi(:,:,4) =imresize(im2bw(Su,graythresh(rgb2gray(Su))),[110 55],'bilinear');
Hanzi(:,:,5) =imresize(im2bw(Yue,graythresh(rgb2gray(Yue))),[110 55],'bilinear');
end
3.识别
接下来就是两路相逢了,将读取的字符与模板库的字符逐个进行对比,找出相似度最高的那个就可以了。对比方式就按照两个二值图像的相应位置黑白点的重合率。
识别函数代码实现:
function Shibie_hanzi=shibiehanzi(hanzi,xiuzhenghanzi)
[y,x,z]=size(xiuzhenghanzi);
for k=1:5
sum=0;
for i=1:y
for j=1:x
if hanzi(...)%统计黑白
sum=sum+1;
else
end
end
end
baifenbi(1,k)=sum/(x*y);
end
Shibie_Xuhao = find(...); % 寻找最大值max(即最相似的)所在的序号位置
Shibie_hanzi = Shibie_Xuhao;
if Shibie_hanzi==1
Shibie_hanzi='桂';
elseif Shibie_hanzi==2
Shibie_hanzi='贵';
elseif Shibie_hanzi==3
Shibie_hanzi='京';
elseif Shibie_hanzi==4
Shibie_hanzi='苏';
elseif Shibie_hanzi==5
Shibie_hanzi='粤';
else
end
end
4.最后将识别的结果显示出来:
%-------识别
i=1;
jieguohanzi = shibiehanzi(Hanzi,xiuzhenghanzi);
shibiejieguo(1,i) =jieguohanzi;
i=i+1;
jieguozimu = shibiezm_sz(Shuzi_Zimu,xiuzhengzimu);
shibiejieguo(1,i) =jieguozimu;
i=i+1;
jieguozm_sz_1= shibiezm_sz(Shuzi_Zimu,xiuzhengzm_sz_1);
shibiejieguo(1,i) =jieguozm_sz_1;
i=i+1;
jieguozm_sz_2= shibiezm_sz(Shuzi_Zimu,xiuzhengzm_sz_2);
shibiejieguo(1,i) =jieguozm_sz_2;
i=i+1;
jieguoshuzi_1= shibiezm_sz(Shuzi_Zimu,xiuzhengshuzi_1);
shibiejieguo(1,i) =jieguoshuzi_1;
i=i+1;
jieguoshuzi_2 = shibiezm_sz(Shuzi_Zimu,xiuzhengshuzi_2);
shibiejieguo(1,i) =jieguoshuzi_2;
i=i+1;
jieguoshuzi_3= shibiezm_sz(Shuzi_Zimu,xiuzhengshuzi_3);
shibiejieguo(1,i) =jieguoshuzi_3;
i=i+1;
shibiejieguo;
msgbox(shibiejieguo,'识别结果');
5.实现效果如下图,至此有关车牌照的识别分了三大模块介绍完了。
留言就不一一回复了
有问题和需要源码的小伙伴们可以加我微信:Abox_0226
获取更多MATLAB以及GUI学习资料。
欢迎扫描下方二维码关注我的微信公众号:空心的梦;