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