%%%%选择车牌图片%%%%[filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.gif'},'选择图片');str=[pathnamefilename];I=imread(str);%将选择的图片读取,并赋于Ifigure(1),subplot(3,2,1),imshow(I);title('原始图像');I1=rgb2gray(I);%转化为灰度图像figure(1),subplot(3,2,2),imshow(I1),title('灰度图像');I2=edge(I1,'roberts',0.09,'both');%采用robert算子进行边缘检测figure(1),subplot(3,2,3),imshow(I2),title('边缘检测后图像');se=[1;1;1];%线型结构元素I3=imerode(I2,se);%腐蚀图像figure(1),subplot(3,2,4),imshow(I3),title('腐蚀后边缘图像');se=strel('rectangle',[25,25]);%矩形结构元素I4=imclose(I3,se);%图像聚类、填充图像figure(1),subplot(3,2,5),imshow(I4),title('填充后图像');I5=bwareaopen(I4,2000);%去除聚团灰度值小于2000的部分figure(1),subplot(3,2,6),imshow(I5),title('形态滤波后图像');%%%%车牌定位%%%%[y,x]=size(I5);%获取滤波后图像的尺寸,及长宽I6=double(I5);Y1=zeros(y,1);%创建一个y行1列的0矩阵fori=1:yforj=1:xif(I6(i,j)==1)Y1(i,1)=Y1(i,1)+1;endendend[~,MaxY]=max(Y1);figure(2),subplot(2,2,1),plot(0:y-1,Y1);title('行方向像素点灰度值累计和'),xlabel('行值'),ylabel('像素');%%%%%%%求的车牌的行起始位置和终止位置%%%%%%%%%PY1=MaxY;while((Y1(PY1,1)=50)&&(PY11))PY1=PY1-1;endPY2=MaxY;while((Y1(PY2,1)=50)&&(PY2y))PY2=PY2+1;endIY=I(PY1:PY2,:,:);X1=zeros(1,x);forj=1:xfori=PY1:PY2if(I6(i,j,1)==1)X1(1,j)=X1(1,j)+1;endendendfigure(2),subplot(2,2,2),plot(0:x-1,X1);title('列方向像素点灰度值累计和');xlabel('列值');ylabel('像数');%%%%%%%求的车牌的列起始位置和终止位置%%%%%%%%%PX1=1;while((X1(1,PX1)5)&&(PX1x))PX1=PX1+1;endPX2=x;while((X1(1,PX2)5)&&(PX2PX1))PX2=PX2-1;end%分割出车牌图像%dw=I(PY1:PY2,PX1:PX2,:);imwrite(dw,'dw.jpg','jpg');figure(2),subplot(2,2,3),imshow(dw);title('定位剪切后的彩色车牌图像');%%%字符切割%%%figure(3),subplot(2,2,1),imshow(dw);title('定位后的车牌图像');I1=rgb2gray(dw);%将RGB图像转化为灰度图像g_max=double(max(max(I1)));%获取I1中灰度最大值g_min=double(min(min(I1)));%获取I1中灰度最小值T=round(g_max-(g_max-g_min)/3);%计算二值化的阈值后赋值于TI1=im2bw(I1,T/256);subplot(2,2,2);imshow(I1),title('二值化车牌图像');I2=bwareaopen(I1,20);%删除面积小于20的区域figure(3),subplot(2,2,3),imshow(I2);title('形态学滤波后的二值化图像');[y1,x1]=size(I2);I3=double(I2);%%%%%%%去除图像顶端和底端的不感兴趣区域%%%%%Y1=zeros(y1,1);fori=1:y1forj=1:x1if(I3(i,j,1)==1)Y1(i,1)=Y1(i,1)+1;endendendPy0=1;while((Y1(Py0,1)20)&&(Py0y1))Py0=Py0+1;endPy1=Py0;while((Y1(Py1,1)=20)&&(Py1y1))Py1=Py1+1;endI2=I2(Py0:Py1,:,:);figure(3),subplot(2,2,4),imshow(I2);title('目标车牌区域');%%%%%%分割字符按行积累量%%%%%%%X1=zeros(1,x1);forj=1:x1fori=1:y1if(I3(i,j)==1)X1(1,j)=X1(1,j)+1;endendendfigure(4),plot(0:x1-1,X1);title('列方向像素点灰度值累计和'),xlabel('列值'),ylabel('累计像素量');%%%%%%%%%%%%分割字符%%%%%%%%%%%%%%%%%%Px0=1;k=1;%记录存储图片的个数fori=1:7while((X1(1,Px0)5)&&(Px0x1))Px0=Px0+1;endPx1=Px0;while(((X1(1,Px1)=5)&&(Px1x1)))Px1=Px1+1;endif((Px1-Px0)15)%%此处加一个if语句作用是除去识Px0=Px1+1;%%别时区域X轴区域小于15的部分,为while((X1(1,Px0)5)&&(Px0x1))%%了去除不是字符的部分,例如:Px0=Px0+1;%%[豫A*A375G]中两个A之间end%%的那个点,由于滤波不能滤掉这个比较Px1=Px0;%%大一点的点,所以在此去除。不足是:while(((X1(1,Px1)=5)&&(Px1x1)))%%同时也去除了[渝AN7968]中那Px1=Px1+1;%%个渝字的偏旁‘氵’,所以识别出来的end%%渝少‘氵’。将错就错,我在样本中用end%%的也是少‘氵’的渝。Z=I2(:,Px0:Px1,:);Z=imresize(Z,[4020]);%将图像Z转换成尺寸为40*20的图片Px0=Px1;imwrite(Z,strcat('分割符号/PIN',num2str(k),'.jpg'),'jpg');%分割出来的赴澳以‘.jpg’格式存储为图片k=k+1;%表示需要存储的下一张图片figure(5),subplot(1,7,i),imshow(Z);endfunctionoutput=pretreatment(I1)I1=imresize(I1,[4020]);%将图片统一划为40*20大小I1=im2bw(I1,0.9);[m,n]=size(I1);output=zeros(1,m*n);%%%%%%将图像按列转换成一个行向量%%%%%%%%%forj=1:nfori=1:moutput(1,m*(j-1)+i)=I1(i,j);%将各行元素依次排列成一个行向量endend(2)符号识别样本输入%%%%归一化训练样本%%%%I=zeros(43,800);%创建一个由43个拥有800个元素行向量组成的矩阵fori=1:43I(i,:)=pretreatment(imread(strcat('识别样本/',num2str(i-1),'.jpg')));%将识别样本中的每个样本转换成一个行向量存储end%在矩阵I的每一行中P=I';%将的到的矩阵I转置赋于PT=eye(43,43);net=newff(minmax(P),[1000,32,43],{'logsig','logsig','logsig'},'trainrp');net.inputWeights{1,1}.initFcn='randnr';net.layerWeights{2,1}.initFcn='randnr';net.trainparam.epochs=5000;net.trainparam.show=50;net.trainparam.goal=0.0000000001;net=init(net);[net,tr]=train(net,P,T);%%%%%%%%%%%测试字符,得到识别数值%%%%PIN=zeros(7,800);%定义一个有7个拥有800个元素组成的行向量组成的矩阵fori=1:7PIN(i,:)=pretreatment(imread(strcat('分割符号/PIN',num2str(i),'.jpg')));%将分割符号中的每个分离图片转换成一个行向量存储在矩阵PIN的每一行中endP0=PIN';%将得到的矩阵PIN转置后赋于P0Str=cell(1,7);%定义一个拥有7个元素字符串fori=1:7T0=sim(net,P0(:,i));T1=compet(T0);d=find(T1==1)-1;if(d10)%当d10,说明符号识别为一个数字,再将数字d转换成str=num2str(d);%与之相对应的字符赋值于strelseif((d=10)&&(d=35))%当d=10且d=35,说明符号识别为一个字母,由于A的str=char(d+55);%ASCII值为65,所以与之对应的d都要加55,再由char()else%函数转换成对应的ASCII字符赋值于strswitchd%在样本中找到与之相应的汉字,并将汉字字符赋值于strcase36,str='豫';case37,str='京';case38,str='苏';case39,str='辽';case40,str='鲁';case41,str='陕';case42,str='渝';otherwise,str='';%那个都不符合的话,默认为空格endendStr{i}=str;endcarname=strcat(Str{1},Str{2},Str{3},Str{4},Str{5},Str{6},Str{7});%将识别出来的各个字符串成字符串figure(6);imshow(dw),title(carname);%赋值于s并输出图片相对比