车牌识别系统源代码

k=input(‘Enter the file name:,''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=[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);
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]))%对连通区域进行标记
hold on
for k=1:length(B)
boundary=B{k};
plot(boundary(:,2),boundary(:,1),'w','LineWidth',2)
end
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);%要显示的匹配度字串
end
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(boundray(1,2)-35,boundray(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 %对截取出的字符区域进行列竖扫描,并且取每列总点数的十分之一作为阀值点,当每列的白点数从阀值以上掉落到阀值以下或从阀值以下上升到阀

值以上时,记录该列的横坐标
num=0;
for i=1:a
if goal(i,j)==1
num=num+1;
end
end
if flag==0
if num<(a*0.1)
row(now)=j;
now=now+1;
flag=1;
end
else
if num>(a*0.1)
row(now)=j;
now=now+1;
flag=0;
end
end
end

if row(3)-row(2)>10%判断扫描出的第二块区域(扫描到的第二列与第三列之间)是否包含有效字符,如包含,则将扫描到的第二列定义为字符分割的起始列;否则,则定义第一列为起始列
now=2;
else
now=1;
end
figure;
11=0;
12=0;
for k=1:8
m=row(now);
m=row(now+1);
temp=goal(1:a,m:n);
point=0;%扫描每个字符图片的白点数
for i=1:a
for j=1:n-m
if temo(i,j)==1
point= point+1;
end
end
end
if point>0.4*a*(n-m)&&n>m %当扫描到的白点数小于总点数的5分之二是放弃输出(有可能是车牌上的点状分割符)
12=12+1;% 用来记录识别出的字符数
subplot(1,7,12);
x(k)=code(temp);%调用子程序进行字符扫描,并返回字符的ASCII码
x(k)=uint8(x(k));
if x(k)>0 %当所选区域不为空时进行输出
11=11+1;% 用来记录输出的字符数
s(11)=char(x(k));
end
temp(32,32)=0;
imshow(temp);
end
now=now+2;
end
y=char(s);%将得到的ASCII码重新转换为字符并在屏幕上输出
fprintf('该车辆的车牌号为:')
disp(y);
fprintf('输出的字符数为: %4d\r\n',11)
fprintf('识别出的字符数为: %4d\r\n',12)







































































































相关主题
相关文档
最新文档