课程设计matlab车牌识别系统Word下载.docx
- 文档编号:17610862
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:27
- 大小:1.36MB
课程设计matlab车牌识别系统Word下载.docx
《课程设计matlab车牌识别系统Word下载.docx》由会员分享,可在线阅读,更多相关《课程设计matlab车牌识别系统Word下载.docx(27页珍藏版)》请在冰豆网上搜索。
二.课程设计原理及设计方案
1.系统简述
一个完整的车牌识别系统闭应包括车辆检测、图像采集、图像预处理、车牌定位、字符分割、字符识别等单元。
当车辆到达触发图像采集单元时,系统采集当前的视频图像。
车辆识别单元对图像进行处理,定位出牌照位置,再将车牌中的字符分割出来进行识别,然后组成车牌号码输出。
车牌识别系统原理如图l所示。
1)图像预处理:
对汽车图像进行图像转换、图像增强等。
2)车牌定位:
从预处理后的汽车图像中分割出车牌图像。
即在一幅车辆图像中找到车牌所在的位置。
3)字符分割:
对车牌图像进行几何校正、去噪、二值化以及字符分割以从车牌图像中分离出组成车牌号码的单个字符图像
4)字符识别:
对分割出来的字符进行预处理(二值化、归一化),然后分析提取,对分割出的字符图像进行识别给出文本形式的车牌号码。
为了用于牌照的分割和牌照字符的识别,原始图象应具有适当的亮度,较大的对比度和清晰可辩的牌照图象。
但由于该系统的摄像部分工作于开放的户外环境,加之车辆牌照的整洁度、自然光照条件、拍摄时摄像机与牌照的矩离和角度以及车辆行驶速度等因素的影响,牌照图象可能出现模糊、歪斜和缺损等严重缺陷,因此需要对原始图象进行识别前的预处理。
牌照的定位和分割是牌照识别系统的关键技术之一,其主要目的是在经图象预处理后的原始灰度图象中确定牌照的具体位置,并将包含牌照字符的一块子图象从整个图象中分割出来,供字符识别子系统识别之用,分割的准确与否直接关系到整个牌照字符识别系统的识别率。
由于拍摄时的光照条件、牌照的整洁程度的影响,和摄像机的焦距调整、镜头的光学畸变所产生的噪声都会不同程度地造成牌照字符的边界模糊、细节不清、笔划断开或粗细不均,加上牌照上的污斑等缺陷,致使字符提取困难,进而影响字符识别的准确性。
因此,需要对字符在识别之前再进行一次针对性的处理。
车牌识别的最终目的就是对车牌上的文字进行识别。
识别方法目前主要有基于模板匹配算法和基于人工神经网络算法。
1)RGB转为灰度图像
输入的彩色图像包含大量颜色信息,会占用较多的存储空间,且处理时也会降低系统的执行速度,因此对图像进行识别等处理时.常将彩色图像转换为灰度图像,以加快处理速度。
可对图像进行灰度化处理、提取背景图像、增强处理、图像二值化,边缘检测、滤波等处理。
然后采用robert算子进行边缘检测,再用imopen和imclose对所得二值图像作开、闭操作进行滤波。
彩色图像分为R、G、B三个分量,分别显示出红、绿、蓝等各种颜色,灰度化就是使彩色的R、G、B分量相等的过程。
灰度值大的像素点比较亮(像素值最大为255,为白色),反之比较暗(像素值最小为0,是黑色)。
图像灰度化的算法在matlab调用的格式为:
I=rgb2gray(I0);
2)RGB转换到HSV空间
表达颜色的彩色空间有许多种,最常见的是RGB彩色空间,但是在RGB彩色模型中各像素值是由R、G、B三种分量的亮度值叠加而成,这三种亮度值随光照强度的不同而改变,而一般汽车图像的光照强度是不定的,所以用RGB颜色模型进行车牌识别是很困难的。
HSV颜色模型对应于画家的配色模型,它由色度H、饱和度S、亮度V三个分量组成。
由于这种模型具有线性伸缩性,可感知的色差与颜色分量的相应样值上的欧几里德距离成比例,因此HSV颜色模型比RGB颜色模型更直观、更容易接受。
图像RGB转换到HSV空间的算法在matlab调用的格式为:
I=rgb2hsv(I0);
但我们取它的第二通道I=(:
,:
2)时可以去掉许多不必要的信息,非常有利于后续处理工作。
3.车牌定位
在车牌定位中首先用颜色定位法,因为在彩色图像中,它分别由R,G,B三个分量合成的,在这种情况下,每个‘像素’由三个值来表征,并且可以表示为一个三维向量z=(z1,z2,z3)T,其分量是一个点的RGB彩色。
当我们想要从一副彩色图像中提取具有指定颜色的所有区域,比如说,蓝色。
令a表示我们感兴趣的平均蓝色。
基于这一参数来分割彩色图像的一种方法是计算任意彩色点的z值和平均彩色a间的距离测度D(z,a)。
然后,我们按如下方式分割图像:
1,D(z,a)《T
g=
0,其它
这里T为一个阈值。
用这样的一种方法可以较好的,查找出车牌的大概区域,然后我们再用形态学操作进行处理切割出车牌的水平区域,之后我们可以再用水平区域的图像来确定车牌的垂直区域图像,到此可以得到车牌的区域。
但是可能这样一个区域不太精细,可以在后续工作中把它更精细的定位到字符区域。
4.字符分割
完成牌照区域的定位后,再将牌照区域分割为单个字符,可采用垂直投影法。
在此设计中,对车牌字符的所有噪声都能很好的去除,字符与字符之间的间隙没有杂点和粘连,因此垂直投影时,七个峰值不会相连,所以查找切割字符时的步骤主要为如下:
从第一列开始查找,当第一个投影值不为0时,记录下第几列,然后继续查找投影值为0的点,记录下第几列,之后就可以切割出第一个字符来。
其余字符的切割也一样。
5.字符识别
在这个设计中,运用神经网络的方法进行识别,准确度较高。
在神经网络的训练中,需要足量的模板,建立好输入,输出量,其中输入量就是每一字符样本,输出量就是一个样本或一类样本所要对应的数据输出。
然后,建立训练网络,设置好相应的一些参数等,当精确度到达一定程度时,就可以停止训练,至此网络训练成功。
当进行字符识别时,就可以调用已经训练好的网络,把每一个输入字符,与网络中的函数进行匹配,找到最匹配的进行相对应的数据输出,就可以判断究竟为那个字符。
神经网络的matlab代码:
1)建立网络:
net=newff(pr,[8501],{'
logsig'
'
purelin'
},'
traingdx'
'
learngdm'
);
2)训练网络:
net=train(net,p,t);
P为输入量,t输出量
3)调用网络:
t=sim(net,p)
三.课程设计的步骤和结果
设计中主要分为三大块:
车牌定位,字符分割,字符识别,因此就以上三块分别一一做一个方法讲解。
此处以车牌1作为示例图像
1.车牌定位
主要分为:
蓝色区域查找,形态学操作,水平区域定位,垂直区域定位等部分。
1.1蓝色区域查找
Y=imread(’1.jpg’)
R=Y(:
:
1);
G=Y(:
2);
B=Y(:
3);
[m,n]=size(R);
fori=1:
m
forj=1:
n
if(R(i,j)>
20&
&
R(i,j)<
82)&
(G(i,j)>
10&
G(i,j)<
255)&
(B(i,j)>
108&
B(i,j)<
255)
A8(i,j)=1;
else
A8(i,j)=0;
end
end
figure,imshow(A8)
从上图可以看出进过这样的一种颜色查找法,可以很好的找出车牌区域。
在这个算法中,最难的一点,就是如何确定R,G,B的范围参数,说实在话,我的这个参数是进过不断尝试才得到的,在网上和相关书籍中,都没有人提出过一致的看法,参数各有不同,可见对于不同的图片,参数范围是不同的,并没有一致的参数。
1.2形态学操作
从以上的图中,我们很明显的知道,车牌区域以凸显出来了,之后的操作一定就要想办法如何去除杂点和‘丰富‘车牌区域了。
se=strel('
disk'
8,8);
bg1=imdilate(A8,se);
figure,imshow(bg1);
I2=imfill(bg1,'
holes'
figure,imshow(I2);
bw1=bwareaopen(I2,29000);
figure,imshow(bw1);
%去除面积小于29000的区域bw2=imclearborder(bw1);
figure,imshow(bw2);
%去除与边界相连的区域
1.3水平车牌区域切割
虽然我们看到上图中,所有杂点都去除了,但是这只是一个特例,在其它大多数图像中,到了以上那不,其实还有一些大于29000块的区域还在的,但他们都有一个共同的特点,就是都在车牌的上方并且不与车牌相连,在车牌下方的区域,则是相当‘干净‘的。
因此,我的想法是先从水平放向切割出车牌的水平区域,在进行下一步打算。
forx=1:
X(x)=sum(bw2(x,:
));
x=1:
m;
figure,plot(x,X(x));
fori=m:
-1:
1
ifX(i)~=0
PX2=i;
break;
forj=PX2-1:
ifX(j)~=0
continue;
elsePX1=j;
DW1=Y(PX1:
PX2,:
figure,imshow(DW1)
1.4垂直车牌区域切割
这段代码的原理与以上1.1到1.3步的原理一样,代码类似。
R1=DW1(:
G1=DW1(:
B1=DW1(:
[a,b]=size(R1);
a
b
if(R1(i,j)>
R1(i,j)<
(G1(i,j)>
G1(i,j)<
(B1(i,j)>
B1(i,j)<
A9(i,j)=1;
A9(i,j)=0;
figure,imshow(A9);
bg2=imdilate(A9,se);
figure,imshow(bg2)
I3=imfill(bg2,'
figure,imshow(I3)
bw3=bwareaopen(I3,29000);
figure,imshow(bw3)
fory=1:
Y(y)=sum(bw3(1:
a,y));
y=1:
b;
figure,plot(y,Y(y));
title('
´
¹
Ö
±
Í
¶
Ó
°
'
ifY(y)~=0
PY1=y;
fory=b:
PY2=y;
DW2=DW1(:
PY1:
PY2,:
figure,imshow(DW2);
1.5倾斜校正
使用雷登变换radon来进行校正,主要步骤为:
对图像进行1到180度的雷登变换,然后查找图上每条直线的最大的角度进行旋转就是。
具体代码在文章尾给出的全部代码中可以找到。
2.字符分割
字符分割的设计主要有三大块:
去除铆钉的粘连和不必要的杂点,车牌的再次精细定位,字符分割。
因此分别对以上的算法做一一的介绍。
2.1去除铆钉的粘连和不必要的杂点
此步的意义在于,使得我们的车牌字符切割时变得较为‘干净‘,并且运用垂直投影法切割时可以,很好的判断切割出来。
I1=rgb2gray(I);
J=rgb2hsv(I);
J=J(:
figure,imshow(J);
I20=im2bw(J,graythresh(J));
figure,imshow(I20);
bg10=bwareaopen(I20,2000);
figure,imshow(bg10);
[m,n]=find(bg10==1);
rowmin=min(m);
rowmax=max(m);
colummin=min(n);
colummax=max(n);
bg20=I1(rowmin:
rowmax,colummin:
colummax);
figure,imshow(bg20);
20);
bg0=imopen(bg20,se);
bg1=imsubtract(bg20,bg0);
figure,imshow(bg1);
bg1=imadjust(bg1);
I2=im2bw(bg1,0.7);
figure,imshow(I2);
II2=im2bw(bg1,graythresh(bg1));
figure,imshow(II2);
I2=imresize(I2,[120,420]);
II2=imresize(II2,[120,420]);
se=[1,1,1];
bg00=imerode(I2,se);
bw3=imclearborder(bg00);
bg2=bwareaopen(bw3,200);
se2=strel('
II=imdilate(bg2,se2);
[m,n]=find(II==1);
bg200=II(rowmin:
figure,imshow(bg200);
从以上可以看出,进过这样的处理后,右边的车牌字符的铆钉和杂点都去除的十分干净,虽然有些字符断裂了或丢失一部分,但切割字符时是以右边的进行垂直投影,而对左边的车牌进行切割的,所以不会使得字符丢失应有的信息。
2.2车牌的再次精细定位和垂直投影
这步的操作主要在于把车牌高度的大小定位为与字符高度一样,切割出的字符就可以大小相同
bg2000=II2(rowmin:
figure,imshow(bg2000);
[a,b]=size(bg200);
fory=1:
Y(y)=sum(bg200(1:
这样可以从投影图看出,到达此步时可以很容易的分割出每个字符了。
2.3字符分割
把分割出来的字符写入当前的目录下,有利于下一步字符识别的调用。
k=1;
figure;
7
fory=k:
ifY(y)~=0;
forx=PY1:
ifY(x)==0;
PY2=x;
end
ifi==7
bg4=bg2000(:
b,:
imwrite(bg4,strcat(num2str(7),'
.jpg'
))bg5=imresize(bg4,[90,40]);
subplot(1,7,7),imshow(bg4);
imwrite(bg4,strcat(num2str(i),'
bg5=imresize(bg4,[90,40]);
subplot(1,7,i),imshow(bg5);
k=PY2+1;
3.字符识别
此部分采用的是BP神经网络,主要有以下几步:
建立字符训练样本,建立BP网络训练,字符检测。
3.1建立字符训练样本
字符库在num文件夹内,把字符读入,进行相关处理后,存在p矩阵中,然后对应的输出为t字符。
在这里共有334个字符,包括汉字,字母和数字。
clearall
clc
forkk=0:
333
p1=ones(10,10);
m=strcat('
num\'
int2str(kk),'
x=imread(m);
rate=10/max(size(x));
I3=imresize(x,rate);
[i,j]=size(I3);
i1=round((10-i)/2);
j1=round((10-j)/2);
p1(i1+1:
i1+i,j1+1:
j1+j)=I3;
forhh=1:
10
p((hh-1)*10+1:
(hh-1)*10+10,kk+1)=p1(hh,1:
10);
switchkk
case{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
t(kk+1)=1;
case{16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34}
t(kk+1)=2;
case{35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50}
t(kk+1)=3;
case{51,52,53,54,55,56,57,58,59,60,61,62,63,64,65}
t(kk+1)=4;
case{66,67,68,69}
t(kk+1)=5;
case{70,71,72,73,74,75,76,77,78,79,80,81,82}
t(kk+1)=6;
case{83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104}
t(kk+1)=7;
case{105,106,107,108,109,110,111,112,113,114,115,116,117,118,119}
t(kk+1)=8;
case{120,121,122,123,124,125,126,127,128,129,130,131,132,133}
t(kk+1)=9;
case{134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152}
t(kk+1)=10;
case{153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187}
t(kk+1)=11;
case{188,189,190,191,192,193,194}
t(kk+1)=12;
case{195,196,197,198,199,200,201}
t(kk+1)=13;
case{202,203,204,205,206}
t(kk+1)=14;
case{207,208,209,210}
t(kk+1)=15;
case{211,212,213,214,215,216,217}
t(kk+1)=16;
case{218,219,220,221,222,223,224,225,226,227}
t(kk+1)=17;
case{228,229,230,231,232,233,234}
t(kk+1)=18;
case{235,236}
t(kk+1)=20;
case{237,238,239,240}
t(kk+1)=21;
case{241,242,243,244,245}
t(kk+1)=22;
case{246,247,248}
t(kk+1)=23;
case{249,250,251}
t(kk+1)=24;
case{252,253,254}
t(kk+1)=26;
case{255,256,257,258,259}
t(kk+1)=27;
case{260,261}
t(kk+1)=28;
case{262,263,264,265,266}
t(kk+1)=29;
case{267,268,269,270,271,272}
t(kk+1)=30;
case{273,274}
t(kk+1)=31;
case{275,276,277}
t(kk+1)=32;
case{278,279,280,281,282}
t(kk+1)=33;
case{283,284}
t(kk+1)=34;
case{285,286,287,288}
t(kk+1)=35;
case{289,290,291,292,293,294}
t(kk+1)=36;
case{295,296,297,298,299,300,301,302}
t(kk+1)=37;
case{303}
t(kk+1)=42;
case{304,305}
t(kk+1)=39;
case{306}
t(kk+1)=41;
case{307}
t(kk+1)=43;
case{308}
t(kk+1)=40;
case{309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333}
t(kk+1)=38;
save51ETpt;
3.2建立BP网络训练
在这里我们新建了一个BP神经网络,训练步数为10000,目标精确度为0.001,学习率为0.00001等,然后train(net,p,t)进行训练。
当达到目标后自会停止。
在当前路径下会出现
的文件,表示训练成功。
load51ETpt;
pr(1:
100,1)=0;
100,2)=1;
net.trainParam.epochs=10000;
net.trainParam.goal=0.001;
net.trainParam.show=10;
net.trainParam
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 matlab 车牌 识别 系统