期末课程报告:数字图像中车牌识别的matlab实现 本文关键词:车牌,期末,识别,课程,数字图像
期末课程报告:数字图像中车牌识别的matlab实现 本文简介:数字图像处理期末课程报告题目:车牌识别的matlab实现题目类型:软件型学院信息工程与自动化学院专业:计算机科学与技术年级:XXXX学号:XXXXXXX学生姓名:xxx指导教师:xx日期:2012-6-8目录摘要:2关键词:2实验工具:2车辆牌照识别流程:2实验内容及步骤31.图像预处理:32.车牌
期末课程报告:数字图像中车牌识别的matlab实现 本文内容:
数字图像处理期末课程报告
题
目:
车牌识别的matlab实现
题目类型:
软件型
学
院
信息工程与自动化学院
专
业:
计算机科学与技术
年
级:
XXXX
学
号:
XXXXXXX
学生姓名:
xxx
指导教师:
xx
日
期:
2012-6-8
目录
摘要:2
关键词:2
实验工具:2
车辆牌照识别流程:2
实验内容及步骤3
1.图像预处理:3
2.车牌定位——车牌起始位置和终止位置5
3.图片二值化5
4.列方向像素点灰度值累计6
5.字符分割:7
6.建立字符模板数据库8
7.归一化训练9
结果分析:13
摘要:
本次课程设计的目的是通过对基于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)
end
PY2=MaxY;
while
((Y1(PY2,1)>=45)
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
;
net.layerWeights{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,PIN6
];
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
第二次训练
第二次识别结果
第三次训练
第三次识别结果
第四次训练第四次识别结果
结果分析:
车辆牌照识别,对于交通管理、治安处罚等工作的智能化起着十分重要的作用。它可广泛应用于交通流量检测,交通控制于诱导,机场,港口,小区的车辆管理,不停车自动收费,闯红灯等违章车辆监控以及车辆安全防盗等领域,具有广阔的应用前景。由于牌照是机动车辆管理的唯一标识符号,因此,车辆牌照识别系统的研究在机动车管理方面具有十分重要的实际意义。
本设计有以下几条优点:
(1)
充分利用MATLAB中已有的函数库,使整个程序设计简单易行;
(2)
使用了MATLAB的自定义函数功能,使程序设计更简洁
但也发现了更多的缺点:
(1)
程序的局限性:只能针对图像中一辆汽车的牌照进行识别;对于图像内的元素较复杂的照片可能无法进行识别。
(2)
神经网络的训练要花费30秒以上的训练时间才能进行下一步的字符识别,效率太慢。
(3)
程序可能会受软件环境的影响识别准确性,据测试,MATLAB的2010a
版比2009a版识别效率高,准确性也高点。
本次实验中进行了三次样本训练,每次识别结果都没有和预期的相符,修改了函数参数也同样没有很大的改善。或者与拍摄的图像质量有关系。
通过本次实验,进一步学习掌握了数字图像方面的知识,对matlab软件也有了一定的学习认识。增强了自己的专业能力,培养了自己在数字图像方面的兴趣。
14