MATLAB 车牌识别的简单程序
I=imread('D:\imgformat\img1.jpg');
[y,x,z]=size(I);
myI=double(I);
%%%%%%%% Y 方向 %%%%%%%%%%
Blue_y=zeros(y,1);
for i=1:y
for j=1:x
if((myI(i,j,1)<=60)&&((myI(i,j,2)<=100)&&(myI(i,j,2)>=10))&&((myI(i,j,3)<=142)&&(myI(i,j,3)>=75)))
% 蓝色RGB的灰度范围
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)<=35)&&((myI(i,j,2)<=100)&&(myI(i,j,2)>=10))&&((myI(i,j,3)<=142)&&(myI(i,j,3)>=75)))
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-2; % 对车牌区域的修正
PX2=PX2+2;
Plate=I(PY1:PY2,PX1-2:PX2,:);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure,imshow(I);title('原始图像')
figure,plot(Blue_y);grid;title('Y方向蓝色像素点统计')
figure,plot(Blue_x);grid;title('X方向蓝色像素点统计')
figure,imshow(IY);
figure,imshow(Plate);title('车牌截取结果')
Cgray=rgb2gray(Plate);%rgb2gray转换成灰度图像
s=strel('disk',25); %strei函数
Bgray=imopen(Cgray,s);%打开Cgray图像
Egray=imsubtract(Cgray,Bgray);%两幅图相减
figure,imshow(Egray)
fmax1=double(max(max(Egray)));
fmin1=double(min(min(Egray)));
level=(fmax1-(fmax1-fmin1)/2)/255;
bw22=im2bw(Egray,level);%转换为二值图像
figure,imshow(bw22);title('二值化后的车牌图像')
[H,L]=size(bw22);
K=zeros(L);
M=zeros(30);
now=1;
flag=1;
for x=1:L
for y=1:H
K(x)=bw22(y,x)+K(x);
end
end
figure,plot(K),title('未处理的图像')
evge=0;
for i=1:L
evge=evge+K(i);
end
evge=5;
for i=1:L
if K(i)<=evge
K(i)=0;
end
end
figure,plot(K),title('阈值处理之后的图像')
for i=1:L-1
if K(i)==0 && K(i+1)~=0 && flag==1
M(now)=i;
now=now+1;
flag=0;
end
if K(i)~=0 && K(i+1)==0 && flag==0
M(now)=i;
now=now+1;
flag=1;
end
end
Len=now;
for i=1:2:Len-2
Plat=bw22(:,M(i):M(i+1));
subplot(1,Len-2,i),imshow(Plat)
end
k=[];
j=1;
for i=3:2:Len-2
Plat=bw22(:,M(i):M(i+1));
s=code(Plat);
k(j)=s;
j=j+1;
end
sprintf('车牌是:%s',string(k))
子程序:
function co=code(H)
M2=imread('D:\imgformat\resimg\M2.jpg');
M3=imread('D:\imgformat\resimg\M3.jpg');
M4=imread('D:\imgformat\resimg\M4.jpg');
[m n]=size(H);
M2=double(M2);
M2=im2bw(M2);
M2=imresize(M2,[m n]);
M3=double(M3);
M3=im2bw(M3);
M3=imresize(M3,[m n]);
M4=double(M4);
M4=im2bw(M4);
M4=imresize(M4,[m n]);
d=zeros(3);
d(1)=corr2(H,M2);
d(2)=corr2(H,M3);
d(3)=corr2(H,M4);
[D,e]=max(d(:));
switch e
case 1
c='A';
case 2
c='4';
case 3
c='B';
otherwise
end
co=c;
[y,x,z]=size(I);
myI=double(I);
%%%%%%%% Y 方向 %%%%%%%%%%
Blue_y=zeros(y,1);
for i=1:y
for j=1:x
if((myI(i,j,1)<=60)&&((myI(i,j,2)<=100)&&(myI(i,j,2)>=10))&&((myI(i,j,3)<=142)&&(myI(i,j,3)>=75)))
% 蓝色RGB的灰度范围
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)<=35)&&((myI(i,j,2)<=100)&&(myI(i,j,2)>=10))&&((myI(i,j,3)<=142)&&(myI(i,j,3)>=75)))
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-2; % 对车牌区域的修正
PX2=PX2+2;
Plate=I(PY1:PY2,PX1-2:PX2,:);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure,imshow(I);title('原始图像')
figure,plot(Blue_y);grid;title('Y方向蓝色像素点统计')
figure,plot(Blue_x);grid;title('X方向蓝色像素点统计')
figure,imshow(IY);
figure,imshow(Plate);title('车牌截取结果')
Cgray=rgb2gray(Plate);%rgb2gray转换成灰度图像
s=strel('disk',25); %strei函数
Bgray=imopen(Cgray,s);%打开Cgray图像
Egray=imsubtract(Cgray,Bgray);%两幅图相减
figure,imshow(Egray)
fmax1=double(max(max(Egray)));
fmin1=double(min(min(Egray)));
level=(fmax1-(fmax1-fmin1)/2)/255;
bw22=im2bw(Egray,level);%转换为二值图像
figure,imshow(bw22);title('二值化后的车牌图像')
[H,L]=size(bw22);
K=zeros(L);
M=zeros(30);
now=1;
flag=1;
for x=1:L
for y=1:H
K(x)=bw22(y,x)+K(x);
end
end
figure,plot(K),title('未处理的图像')
evge=0;
for i=1:L
evge=evge+K(i);
end
evge=5;
for i=1:L
if K(i)<=evge
K(i)=0;
end
end
figure,plot(K),title('阈值处理之后的图像')
for i=1:L-1
if K(i)==0 && K(i+1)~=0 && flag==1
M(now)=i;
now=now+1;
flag=0;
end
if K(i)~=0 && K(i+1)==0 && flag==0
M(now)=i;
now=now+1;
flag=1;
end
end
Len=now;
for i=1:2:Len-2
Plat=bw22(:,M(i):M(i+1));
subplot(1,Len-2,i),imshow(Plat)
end
k=[];
j=1;
for i=3:2:Len-2
Plat=bw22(:,M(i):M(i+1));
s=code(Plat);
k(j)=s;
j=j+1;
end
sprintf('车牌是:%s',string(k))
子程序:
function co=code(H)
M2=imread('D:\imgformat\resimg\M2.jpg');
M3=imread('D:\imgformat\resimg\M3.jpg');
M4=imread('D:\imgformat\resimg\M4.jpg');
[m n]=size(H);
M2=double(M2);
M2=im2bw(M2);
M2=imresize(M2,[m n]);
M3=double(M3);
M3=im2bw(M3);
M3=imresize(M3,[m n]);
M4=double(M4);
M4=im2bw(M4);
M4=imresize(M4,[m n]);
d=zeros(3);
d(1)=corr2(H,M2);
d(2)=corr2(H,M3);
d(3)=corr2(H,M4);
[D,e]=max(d(:));
switch e
case 1
c='A';
case 2
c='4';
case 3
c='B';
otherwise
end
co=c;
最新评论