车牌识别MATLAB代码.docx

上传人:b****6 文档编号:7237115 上传时间:2023-01-22 格式:DOCX 页数:12 大小:17.75KB
下载 相关 举报
车牌识别MATLAB代码.docx_第1页
第1页 / 共12页
车牌识别MATLAB代码.docx_第2页
第2页 / 共12页
车牌识别MATLAB代码.docx_第3页
第3页 / 共12页
车牌识别MATLAB代码.docx_第4页
第4页 / 共12页
车牌识别MATLAB代码.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

车牌识别MATLAB代码.docx

《车牌识别MATLAB代码.docx》由会员分享,可在线阅读,更多相关《车牌识别MATLAB代码.docx(12页珍藏版)》请在冰豆网上搜索。

车牌识别MATLAB代码.docx

车牌识别MATLAB代码

clear;

closeall;

%Step1获取图像装入待处理彩色图像并显示原始图像

Scolor=imread('C:

\Users\lenovo\Desktop\程序\chepai\l2.jpg');

%将彩色图像转换为黑白并显示

Sgray=rgb2gray(Scolor);

figure,imshow(Scolor),title('原始彩色图像');

figure,imshow(Sgray),title('原始灰度图像');

%bw3=medfilt2(Sgray,[55]);

%figure,imshow(bw3);title('图像中值滤波');

%bw4=imfilter(bw3,fspecial('laplacian'));

%figure,imshow(bw4);title('图像中值滤波');

%Egray=imsubtract(bw3,bw4);

%figure,imshow(Egray);

%Step2图像预处理对Sgray原始黑白图像进行开操作得到图像背景

s=strel('disk',10);

Bgray=imopen(Sgray,s);

figure,imshow(Bgray);title('背景图像');

%用原始图像与背景图像作减法,增强图像

Egray=imsubtract(Sgray,Bgray);

figure,imshow(Egray);title('增强黑白图像');

%Step3取得最佳阈值,将图像二值化

%fmax1=double(max(max(Egray)));

%fmin1=double(min(min(Egray)));

%level=(fmax1-(fmax1-fmin1)/3)/255;

%

level=graythresh(Egray);

%

%bw3=filter2(fspecial('average',3),Egray);

%

%Egray=medfilt2(Egray,[33]);

%figure,imshow(Egray);title('图像中值滤波');

bw2=im2bw(Egray,level);

figure,imshow(bw2);title('图像二值化');

%bw4=im2bw(bw3,level);

%figure,imshow(bw4);title('图像二值化');

 

%Step4对得到二值图像作开闭操作进行滤波

grd=edge(bw2,'canny');

figure,imshow(grd);title('图像边缘提取');

%

bg1=imclose(grd,strel('rectangle',[5,19]));

%

figure,imshow(bg1);title('图像闭运算[5,19]');

bg2=bwareaopen(bg1,2000);

figure,imshow(bg2);title('小对象');

bg2=imclose(bg2,strel('rectangle',[20,50]));

%bg3=imclose(bg2,strel('rectangle',[20,50]));

bg2=imopen(bg2,strel('rectangle',[5,20]));

figure,imshow(bg2);title('图像开运算[5,19]');

bg2=imopen(bg2,strel('rectangle',[19,1]));

figure,imshow(bg2);title('图像开运算[19,1]');

%Step5对二值图像进行区域提取,并计算区域特征参数。

进行区域特征参数比较,提取车牌区域

[L,num]=bwlabel(bg2,8);

Feastats=regionprops(L,'basic');

Area=[Feastats.Area];

BoundingBox=[Feastats.BoundingBox];%[xywidthheight]

RGB=label2rgb(L,'spring','k','shuffle');

figure,imshow(RGB);title('图像彩色标记');

lx=0;

%Getok=zeros(1,5);

forl=1:

num

width=BoundingBox((l-1)*4+3);

hight=BoundingBox((l-1)*4+4);

if(width>250&&width<500&&hight>70&&hight<150)

lx=lx+1;

Getok(lx)=l;

end

end

fork=1:

lx

l=Getok(k);

startcol=BoundingBox((l-1)*4+1);%开始列

startrow=BoundingBox((l-1)*4+2);%开始行

width=BoundingBox((l-1)*4+3);%车牌宽

hight=BoundingBox((l-1)*4+4);%车牌高

rato=width/hight;%计算车牌长宽比

ifrato>2&&rato<4

break;

end

end

sbw1=bw2(startrow:

startrow+hight,startcol:

startcol+width-1);%获取车牌二值子图

subcol1=Sgray(startrow:

startrow+hight,startcol:

startcol+width-1);%获取车牌灰度子图

figure,subplot(2,1,1),imshow(subcol1);title('车牌灰度子图');

subplot(2,1,2),imshow(sbw1);title('车牌二值子图');

 

%Step6计算车牌水平投影,并对水平投影进行峰谷分析

histcol1=sum(sbw1);%计算垂直投影

histrow=sum(sbw1');%计算水平投影

figure,subplot(2,1,1),bar(histcol1);title('垂直投影(含边框)');

subplot(2,1,2),bar(histrow);title('水平投影(含边框)');

figure,subplot(2,1,1),bar(histrow);title('水平投影(含边框)');

subplot(2,1,2),imshow(sbw1);title('车牌二值子图');

%对水平投影进行峰谷分析

meanrow=mean(histrow);

minrow=min(histrow);

levelrow=(meanrow+minrow)/2;

count1=0;

l=1;

%globalmarkrow;

fork=1:

hight

ifhistrow(k)<=levelrow

count1=count1+1;

else

ifcount1>=1

markrow(l)=k;%上升点

markrow1(l)=count1;%谷宽度(下降点至下一个上升点)

l=l+1;

end

count1=0;

end

end

markrow2=diff(markrow);%峰距离(上升点至下一个上升点)

[m1,n1]=size(markrow2);

n1=n1+1;

markrow(l)=hight;

markrow1(l)=count1;

markrow2(n1)=markrow(l)-markrow(l-1);

l=0;

fork=1:

n1

markrow3(k)=markrow(k+1)-markrow1(k+1);%下降点

markrow4(k)=markrow3(k)-markrow(k);%峰宽度(上升点至下降点)

markrow5(k)=markrow3(k)-double(uint16(markrow4(k)/2));%峰中心位置

end

 

%Step7计算车牌旋转角度

%

(1)在上升点至下降点找第一个为1的点

[m2,n2]=size(sbw1);

[m1,n1]=size(markrow4);

maxw=max(markrow4);%最大宽度为字符

ifmarkrow4

(1)~=maxw%检测上边

ysite=1;

k1=1;

forl=1:

n2

fork=1:

markrow3(ysite)%从顶边至第一个峰下降点扫描

ifsbw1(k,l)==1

xdata(k1)=l;

ydata(k1)=k;

k1=k1+1;

break;

end

end

end

else%检测下边

ysite=n1;

ifmarkrow4(n1)==0

ifmarkrow4(n1-1)==maxw

ysite=0;%无下边

else

ysite=n1-1;

end

end

ifysite~=0

k1=1;

forl=1:

n2

k=m2;

whilek>=markrow(ysite)%从底边至最后一个峰的上升点扫描

ifsbw1(k,l)==1

xdata(k1)=l;

ydata(k1)=k;

k1=k1+1;

break;

end

k=k-1;

end

end

end

end

%

(2)线性拟合,计算与x夹角

fresult=fit(xdata',ydata','poly1');%poly1Y=p1*x+p2

p1=fresult.p1;

angle=atan(fresult.p1)*180/pi;%弧度换为度,360/2pi,pi=3.14

%(3)旋转车牌图象

subcol=imrotate(subcol1,angle,'bilinear','crop');%旋转车牌图象

sbw=imrotate(sbw1,angle,'bilinear','crop');

figure,subplot(2,1,1),imshow(subcol);title('车牌灰度子图');

subplot(2,1,2),imshow(sbw);title('');

title(['车牌旋转角:

',num2str(angle),'度'],'Color','r');

%Step8旋转车牌后重新计算车牌水平投影,去掉车牌水平边框,获取字符高度

histcol1=sum(sbw);%计算垂直投影

histrow=sum(sbw');%计算水平投影

figure,subplot(2,1,1),bar(histcol1);title('垂直投影(旋转后)');

subplot(2,1,2),bar(histrow);title('水平投影(旋转后)');

figure,subplot(2,1,1),bar(histrow);title('水平投影(旋转后)');

subplot(2,1,2),imshow(sbw);title('车牌二值子图(旋转后)');

%对水平投影进行峰谷分析

clearmarkrow,markrow1,markrow2,markrow3,markrow4,markrow5

meanrow=mean(histrow);

minrow=min(histrow);

levelrow=(meanrow+minrow)/2;

count1=0;

l=1;

fork=1:

hight

ifhistrow(k)<=levelrow

count1=count1+1;

else

ifcount1>=1

markrow(l)=k;%上升点

markrow1(l)=count1;%谷宽度(下降点至下一个上升点)

l=l+1;

end

count1=0;

end

end

markrow2=diff(markrow);%峰距离(上升点至下一个上升点)

[m1,n1]=size(markrow2);

n1=n1+1;

markrow(l)=hight;

markrow1(l)=count1;

markrow2(n1)=markrow(l)-markrow(l-1);

l=0;

fork=1:

n1

markrow3(k)=markrow(k+1)-markrow1(k+1);%下降点

markrow4(k)=markrow3(k)-markrow(k);%峰宽度(上升点至下降点)

markrow5(k)=markrow3(k)-double(uint16(markrow4(k)/2));%峰中心位置

end

%去水平(上下)边框,获取字符高度

maxhight=max(markrow2);

findc=find(markrow2==maxhight);

rowtop=markrow(findc);

rowbot=markrow(findc+1)-markrow1(findc+1);

sbw2=sbw(rowtop:

rowbot,:

);%子图为(rowbot-rowtop+1)行

maxhight=rowbot-rowtop+1;%字符高度(rowbot-rowtop+1)

 

%Step9计算车牌垂直投影,去掉车牌垂直边框,获取车牌及字符平均宽度

histcol=sum(sbw2);%计算垂直投影

figure,subplot(2,1,1),bar(histcol);title('垂直投影(去水平边框后)');

subplot(2,1,2),imshow(sbw2);

title(['车牌字符高度:

',int2str(maxhight)],'Color','r');

%对垂直投影进行峰谷分析

meancol=mean(histcol);

mincol=min(histcol);

levelcol=(meancol+mincol)/4;

count1=0;

l=1;

fork=1:

width

ifhistcol(k)<=levelcol

count1=count1+1;

else

ifcount1>=1

markcol(l)=k;%字符上升点

markcol1(l)=count1;%谷宽度(下降点至下一个上升点)

l=l+1;

end

count1=0;

end

end

markcol2=diff(markcol);%字符距离(上升点至下一个上升点)

[m1,n1]=size(markcol2);

n1=n1+1;

markcol(l)=width;

markcol1(l)=count1;

markcol2(n1)=markcol(l)-markcol(l-1);

 

%Step10计算车牌上每个字符中心位置,计算最大字符宽度maxwidth

l=0;

fork=1:

n1

markcol3(k)=markcol(k+1)-markcol1(k+1);%字符下降点

markcol4(k)=markcol3(k)-markcol(k);%字符宽度(上升点至下降点)

markcol5(k)=markcol3(k)-double(uint16(markcol4(k)/2));%字符中心位置

end

markcol6=diff(markcol5);%字符中心距离(字符中心点至下一个字符中心点)

maxs=max(markcol6);%查找最大值,即为第二字符与第三字符中心距离

findmax=find(markcol6==maxs);

markcol6(findmax)=0;

maxwidth=max(markcol6);%查找最大值,即为最大字符宽度

 

%Step11提取分割字符,并变换为40行*20列标准子图

l=1;

[m2,n2]=size(sbw2);%subcol换为sbw2

figure;

fork=findmax-1:

findmax+5

cleft=markcol5(k)-maxwidth/2;

cright=markcol5(k)+maxwidth/2-2;

ifcleft<1

cleft=1;

cright=maxwidth;

end

ifcright>n2

cright=n2;

cleft=n2-maxwidth;

end

SegGray=subcol(rowtop:

rowbot,cleft+2:

cright);

SegBw1=sbw(rowtop:

rowbot,cleft+2:

cright);

SegBw2=imresize(SegBw1,[4020]);%变换为40行*20列标准子图

subplot(2,n1,l),imshow(SegGray);

ifl==7

title(['车牌字符宽度:

',int2str(maxwidth)],'Color','r');

end

subplot(2,n1,n1+l),imshow(SegBw2);

%fname=strcat('G:

\Matlab\lib\S',Filename,int2str(k),'.bmp');%保存子图备选入样本库,并建立样本库

fname=strcat(int2str(k),'.BMP');

imwrite(SegBw2,fname);

l=l+1;

end

 

%Step12将计算计算获取的字符图像与样本库进行匹配,自动识别出字符代码。

%在进行匹配前需将存入的子图名按以下编码规则更改:

%Sam0~Sam90~9数字1~10

%SamA~SamZA~Z字母11~36

%Sam粤~Sam沪省别汉字37~45

liccode=char(['0':

'9''A':

'Z''苏豫陕鲁']);%建立自动识别字符代码表

l=1;

[m2,n2]=size(sbw2);

fork=findmax-1:

findmax+5

cleft=markcol5(k)-maxwidth/2;

cright=markcol5(k)+maxwidth/2-2;

ifcleft<1

cleft=1;

cright=maxwidth;

end

ifcright>n2

cright=n2;

cleft=n2-maxwidth;

end

SegBw1=sbw(rowtop:

rowbot,cleft+2:

cright);

SegBw2=imresize(SegBw1,[4020],'bilinear');%变换为32行*16列标准子图

ifl==1%第一位汉字识别

kmin=37;

kmax=40;

elseifl==2%第二位A~Z字母识别

kmin=11;

kmax=36;

elsel>=3%第三位以后是字母或数字识别

kmin=1;

kmax=36;

end

fork2=kmin:

kmax

fname=strcat('字符模板2\',liccode(k2),'.bmp');

SamBw2=imread(fname);

%SamBw2=im2bw(SamBw2);

SubBw2=SamBw2-SegBw2;

Dmax=0;

fork1=1:

40

forl1=1:

20

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);

RegCode(l*2-1)=liccode(findc

(1)+kmin-1);

RegCode(l*2)='';

l=l+1;

end

title(['识别车牌号码:

',RegCode],'Color','r');

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1