期末课程报告:数字图像中车牌识别的matlab实现
期末课程报告:数字图像中车牌识别的matlab实现
数字图像处理期末课程报告
题目:车牌识别的matlab实现
题目类型:软件型
学院信息工程与自动化学院
专业:计算机科学与技术
年级: XXXX 学号: XXXXXXX
学生姓名: xxx
指导教师: xx
日期: 2012-6-8
目录
摘要: (4)
关键词: (4)
实验工具: (4)
车辆牌照识别流程: (4)
实验内容及步骤 (5)
1.图像预处理: (5)
2.车牌定位——车牌起始位置和终止位置 (8)
3.图片二值化 (9)
4.列方向像素点灰度值累计 (11)
5.字符分割: (12)
6.建立字符模板数据库 (14)
7.归一化训练 (15)
结果分析: (22)
摘要:
本次课程设计的目的是通过对基于MATLAB的字符识别的研究,以汽车牌照识别的设计为实例,详细介绍字符识别的相关原理。整个汽车牌照识别的过程分为预处理、边缘提取、车牌定位、字符分割、字符识别五大模块,用MATLAB软件编程来实现每一个部分,最后识别出汽车牌照。在研究的同时对其中出现的问题进行了具体分析,处理。寻找出对于具体的汽车牌照识别过程的最好的方法。
关键词:
MATLAB 字符识别车牌识别神经网络图像处理
实验工具:
MATLAB 7.8(R2009a)。
车辆牌照识别流程:
基于 MATLAB图像处理的汽车牌照识别,主要包括车牌定位、字符车牌分割、和车牌字符识别三个关键环节。
流程图如下:
原始图图像预车牌定
字符识
字符分
字符数
其中,
(1)原始图像:由数码相机或其它扫描装置拍摄到的图
像;(本实验图片由数码相机获得)
(2)图像预处理:对动态采集到的图像进行灰度处理、边
缘检测、腐蚀、膨胀、滤波、等处理排除图像干扰;
(3)车牌定位:计算边缘图像的投影面积,寻找峰谷点,
大致确定车牌位置,再计算此连通域内的宽高比,剔除不在域值范围内的连通域,最后得到的便为车牌区域;
(4)字符分割:利用投影检测的字符定位分割方法得到单
个的字符;
(5)字符数据库:构造训练样本数据库,为第6步的字符
识别建立字符模板数据库;
(6)字符识别:通过基于模板匹配的OCR算法或基于人工
神经网络的OCR算法,通过特征对比或训练识别出相关的字符,得到最后的汽车牌照,包括英文字母和数字。
实验内容及步骤
1.图像预处理:
预处理源代码:
>> I=imread('h:\tuku\car1.jpg');%读取图像
figure(); subplot(3,2,1),imshow(I), title('原始图像');
>> I1=rgb2gray(I);%转化为灰度图像
subplot(3,2,2),imshow(I1),title('灰度图像');
>> I2=edge(I1,'robert',0.09,'both');%采用robert算子进行边缘检测
subplot(3,2,3),imshow(I2),title('边缘检测后图像');
>> se=[1;1;1]; %线型结构元素
I3=imerode(I2,se); %腐蚀图像
subplot(3,2,4),imshow(I3),title('腐蚀后边缘图像');
>> se=strel('rectangle',[25,25]); %矩形结构元素
I4=imclose(I3,se);%图像聚类、填充图像
subplot(3,2,5),imshow(I4),title('填充后图像');
>> I5=bwareaopen(I4,2000);%去除聚团灰度值小于2000的部分
subplot(3,2,6),imshow(I5),title('形态滤波后图像');
预处理结果截图:
行列方向像素值累计值:
源代码:
[y,x,z]=size(I5);
I6=double(I5);
Y1=zeros(y,1);
for i=1:y
for j=1:x
if(I6(i,j,1)==1)
Y1(i,1)= Y1(i,1)+1;
end
end
end
[temp MaxY]=max(Y1);
figure();
subplot(3,2,1),plot(0:y-1,Y1),title('行方向像素点灰度值累计和'),xlabel('行值'),ylabel('像素');
运行截图:
2.车牌定位——车牌起始位置和终止位置
PY1=MaxY;
while ((Y1(PY1,1)>=45)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while ((Y1(PY2,1)>=45)&&(PY2 PY2=PY2+1; end IY=I(PY1:PY2,:,:); X1=zeros(1,x); for j=1:x for i=PY1:PY2 if(I6(i,j,1)==1) X1(1,j)= X1(1,j)+1; end end end subplot(3,2,2),plot(0:x-1,X1),title('列方向像素点灰度值累计和'),xlabel('列值'),ylabel('像数'); 3.图片二值化 代码: if isrgb(DW) I1 = rgb2gray(DW); %将RGB图像转化为灰度图像else I1=I; end g_max=double(max(max(I1))); g_min=double(min(min(I1))); T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值[m,n]=size(I1);% d:二值图像 %h=graythresh(I1); I1=im2bw(I1,T/256); subplot(3,2,4); imshow(I1),title('二值化车牌图像'); 运行截图: 滤波二值化图像: I2=bwareaopen(I1,20); subplot(3,2,5); imshow(I2),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 Py0=Py0+1; end Py1=Py0; while((Y1(Py1,1)>=20)&&(Py1 Py1=Py1+1; end I2=I2(Py0:Py1,:,:); subplot(3,2,6); imshow(I2),title('目标车牌区域'); 运行截图: 4.列方向像素点灰度值累计代码: 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(5); plot(0:x1-1,X1),title('列方向像素点灰度值累计和'),xlabel('列值'),ylabel('累计像素量'); 运行截图: 5.字符分割: Px0=1; Px1=1; figure(); for i=1:7 while ((X1(1,Px0)<3)&&(Px0 Px0=Px0+1; end Px1=Px0; while (((X1(1,Px1)>=3)&&(Px1 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 subplot(1,7,i); imshow(Z); Px0=Px1; end 运行结果: 6.建立字符模板数据库 1)将下列图片存到相应的图片库中,待之后检测比对时用。 (注:每个字符图像要单独存放为.jpg文件。) 2)新建一个自定义函数pretreatment.m 文件,对这些图片进行统一处理: function inpt = pretreatment(I) if isrgb(I) I1 = rgb2gray(I); else I1=I; end I1=imresize(I1,[50 25]);%将图片统一划为50*25大小 I1=im2bw(I1,0.9); [m,n]=size(I1); inpt=zeros(1,m*n); for j=1:n for i=1:m inpt(1,m*(j-1)+i)=I1(i,j); end end 7.归一化训练 代码: I0=pretreatment(imread('h:\tuku\0.jpg')); I1=pretreatment(imread('h:\tuku\1.jpg')); I2=pretreatment(imread('h:\tuku\2.jpg')); I3=pretreatment(imread('h:\tuku\3.jpg')); I4=pretreatment(imread('h:\tuku\4.jpg')); I5=pretreatment(imread('h:\tuku\5.jpg')); I6=pretreatment(imread('h:\tuku\6.jpg')); I7=pretreatment(imread('h:\tuku\7.jpg')); I8=pretreatment(imread('h:\tuku\8.jpg')); I9=pretreatment(imread('h:\tuku\9.jpg')); I10=pretreatment(imread('h:\tuku\A.jpg')); I11=pretreatment(imread('h:\tuku\B.jpg')); I12=pretreatment(imread('h:\tuku\C.jpg')); I13=pretreatment(imread('h:\tuku\D.jpg')); I14=pretreatment(imread('h:\tuku\G.jpg')); I15=pretreatment(imread('h:\tuku\K.jpg')); I16=pretreatment(imread('h:\tuku\L.jpg')); I17=pretreatment(imread('h:\tuku\M.jpg')); P=[I0',I1',I2',I3',I4',I5',I6',I7',I8',I9', I10',I11',I12',I13',I14',I15',I16',I17']; T=eye(18,18); %输出样本 %% bp神经网络参数设置 net=newff(minmax(P),[1250,32,18],{'logsig', 'logsig','logsig'},'trainrp'); net.inputWeights{1,1}.initFcn ='randnr'; https://www.360docs.net/doc/da12054419.html,yerWeights{2,1}.initFcn ='randnr'; net.trainparam.epochs=5000; net.trainparam.show=50; %net.trainparam.lr=0.003; net.trainparam.goal=0.0000000001; net=init(net); [net,tr]=train(net,P,T); %训练样本 测试字符代码: PIN0=pretreatment(PIN0); PIN1=pretreatment(PIN1); PIN2=pretreatment(PIN2); PIN3=pretreatment(PIN3); PIN4=pretreatment(PIN4); PIN5=pretreatment(PIN5); PIN6=pretreatment(PIN6); P0=[PIN0',PIN1',PIN2',PIN3',PIN4',PIN5',PIN 6']; for i=2:7 T0= sim(net ,P0(:,i)); T1 = compet (T0) ; d = find(T1 == 1) - 1; if (d==10) str='A'; elseif (d==11) str='B'; elseif (d==12) str='C'; elseif (d==13) str='D'; elseif (d==14) str='G'; elseif (d==15) str='K'; elseif (d==16) str='L'; elseif (d==17) str='M'; elseif (d==0) str='0'; elseif (d==1) str='1'; elseif (d==2) str='2'; elseif (d==3) str='3'; elseif (d==4) str='4'; elseif (d==5) str='5'; elseif (d==6) str='6'; elseif (d==7) str='7'; elseif (d==8) 第一次训练 str='8'; elseif (d==9) str='9'; else str=num2str(d); end switch i case 2 str2=str; case 3 str3=str; case 4 str4=str; case 5 str5=str; case 6 str6=str; otherwise str7=str;第一次识别结果 end end 第二次识别结果 第二次训练 第三次训练第三次识别结果