实例介绍
【实例简介】
【实例截图】
【核心代码】
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');
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论