资源描述
基于MATLAB车牌辨认系统设计
学 院 测控与通信工程学院
专 业 信号与信息解决
学生姓名 二妮子
学 号
指引教师 么么哒
基于MATLAB车牌辨认系统设计
摘要:本文重要简介了基于MATLAB关于数字图像解决车牌数字辨认系统。系统是运用单张包括车牌静态图片进行辨认,整个辨认过程重要分为车牌定位和字符分割和字符辨认三个大模块。而其中字符辨认是系统核心某些。字符辨认当前运用最多就是神经网络和模板匹配办法,本文所简介就是基于神经网络办法来实现车牌数字辨认。过程中也相应结合了特性提取、直方图记录等一系列办法。从实验得知,这种神经网络办法实现简朴,且容易理解,在保证辨认精确率前提下,可以提高辨认效率,使得系统在比较精确地定位了车牌及分割出字符后,能更精确地实现字符辨认。
核心词:车牌辨认;matlab;神经网络
1 引言
随着国内交通运送不断发展,智能交通系统(Intelligent Traffic System,简称ITS)推广变越来越重要,而作为ITS一种重要构成某些,车牌辨认系统(LPRS)是智能交通系统重要构成某些。随着机动车辆数量大幅度增长以及计算机技术发展,人们对交通控制系统规定明显提高。因而智能交通系统被广泛地应用于交通控制系统当中,例如高速公路收费、停车场车辆管理、违章车辆监控、交通诱导控制等场合。这使得车牌辨认系统也得到了更广泛关注。与老式车辆管理办法比较,车牌辨认系统可以大大提高交通管理效率和水平,协助实现车辆管理规范化。由于牌照是机动车辆管理唯一标记符号,因而,车辆牌照辨认系统研究在机动车管理方面具备十分重要实际意义。
2 车辆牌照辨认系统工作原理
车辆牌照辨认系统基本工作原理为:将摄像头拍摄到包括车辆牌照图像通过视频卡输入到计算机中进行预解决,再由检索模块对牌照进行搜索、检测、定位,并分割出包括牌照字符矩形区域,然后对牌照字符进行二值化并将其分割为单个字符,然后输入JPEG或BMP格式数字,输出则为车牌号码数字。
3 车辆牌照辨认系统构成
1.读入图像: 输入图像由于受到天气影响,涉及晴天、阴天、晚上等,由于光照影响和摄像机曝光不同,再加上有些车牌老化污损、陈旧退色,这些都也许使车牌图像产生对比度局限性弊端,图像细节辨别不清,车牌字符某些不突出. 并且,对高速行进中汽车拍摄图像往往产生模糊、扭曲、变形等现象,这些都增长了预解决难度。而这些解决需要很复杂过程,由于系统把读入图片默以为比较清晰、几乎没有倾斜角度图片。
2.图像预解决:图像预解决过程需要把图像转换成便于车牌定位二值化图像。需要通过图像灰度化,图像增强,边沿提取,二值化操作。
3.车牌定位:从预解决后汽车图像中分割出车牌图像。即在一幅车辆图像中找到车牌所在位置。
4.字符分割:对车牌图像进行几何校正、去噪、二值化以及字符分割以从车牌图像中分离出构成车牌号码单个字符图像
5.字符辨认:对分割出来字符进行预解决(二值化、归一化),然后分析提取,对分割出字符图像进行辨认给出文本形式车牌号码。
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.系统字符辨认过程中神经网络参数选取如果更加精准,可以更加精确辨认。
附录:
clear all;
close all;
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,); %去除聚团灰度值不大于某些<span style="color:#ff0000;">
figure(6);
imshow(I5);
[y,x,]=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
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;
end
PY2=MaxY;
while ((Y1(PY2,1)>=80)&&(PY2<y))
PY2=PY2+7;
end
%绘制列曲线图
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(1,2,2);
plot(0:x-1,X1),title('列像素灰度值合计'),xlabel('列值'),ylabel('像数和');
PX1=1;
while ((X1(1,PX1)<3)&&(PX1<x))
PX1=PX1+7;
end
PX2=x;
while ((X1(1,PX2)<3)&&(PX2>PX1))
PX2=PX2-7;
end
DW=I(PY1:PY2,PX1:PX2,:);
figure(8);
imshow(DW),title('车牌定位后图像');
%% 车牌图像转为灰度
if isrgb(I)
I1 = rgb2gray(I);
else
I1 = I;
end
%% 二值化车牌图像
I1 = im2bw(I1,graythresh(I1));%二值化图像
I2 = bwareaopen(I1,16);%去除不大于16像素区块
figure();
subplot(1,2,1);
imshow(I2),title('二值化车牌图像');
%% 分割字符按行积累量
[y,x]=size(I2);
I3=double(I2);
X1=zeros(1,x);
for j=1:x
for i=1:y
if(I3(i,j,1)==1)
X1(1,j)= X1(1,j)+1;
end
end
end
subplot(1,2,2);
plot(0:x-1,X1),title('车牌列像素点合计'),xlabel('列值'),ylabel('像素和');
%% 分割字符
Px0=1;
Px1=1;
figure();
for i=1:7
while ((X1(1,Px0)<3)&&(Px0<x))
Px0=Px0+1;
end
Px1=Px0;
while (((X1(1,Px1)>=3)&&(Px1<x))||((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
subplot(1,7,i);
imshow(Z);
Px0=Px1;
end
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
close all;
clear all;
%% 归一化训练样本
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','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.;
net=init(net);
[net,tr]=train(net,P,T); %训练样本
%% 测试
I=imread('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'];
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
%% 辨认出成果以标题形式显示在图上
S=strcat('黑',str2,str3,str4,str5,str6,str7);
figure();
imshow(DW),title(S);
展开阅读全文