基于MATLAB的车牌识别系统的源代码(可以实现)

  • 格式:doc
  • 大小:22.00 KB
  • 文档页数:4

下载文档原格式

  / 12
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

k=input('Enter the file name:','s');%输入车牌照片

im=imread(k);

imshow(im);

im_gray=rgb2gray(im);

im_gray=medfilt2(im_gray,[3,3]);%对图像进行中值滤波

Image=im2bw(im_gray,0.2);

BW=edge(im_gray,'sobel');%找出图像边缘

[imx,imy]=size(BW);%计算图像大小

msk=[0 0 0 0 0;

0 1 1 1 0;

0 1 1 1 0;

0 1 1 1 0;

0 0 0 0 0;];

B0=conv2(double(BW),double(msk));%对边缘区域进行加强

se=ones(2,80);

B1=imdilate(B0,se);

%figure;%imshow(B1);

B2=imerode(B1,se);

%figure;%imshow(B2);

se=ones(20,2);

B3=imdilate(B2,se);

%figure;imshow(B3);

B4=imerode(B3,se);

%figure;imshow(B4);

se=ones(50,2);

B5=imdilate(B4,se);

%figure;imshow(B5);

B6=imerode(B5,se);

%figure;imshow(B6);%对边界图进行小区域连通,使车牌区域连通为一个方块[B,L]=bwboundaries(B6,4);

imshow(label2rgb(L,@jet,[.5 .5 .5]))%对连通区域进行标记

hold on

for k=1:length(B)%用线条给连通区域标上边界线

boundary=B{k};

plot(boundary(:,2),boundary(:,1),'w','LineWidth',2)

end

stats=regionprops(L,'Area','Centroid');%找到每个连通域的质心

for k=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);%要显示的匹配度字串

if metric>=0.85&&metric<=1.15&&area>1000%截取出匹配度接近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)]);

end

text(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','g','FontSize',14,'FontWeight','bold') ;%显示匹配度字串

end

goal=~goal;%对截取图像进行反色处理

figure;imshow(goal);

[a,b]=size(goal);

for i=a/2:-1:1 %从图像水平中轴开始向上扫描,当白点数少于每行总点数的1/10时,停止扫描,并将该行定义为车牌字符区域的上限

num=0;

for j=1:b

if goal(i,j)==1

num=num+1;

end

end

if num<(b*0.1)

line_up=i;

break;

end

end

for i=a/2:a %从图像水平中轴开始向下扫描,当白点数少于每行总点数的1/10时,停止扫描,并将该行定义为车牌字符区域的下限

num=0;

for j=1:b

if goal(i,j)==1

num=num+1;

end

end

if num<(b*0.1)

line_down=i;

break;

end

end

goal=goal(line_up:line_down,1:b);%根据之前定义的上下限截取车牌字符区域

figure;imshow(goal);%显示车牌字符区域

[a,b]=size(goal);

row=zeros(18);

now=1;

flag=0;

for j=1:b %对截取出的字符区域进行竖列扫描,并取每列总点数的1/10作为阈值点,当每列的白点数从阈值以上掉落到阈值以下或从阈值以下上升到阈值以上时,记录该列的横坐标num=0;

for i=1:a

if goal(i,j)==1

num=num+1;

end

end

if flag==0

if num<0.1*a

row(now)=j;

now=now+1;

flag=1;

end

else

if num>0.1*a

row(now)=j;

now=now+1;

flag=0;

end

end

end

if row(3)-row(2)>10 %判断扫描出的第二块区域(扫描到的第二列与第三列之间)是否包含有效字符,如包含,则将扫描到的第二列定义为字符分割的起始列;否则,则定义第一列为起始列

now=2;

else

now=1;

end

figure;

l1=0;

l2=0;

for k=1:8

m=row(now);

n=row(now+1);

temp=goal(1:a,m:n);

point=0;%扫描每一个字符图片的白点数

for i=1:a

for j=1:n-m

if temp(i,j)==1