期末课程报告:数字图像中车牌识别的matlab实现

期末课程报告:数字图像中车牌识别的matlab实现
期末课程报告:数字图像中车牌识别的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

第二次识别结果

第二次训练

第三次训练第三次识别结果

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