实例介绍
【实例简介】
【实例截图】
【核心代码】
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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论