您好,欢迎访问三七文档
k=input(‘Enterthefilename:,''s’);%输入车牌照片pic=imread(k);imshow(pic);pic_gray=rgb2gray(pic);pic_gray=medfilt2(pic_gray,[3,3]);%对灰度图像进行中值滤波Image=im2bw(pic_gray,0.2);BW=edge(pic_gray,‘sobel’);%找出图像的边缘[imx,imy]=size(BW);%计算图像大小msk=[00000;01110;01110;01110;00000;];B0=conv2(double(BW),double(msk));%对边缘区域进行加强se=ones(2,80);B1=imdilate(B0,se);%figure;%imshow(B1);B2=imerode(B1,se);se=ones(20,2);B3=imdilate(B2,se);B4=imerode(B3,se);se=ones(50,2);B5=imdilate(B4,se);B6=imerode(B5,se);[B,L]=bwboundaries(B6,4);%对边界图进行小区域联通,是车牌区域连通为一个方块imshow(label2rgb(L,@jet,[.5.5.5]))%对连通区域进行标记holdonfork=1:length(B)boundary=B{k};plot(boundary(:,2),boundary(:,1),'w','LineWidth',2)endfork=1:length(B)%循环遍历每个连通域的边界boundary=B{k};%获取一条边界上的所有点delta_sq=diff(boundary).^2;perimeter=sum(sqrt(sum(delta_sq,2)));%计算边界周长area=stats(k).Area;%获取边界所围面积metric=27*area/perimeter^2;%计算匹配度metric_string=sprintf('%2.2f',metric);%要显示的匹配度字串endifmetric=0.85&&metric=1.15&&area1000%截取出匹配度接近1且面积大于1000像素的连通域centroid=stats(k).Centroid;plot(centroid(1),centroid(2),'ko');%提取该连通域所对应在二值图像中的矩形区域goalboundary=boundary;s=min(goalboundary,[],1);e=max(goalboundary,[],1);goal=imcrop(Image,[s(2)s(1)e(2)-s(2)e(1)-s(1)]);endtext(boundray(1,2)-35,boundray(1,1)+13,metric_string,'Color','g','FontSize',14,'FontWeight','bold');%显示匹配度字串endgoal=~goal;%对截取图像进行反色处理figure;imshow(goal);[a,b]=size(goal);fori=a/2:-1:1%从图像水平轴开始向上扫描,当白点数少于每行点总数的1/10时,停止扫描,并将该行定义为车牌字符区域的上限num=0;forj=1:bifgoal(i,j)==1num=num+1;endendifnum(b*0.1)line_up=i;break;endendfori=a/2:a%从图像水平中轴开始向下扫描,当白点数少于每行点总数的1/10时,停止扫描,并将该行定义为车牌字符区域的下限num=0;forj=1:bifgoal(i,j)==1num=num+1;endendifnum(b*0.1)line_down=i;break;endendgoal=goal(line_up:line_down,1:b);%根据之前定义的上下限截取车牌字符区域figure;imshow(goal);%显示车牌字符区域[a,b]=size(goal);row=zeros(18);now=1;flag=0;forj=1:b%对截取出的字符区域进行列竖扫描,并且取每列总点数的十分之一作为阀值点,当每列的白点数从阀值以上掉落到阀值以下或从阀值以下上升到阀值以上时,记录该列的横坐标num=0;fori=1:aifgoal(i,j)==1num=num+1;endendifflag==0ifnum(a*0.1)row(now)=j;now=now+1;flag=1;endelseifnum(a*0.1)row(now)=j;now=now+1;flag=0;endendendifrow(3)-row(2)10%判断扫描出的第二块区域(扫描到的第二列与第三列之间)是否包含有效字符,如包含,则将扫描到的第二列定义为字符分割的起始列;否则,则定义第一列为起始列now=2;elsenow=1;endfigure;11=0;12=0;fork=1:8m=row(now);m=row(now+1);temp=goal(1:a,m:n);point=0;%扫描每个字符图片的白点数fori=1:aforj=1:n-miftemo(i,j)==1point=point+1;endendendifpoint0.4*a*(n-m)&&nm%当扫描到的白点数小于总点数的5分之二是放弃输出(有可能是车牌上的点状分割符)12=12+1;%用来记录识别出的字符数subplot(1,7,12);x(k)=code(temp);%调用子程序进行字符扫描,并返回字符的ASCII码x(k)=uint8(x(k));ifx(k)0%当所选区域不为空时进行输出11=11+1;%用来记录输出的字符数s(11)=char(x(k));endtemp(32,32)=0;imshow(temp);endnow=now+2;endy=char(s);%将得到的ASCII码重新转换为字符并在屏幕上输出fprintf('该车辆的车牌号为:')disp(y);fprintf('输出的字符数为:%4d\r\n',11)fprintf('识别出的字符数为:%4d\r\n',12)
本文标题:车牌识别系统源代码
链接地址:https://www.777doc.com/doc-6496874 .html