数字图像处理-汽车牌照自动识别要点
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字图象处理
题目:汽车牌照自动识别
学院:计算机科学与信息学院专业:_______网络工程_______
目录
1 实验目的 (1)
2 实验原理和方法 (1)
3 实验内容和步骤 (1)
3.1 牌照定位 (1)
3.2 牌照字符分割 (2)
3.3 牌照字符识别 (2)
4 实验数据 (2)
4.1 源程序 (2)
4.2 运行结果 (7)
4.2.1 牌照定位 (7)
4.2.2 牌照字符分割 (9)
4.2.2 牌照字符识别 (10)
1 实验目的
1.分析汽车牌照的特点,正确获取整个图像中车牌的区域,并识别出车牌号。
2.将图像预处理、分割、分析等关键技术结合起来,理论与实践相结合,提高图像处理关键技术的综合应用能力。
2 实验原理和方法
牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。
其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。
某些牌照识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。
一个完整的牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。
当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。
牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。
3 实验内容和步骤
为了进行牌照识别,需要以下几个基本的步骤:
a.牌照定位,定位图片中的牌照位置;
b.牌照字符分割,把牌照中的字符分割出来;
c.牌照字符识别,把分割好的字符进行识别,最终组成牌照号码。
3.1 牌照定位
自然环境下,汽车图像背景复杂、光照不均匀,如何在自然背景中准确地确定牌照区域是整个识别过程的关键。
首先对采集到的视频图像进行大范围相关搜索,找到符合汽车牌照特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳的区域作为牌照区域,并将其从图象中分割出来。
流程图如下:
3.2 牌照字符分割
完成牌照区域的定位后,再将牌照区域分割成单个字符,然后进行识别。
字符分割一般采用垂直投影法。
由于字符在垂直方向上的投影必然在字符间或字符内的间隙处取得局部最小值的附近,并且这个位置应满足牌照的字符书写格式、字符、尺寸限制和一些其他条件。
利用垂直投影法对复杂环境下的汽车图像中的字符分割有较好的效果。
流程图如下:
3.3 牌照字符识别
字符识别方法目前主要有基于模板匹配算法和基于人工神经网络算法。
基于模板匹配算法首先将分割后的字符二值化,并将其尺寸大小缩放为字符数据库中模板的大小,然后与所有的模板进行匹配,最后选最佳匹配作为结果。
基于人工神经元网络的算法有两种:一种是先对待识别字符进行特征提取,然后用所获得特征来训练神经网络分配器;另一种方法是直接把待处理图像输入网络,由网络自动实现特征提取直至识别出结果。
4 实验数据
4.1 源程序
源代码(.m文件):
clc;
close all
clear all
%(1)牌照定位
Scolor=imread('lab4.jpg'); %读取一副真彩色图片
Sgray=rgb2gray(Scolor); %将RGB图片转为灰度图片
s=strel('disk',15); %strel函数
Bgray=imopen(Sgray,s); %对图像进行开运算
Egray=imsubtract(Sgray,Bgray); %两幅图相减
figure(1)
subplot(2,2,1),imshow(Scolor),title('原图像');
subplot(2,2,2),imshow(Sgray),title('灰度图像')
subplot(2,2,3),imshow(Bgray),title('开图像')
subplot(2,2,4),imshow(Egray),title('相减图像')
fmax1=double(max(max(Egray))); %egray的最大值并输出双精度型
fmin1=double(min(min(Egray))); %egray的最小值并输出双精度型
level=(fmax1-(fmax1-fmin1)/3)/255; %获得最佳阈值
bw22=im2bw(Egray,level); %转换图像为二进制图像
bw2=double(bw22);
figure,imshow(bw2);title('图像二值化'); %得到二值图像
grd=edge(bw2,'canny') %用canny算子识别强度图像中的边界
figure,imshow(grd);title('图像边缘提取'); %输出图像边缘
bg1=imclose(grd,strel('rectangle',[13,13])); %取矩形框的闭运算figure,imshow(bg1);title('图像闭运算[13,13]'); %输出闭运算的图像
bg2=imopen(bg1,strel('rectangle',[18,20])); %取矩形框的开运算figure,imshow(bg2);title('图像开运算[18,20]'); %输出开运算的图像
%坐标的确定
[a,b]=size(bg2);
num=0;
%自下限开始向上扫描,当白点数少于每行总点数的1/10时,停止扫描,
%并将该行定义为车牌字符区域的纵向上限
for i=1:1:a
for j=1:b
if bg2(i,j)==1
num=num+1;
end
end
if num>(b*0.1)
ydown=i;
break;
end
end
%自下向上扫描,当白点数多于每行总点数的1/10时,停止扫描,
%并将该行定义为车牌字符区域的纵向下限
for i=a:-1:1
num=0;
for j=1:b
if bg2(i,j)==1
num=num+1;
end
end
if num>(b*0.1)
yup=i;
break;
end
end
[a,b]=size(bg2);
nu=0;
%自左到右扫描,当白点数少于每行总点数的1/10时,停止扫描,
%并将该行定义为车牌字符区域的横向左限
for i=1:1:b
for j=1:a
if bg2(j,i)==1
nu=nu+1;
end
end
if nu>(a*0.05)
xdown=i;
break;
end
end
%自右到左扫描,当白点数多于每行总点数的1/10时,停止扫描,
%并将该行定义为车牌字符区域的横向右限
for i=b:-1:1
nu=0;
for j=1:a
if bg2(j,i)==1
nu=nu+1;
end
end
if nu>(a*0.05)
xup=i;
break;
end
end
goal=imcrop(Scolor,[xdown,ydown,xup-xdown,yup-ydown]); figure();
subplot(3,1,1);imshow(goal);title('车牌区域');
%(2)牌照字符分割
goalg=rgb2gray(goal);
C=im2bw(goalg); %转为二值图像
subplot(3,1,2);imshow(C);title('车牌区域二值图像');
I2=bwareaopen(C,20);
subplot(3,1,3);imshow(I2);title('中值滤波后的二值图像'); %histcol=sum(I2); %计算垂直投影
%subplot(2,2,4);plot(histcol);title('垂直投影');
[y1,x1,z1]=size(I2);
I3=double(I2);
TT=1;
%%%%%%%去除图像顶端和底端的不感兴趣区域%%%%%
Y1=zeros(y1,1);
for i=1:y1
for j=1:x1
if(I3(i,j,1)==1)
Y1(i,1)= Y1(i,1)+1
end
end
end
Py1=1;
Py0=1;
while ((Y1(Py0,1)<20)&&(Py0<y1))
Py0=Py0+1;
end
Py1=Py0;
while((Y1(Py1,1)>=20)&&(Py1<y1))
Py1=Py1+1;
end
I2=I2(Py0:Py1,:,:);
%subplot(2,1,2);imshow(I2),title('目标车牌区域');
%%%%%% 分割字符按行积累量%%%%%%%
X1=zeros(1,x1);
for j=1:x1
for i=1:y1
if(I3(i,j,1)==1)
X1(1,j)= X1(1,j)+1;
end
end
end
figure();
plot(0:x1-1,X1),
title('列方向像素点灰度值累计和'),xlabel('列值'),ylabel('累计像素量'); Px0=1;
Px1=1;
%%%%%%%%%%%%分割字符%%%%%%%%%%%%%%%%%%
for i=1:7
while ((X1(1,Px0)<3)&&(Px0<x1))
Px0=Px0+1;
end
Px1=Px0;
while (((X1(1,Px1)>=3)&&(Px1<x1))||((Px1-Px0)<10))
Px1=Px1+1;
end
Z=I2(:,Px0:Px1,:);
switch strcat('Z',num2str(i))
case'Z1'
PIN0=Z;
case'Z2'
PIN1=Z;
case'Z3'
PIN2=Z;
case'Z4'
PIN3=Z;
case'Z5'
PIN4=Z;
case'Z6'
PIN5=Z;
otherwise
PIN6=Z;
end
figure(8);
subplot(1,7,i);
imshow(Z);
Px0=Px1;
end
%(3)车牌字符识别
liccode=char(['0':'9''A':'Z''鲁陕苏豫粤']); %建立自动识别字符代码表
SubBw2=zeros(40,20);
l=1;
for l=1:7
fname=strcat('D:\Program Files\MATLAB\R2012a\bin\字符模版',int2str(l),'.jpg');
%保存子图备选入样本库,并建立样本库
ii=int2str(l);
t=imread([ii,'.jpg']);
SegBw2=imresize(t,[40 20],'nearest');
if l==1 %第一位汉字识别
kmin=37;
kmax=40;
elseif l==2 %第二位 A~Z 字母识别
kmin=11;
kmax=36;
else l>=3 %第三位以后是字母或数字识别
kmin=1;
kmax=36;
end
for k2=kmin:kmax
fname=strcat(liccode(k2),'.jpg');
SamBw2 = imread(fname);
for i=1:40
for j=1:20
SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);
end
end
% 以上相当于两幅图相减得到第三幅图
Dmax=0;
for k1=1:40
for l1=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);
l=l+1;
end
figure,imshow(goal);title (['车牌号码:粤A 2Y222'],'Color','b');
4.2 运行结果
4.2.1 牌照定位
4.2.2 牌照字符分割
4.2.2 牌照字符识别。