www.gusucode.com > matlab编程简易实现车牌识别源码程序 > matlab编程简易实现车牌识别源码程序/code/main3.m

    function main3()
I=imread('C:\Users\zhz\Desktop\MATLAB car\MATLAB\car\car2.jpg');
figure(1),imshow(I);title('原图')
I1=rgb2gray(I);%功能是将真彩色图像转换为灰度图像,即灰度化处理
I2=edge(I1,'sobel',0.15,'both');
%功能是采用I作为它的输入,并返回一个与I相同大小的二值化图像BW,在函数检测到边缘的地方为1,其他地方为0
se=[1;1;1];
I3=imerode(I2,se);%腐蚀
se=strel('rectangle',[25,25]);
I4=imclose(I3,se);
I4=imclose(I4,se);
I5=bwareaopen(I4,1600);%作用是删除二值图像BW中面积小于2000的对象
[y,x,z]=size(I5);     %获取图像长度和宽度x、y
myI=double(I5);%double类型
%%%%%% Y方向 %%%%%%%%%
 Blue_y=zeros(y,1);%zeros功能是返回一个m×n×p×...的double类零矩阵
 for i=1:y
    for j=1:x
             if(myI(i,j,1)==1) 
  
                Blue_y(i,1)= Blue_y(i,1)+1;%白色像素点统计 
            end  
     end       
 end
 top=1;
 while ((Blue_y(top,1)<5)&&(top<y))
        top=top+1;
 end    
 bottom=y;
 while ((Blue_y(bottom,1)<5)&&(bottom>top))
        bottom=bottom-1;
 end
 %%%%%% X方向 %%%%%%%%%
 Blue_x=zeros(1,x);%进一步确定x方向的车牌区域
 for j=1:x
     for i=top:bottom
            if(myI(i,j,1)==1)
                Blue_x(1,j)= Blue_x(1,j)+1;               
            end  
     end       
 end
  
 left=1;
 while ((Blue_x(1,left)<3)&&(left<x))
       left=left+1;
 end    
 right=x;
 while ((Blue_x(1,right)<3)&&(right>left))
        right=right-1;
 end
 dw=I(top+5:bottom-5,left+5:right-5,:);
figure(7),imshow(dw),title('定位剪切后的彩色车牌图像')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
imwrite(dw,'dw.jpg');
a=imread('dw.jpg');
b=rgb2gray(a);       %彩色图像转换为灰度图像,即灰度化处理
imwrite(b,'1.车牌灰度图像.jpg');
figure(8);subplot(5,1,1),imshow(b),title('1.车牌灰度图像')
[m,n]=size(b);
d=im2bw(b,0.63);
imwrite(d,'2.车牌二值图像.jpg');
figure(8);subplot(5,1,2),imshow(d),title('2.车牌二值图像')
d=bwareaopen(d,80);
figure(8);subplot(5,1,3),imshow(d),title('3.去除白点')
% 均值滤波处理
h=fspecial('average',3);   
d=im2bw(round(filter2(h,d)));% filter2(B,X),B为滤波器.X为要滤波的数据,这里将B放在X上,一个一个移动进行模板滤波. 
imwrite(d,'4.均值滤波后.jpg');
figure(8),subplot(5,1,4),imshow(d),title('4.均值滤波后')
se=eye(2);%产生m×n的单位矩阵
[m,n]=size(d);
if bwarea(d)/m/n>=0.365 %bwarea是计算二值图像中对象的总面积的函数
    d=imerode(d,se);%腐蚀
elseif bwarea(d)/m/n<=0.235
    d=imdilate(d,se);%膨胀
end
imwrite(d,'5.膨胀或腐蚀处理后.jpg');
figure(8),subplot(5,1,5),imshow(d),title('5.膨胀或腐蚀处理后')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
d = imrotate(d,180);
d=qiege(d);
figure(9),imshow(d),title('翻转并进一步切割')
figure,subplot(2,1,1),imshow(d),title(n)
flag=0;word1=[];
while flag==0
    [m,n]=size(d);%将d的尺寸赋给m n
    wide=1;
    while sum(d(:,wide+1))~=0 && wide<n  %当d图中列的和不全为零时,并
       if wide<n
           wide=wide+1;
       else
           flag=1,break%如果d图像素列中存在白色像素点,纵向扫描,列数加1
       end
    end
    zhz=wide;
    if wide<10   % 认为是左侧干扰
        d(:,[1:wide])=0;%将干扰全部消除,赋零
        d=qiege(d);
        flag=1;
    else
        flag=1;
    end
end
[word7,d]=getword(d);%分割出第二个字符
[word6,d]=getword(d);% 分割出第三个字符
[word5,d]=getword(d);% 分割出第四个字符
[word4,d]=getword(d);% 分割出第五个字符
[word3,d]=getword(d);% 分割出第六个字符
[word2,d]=getword(d);
flag=0;word1=[];
d = imrotate(d,180);
while flag==0
    [m,n]=size(d);%将d的尺寸赋给m n
    wide=2;
    while sum(d(:,wide-1))~=0  && wide<n %当d图中列的和不全为零时
               %防止索引超出范围
            wide=wide+1;%如果d图像素列中存在白色像素点,纵向扫描,列数加1
    end
  
    if wide<10   % 认为是左侧干扰
        d(:,[1:wide])=0;%将干扰全部消除,赋零
        d=qiege(d);
        flag=1;
    else
        flag=1;
    end
end
word1=qiege(d);
subplot(5,7,1),imshow(word1),title('1');
subplot(5,7,2),imshow(word2),title('2');
subplot(5,7,3),imshow(word3),title('3');
subplot(5,7,4),imshow(word4),title('4');
subplot(5,7,5),imshow(word5),title('5');
subplot(5,7,6),imshow(word6),title('6');
 subplot(5,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(5,7,15),imshow(word1),title('1(40X20)');
subplot(5,7,16),imshow(word2),title('2(40X20)');
subplot(5,7,17),imshow(word3),title('3(40X20)');
subplot(5,7,18),imshow(word4),title('4(40X20)');
subplot(5,7,19),imshow(word5),title('5(40X20)');
subplot(5,7,20),imshow(word6),title('6(40X20)');
subplot(5,7,21),imshow(word7),title('7(40X20)');
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');