大家好,今天给大家介绍基于matlab的车牌识别系统设计与原理。
车牌识别系统(License Plate Recognition ,简称LPR)是智能交通系统(ITS)的核心组成部分,在现代交通管理系统中发挥着举足轻重的作用。本项目运用神经网络算法从车牌图像预处理、车牌定位、车牌字符分割和车牌字符识别这几个方面对车牌识别技术进行研究,运用MATLAB仿真,实现对车牌识别系统的设计。
文章目录:
本项目难度:中等难度
适用场景:相关题目的毕业设计及相关领域的应用研究
环境配置:
本项目所使用的MATLAB版本为MATLAB 7.8.0(R2016a)
注:可适配绝大部分matlab版本
项目技术:
轮廓提取算法+ 图像分割算法 +神经网络算法+图像预处理+车牌定位+车牌字符分割+车牌识别等等
提示:以下为项目的详细介绍,项目源码及项目设计文档下载地址见文末~
4.1系统总体设计
车牌识别系统的构成如图所示
其中各个模块的研究内容包括:
1 .车牌图像采集:通过安装在过道路口或者车辆出入通道的摄像机实时捕捉车辆视屏图像,并传输到计算机上以便于实时的处理。
2.车牌图像预处理:主要完成包括图像灰度变化,图像边缘检测、图像二值化等来突出车牌的特征,以便于更好的车牌定位。
3.车牌定位:从摄入的汽车图像中找到车牌的位置,并把含有车牌图像的区域提取出来,以供后端的字符分割处理
4.车牌字符分割:对搜索定位后的车牌区域进行字符分割, 将车牌分为N个单一的字符
5.车牌识别:对于提取出的单个字符,先进行归一化操作,再运用训练好的神经网络进行字符识别。
6.结果显示:显示处理后的车牌并与原始车牌相比较
4.2各个模块设计及原理
4.2.1车牌图像采集
当系统发现有车辆通过感应线圈或监视图像发生变化时,触发图像采集系统,通过CCD摄像机摄取采集出车牌图像,然后车牌自动识别模块对车牌图像进行预处理、车牌定位、字符分割、字符识别等一系列处理识别出车牌号码,识别结果和原始车牌图像通过网络传输至监控中心,留待以后车牌查询和交通流量统计。本次设计主要是实现对已经采集到的车牌图像进行识别
4.2.2车牌图像预处理
汽车牌照中的字符主要由有限汉字、字母和数字组成,采用固定的印刷体格式。由于图像上字符光照不均、车牌本身污损、汽车行驶速度较快、牌照颜色类型较多、拍摄角度及地况等主客观原因会使车牌字符发生畸变,从而造成识别上的困难,因此,为提高牌照的字符识别率, 必须进行预处理, 以便得到较为清晰的待识别的单个字符.这些预处理包括灰度变换、边缘检测、腐蚀、填充、形态滤波处理等。预处理的效果对随后的定位处理有很大的影响,所以选择可靠的预处理算法也是非常重要的。
图像预处理程序设计流程图如下:
车牌图像预处理流程:
预处理的结果显示如下图:
4.2.3车牌定位
车牌定位方法的出发点是利用车牌区域的特征来判断牌照,将车牌区域从整幅车辆图像中分割出来。在车牌识别中,定位的成功与否以及定位的准确程度将会直接决定后期能否进行车牌识别以及识别的准确度。
车牌定位方法涉及到的具体方法有: 基于边缘检测的方法、区域生长法,构造灰度模型法,二值图像的数学形态学运算法,灰度图像的数学形态学运算法,自适应边界搜索法,DFT变换法,模糊聚类法等。这里采用基于边缘检测的方法,首先去除图像中的背景,然后得到汽车牌照的特征区域,再通过一定的方式定位这个区域,最后把汽车牌照从图像中分割出来。
所谓“边缘”就是指其周围像素灰度有阶跃变化的那些像素的集合。“边缘”的两侧分属于两个区域,每个区域的灰度均匀一致,而这两个区域的灰度在特征上存在一定的差异。边缘检测的任务是精确定位边缘和抑制噪声。
检测的方法有多种, 例如Roberts 边缘算子、Prewitt 算子、Sobel 算子以及拉普拉斯边缘检测。这些方法正是利用物体边缘处灰度变化剧烈这一特点来检测图像的边缘。各算子对不同边缘类型的敏感程度不同, 产生的效果也不同, 经过大量实验分析可知, Roberts边缘算子是一种利用局部方差算子寻找边缘的算子, 定位比较精确; Prewitt算子和Sobel算子对噪声有一定的抑制能力, 但不能完全排除伪边缘; 拉普拉斯算子是二阶微分算子, 对图像中的阶跃型边缘点定位准确且具有旋转不变性, 但容易丢失一部分边缘的方向信息, 同时抗噪能力较差。针对不同的环境和要求, 选择合适的算子来对图像进行边缘检测才能达到好的效果。
4.2.4车牌字符分割
字符的分割是指将车牌区域分割成若干个单个的字符区域,把单个有意义的字符从字符串中提取出来,作为独立的字符图像。字符分割的成败与否直接影响到单字的识别效果,如果分割出的字符出现了断裂、粘连,则系统难以识别。本次设计中采用的是垂直投影字符分割方法,即先将图像二值化,然后进行水平倾斜以及竖直倾斜校正,去除一些噪声,然后将车牌像素灰度值按垂直方向累加,即所谓的垂直投影。由于字符块的垂直投影必然在字符间距或字符内的间隙处取得局部最小值,所以分割位置应该在局部最小值处。
此方法比较简单易行,程序设计简单,便于设计和操作,因此比较常用。由于在车牌定位中得到的是彩色的车牌区域图像,故在字符分割前需对图像进行预处理。
列方向像素点灰度值累积和:
车牌字符分割结果:
车牌字符归一化后显示结果:
4.2.5车牌字符识别
4.2.5.1BP神经网络简介
BP (Back Propagation)神经网络,即误差反传误差反向传播算法的学习过程,由信息的正向传播和误差的反向传播两个过程组成。输入层各神经元负责接收来自外界的输入信息,并传递给中间层各神经元;中间层是内部信息处理层,负责信息变换,根据信息变化能力的需求,中间层可以设计为单隐层或者多隐层结构;最后一个隐层传递到输出层各神经元的信息,经进一步处理后,完成一次学习的正向传播处理过程,由输出层向外界输出信息处理结果。当实际输出与期望输出不符时,进入误差的反向传播阶段。误差通过输出层,按误差梯度下降的方式修正各层权值,向隐层、输入层逐层反传。周而复始的信息正向传播和误差反向传播过程,是各层权值不断调整的过程,也是神经网络学习训练的过程,此过程一直进行到网络输出的误差减少到可以接受的程度,或者预先设定的学习次数为止。
BP神经网络模型包括其输入输出模型、作用函数模型、误差计算模型和自学习模型。
(1)节点输出模型
隐节点输出模型:Oj=f(∑Wij×Xi-qj)
输出节点输出模型:Yk=f(∑Tjk×Oj-qk)
f-非线形作用函数;q -神经单元阈值。
(2)作用函数模型
作用函数是反映下层输入对上层节点刺激脉冲强度的函数又称刺激函数,一般取为(0,1)内连续取值Sigmoid函数: f(x)=1/(1+e)
(3)误差计算模型
误差计算模型是反映神经网络期望输出与计算输出之间误差大小的函数:Ep=1/2×∑(tpi-Opi)
tpi- i节点的期望输出值;Opi-i节点计算输出值。
(4)自学习模型
神经网络的学习过程,即连接下层节点和上层节点之间的权重拒阵Wij的设定和误差修正过程。BP网络有师学习方式-需要设定期望值和无师学习方式-只需输入模式之分。自学习模型为
△Wij(n+1)= h ×Фi×Oj+a×△Wij(n)
h -学习因子;Фi-输出节点i的计算误差;Oj-输出节点j的计算输出;a-动量因子。
下图为BP神经网络结构:
4.2.5.2神经网络训练
BP神经网络学习是典型的有导师学习,其训练主要是利用误差反向传播算法,不断修正网络权值矩阵。因为一般的车牌均由汉字、英文字母和数字组成,根据车牌字符的上述特点,在用BP神经网络进行训练和识别时,所选用的样本需包括字符的这些特点,加上本次实验的特殊性,由于待识别车牌图像有限,所得到的车牌字符不是很全,这里为简化起见,只对汉字渝,数字0~9和字母A、L、M、N、R这几个字符进行训练。训练样本如下图所示:
4.2.5.3神经网络识别结果
用训练好的神经网络对样本进行识别,下图为车牌识别结果:
4.2.5.3结论
汽车牌照的自动识别技术作为智能交通的一部分已经得到了越来越广泛的应用,良好的自动识别技术对现代化交通来说具有重要意义。本设计运用神经网络算法对汽车牌照进行识别,实现了对车牌预处理,车牌定位车牌分割,车牌识别,处在的不足在于,由于不同的汽车牌照其倾斜度和所在位置不一,对于不同的车牌需要改变分割参数才能实现。
4.3部分程序源码
%% 主程序%%
clc;
close all;
clear all;
I=imread('C:\wangyuanyuan\DSC01317.jpg');
dw=cpdw(I);%车牌定位
[PIN0,PIN1,PIN2,PIN3,PIN4,PIN5,PIN6]=zffg(I);%字符分割及处理
PIN0=ycl(PIN0);
PIN1=ycl(PIN1);
PIN2=ycl(PIN2);
PIN3=ycl(PIN3);
PIN4=ycl(PIN4);
PIN5=ycl(PIN5);
PIN6=ycl(PIN6);
P0=[PIN0',PIN1',PIN2',PIN3',PIN4',PIN5',PIN6'];
%%%%归一化训练样本%%%%
I0=ycl(imread('C:\wangyuanyuan\yangben\0.jpg'));
I1=ycl(imread('C:\wangyuanyuan\yangben\1.jpg'));
I2=ycl(imread('C:\wangyuanyuan\yangben\2.jpg'));
I3=ycl(imread('C:\wangyuanyuan\yangben\3.jpg'));
I4=ycl(imread('C:\wangyuanyuan\yangben\4.jpg'));
I5=ycl(imread('C:\wangyuanyuan\yangben\5.jpg'));
I6=ycl(imread('C:\wangyuanyuan\yangben\6.jpg'));
I7=ycl(imread('C:\wangyuanyuan\yangben\7.jpg'));
I8=ycl(imread('C:\wangyuanyuan\yangben\8.jpg'));
I9=ycl(imread('C:\wangyuanyuan\yangben\9.jpg'));
I10=ycl(imread('C:\wangyuanyuan\yangben\A.jpg'));
I11=ycl(imread('C:\wangyuanyuan\yangben\L.jpg'));
I12=ycl(imread('C:\wangyuanyuan\yangben\M.jpg'));
I13=ycl(imread('C:\wangyuanyuan\yangben\N.jpg'));
I14=ycl(imread('C:\wangyuanyuan\yangben\R.jpg'));
%输入样本%
P=[I0',I1',I2',I3',I4',I5',I6',I7',I8',I9',I10',I11',I12',I13',I14'];
%输出样本%
T=eye(15,15);
% 建立神经网络模型%
%%bp神经网络参数设置%%;
net=newff(minmax(P),[100,15],{'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);
%%%%测试字符,得到识别数值%%%%
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='L';
elseif (d==12)
str='M';
elseif (d==13)
str='N';
elseif (d==14)
str='R';
else
str=num2str(d);
end
switch i
case 2
str1=str;
case 3
str2=str;
case 4
str3=str;
case 5
str4=str;
case 6
str5=str;
otherwise
str6=str;
end
end
%%%显示定位后分割出的车牌彩图,识别结果以标题形式显示在图上%%%
s=strcat('渝',str1,str2,str3,str4,str5,str6);
figure();
imshow(dw),title(s);
车牌定位程序
function [ dw ]= cpdw( I )
subplot(3,2,1),imshow(I),title('原始图像');
I1=rgb2gray(I);%转化为灰度图像
subplot(3,2,2),imshow(I1),title('灰度图像');
I2=edge(I1,'roberts',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);
%%%%%%%求的车牌的行起始位置和终止位置%%%%%%%%%
PY1=MaxY;
while ((Y1(PY1,1)>=50)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while ((Y1(PY2,1)>=100)&&(PY2<y))
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
%%%%%求的车牌的列起始位置和终止位置%%%%%%
PX1=1;
while ((X1(1,PX1)<3)&&(PX1<x))
PX1=PX1+1;
end
PX2=x;
while ((X1(1,PX2)<3)&&(PX2>PX1))
PX2=PX2-1;
end
PX1=PX1-1;
PX2=PX2+1;
本项目及一些精选的matlab车牌识别项目源码如下,有需要的朋友可以点击进行下载
序号 | matlab车牌识别项目(点击下载) |
---|---|
1 (本项目源码) | 基于BP神经网络的MATLAB车牌识别系统源码+项目设计文档_车牌识别_BP神经网络_matlab_毕业设计_课程设计 |
2 | matlab实现车型识别 程序源码 |
3 | MATLAB夜间车牌识别程序_车牌识别_夜间车牌识别_matlab |
4 | 用MATLAB实现车牌识别,包括定位、分割和字符识别,识别方法是神经网络_matlab |
5 | 基于图像的车牌自动识别技术_matlab |
6 | BP神经网络车牌识别_车牌定位后的倾斜矫正_车牌识别_matlab |
7 | 图像处理_车牌识别_包含程序与实验图像与课程报告_matlab |
8 | 能完成车牌字符识别的整个流程MATLAB(推荐)_车牌识别_matlab |
9 | 基于MATLAB的车牌识别系统_里面有详细的源码和设计实验报告,非常不错_matlab |
10 | 国外的车牌识别程序_matlab_车牌识别 |
11 | 车牌识别_包含字符集_包含测试图像_包含课程设计_matlab |
12 | 基于神经网络的车牌识别_包含测试图片和论文_MATLAB |
13 | 车牌智能识别_车牌识别_matlab |
14 | 车牌识别MATLAB算法_车牌识别_含图片_matlab |
15 | MATLAB夜间车牌识别程序_matlab |
16 | 车牌定位识别的源代码_在文字识别,车牌定位等领域中广泛应用_matlab |
17 | 车道线识别车牌识别系统及其学习机制的研究,matlab源码 |
18 | 识别客车、轿车、面包车等的车型识别_matlab编写_背景差分得到车辆区域_再做后续图像处理 |
19 | matlab实现车型识别 程序源码.zip |