all=sum(sum(temp));
two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:))); if two_thirds/all>y2 flag=1;word1=temp; end
d(:,[1:wide])=0;d=qiege(d); end end
% 分割出第二个字符 [word2,d]=getword(d); % 分割出第三个字符 [word3,d]=getword(d); % 分割出第四个字符 [word4,d]=getword(d); % 分割出第五个字符 [word5,d]=getword(d); % 分割出第六个字符 [word6,d]=getword(d); % 分割出第七个字符 [word7,d]=getword(d); figure(9);
subplot(2,7,1),imshow(word1),title('1'); subplot(2,7,2),imshow(word2),title('2'); subplot(2,7,3),imshow(word3),title('3'); subplot(2,7,4),imshow(word4),title('4'); subplot(2,7,5),imshow(word5),title('5'); subplot(2,7,6),imshow(word6),title('6'); subplot(2,7,7),imshow(word7),title('7'); [m,n]=size(word1);
% 商用系统程序中归一化大小为 40*20,此处演示
word1=imresize(word1,[40 20]); word2=imresize(word2,[40 20]); word3=imresize(word3,[40 20]); word4=imresize(word4,[40 20]); word5=imresize(word5,[40 20]); word6=imresize(word6,[40 20]); word7=imresize(word7,[40 20]);
subplot(2,7,8),imshow(word1),title('1'); subplot(2,7,9),imshow(word2),title('2'); subplot(2,7,10),imshow(word3),title('3'); subplot(2,7,11),imshow(word4),title('4'); subplot(2,7,12),imshow(word5),title('5'); subplot(2,7,13),imshow(word6),title('6'); subplot(2,7,14),imshow(word7),title('7'); imwrite(word1,'1.jpg'); imwrite(word2,'2.jpg'); imwrite(word3,'3.jpg'); imwrite(word4,'4.jpg'); imwrite(word5,'5.jpg'); imwrite(word6,'6.jpg');
imwrite(word7,'7.jpg');运行结果如下:
四、车牌匹配识别
模板匹配是图象识别方法中最具代表性的基本方法之一,它是将从待识别的图象或图象区域f(i,j)中提取的若干特征量与模板T(i,j)相应的特征量逐个进行比较,计算它们之间规格化的互相关量,其中互相关量最大的一个就表示期间相似程度最高,可将图象归于相应的类。也可以计算图象与模板特征量之间的距离,用最小距离法判定所属类。
此处采用相减的方法来求得字符与模板中哪一个字符最相似,然后找到相似度最大的输出。汽车牌照的字符一般有七个,大部分车牌第一位是汉字,通常代表车辆所属省份,紧接其后的为字母与数字。车牌字符识别与一般文字识别在于它的字符数有限,汉字共约50多个,大写英文字母26个,数字10个。为了实验方便,结合本次设计所选汽车牌照的特点,只建立了7个数字26个字母与10个数字的模板。其他模板设计的方法与此相同。
首先取字符模板,接着依次取待识别字符与模板进行匹配,将其与模板字符相减,得到的0越多那么就越匹配。把每一幅相减后的图的0值个数保存,即为识别出来的结果。 识别的流程图如下所示:
建立自动识别的代码表 读取分割出来的字第一个字符与模板中的汉字模板进行匹配 第二个字符与模板中的字母模板进行匹配 后5个字符与模板中的字母与数字模板进行匹配 待识别字符与模板字符相减,值越小相似度越大,找到最小的一个即为匹配的最好的 识别完成,输出此模板对应值 源代码如下:
liccode=char(['0':'9' 'A':'Z' '京辽鲁陕苏豫浙']); %建立自动识别字符代码表 SubBw2=zeros(40,20); %产生40*20的全0矩阵 l=1;
for I=1:7
ii=int2str(I); %转为串
t=imread([ii,'.jpg']); %读取图片文件中的数据
SegBw2=imresize(t,[40 20],'nearest'); %对图像做缩放处理 SegBw2=double(SegBw2)>20;
if l==1 %第一位汉字识别 kmin=37; kmax=43;
elseif l==2 %第二位 A~Z 字母识别 kmin=11; kmax=36;
else l>=3 %第三位以后是字母或数字识别 kmin=1; kmax=36; end
for k2=kmin:kmax
fname=strcat('字符模板\\',liccode(k2),'.jpg'); %把行向量转化成字符串
SamBw2 = imread(fname); SamBw2=double(SamBw2)>1; for i=1:40 for j=1:20
SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j); end end
% 以上相当于两幅图相减得到第三幅图 Dmax=0; for k1=1:40 for l1=1:20
if ( SubBw2(k1,l1) > 0 | SubBw2(k1,l1) <0 ) Dmax=Dmax+1; end end end
Error(k2)=Dmax; end
Error1=Error(kmin:kmax); MinError=min(Error1);
findc=find(Error1==MinError);
Code(l*2-1)=liccode(findc(1)+kmin-1); Code(l*2)=' '; %输出最大相关图像 l=l+1; end
figure(10),imshow(dw),title (['车牌号码:', Code],'Color','r');