《基于MATLAB的车牌识别程序详解..精要ppt课件.ppt》由会员分享,可在线阅读,更多相关《基于MATLAB的车牌识别程序详解..精要ppt课件.ppt(43页珍藏版)》请在三一办公上搜索。
1、基于MATLAB的车牌识别系统,小组成员: 张佰涛 刘强伟崔敏滕秀萍龚恒耿,车牌识别系统的摄像头通过对经过指定区域的机动车辆进行拍照,因为照片会受到光照、拍摄位置和车辆行驶速度的影响,导致拍摄的图片不能准确的确定汽车的车牌。而车牌识别系统就通过对机动车辆的照片进行图像预处理、车牌定位、字符分割、字符识别等技术手段,从而得到清晰的机动车牌照的照片,从而提高现代智能交通的管理效率,可以说车牌识别系统对于现代智能交通至关重要。,系统技术:,本系统应用图像处理技术、车牌分割技术、字符特征提取方法、神经网络识别技术,模板匹配的方法来解决车辆牌照识别问题。完整的车牌识别系统包括图像采集、图像处理、车牌定位
2、、字符分割、字符识别、数据库、数据库支持模块等模块。,一、图像处理:,本系统中图像处理主要分为几个步骤:图像预处理,图像增强,图像去噪,图像切割,图像提取等几个步骤。 (一)图像预处理 收集到的图片一般为彩色图片,由于彩色图片占用存储容量大,处理时间长,因此需要对图像进行灰度转换,将彩色图像转换为灰度图像,灰度图像只保留亮度信息,方便使用,也为后面的对图像进行二值化处理提供方便。 程序:I1=rgb2gray(I); rgb2gray,MATLAB中灰度图像转换函数,原图及处理后的灰度图显示如下,一、图像处理,(二)、图像增强: 图像增强是数字图像处理过程中经常采用的一种方法。为了改善视觉效果
3、或者便于人和机器对图像的理解和分析,根据图像的特点或存在的问题采取的改善方法或者加强特征的措施称为图像增强。 采集的图片受天气、光照、观察点等制约,往往会产生对比度不足,图像细节不清,另外,图像传输过程中也会产生失真,影响识别率。 图像增强的方法有:中值滤波、直方图均衡,灰度拉伸、通天滤波、高斯滤波、多图像平均、领域平均。腐蚀膨胀等。,一、图像处理,(二)、图像增强: 本系统中使用到的方法有:平均滤波,膨胀腐蚀,直方图均衡 直方图均衡 程序:figure(2),subplot(1,2,2),imhist(I1;title(灰度图直方图); imhist函数,用来提取灰度图中直方图信息,用来直方
4、图均衡,增强图像。 处理后的直方图显示如下:,一、图像处理,(二)、图像增强: 膨胀腐蚀 程序:I3=imerode(I2,se); imerode,MATLAB中的腐蚀函数 处理后的腐蚀图像显示如下:,(三)、图像的去噪: 通常使用2种方法:线性滤波、中值滤波。线性滤波可以去除图像中某些类型的噪声,本程序中采用平均滤波发:邻域平均法的均值滤波器就非常适用于去除通过扫描得到的图像中的颗粒噪声。经邻域平均后,噪声的均值不变,噪声方差变小,说明噪声强度减弱了,即抑制了噪声。邻域平均法也平滑了图像信号,特别是可能使图像目标区域的边界变得模糊。可以证明,对图像进行邻域平均处理相当于图像信号通过一低通滤
5、波器。,相关的MATLAB 指令: h=fspecial(average,3); ;%平均值的设定 d=im2bw(round(filter2(h,d);%平均滤波,(四)、图像的边缘检测: 边缘是图像的最本特征,边缘检测在计算机视觉、图像分析等应用中起着重要的作用,使图像识别与分析的重要环节。边缘存在于目标与背景、目标与目标、区域与区域之间因此它是图像分割、形状特征、纹理特征的基础。缘具有方向与幅度两个特征。沿边缘走向,像素变化比较平缓。而垂直于边缘走向,则像素变化剧烈。这种剧烈可能呈现阶跃状,也可能呈现斜坡状。边缘的上的像素的一 阶导数较大; 二阶导数在边缘检测处值为零,呈现零交叉。这种特
6、点使得边缘检测可以利用数学方法获得,经典的边缘检测算子有Roberts、Sobel、Prewitt、LoG、Canny算子。,本设计中采用Roberts算子其MATLAB指令:I2=edge(I1,robert,0.15,both);%使用robert算子进行边缘检测。%将灰度图像用Robert算子计算,间距0.15,方向水平,垂直两个方向,图像边缘处理,利用Robert算子运算,要先进行牌照的倾斜校正。由于牌照的上下沿是两条明显的平行直线,因此,一般都采用霍夫(Hough)变换,检测出这两条直线,然后对牌照进行校正 。,汽车牌照的定位,是指从摄入的汽车图像中找到汽车牌照所在的位置,并把含有车
7、牌的子区域提取出来。从编程实现的角度来看,就是针对某汽车图像,通过运行某个定位算法,确定车牌子区域的对角坐标。为了准确而快速的实现车牌的定位,人们提出了许多定位算法。这些算法大都基于汽车牌照的不同特征而提出的。这些特征包括:,(1)车牌区域内字符的纹理特征。(2)车牌的格式标准和字符标准信息。(3)车牌区域水平或者垂直投影特征。(4)车牌区域的位置特点。(5)车牌的彩色信息。(6)频谱特征。,处理方法主要分为两大块:行定位与列定位。具体方法如下: 获取特征图像 要想从一整幅包括车身,背景等其他相对于车牌来说属于干扰因素的图像中提取出车牌,就必须抓住车牌区域的最主要特征。车牌区域最主要的特征应该
8、是:车牌的底色和车牌字的颜色形成强烈对比,而且灰度变化频繁。 程序: Blue_y=zeros(y,1); for i=1:y for j=1:x if(myI(i,j,1)=1) Blue_y(i,1)= Blue_y(i,1)+1; end end end,temp MaxY=max(Blue_y) PY1=MaxY; while (Blue_y(PY1,1)=5),while (Blue_x(1,PX2)PX1) PX2=PX2-1; end PX1=PX1-1; PX2=PX2+1; dw=I(PY1:PY2-8,PX1:PX2,:); 通过以上的行 列扫描确定了车牌的区域,并将车牌提
9、取 出来,效果如下图,程序部分详解,(1)图像预处理 function d=main(jpg) close all clc I1=imread(car2.jpg);%读入图片 figure(1),imshow(I);title(原图)%显示输出一个图形窗口 I1=rgb2gray(I);%变为灰度图像,图像转换预处理 figure(2),subplot(1,2,1) (灰度图); title(灰度图) figure图片产生一行两列子图激活第1个格子图 此部分是图像预处理部分,将采集到的图像转换为灰度图像, 便于后面处理,同时显示原图的图片以及处理好的灰度图片。,(2)图像增强与边缘检测figu
10、re(2),subplot(1,2,2),imhist(I1;title(灰度图直方图);)%显示图像直方图,图像增强处理,直方图均衡I2=edge(I1,robert,0.15,both);%将灰度图像用Robert算子计算,间距0.15,方向水平,垂直两个方向,图像边缘处理,利用Robert算子运算figure(3),imshow(I2)%显示边缘处理后的;title(robert算子边缘检测)se=1;1;1;%创造一个维度矩阵,用于腐蚀单位扫描I3=imerode(I2,se);%将I3灰度腐蚀,se为腐蚀算子figure(4),imshow(I3);title(腐蚀后图像);%对裁剪
11、好的图像进行图像增强处理,利用腐蚀处理se=strel(rectangle,25,25);%构建一个25为边长的正方形结构体图,I4=imclose(I3,se);%对I3利用正方形结构图闭运算,平滑图片轮廓,修补缝隙;figure(5),imshow(I4);title(平滑图像的轮廓);I5=bwareaopen(I4,2000);%删掉原图的面积小于2000的不必要的小部分figure(6),imshow(I5);title(从对象中移除小对象);y,x,z=size(I5);%I5是移除小对象后的图像,将I5各维尺寸存储在X,Y,Z中myI=double(I5);%换成双精度数据。 首
12、先利用直方图,统计灰度图中像素灰度的信息,对此进行直方图均衡,增强图像,将直方图显示;利用robert算子进行边缘检测,对原图进行处理,然后创建一个维度矩阵,用来进行腐蚀操作,将图像进一步增强,然后对图像进行进一步修补,建立一个正方形结构图进行闭运算,修补轮廓,填补缝隙。由于原图中存在车标志等因素的干扰,因此要对干扰消除,删除掉不必要的小部分。 最后将最终图像的图像数据各个维度存储在数组中,转换为双精度为下面的行列扫描做准备。(3)车牌区域的确定与提取 tic%保存当前时间,用toc计算程序运行时间 Blue_y=zeros(y,1);%产生y*1的全零矩阵 for i=1:y%对应图片中像素
13、点横向坐标 for j=1:x%对应图片中像素点纵向坐标 if(myI(i,j,1)=1) %灰度图像中白色表示为全1,若myI=1,则表示是数字区域,进行行扫描,列不变,所以j不变 %利用行数加一循环统计蓝色像素点,Blue_y(i,1)= Blue_y(i,1)+1;%Blue_y第i行第一列数值加一,即若图片中出现白色点,将对应的位置横向坐标存放在变量中,保存数字区域行信息 end end end %确定数字区域,将数字区域所在行信息输入 Blue_y中temp MaxY=max(Blue_y);%Y方向车牌区域确定 temp为blue-y最大值所在位置,maxy为最大值 PY1=Max
14、Y; while (Blue_y(PY1,1)=5),while (Blue_y(PY2,1)=5) %Blue_y第i行第一列数值加一,即若图片中出现白色点,将对应的位置横向坐标存放在变量中,保存数字区域列信息 end end end%纵向扫描,进一步确定车牌区域,PX1=1; while (Blue_x(1,PX1)PX1) PX2=PX2-1; end %从下至上截取一段区域,区域下限位PY2 PX1=PX1-1;%对车牌区域的校正 PX2=PX2+1; dw=I(PY1:PY2-8,PX1:PX2,:);%车牌区域提取,考虑到车牌边框区域,进行剪切 t=toc; %计算程序运行时间fi
15、gure(7),subplot(1,2,1),imshow(IY),title(行方向合理区域);%显示行合适区域图片,将它放在第一个小图位置,figure(7),subplot(1,2,2),imshow(dw),title(定位剪切后的彩色车牌图像)%显示车牌区域,放到第二个小图 imwrite(dw,dw.jpg);%将图像数据写入图像文件中 figure(8);subplot(3,2,1),imshow(b),title(1.车牌灰度图像)%产生3行两列子图,将灰度图放到第一个小图位置 通过运用for循环来进行行列扫描,将图片中数字部分所在的行 列信息付给变量,对变量的操作来完成对图片
16、车牌区域的提取。 (4)图像的二值化 灰度图像是有256个灰度级的单色图像,多级别的图像能够呈现出较为丰富的明暗度,但对于目标搜索来说,总是希望尽可能地减少背景像素的干扰,而保存或增强目标区的色素度。图像的二值化可把像素的灰度级分成黑与白二级,即把原灰度图像转化为二值图像,方便目标区域的处理。,本程序中采用的是基于纹理的全局二值化方法,先确定一个最佳阀值,通过对图片像素点和阀值的比较来实现图像的二值化。 程序:g_max=double(max(max(b);%最大值换为双精度数据 g_min=double(min(min(b);%最小值换位双精度数据 T=round(g_max-(g_max-
17、g_min)/3); % T 为二值化的阈值,g_max表 示车牌中二值最大点,g_min表示黑色像素点最小值,两个相减除以三,再用g_max减去,取中间值作为判断标准阀值过小,则干扰也算在内,正常显示受影响 m,n=size(b);%返回矩阵b中的数值保存在m n中 d=(double(b)=T); % d:如果满足条件,像素点置1,不满足,则为0,即满足条件的白色像素点不变,不满足的置为0,黑色 imwrite(d,2.车牌二值图像.jpg);%数据写入图像文件中 figure(8);subplot(3,2,2),imshow(d),title(2.车牌二值图像)%将二值图像放到第一行第二
18、个处 figure(8),subplot(3,2,3),imshow(d),title(3.均值滤波前)%将均值滤波前图像放到第三个处,两次取最值并转换为双精度数据,是为了保证数据的准确性,程序中T为阀值,T的指由实验得来,通过与T值的比较,若大于T,则为白色像素点,若小于T,则为背景黑色像素点,实现图像的二值化,实现对目标区域的处理。(5)图像去噪 由于在图像的采集过程中,受硬件或是各种因素的影响,图像中会出现随机的或是非线性的噪声,使得图像受到污染,因此图像的去噪是必须的。对车牌图像进行处理,通常采用空间域法对车牌图像滤波,目的是去除图像中的噪声,通常使用2种方法:线性滤波、中值滤波。本程
19、序中使用的是线性滤波。 程序:h=fspecial(average,3);%建立预定义的均值滤波算子,相应的参数为3d=im2bw(round(filter2(h,d); %将d用建立好的算子h进行滤波,用round函数进行四舍五入,数据精确,然后用im2bw函数将灰度图转换为二值图imwrite(d,4.均值滤波后.jpg);%将数据写入图像文件,figure(8),subplot(3,2,4),imshow(d),title(4.均值滤波后)%将图像放入第四个小图位置(6)图像增强 这次的图像增强运用的是膨胀腐蚀操作,对二值化图像进行膨胀腐蚀操作,若先腐蚀后膨胀的过程:利用它可以消除小物体
20、,在纤细点处分离物体,平滑较大物体边界,但同时并不会明显改变原来物体的面积。而先膨胀后腐蚀的过程:利用它可以填充物体内细小空洞,连接临近物体、平滑其边界,但同时并不会明显改变原来物体的面积。本程序中利用的是先腐蚀后膨胀,消除了小物体,平滑了较大物体的轮廓 。 程序:se=eye(2); % 建立一个小的二值单位矩阵,用来与处理图像进行比较m,n=size(d);%返回矩阵d的尺寸,存储在m,n中,m表示的为行数,n为列数if bwarea(d)/m/n=0.365%计算二值图像中对象的总面积与整个面积的比是否大于0.365? d=imerode(d,se);%对d图符合要求的实现腐蚀操作,el
21、seif bwarea(d)/m/n=0.235%计算二值图像中对象的总面积与整个面积的比是否小于0.365 d=imdilate(d,se);%对d图实现膨胀操作end%先腐蚀后膨胀,消除小物体,平滑较大物体边界imwrite(d,5.膨胀或腐蚀处理后.jpg);%将数据写入d图当中figure(8),subplot(3,2,5),imshow(d),title(5.膨胀或腐蚀处理后)%在第五个位置显示出d图通过先腐蚀后膨胀的操作,将原图进行了进一步的图像增强处理。将膨胀腐蚀后的图片显示。(7)图像切割 自定义一个切割函数,利用横向扫描和纵向扫描确定黑色像素点区域边界,将区域裁剪掉,保留原图
22、中白色边框区域。,程序:function e=qiege(d)m,n=size(d);top=1;bottom=m;left=1;right=n; % initwhile sum(d(top,:)=0 ,endwhile sum(d(:,right)=0 ,while j=n%从第一列开始 while s(j)=0%当图像中全为黑色像素点 j=j+1;%列加一 end k1=j; while s(j)=0 % 将两个字符中间的干扰赋零,消除干扰,进行下一次切割 end end,经过上述程序处理,已经把车牌区域提取出来,并且对车牌区域内部可能存在的干扰也已消除,接下来就是将车牌中7个字符提取出来
23、 程序:d=qiege(d);%防止上面出现两个字符连在一起,处理后变乱,故再次切割% 切割出 7 个字符y1=10;y2=0.25;flag=0;word1=;while flag=0 m,n=size(d);%将d的尺寸赋给m n left=1;wide=0; while sum(d(:,wide+1)=0 %当d图中列的和不全为零时 wide=wide+1;%如果d图像素列中存在白色像素点,纵向扫描,列数加一 end if widey1 % 认为是左侧干扰 d(:,1:wide)=0;%将干扰全部消除,赋零,d=qiege(d);%再次调用切割函数,剪切剩下的区域(去掉干扰后) else
24、 temp=qiege(imcrop(d,1 1 wide m);%第一行,第一列,右边界为wide,下边界为m m,n=size(temp);%将temp尺寸赋给m n all=sum(sum(temp);%对temp二次求和加强精度,赋给all two_thirds=sum(sum(temp(round(m/3):2*round(m/3),:); if two_thirds/ally2%如果two_thirds占到all的四分之一,认为是字符 flag=1;word1=temp; % WORD 1将字符一赋给word1,flag等于1,改变flag初值,避免再次进入while大循环,将wi
25、de值破坏 end d(:,1:wide)=0;d=qiege(d);%人为地将Word1 改变为黑色像素点,这样就可以用切割函数切割掉,为下一个字符做准备, %可以循环切割提取字符,如果不对Word1赋黑,Word1将进行切割进入下一循环,造成重复切割 endend,自定义一个字符函数,用来从车牌区域中提取出7个字符,其中利用切割函数来进行切割。程序:function word,result=getword(d)word=;flag=0;y1=8;y2=0.5; while flag=0 m,n=size(d);%将d的尺寸存入m n wide=0; while sum(d(:,wide+1
26、)=0 %将1到wide行赋一,消除干扰,if sum(sum(d)=0%二次求和,加强精度,如果还不等于零,干扰未完全消除,再次切割 d=qiege(d); else word=;flag=1;%不作处理,改变flag初值为了避免再次进入大循环,破坏wide值 end else%全为有用区域,即数字区域 word=qiege(imcrop(d,1 1 wide m);%将第一个字符切割出来,赋给Word d(:,1:wide)=0;%人为地将第一个字符赋零,调用切割函数切割掉,避免重复切割 if sum(sum(d)=0;%加强精度,如果二次求和还不为0,再次切割,改变flag初值为了避免再
27、次进入大循环,破坏wide值 d=qiege(d);flag=1; else d=; end,end endend result=d;%结果为d图 运用这个getword函数就可以提取7个字符,调用getword函数word2,d=getword(d); % 分割出第二个字符word3,d=getword(d); % 分割出第三个字符word4,d=getword(d); % 分割出第四个字符word5,d=getword(d); % 分割出第五个字符word6,d=getword(d); % 分割出第六个字符word7,d=getword(d); % 分割出第七个字符subplot(5,7,
28、1),imshow(word1),title(1);subplot(5,7,2),imshow(word2),title(2);subplot(5,7,3),imshow(word3),title(3);subplot(5,7,4),imshow(word4),title(4);subplot(5,7,5),imshow(word5),title(5);,subplot(5,7,6),imshow(word6),title(6);subplot(5,7,7),imshow(word7),title(7);m,n=size(word1);然后对图像进行缩放处理,运用imresize函数进行缩放w
29、ord1=imresize(word1,40 20);%图像缩放函数,将图片缩放为40 20比例word2=imresize(word2,40 20);word3=imresize(word3,40 20);word4=imresize(word4,40 20);word5=imresize(word5,40 20);word6=imresize(word6,40 20);word7=imresize(word7,40 20);,subplot(5,7,15),imshow(word1),title(1);subplot(5,7,16),imshow(word2),title(2);subpl
30、ot(5,7,17),imshow(word3),title(3);subplot(5,7,18),imshow(word4),title(4);subplot(5,7,19),imshow(word5),title(5);subplot(5,7,20),imshow(word6),title(6);subplot(5,7,21),imshow(word7),title(7);imwrite(word1,1.jpg);imwrite(word2,2.jpg);imwrite(word3,3.jpg);imwrite(word4,4.jpg);imwrite(word5,5.jpg);imwri
31、te(word6,6.jpg);imwrite(word7,7.jpg);,最终将提取出的字符以及缩放完的字符显示出来,缩放的字符大小统一,利于识别。(8)图像字符识别(1)首先输入实际图片数据,为下面的和字符模板作对比做准备。 liccode=char(0:9 A:Z 苏豫陕鲁); %建立自动识别字符代码表 SubBw2=zeros(40,20);%建立一个40行 20列的零矩阵l=1;for I=1:7 ii=int2str(I);%将I把整形转换成字符串,(将7个字符转换为字符串) t=imread(ii,.jpg); SegBw2=imresize(t,40 20,nearest);
32、%图像缩放中改变图像尺寸时采用最近邻插值算法 if l=1 %第一位汉字识别 kmin=37; %预先建立好的字库,37到40号位置为汉字的位置 kmax=40; elseif l=2 %第二位 AZ 字母识别,kmin=11; %26个大写字母和十位数字,预先建立好的字库 kmax=36; else l=3 %第三位以后是字母或数字识别 kmin=1; kmax=36; %实际图片部分 end%实际图片输入(2)字符模板输入对比 for k2=kmin:kmax %范围 kmin到kmax fname=strcat(字符模板,liccode(k2),.jpg);%将kmin到kmax的范围的
33、字符提取出来,给予字符模板的名字(字符串横向连接),循环重复提取需要的部分 SamBw2 = imread(fname)%将fname数据读入Sambw2中; for i=1:40 for j=1:20 SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);%将模板和实际图做对比,end end % 以上相当于两幅图相减得到第三幅图(3)处理对比结果 Dmax=0; for k1=1:40 for l1=1:20 if ( SubBw2(k1,l1) 0 | SubBw2(k1,l1) 0 )%只要subBw2不等于零 Dmax=Dmax+1;%统计不相符的像素点 end e
34、nd end Error(k2)=Dmax;%对比完后不匹配的像素点 end,Error1=Error(kmin:kmax); MinError=min(Error1); findc=find(Error1=MinError);%通过最小错误的计算,寻找最匹配的字符 Code(l*2-1)=liccode(findc(1)+kmin-1);%将找到的字符位置与字库中的位置连接上 Code(l*2)= ;%为了美观显示空格 l=l+1;endfigure(10),imshow(dw),title (车牌号码:, Code,Color,b); 最后将车牌区域的原图(彩色图)输出,就完成了车牌识别的
35、目的,程序中所使用的Matlab 函数imread%读取图片中的数据rgb2gray%灰度转换函数imshow%显示图像imhist%获取图像数据直方图strel%构造结构体函数imclose%对图片进行闭操作edge%自动选择阈值用Roberts算子进行边缘检测imerode%图像腐蚀函数bwareaopen%删除图像中小对象函数imwrite%将图像数据写入图片文件中fspecial%用于建立预定义的滤波算子im2bw%将灰度图像转换为二值图像bwarea%计算二值图像中对象的总面积imdilate%图像膨胀函数imresize%对图像进行缩放处理,结论: 应用到车载动态图像采集与识别中,识别率则大为下降,主要原因是天气、环境、照明、速度、车辆状况及拍摄距离等诸多因素都是变化的,所得到图像存在着大量的噪声和变形, 影响了识别率。因此,该系统若用于高速公路行驶车辆牌照的实时识别还需进一步改进。,The Ending,