在好例子网,分享、交流、成长!
您当前所在位置:首页Others 开发实例一般编程问题 → MATLAB车牌识别 源码下载

MATLAB车牌识别 源码下载

一般编程问题

下载此实例
  • 开发语言:Others
  • 实例大小:3.62M
  • 下载次数:142
  • 浏览次数:4316
  • 发布时间:2017-07-17
  • 实例类别:一般编程问题
  • 发 布 人:Hello321w
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 识别 MATLAB 车牌

实例介绍

【实例简介】

【实例截图】

from clipboard

from clipboard


【核心代码】


I=imread('car1.jpg');
figure(1),imshow(I);title('原图')
I1=rgb2gray(I);%转换为灰度图
figure(2),imshow(I1);title('灰度图');
I2=edge(I1,'roberts',0.15,'both');%边缘检测算法,强度小于阈值0.15的边缘被省略掉,'both'两个方向检测
figure(3),imshow(I2);title('robert算子边缘检测')
se=[1;1;1];
I3=imerode(I2,se);%腐蚀Imerode(X,SE).其中X是待处理的图像,SE是结构元素对象
figure(4),imshow(I3);title('腐蚀后图像');
se=strel('rectangle',[25,25]);
I4=imclose(I3,se);
figure(5),imshow(I4);title('平滑图像的轮廓');
I5=bwareaopen(I4,2000);
figure(6),imshow(I5);title('从对象中移除小对象');
[y,x,z]=size(I5);
myI=double(I5);
tic
 Blue_y=zeros(y,1);
 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
 [temp MaxY]=max(Blue_y);%Y方向车牌区域确定
 PY1=MaxY;
 while ((Blue_y(PY1,1)>=5)&&(PY1>1))
        PY1=PY1-1;
 end    
 PY2=MaxY;
 while ((Blue_y(PY2,1)>=5)&&(PY2<y))
        PY2=PY2 1;
 end
 IY=I(PY1:PY2,:,:);
 %%%%%% X方向 %%%%%%%%%
 Blue_x=zeros(1,x);%进一步确定x方向的车牌区域
 for j=1:x
     for i=PY1:PY2
            if(myI(i,j,1)==1)
                Blue_x(1,j)= Blue_x(1,j) 1;               
            end  
     end       
 end
  
 PX1=1;
 while ((Blue_x(1,PX1)<3)&&(PX1<x))
       PX1=PX1 1;
 end    
 PX2=x;
 while ((Blue_x(1,PX2)<3)&&(PX2>PX1))
        PX2=PX2-1;
 end
 PX1=PX1-1;%对车牌区域的校正
 PX2=PX2 1;
 dw=I(PY1:PY2-6,PX1:PX2,:);
 t=toc; 
figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域');
figure(7),subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像')
imwrite(dw,'dw.jpg');
[filename,filepath]=uigetfile('dw.jpg','输入一个定位裁剪后的车牌图像');
jpg=strcat(filepath,filename);
a=imread('dw.jpg');
b1=rgb2gray(a);
b2=wiener2(b1,[5,5]);
b3=edge(b2,'sobel','horizontal');
b3=imcrop(b3,[0 0 500 100]);
theta=0:179;
r=radon(b3,theta);
[m,n]=size(r);
c=1;
for i=1:m
    for j=1:n
        if r(1,1)<r(i,j)
            r(1,1)=r(i,j);
            c=j;
        end
    end
end
rot=90-c;
b4=imrotate(b2,rot,'crop');
figure,
subplot(2,2,1),imshow(b1),title('原车牌图像的灰度图像');
subplot(2,2,2),imshow(b2),title('预处理后的车牌图像');
subplot(2,2,3),imshow(b3),title('边缘检测后的车牌图像');
subplot(2,2,4),imshow(b4),title('校正后的车牌图像');
se=strel('disk',12);
background=imopen(b4,se);
figure(9),subplot(2,1,1),imshow(background);title('灰度车牌图像的背景图');
Ig=imsubtract(b4,background);
figure(9),subplot(2,1,2),imshow(Ig);title('图像减法运算后');
level=graythresh(Ig);
Ib=im2bw(Ig,level);
figure,imshow(Ib),title('二值化后的图像');
Ib=bwareaopen(Ib,100);
figure,imshow(Ib),title('去除字符噪声后');
[x,y]=size(Ib);
rect=[round(y/3),1,round(y/3),x];
Iz=imcrop(Ib,rect);
H=sum(Iz,2);%行求和
Hi=find(H>0);%返回所需元素所在位置
h0=round(x/2);
hi=find(Hi==h0);
for i=hi:-1:2;
    f=Hi(i)-Hi(i-1);
    if(i==2&&f==1)
        h1=Hi(i-1);
    elseif(f~=1)
        h1=Hi(i);
        break;
    end
end
Hl=length(Hi);%数组长度
for i=hi:1:Hl-1
    f=Hi(i 1)-Hi(i);
    if(i==Hl-1&&f==1)
        h2=Hi(Hl);
    elseif(f~=1)
        h2=Hi(i);
        break;
    end
end
d=Ib(h1:h2,:);
figure,imshow(d);title('去除边框后');

d=qiege(d);
[m,n]=size(d);
figure,subplot(2,1,1),imshow(d),title(n)
k1=1;k2=1;s=sum(d);j=1;
while j~=n
    while s(j)==0
        j=j 1;
    end
    k1=j;
    while s(j)~=0 && j<=n-1
        j=j 1;
    end
    k2=j-1;
    if k2-k1>=round(n/6.5)
        [val,num]=min(sum(d(:,[k1 5:k2-5])));
        d(:,k1 num 5)=0;  % 分割
    end
end
% 再切割
d=qiege(d);
% 切割出 7 个字符
y1=10;y2=0.25;flag=0;word1=[];
while flag==0
    [m,n]=size(d);
    left=1;wide=0;
    while sum(d(:,wide 1))~=0
        wide=wide 1;
    end
    if wide<y1   % 认为是左侧干扰
        d(:,[1:wide])=0;
        d=qiege(d);
    else
        temp=qiege(imcrop(d,[1 1 wide m]));
        [m,n]=size(temp);
        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;   % WORD 1
        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);
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');
subplot(5,7,16),imshow(word2),title('2');
subplot(5,7,17),imshow(word3),title('3');
subplot(5,7,18),imshow(word4),title('4');
subplot(5,7,19),imshow(word5),title('5');
subplot(5,7,20),imshow(word6),title('6');
subplot(5,7,21),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');
liccode=char(['0':'9' 'A':'Z' '鲁陕苏渝']);  %建立自动识别字符代码表  
SubBw2=zeros(32,16);
 l=1;
 for I=1:7
      SubBw2=zeros(32,16);
       ii=int2str(I);
       t=imread([ii '.jpg']);
       SegBw2=imresize(t,[32 16],'nearest');
       SegBw2=double(SegBw2)>20;
         if l==1                 %第一位汉字识别
            kmin=37;
             kmax=40;
         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),'.bmp');
             SamBw2 = imread(fname);
             SamBw2=double(SamBw2)>1;
             for  i=1:32
                 for j=1:16
                     SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);
                 end
             end
            % 以上相当于两幅图相减得到第三幅图
            Dmax=0;
             for k1=1:32
                 for l1=1:16
                     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,imshow(dw),title (['车牌号码:', Code],'Color','b');


标签: 识别 MATLAB 车牌

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警