基于MATLAB的车牌识别系统设计说明Word文档下载推荐.docx
《基于MATLAB的车牌识别系统设计说明Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于MATLAB的车牌识别系统设计说明Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
对分割出来的字符进行预处理(二值化、归一化),然后分析提取,对分割出的字符图像进行识别给出文本形式的车牌。
4汽车牌照识别系统的matlab实现
4.1图像预处理
图像在形成、传输或变换过程中,受多种因素的影响,如:
光学系统失真、系统噪声、曝光不足或过量、相对运动等,往往会与原始景物之间或图像与原始图像之间产生了某种差异,这种差异称为降质或退化。
因此在图像处理之前必须进行预处理,包括去除噪音、边界增强、增加亮度等。
输入的彩色图像包含大量颜色信息,会占用较多的存储空间,且处理时也会降低系统的执行速度,因此对图像进行识别等处理时,常将彩色图像转换为灰度图像,以加快处理速度。
对图像进行灰度化处理、边缘提取、再利用形态学方法对车牌进行定位。
具体步骤如下:
首先对图像进行灰度转换,二值化处理然后采用4X1的结构元素对图像进行腐蚀,去除图像的噪声。
采用25X25的结构元素,对图像进行闭合应算使车牌所在的区域形成连通。
再进行形态学滤波去除其它区域。
图像预处理
原图像
灰度图像
边缘检测
腐蚀图像
填充后图像
形态学滤波后图像
通过对比原始图片,我们可以发现形态滤波后的图像已经很接近正确的车牌位置了,因此后期处理将通过这图来找出车牌位置。
车牌定位
观察经过预处理后得到的图像发现车牌位置有明显的矩形有明显的矩形图样,通过对矩形区域的定位即可获得具体的车牌位置。
(1)车牌的行起始和终止位置的确定。
车牌的列起始位置和终止位置的确定。
(2)最后拼合获取的车牌在图像的行列位置
定位剪切后彩色车牌图像
(3)字符分割
在汽车牌照自动识别过程中,字符分割有承前启后的作用。
它在前期牌照定位的基础上进行字符的分割,然后再利用分割的结果进行字符识别。
二值化车牌图像
4.3车牌字符识别
建立字符模板数据库
模板库的合理建造是字符识别准确的关键之一,所以在字符识别之前必须把模板库设置好。
汽车牌照的字符一般有7个,大部分车牌第一位是汉字,通常代表车辆所属省份,或是军种,警别等有特定含义的字符简称;
紧接其后的为字母与数字。
车牌字符识别与一般文字识别在于它的字符数有限,十个阿拉伯数字0~9,26个大写英文字母A~Z以及相关的车牌用汉字:
京、沪、、台、港、澳、甲、乙、丙、使、领、学、试、境、消、边、警等,以及新式军牌中的汉字南、兰、广、北、、济、空、海等;
车牌颜色:
蓝、白、黑、黄等。
所以建立字符模板库也极为方便。
4.3.1构造训练样本如下图所示的数字和字母
建立模板数据库时必须对这些图片进行统一处理,因为对前面处理分割后的车牌图像的测量得知单个字符的最佳宽高比是1:
2,所以将这些图片归一化为50×
25大小;
因为之后的字符识别考虑使用神经网络算法进行字符识别,所以再将上面归一化后的模板图像的样本排列在一起构成1250×
18的矩阵样本。
将样本进行归一化为50X20大小,再将图像按列转换成一个1000X1的行向量,将上述18个图像的样本排列在一起构成1000X18的矩阵样本,尽可能多的采集汽车图像提取车牌,部分切分出车牌字符,构造出更多1000X18的矩形样本,用构造好的样本库对神经网络进行训练。
4.3.2构造输入样本,按同样的方法,将前面分割出的样本归一化
4.3.3神经网络进行识别
总结
目前,基于数字图像的车牌数字识别系统已经开发完毕。
系统设计过程中,在对图像处理概念和方法有了一定了解之后,开始了系统的开发,此过程大概用了一个半月时间。
而后完成系统的实现和测试。
系统基本完成了当初预计的功能,根据输入的包含车牌信息的静态图片,利用神经网络方法识别车牌部数字。
就目前结果来看,系统基本实现了当初预计的功能。
本系统的特点:
1.原创性:
在消化理解了现有一些图像操作算法的基础上,根据实际情况,将有关算法转化为了个人的方法,从系统实验结果可以看到,这些算法起到了一定效果
2.多方式运行:
系统可以实现一键运行,即运行程序立即显现结果。
同时,可以进行分步运行,帮助用户及使用者观察到系统每一步运行所产生的变化,进而更加理解系统的作用,能够更好的运行系统。
3.方法的丰富性:
系统中运用了多种图像处理算法,并加之个人理解,从而形成了一个功能比较齐全的软件系统。
展望
虽然系统目前完成了基本功能,但是由于图像处理操作很多,并且其设计的知识也相当的广,在短时间很难全部理解和灵活运用,再加之个人技术水平的限制,因此系统仍存在一些不足之处,总结起来主要有以下三个方面:
1.系统默认输入图片为具有一定清晰度的图片,但是也会有模糊的情况,系统应降低它的局限性,因此应增加一些更进一步的图像增强的操作,以使得能够处理大部分图片,且能更好的进行车牌定位。
2.车牌定位算法,虽然可以定位出车牌的位置,但有时还是会出现一定偏差,仍可以进一步完善。
3.系统字符识别过程中的神经网络参数选择如果更加精确,可以更加准确的识别。
附录:
clearall;
closeall;
clc;
I=imread('
H:
/532.jpg'
);
%读取图片
figure
(1);
imshow(I);
I1=rgb2gray(I);
%转化为灰度图像
figure
(2);
imshow(I1);
I2=edge(I1,'
roberts'
0.09,'
both'
%采用robert算子进行边缘检测
figure(3);
imshow(I2);
se=[1;
1;
1];
%线型结构元素
I3=imerode(I2,se);
%腐蚀图像
figure(4);
imshow(I3);
se=strel('
rectangle'
[25,25]);
%矩形结构元素
I4=imclose(I3,se);
%图像聚类、填充图像
figure(5);
imshow(I4);
I5=bwareaopen(I4,2000);
%去除聚团灰度值小于2000的部分<
spanstyle="
color:
#ff0000;
"
>
figure(6);
imshow(I5);
[y,x,]=size(I5);
I6=double(I5);
%绘制行曲线图
Y1=zeros(y,1);
fori=1:
y
forj=1:
x
if(I6(i,j,1)==1)
Y1(i,1)=Y1(i,1)+1;
end
end
figure(7);
subplot(1,2,1);
plot(0:
y-1,Y1),title('
行像素灰度值累计'
),xlabel('
行值'
),ylabel('
像素和'
[temp,MaxY]=max(Y1);
PY1=MaxY;
while((Y1(PY1,1)>
=80)&
&
(PY1>
1))
PY1=PY1-7;
PY2=MaxY;
while((Y1(PY2,1)>
(PY2<
y))
PY2=PY2+7;
%绘制列曲线图
X1=zeros(1,x);
forj=1:
fori=PY1:
PY2
X1(1,j)=X1(1,j)+1;
subplot(1,2,2);
x-1,X1),title('
列像素灰度值累计'
列值'
像数和'
PX1=1;
while((X1(1,PX1)<
3)&
(PX1<
x))
PX1=PX1+7;
PX2=x;
while((X1(1,PX2)<
(PX2>
PX1))
PX2=PX2-7;
DW=I(PY1:
PY2,PX1:
PX2,:
figure(8);
imshow(DW),title('
车牌定位后图像'
%%车牌图像转为灰度
ifisrgb(I)
I1=rgb2gray(I);
else
I1=I;
%%二值化车牌图像
I1=im2bw(I1,graythresh(I1));
%二值化图像
I2=bwareaopen(I1,16);
%去除小于16像素的区块
figure();
imshow(I2),title('
二值化车牌图像'
%%分割字符按行积累量
[y,x]=size(I2);
I3=double(I2);
fori=1:
if(I3(i,j,1)==1)
车牌列像素点累计'
%%分割字符
Px0=1;
Px1=1;
7
while((X1(1,Px0)<
(Px0<
Px0=Px0+1;
Px1=Px0;
while(((X1(1,Px1)>
=3)&
(Px1<
x))||((Px1-Px0)<
10))
Px1=Px1+1;
Z=I2(:
Px0:
Px1,:
switchstrcat('
Z'
num2str(i))
case'
Z1'
PIN0=Z;
Z2'
PIN1=Z;
Z3'
PIN2=Z;
Z4'
PIN3=Z;
Z5'
PIN4=Z;
Z6'
PIN5=Z;
otherwise
PIN6=Z;
subplot(1,7,i);
imshow(Z);
Px0=Px1;
functioninpt=Pretreatment(I)
%%训练样本前期处理
I1=I;
I1=imresize(I1,[5025]);
%将图片统一划为50*25大小
I1=im2bw(I1,0.9);
[m,n]=size(I1);
inpt=zeros(1,m*n);
%%将图像按列转换成一个行向量
n
m
inpt(1,m*(j-1)+i)=I1(i,j);
%%归一化训练样本
I0=pretreatment(imread('
BP/0.jpg'
));
I1=pretreatment(imread('
BP/1.jpg'
I2=pretreatment(imread('
BP/2.jpg'
I3=pretreatment(imread('
BP/3.jpg'
I4=pretreatment(imread('
BP/4.jpg'
I5=pretreatment(imread('
BP/5.jpg'
I6=pretreatment(imread('
BP/6.jpg'
I7=pretreatment(imread('
BP/7.jpg'
I8=pretreatment(imread('
BP/8.jpg'
I9=pretreatment(imread('
BP/9.jpg'
I10=pretreatment(imread('
BP/A.jpg'
I11=pretreatment(imread('
BP/B.jpg'
I12=pretreatment(imread('
BP/C.jpg'
I13=pretreatment(imread('
BP/D.jpg'
I14=pretreatment(imread('
BP/G.jpg'
I15=pretreatment(imread('
BP/K.jpg'
I16=pretreatment(imread('
BP/L.jpg'
I17=pretreatment(imread('
BP/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'
'
},'
trainrp'
net.inputWeights{1,1}.initFcn='
randnr'
;
net.layerWeights{2,1}.initFcn='
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);
%训练样本
%%测试
CAR/0.jpg'
DW=Location(I);
%车牌定位
[PIN0,PIN1,PIN2,PIN3,PIN4,PIN5,PIN6]=StringSplit(DW);
%字符分割及处理
%%测试字符,得到识别数值
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'
fori=2:
T0=sim(net,P0(:
i));
T1=compet(T0);
d=find(T1==1)-1;
if(d==10)
str='
A'
elseif(d==11)
B'
elseif(d==12)
C'
elseif(d==13)
D'
elseif(d==14)
G'
elseif(d==15)
K'
elseif(d==16)
L'
elseif(d==17)
M'
elseif(d==0)
0'
elseif(d==1)
1'
elseif(d==2)
2'
elseif(d==3)
3'
elseif(d==4)
4'
elseif(d==5)
5'
elseif(d==6)
6'
elseif(d==7)
7'
elseif(d==8)
8'
elseif(d==9)
9'
else
str=num2str(d);
switchi
case2
str2=str;
case3
str3=str;
case4
str4=str;
case5
str5=str;
case6
str6=str;
str7=str;
%%识别出的结果以标题形式显示在图上
S=strcat('
黑'
str2,str3,str4,str5,str6,str7);
imshow(DW),title(S);