基于MATLAB的车牌识别系统的源代码(可以实现)
- 格式:doc
- 大小:22.00 KB
- 文档页数:4
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