gusucode.com > MATLAB,车牌定位仿真源码程序 > MATLAB,车牌定位仿真源码程序/programs_and_pictures/zifufg.m
function [PIN0,PIN1,PIN2,PIN3,PIN4,PIN5,PIN6] = zifufg(I) %功能:对字符进行分割 %step1:提取饱和度信息,并对图像进行二值化 Ihsv=rgb2hsv(I); Isat=Ihsv(:,:,2); t=graythresh(Isat); I1=1-im2bw(Isat,t); I11=imerode(I1,ones(4,2)); I21=bwareaopen(I11,40);%原为50 I2=imdilate(I21,ones(4,1)); figure(); subplot(2,2,1);imshow(I1),title('四次定位车牌图像二值化'); subplot(2,2,2);imshow(I11);title('腐蚀后的图像'); subplot(2,2,3);imshow(I21),title('形态学滤波后的二值化图像'); subplot(2,2,4);imshow(I2);title('膨胀'); [y1,x1,z1]=size(I2); I2=double(I2); % step2:分割字符按列积累,为字符分割提供依据 X1=zeros(1,x1); for j=1:x1 for i=1:y1 if(I2(i,j,1)==1) X1(1,j)= X1(1,j)+1; end end end figure(); plot(0:x1-1,X1),title('各列方向像素点之和累计'),xlabel('x'),ylabel('累计像素量'); %step3:字符分割 %Z1 Px0=1; Px1=1; while ((X1(1,Px0)<3)&&(Px0<x1)) Px0=Px0+1; end Px1=Px0; while (((X1(1,Px1)>=3)&&(Px1<x1))||((Px1-Px0)<10)) Px1=Px1+1; end Z1=I2(:,Px0:Px1,:); figure(); subplot(3,3,1); imshow(Z1); %Z2 Px0=Px1; while ((X1(1,Px0)<3)&&(Px0<x1)) Px0=Px0+1; end Px1=Px0; while (((X1(1,Px1)>=3)&&(Px1<x1))||((Px1-Px0)<10)) Px1=Px1+1; end Z2=I2(:,Px0:Px1,:); subplot(3,3,2); imshow(Z2); %Z3 Px0=Px1; while ((X1(1,Px0)<3)&&(Px0<x1)) Px0=Px0+1; end Px1=Px0; while (((X1(1,Px1)>=3)&&(Px1<x1))||((Px1-Px0)<10)) Px1=Px1+1; end Z3=I2(:,Px0:Px1,:); subplot(3,3,3); imshow(Z3); %Z4 Px0=Px1; while ((X1(1,Px0)<3)&&(Px0<x1)) Px0=Px0+1; end Px1=Px0; while (((X1(1,Px1)>=3)&&(Px1<x1))||((Px1-Px0)<10)) Px1=Px1+1; end Z4=I2(:,Px0:Px1,:); subplot(3,3,4); imshow(Z4); %Z5 Px0=Px1; while ((X1(1,Px0)<3)&&(Px0<x1)) Px0=Px0+1; end Px1=Px0; while (((X1(1,Px1)>=3)&&(Px1<x1))||((Px1-Px0)<10)) Px1=Px1+1; end Z5=I2(:,Px0:Px1,:); subplot(3,3,5); imshow(Z5); %Z6 Px0=Px1; while ((X1(1,Px0)<3)&&(Px0<x1)) Px0=Px0+1; end Px1=Px0; while (((X1(1,Px1)>=3)&&(Px1<x1))||((Px1-Px0)<10)) Px1=Px1+1; end Z6=I2(:,Px0:Px1,:); subplot(3,3,6); imshow(Z6); %Z7 Px0=Px1; while ((X1(1,Px0)<3)&&(Px0<x1)) Px0=Px0+1; end Px1=Px0; while (((X1(1,Px1)>=3)&&(Px1<x1))||((Px1-Px0)<10)) Px1=Px1+1; end Z7=I2(:,Px0:Px1,:); subplot(3,3,7); imshow(Z7); %Z8(处理较为特殊) Px0=Px1; if (x1-Px0)>30 while ((X1(1,Px0)<3)&&(Px0<x1)) Px0=Px0+1; end Px1=Px0; if (x1-Px1)>10 while (((X1(1,Px1)>=3)&&(Px1<x1))||((Px1-Px0)<10)) Px1=Px1+1; end TT=0; Z8=I2(:,Px0:Px1,:); % Z8=crec(Z8);%%% subplot(3,3,8); imshow(Z8); else TT=1; end else TT=1; end %保存样本图像供神经网络训练 % imwrite(I,'dw.jpg'); % imwrite(Z1,'z1.jpg'); % imwrite(Z2,'z2.jpg'); % imwrite(Z3,'z3.jpg'); % imwrite(Z4,'z4.jpg'); % imwrite(Z5,'z5.jpg'); % imwrite(Z6,'z6.jpg'); % imwrite(Z7,'z7.jpg'); % imwrite(Z8,'z8.jpg'); %对输出哪些字符进行判断 if TT==0 PIN0=Z2; PIN1=Z3; PIN2=Z4; PIN3=Z5; PIN4=Z6; PIN5=Z7; PIN6=Z8; else PIN0=Z1; PIN1=Z2; PIN2=Z3; PIN3=Z4; PIN4=Z5; PIN5=Z6; PIN6=Z7; end