车牌识别的matlab程序
- 格式:docx
- 大小:22.49 KB
- 文档页数:10
基于matlab的车牌识别系统一、对车辆图像进行预处理1.载入车牌图像:function [d]=main(jpg)[filename, pathname] = uigetfile({'*.jpg', 'JPEG 文件(*.jpg)'});if(filename == 0), return, endglobal FILENAME %定义全局变量FILENAME = [pathname filename];I=imread(FILENAME);figure(1),imshow(I);title('原图像');%将车牌的原图显示出来结果如下:2.将彩图转换为灰度图并绘制直方图:I1=rgb2gray(I);%将彩图转换为灰度图figure(2),subplot(1,2,1),imshow(I1);title('灰度图像');figure(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');%绘制灰度图的直方图结果如下所示:3. 用roberts算子进行边缘检测:I2=edge(I1,'roberts',0.18,'both');%选择阈值0.18,用roberts算子进行边缘检测figure(3),imshow(I2);title('roberts 算子边缘检测图像');结果如下:4.图像实施腐蚀操作:se=[1;1;1];I3=imerode(I2,se);%对图像实施腐蚀操作,即膨胀的反操作figure(4),imshow(I3);title('腐蚀后图像');5.平滑图像se=strel('rectangle',[25,25]);%构造结构元素以正方形构造一个seI4=imclose(I3,se);% 图像聚类、填充图像figure(5),imshow(I4);title('平滑图像');结果如下所示:6. 删除二值图像的小对象I5=bwareaopen(I4,2000);% 去除聚团灰度值小于2000的部分figure(6),imshow(I5);title('从对象中移除小的对象');结果如下所示:二、车牌定位[y,x,z]=size(I5);%返回I5各维的尺寸,存储在x,y,z中myI=double(I5);%将I5转换成双精度tic %tic表示计时的开始,toc表示计时的结束Blue_y=zeros(y,1);%产生一个y*1的零阵for i=1:yfor j=1:xif(myI(i,j,1)==1)%如果myI(i,j,1)即myI的图像中坐标为(i,j)的点值为1,即该点为车牌背景颜色蓝色 %则Blue_y(i,1)的值加1Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计endendend[temp MaxY]=max(Blue_y);%Y方向车牌区域确定%temp为向量white_y的元素中的最大值,MaxY为该值的索引PY1=MaxY;while ((Blue_y(PY1,1)>=5)&&(PY1>1))PY1=PY1-1;endPY2=MaxY;while ((Blue_y(PY2,1)>=5)&&(PY2<y))PY2=PY2+1;endIY=I(PY1:PY2,:,:);%x方向车牌区域确定%%%%%% X方向 %%%%%%%%%Blue_x=zeros(1,x);%进一步确定x方向的车牌区域for j=1:xfor i=PY1:PY2if(myI(i,j,1)==1)Blue_x(1,j)= Blue_x(1,j)+1; endendendPX1=1;while ((Blue_x(1,PX1)<3)&&(PX1<x))PX1=PX1+1;endPX2=x;while ((Blue_x(1,PX2)<3)&&(PX2>PX1))PX2=PX2-1;endPX1=PX1-1;%对车牌区域的校正PX2=PX2+1;dw=I(PY1:PY2-8,PX1:PX2,:);t=toc;figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域');%行方向车牌区域确定figure(7),subplot(1,2,2),imshow(dw),title('定位裁剪后的车牌彩色图像');的车牌区域如下所示:三、字符分割及处理1.车牌的进一步处理对分割出的彩色车牌图像进行灰度转换、二值化、均值滤波、腐蚀膨胀以及字符分割以从车牌图像中分离出组成车牌号码的单个字符图像,对分割出来的字符进行预处理(二值化、归一化),然后分析提取,对分割出的字符图像进行识别给出文本形式的车牌号码。
如何使用Matlab技术进行车牌识别车牌识别技术是一种在现代交通管理、安保等领域应用广泛的技术。
通过使用Matlab软件,我们可以轻松实现车牌识别功能。
本文将介绍如何使用Matlab技术进行车牌识别。
一、图像预处理在进行车牌识别之前,首先需要对图像进行预处理。
图像预处理的目的是提取车牌信息并减小噪声干扰。
在Matlab中,我们可以使用一系列图像处理函数来实现图像预处理,包括图像二值化、边缘检测、形态学操作等。
这些函数可以帮助我们提取车牌轮廓,并去除背景和噪声。
二、车牌定位车牌定位是车牌识别的关键步骤之一。
通过车牌定位,我们可以找到图像中的车牌区域,并将其与其他区域进行区分。
在Matlab中,可以使用图像分割、形态学滤波等技术来实现车牌定位。
这些技术可以帮助我们提取车牌的形状、颜色和纹理等特征,并将其与其他区域进行区分。
三、字符分割一旦我们成功地定位了车牌区域,就需要将车牌中的字符进行分割。
字符分割是车牌识别中的一个重要环节。
通过将车牌中的字符进行分割,我们可以得到单个字符的图像,为后续的字符识别做准备。
在Matlab中,可以使用一系列图像处理函数来实现字符分割,包括边缘检测、连通性分析和投影分析等。
这些函数可以帮助我们将车牌中的字符与其他区域进行分离。
四、字符识别字符识别是车牌识别的核心任务。
通过对字符进行识别,我们可以得到车牌中的文本信息。
在Matlab中,可以使用模式识别、神经网络或者深度学习等技术来实现字符识别。
这些技术可以帮助我们训练一个分类器,将字符图像与对应的字符进行匹配。
通过匹配算法,我们可以得到车牌的文本信息。
五、车牌识别结果展示在进行车牌识别之后,我们可以将识别结果进行展示。
通过将识别结果与原始图像进行对比,我们可以验证车牌识别的准确性。
在Matlab中,可以使用图像绘制函数和文本显示函数来实现车牌识别结果的展示。
通过这些函数,我们可以在原始图像中标注出识别结果,并将结果显示在图像上。
clcclearclose allI=imread('chepai.jpg');subplot(3,2,1);imshow(I), title('原始图像');I_gray=rgb2gray(I);subplot(3,2,2),imshow(I_gray),title('灰度图像');%====================== 形态学预处理======================I_edge=edge(I_gray,'sobel');subplot(3,2,3),imshow(I_edge),title('边缘检测后图像');se=[1;1;1];I_erode=imerode(I_edge,se);subplot(3,2,4),imshow(I_erode),title('腐蚀后边缘图像');se=strel('rectangle',[25,25]);I_close=imclose(I_erode,se); %图像闭合、填充图像subplot(3,2,5),imshow(I_close),title('填充后图像');I_final=bwareaopen(I_close,2000); %去除聚团灰度值小于2000的部分subplot(3,2,6),imshow(I_final),title('形态滤波后图像');%========================== 车牌分割============================= I_new=zeros(size(I_final,1),size(I_final,2));location_of_1=[];for i=1:size(I_final,1) %寻找二值图像中白的点的位置for j=1:size(I_final,2)if I_final(i,j)==1;newlocation=[i,j];location_of_1=[location_of_1;newlocation];endendendmini=inf;maxi=0;for i=1:size(location_of_1,1)%寻找所有白点中,x坐标与y坐标的和最大,最小的两个点的位置temp=location_of_1(i,1)+location_of_1(i,2);if temp<minimini=temp;a=i;endif temp>maximaxi=temp;b=i;endendfirst_point=location_of_1(a,:); %和最小的点为车牌的左上角last_point=location_of_1(b,:); %和最大的点为车牌的右下角x1=first_point(1)+4; %坐标值修正x2=last_point(1)-4;y1=first_point(2)+4;y2=last_point(2)-4;I_plate=I(x1:x2,y1:y2);I_plate=OTSU(I_plate); %以OTSU算法对分割出的车牌进行自适应二值化处理I_plate=bwareaopen(I_plate,50);figure,imshow(I_plate),title('车牌提取') %画出最终车牌%========================= 字符分割============================X=[]; %用来存放水平分割线的横坐标flag=0;for j=1:size(I_plate,2)sum_y=sum(I_plate(:,j));if logical(sum_y)~=flag %列和有变化时,记录下此列X=[X j];flag=logical(sum_y);endendfigurefor n=1:7char=I_plate(:,X(2*n-1):X(2*n)-1); %进行粗分割for i=1:size(char,1) %这两个for循环对分割字符的上下进行裁剪if sum(char(i,:))~=0top=i;breakendendfor i=1:size(char,1)if sum(char(size(char,1)-i,:))~=0bottom=size(char,1)-i;breakendendchar=char(top:bottom,:);subplot(2,4,n);imshow(char);char=imresize(char,[32,16],'nearest'); %归一化为32*16的大小,以便模板匹配eval(strcat('Char_',num2str(n),'=char;')); %将分割的字符放入Char_i中end%========================== 字符识别============================= char=[];store1=strcat('京','津','沪','渝','冀','晋','辽','吉','黑','苏','浙'... %汉字识别,'皖','闽','赣','鲁','豫','鄂','湘','粤','琼','川','贵','云','陕'...,'甘','青','藏','桂','皖','新','宁','港','鲁','蒙');for j=1:34Im=Char_1;Template=imread(strcat('chinese\',num2str(j),'.bmp')); %chinese文件附在最后Template=im2bw(Template);Differ=Im-Template;Compare(j)=sum(sum(abs(Differ)));endindex=find(Compare==(min(Compare)));char=[char store1(index)];store2=strcat('A','B','C','D','E','F','G','H','J','K','L','M','M','N','P','Q','R'...,'S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9');for i=2:7 %字母数字识别for j=1:35Im=eval(strcat('Char_',num2str(i)));Template=imread(strcat('cha&num\',num2str(j),'.bmp')); %cha&num文件附在最后Template=im2bw(Template);Differ=Im-Template;Compare(j)=sum(sum(abs(Differ)));endindex=find(Compare==(min(Compare)));char=[char store2(index)];endfigure,imshow(I),title(strcat('车牌为:',char))信研-11 XX 2011301XXXXXX模式识别作业—车牌识别1、作业要求:要求:任给一幅符合假定的图片,自动识别出车牌号。
k=input('Enter the file name:','s');%输入车牌照片im=imread(k);imshow(im);im_gray=rgb2gray(im);im_gray=medfilt2(im_gray,[3,3]);%对图像进行中值滤波Image=im2bw(im_gray,0.2);BW=edge(im_gray,'sobel');%找出图像边缘[imx,imy]=size(BW);%计算图像大小msk=[0 0 0 0 0;0 1 1 1 0;0 1 1 1 0;0 1 1 1 0;0 0 0 0 0;];B0=conv2(double(BW),double(msk));%对边缘区域进行加强se=ones(2,80);B1=imdilate(B0,se);%figure;%imshow(B1);B2=imerode(B1,se);%figure;%imshow(B2);se=ones(20,2);B3=imdilate(B2,se);%figure;imshow(B3);B4=imerode(B3,se);%figure;imshow(B4);se=ones(50,2);B5=imdilate(B4,se);%figure;imshow(B5);B6=imerode(B5,se);%figure;imshow(B6);%对边界图进行小区域连通,使车牌区域连通为一个方块[B,L]=bwboundaries(B6,4);imshow(label2rgb(L,@jet,[.5 .5 .5]))%对连通区域进行标记hold onfor k=1:length(B)%用线条给连通区域标上边界线boundary=B{k};plot(boundary(:,2),boundary(:,1),'w','LineWidth',2)endstats=regionprops(L,'Area','Centroid');%找到每个连通域的质心for k=1:length(B)%循环遍历每个连通域的边界boundary=B{k};%获取一条边界上的所有点delta_sq=diff(boundary).^2;perimeter=sum(sqrt(sum(delta_sq,2)));%计算边界周长area=stats(k).Area;%获取边界所围面积metric=27*area/perimeter^2;%计算匹配度metric_string=sprintf('%2.2f',metric);%要显示的匹配度字串if metric>=0.85&&metric<=1.15&&area>1000%截取出匹配度接近1且面积大于1000像素的连通域centroid=stats(k).Centroid;plot(centroid(1),centroid(2),'ko');%提取该连通域所对应在二值图像中的矩形区域goalboundary=boundary;s=min(goalboundary,[],1);e=max(goalboundary,[],1);goal=imcrop(Image,[s(2) s(1) e(2)-s(2) e(1)-s(1)]);endtext(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','g','FontSize',14,'FontWeight','bold') ;%显示匹配度字串endgoal=~goal;%对截取图像进行反色处理figure;imshow(goal);[a,b]=size(goal);for i=a/2:-1:1 %从图像水平中轴开始向上扫描,当白点数少于每行总点数的1/10时,停止扫描,并将该行定义为车牌字符区域的上限num=0;for j=1:bif goal(i,j)==1num=num+1;endendif num<(b*0.1)line_up=i;break;endendfor i=a/2:a %从图像水平中轴开始向下扫描,当白点数少于每行总点数的1/10时,停止扫描,并将该行定义为车牌字符区域的下限num=0;for j=1:bif goal(i,j)==1num=num+1;endendif num<(b*0.1)line_down=i;break;endendgoal=goal(line_up:line_down,1:b);%根据之前定义的上下限截取车牌字符区域figure;imshow(goal);%显示车牌字符区域[a,b]=size(goal);row=zeros(18);now=1;flag=0;for j=1:b %对截取出的字符区域进行竖列扫描,并取每列总点数的1/10作为阈值点,当每列的白点数从阈值以上掉落到阈值以下或从阈值以下上升到阈值以上时,记录该列的横坐标num=0;for i=1:aif goal(i,j)==1num=num+1;endendif flag==0if num<0.1*arow(now)=j;now=now+1;flag=1;endelseif num>0.1*arow(now)=j;now=now+1;flag=0;endendendif row(3)-row(2)>10 %判断扫描出的第二块区域(扫描到的第二列与第三列之间)是否包含有效字符,如包含,则将扫描到的第二列定义为字符分割的起始列;否则,则定义第一列为起始列now=2;elsenow=1;endfigure;l1=0;l2=0;for k=1:8m=row(now);n=row(now+1);temp=goal(1:a,m:n);point=0;%扫描每一个字符图片的白点数for i=1:afor j=1:n-mif temp(i,j)==1point=point+1;endendendif point>0.4*a*(n-m)&&n>m %当扫描到的白点数小于总点数的2/5时放弃输出(有可能是车牌上的点状分隔符)l2=l2+1;%l2用来记录识别出的字符数subplot(1,7,l2);x(k)=code(temp);%调用子程序进行字符扫描,并返回字符的ASCII码x(k)=uint8(x(k));if x(k)>0 %当所选区域不为空时进行输出l1=l1+1;%l1用来记录输出的字符数s(l1)=char(x(k));endtemp(32,32)=0;imshow(temp);endnow=now+2;endy=char(s);%将得到的ASCII码重新转换为字符并在屏幕上输出fprintf('\r\n该车辆的车牌号为:\r\n');disp(y);fprintf('\r\n输出的字符数为:%4d\r\n',l1);fprintf('识别出的字符数为:%4d\r\n',l2);。
目录1.引言 (2)2.设计概述 (3)2.1车牌识别技术 (3)2.2 车牌识别技术的发展 (3)2.3 车牌识别技术的国内外研究现状 (4)2.4 主要应用领域 (6)3.设计方案 (7)4.车牌识别系统的matlab实现 (8)4.1 图像的读取 (8)4.2 图像预处理 (9)4.2.1灰度变换 (9)4.2.2 图像校正 (10)4.3 牌照分割 (10)4.3.1 图像边缘提取及二值化 (11)4.3.2 BP神经网络 (14)4.4 车牌提取 (15)5.设计结果及分析 (16)5.1程序运行结果 (16)5.2程序结果分析 (17)总结体会 (18)参考文献 (19)附录1 (20)附录2 (28)1.引言伴随着世界各国车辆数量的增加,城市交通状况日益受到人们的重视。
如何有效地进行交通管理,越来越成为各国政府的相关部门所关注的焦点。
针对这一问题,人们运行先进的信息处理技术、导航定位技术、无线通信技术、自动控制技术、图像处理和识别技术及计算机网络技术等科学技术,相继研发了各种交通道路监视管理系统、车辆控制系统及公共交通系统。
这些系统将车辆和道路综合起来进行考虑,运行各种先进的技术解决道路交通的问题,统称为智能交通系统( Intelligent Transportation System,简称ITS)。
ITS 是20世纪90年代兴起的新一代交通运输系统。
它可以加强道路、车辆、驾驶员和管理人员的联系,实现道路交通管理自动化和车辆行驶的智能化,增强交通安全,减少交通堵塞,提高运输效率,减少环境污染,节约能源,提高经济活力。
智能交通系统以车辆的自动检测作为信息的来源,因而对车牌照等相关信息的自动采集和处理的一门新的交通信息获取技术——车牌识别(License Plate Recognition ,LPR) 技术逐渐发展起来,成为信息处理技术的一项重要研究课题。
车牌自动识别是智能交通管理系统中的关键技术之一。
附录车牌识别程序clear ;close all;%Step1 获取图像装入待处理彩色图像并显示原始图像Scolor = imread('3.jpg');%imread函数读取图像文件%将彩色图像转换为黑白并显示Sgray = rgb2gray(Scolor);%rgb2gray转换成灰度图figure,imshow(Scolor),title('原始彩色图像');%figure命令同时显示两幅图figure,imshow(Sgray),title('原始黑白图像');%Step2 图像预处理对Sgray 原始黑白图像进行开操作得到图像背景s=strel('disk',13);%strel函数Bgray=imopen(Sgray,s);%打开sgray s图像figure,imshow(Bgray);title('背景图像');%输出背景图像%用原始图像与背景图像作减法,增强图像Egray=imsubtract(Sgray,Bgray);%两幅图相减figure,imshow(Egray);title('增强黑白图像');%输出黑白图像%Step3 取得最佳阈值,将图像二值化fmax1=double(max(max(Egray)));%egray的最大值并输出双精度型fmin1=double(min(min(Egray)));%egray的最小值并输出双精度型level=(fmax1-(fmax1-fmin1)/3)/255;%获得最佳阈值bw22=im2bw(Egray,level);%转换图像为二进制图像bw2=double(bw22);%Step4 对得到二值图像作开闭操作进行滤波figure,imshow(bw2);title('图像二值化');%得到二值图像grd=edge(bw2,'canny')%用canny算子识别强度图像中的边界figure,imshow(grd);title('图像边缘提取');%输出图像边缘bg1=imclose(grd,strel('rectangle',[5,19]));%取矩形框的闭运算figure,imshow(bg1);title('图像闭运算[5,19]');%输出闭运算的图像bg3=imopen(bg1,strel('rectangle',[5,19]));%取矩形框的开运算figure,imshow(bg3);title('图像开运算[5,19]');%输出开运算的图像bg2=imopen(bg3,strel('rectangle',[19,1]));%取矩形框的开运算figure,imshow(bg2);title('图像开运算[19,1]');%输出开运算的图像%Step5 对二值图像进行区域提取,并计算区域特征参数。
《基于MATLAB的车牌识别系统研究》篇一一、引言随着科技的发展,车牌识别系统在交通管理、安全监控、车辆定位等领域的应用越来越广泛。
MATLAB作为一种强大的编程语言和数据处理工具,被广泛应用于图像处理和机器视觉等领域。
本文旨在研究基于MATLAB的车牌识别系统,包括系统的基本原理、实现方法、实验结果和结论。
二、车牌识别系统的基本原理车牌识别系统是一种基于图像处理和机器视觉技术的自动识别系统。
其主要原理包括图像预处理、车牌定位、字符分割和字符识别四个部分。
在MATLAB中,这些过程通过数字图像处理算法、计算机视觉算法以及机器学习算法实现。
(一)图像预处理图像预处理是车牌识别系统的第一步,主要目的是消除图像中的噪声和干扰信息,提高图像的清晰度和对比度,以便后续的图像处理和分析。
常用的预处理方法包括灰度化、二值化、滤波等。
(二)车牌定位车牌定位是车牌识别系统的关键步骤,其主要目的是从图像中准确地检测出车牌的位置。
常用的车牌定位方法包括基于颜色特征的方法、基于形状特征的方法和基于模板匹配的方法等。
在MATLAB中,可以通过边缘检测、Hough变换等方法实现车牌的定位。
(三)字符分割字符分割是将车牌图像中的每个字符分割出来的过程。
常用的字符分割方法包括投影法、连通域法等。
在MATLAB中,可以通过图像形态学操作、阈值分割等方法实现字符的分割。
(四)字符识别字符识别是将分割后的字符进行分类和识别的过程。
常用的字符识别方法包括模板匹配法、神经网络法等。
在MATLAB中,可以通过训练分类器、使用机器学习算法等方法实现字符的识别。
三、车牌识别系统的实现方法在MATLAB中,我们可以通过编写程序实现车牌识别系统的各个步骤。
具体实现方法如下:(一)图像预处理首先,对输入的图像进行灰度化和二值化处理,消除噪声和干扰信息。
然后,通过滤波等操作提高图像的清晰度和对比度。
(二)车牌定位通过边缘检测和Hough变换等方法检测出车牌的轮廓,并确定车牌的位置。
科技与创新┃Science and Technology &Innovation·20·2020年第14期文章编号:2095-6835(2020)14-0020-03基于MATLAB 平台下的车牌识别系统设计楚天鸿1,唐瑞尹2(1.华北理工大学电气工程学院,河北唐山063210;2.北华航天工业学院电子与控制工程学院,河北廊坊065000)摘要:科技的快速发展使汽车成为现代社会的重要代步工具,促生了新一代的智能交通系统,车牌识别技术作为智能交通的基石,为交通管理提供了技术支撑,使人们的驾车出行更为方便快捷。
将车牌识别与计算机软件相结合,在MATLAB 平台下,运用数字图像处理技术,对采集到的车辆图像进行相关操作,完成了对汽车牌照的定位和字符的分割。
同时,将改进后的模板匹配识别方法运用到字符识别中,使系统正确识别出车牌字符,实现了自动识别汽车牌照的目的。
关键词:车牌识别;MATLAB ;图像处理;模板匹配中图分类号:TP391.41文献标识码:ADOI :10.15913/ki.kjycx.2020.14.006自2013年起,中国汽车保有量逐年递增,2019年中国汽车保有量已经达到2.6亿辆,与2018年相比增长了8.83%。
这足以说明汽车已经成为民众生活中不可或缺的工具,给人们的出行带来方便的同时也给交通带来了巨大压力,建立一个完善的智能交通系统的需求愈发强烈。
计算机相关的科学技术迅猛发展以及现代网络科技的广泛应用,带动智能信息化功能处理技术不断完善,同时为现代汽车管理手段提供了新思路和新方案[1]。
汽车牌照是每辆汽车特有的身份证明,而车牌识别系统也成为了高速路、小区门禁、停车场等场所的必备工具,在交通管制等方面发挥着重要的作用。
车牌识别技术主要包括车牌定位、字符分割、字符识别三个部分[2],通过对采集到的车辆图像进行相关处理就可成功获取车牌号码,完成车牌识别。
本文在MATLAB 软件平台下,设计车牌识别系统,对小型汽车蓝底白字的车牌图像进行相关处理,实现车牌识别功能。
学位申请人:指导教师:学科专业:软件工程 学位类别:工学学士2012年 06月 题目:基于Matlab 的车牌二值化、阈值分割西安工业大学毕业设计(论文)任务书院(系)计算机学院专业软件工程班080605 姓名陈章权学号0806051011.毕业设计(论文)题目:基于Matlab车牌自动识别技术的研究与实现2.题目背景和意义:车牌识别是现代智能交通系统中的重要组成部分之一,应用十分广泛。
它以数字图像处理、模式识别、计算机视觉等技术基础,对摄像机所拍摄的车辆图像或者视频序列进行分析,得到每一辆汽车唯一的车牌号码,从而完成识别过程。
通过一些后续处理手段可以实现停车场收费管理、交通流量控制指标测量,车辆定位,汽车防盗,高速公路超速自动化监管等等功能。
对于维护交通安全和城市治安,防止交通堵塞,实现交通自动化管理有着现实的意义。
3.设计(论文)的主要内容:要求学生使用Matlab工具对车牌识别进行开发。
主要研究内容包括:(1)图像数据采集和预处理(2)二值化研究(3)系统实现和效果评价4.设计的基本要求及进度安排(含起始时间、设计地点):要求熟悉数字图像处理的基本知识,熟悉matlab编程毕业设计的进度安排如下:1~3周:准备所需资料,详细设计,开题报告,准备开题答辩。
4~12周:完成界面设计开发,详细设计,编程及调试。
13~15周:系统测试。
16~17周:书写毕业设计论文。
18周:改进完善,提交毕业论文,准备答辩。
5.毕业设计(论文)的工作量要求:*或实习(天数):18周①实验(时数)*:无②图纸(幅面和张数)③其他要求:毕业论文不少于15000字。
指导教师签名:年月日学生签名:年月日系(教研室)主任审批:年月日说明:1本表一式二份,一份由学生装订入附件册,一份教师自留。
2 带*项可根据学科特点选填。
毕I-2基于Matlab的车牌自动识别技术的研究与实现摘要车牌识别是现代智能交通系统中的重要组成部分之一,应用十分广泛。
Matlab 程序设计任务书分院(系)信息科学与工程专业学生姓名学号设计题目车牌识别系统设计内容及要求:车牌定位系统的目的在于正确获取整个图像中车牌的区域,并识别出车牌号。
通过设计实现车牌识别系统,能够提高学生分析问题和解决问题的能力,还能培养一定的科研能力。
1.牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。
2.当车辆检测部分检测到车辆到达时 , 触发图像采集单元,采集当前的视频图像。
3.牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。
进度安排:19 周: Matlab 环境熟悉与基础知识学习19周:课程设计选题与题目分析20周:程序设计编程实现20周:课程设计验收与答辩指导教师(签字):学院院长(签字):年月日年月日目录一.课程设计目的⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯3二.设计原理⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯3三.详细设计步骤⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯3四.设计结果及分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯18五.总结⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯19六.设计体会⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯20七.参考文献⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯21一、课程设计目的车牌定位系统的目的在于正确获取整个图像中车牌的区域,并识别出车牌号。
通过设计实现车牌识别系统,能够提高学生分析问题和解决问题的能力,还能培养一定的科研能力。
二、设计原理 :牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。
其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。
某些牌照识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。
一个完整的牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。
附录车牌识别程序clear ;close all;%Step1 获取图像装入待处理彩色图像并显示原始图像Scolor = imread('3.jpg');%imread函数读取图像文件%将彩色图像转换为黑白并显示Sgray = rgb2gray(Scolor);%rgb2gray转换成灰度图figure,imshow(Scolor),title('原始彩色图像');%figure命令同时显示两幅图figure,imshow(Sgray),title('原始黑白图像');%Step2 图像预处理对Sgray 原始黑白图像进行开操作得到图像背景s=strel('disk',13);%strel函数Bgray=imopen(Sgray,s);%打开sgray s图像figure,imshow(Bgray);title('背景图像');%输出背景图像%用原始图像与背景图像作减法,增强图像Egray=imsubtract(Sgray,Bgray);%两幅图相减figure,imshow(Egray);title('增强黑白图像');%输出黑白图像%Step3 取得最佳阈值,将图像二值化fmax1=double(max(max(Egray)));%egray的最大值并输出双精度型fmin1=double(min(min(Egray)));%egray的最小值并输出双精度型level=(fmax1-(fmax1-fmin1)/3)/255;%获得最佳阈值bw22=im2bw(Egray,level);%转换图像为二进制图像bw2=double(bw22);%Step4 对得到二值图像作开闭操作进行滤波figure,imshow(bw2);title('图像二值化');%得到二值图像grd=edge(bw2,'canny')%用canny算子识别强度图像中的边界figure,imshow(grd);title('图像边缘提取');%输出图像边缘bg1=imclose(grd,strel('rectangle',[5,19]));%取矩形框的闭运算figure,imshow(bg1);title('图像闭运算[5,19]');%输出闭运算的图像bg3=imopen(bg1,strel('rectangle',[5,19]));%取矩形框的开运算figure,imshow(bg3);title('图像开运算[5,19]');%输出开运算的图像bg2=imopen(bg3,strel('rectangle',[19,1]));%取矩形框的开运算figure,imshow(bg2);title('图像开运算[19,1]');%输出开运算的图像%Step5 对二值图像进行区域提取,并计算区域特征参数。
close allclc[fn,pn,fi]=uigetfile('ChePaiKu\*.jpg','选择图片');YuanShi=imread([pn fn]);%输入原始图像figure(1);subplot(3,2,1),imshow(YuanShi),title('原始图像');%%%%%%%%%%1、图像预处理%%%%%%%%%%%YuanShiHuiDu=rgb2gray(YuanShi);%转化为灰度图像subplot(3,2,2),imshow(YuanShiHuiDu),title('灰度图像');BianYuan=edge(YuanShiHuiDu,'robert',0.09,'both');%Robert算子边缘检测subplot(3,2,3),imshow(BianYuan),title('Robert算子边缘检测后图像');se1=[1;1;1]; %线型结构元素FuShi=imerode(BianYuan,se1); %腐蚀图像subplot(3,2,4),imshow(FuShi),title('腐蚀后边缘图像');se2=strel('rectangle',[30,30]); %矩形结构元素TianChong=imclose(FuShi,se2);%图像聚类、填充图像subplot(3,2,5),imshow(TianChong),title('填充后图像');YuanShiLvBo=bwareaopen(TianChong,2000);%从对象中移除面积小于2000的小对象figure(2);subplot(2,2,1),imshow(YuanShiLvBo),title('形态滤波后图像');%%%%%%%%%%2、车牌定位%%%%%%%%%%%[y,x]=size(YuanShiLvBo);%size函数将数组的行数返回到第一个输出变量,将数组的列数返回到第二个输出变量YuCuDingWei=double(YuanShiLvBo);%%%%%%%%%%2.1、车牌粗定位之一确定行的起始位置和终止位置%%%%%%%%%%%Y1=zeros(y,1);%产生y行1列全零数组for i=1:yfor j=1:xif(YuCuDingWei(i,j)==1)Y1(i,1)= Y1(i,1)+1;%白色像素点统计endendend[temp,MaxY]=max(Y1);%Y方向车牌区域确定。
基于Matlab的车牌识别摘要:车牌识别技术是智能交通系统的重要组成部分,在近年来得到了很大的发展。
本文从预处理、边缘检测、车牌定位、字符分割、字符识别五个方面,具体介绍了车牌自动识别的原理。
并用MATLAB软件编程来实现每一个部分,最后识别出汽车车牌。
一、设计原理车辆车牌识别系统的基本工作原理为:将摄像头拍摄到的包含车辆车牌的图像通过视频卡输入到计算机中进行预处理,再由检索模块对车牌进行搜索、检测、定位,并分割出包含车牌字符的矩形区域,然后对车牌字符进行二值化并将其分割为单个字符,然后输入JPEG或BMP格式的数字,输出则为车牌号码的数字。
车牌自动识别是一项利用车辆的动态视频或静态图像进行车牌号码、车牌颜色自动识别的模式识别技术。
其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。
某些车牌识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。
一个完整的车牌识别系统应包括车辆检测、图像采集、车牌识别等几部分。
当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。
车牌识别单元对图像进行处理,定位出车牌位置,再将车牌中的字符分割出来进行识别,然后组成车牌号码输出。
二、设计步骤总体步骤为:基本的步骤:a.车牌定位,定位图片中的车牌位置;b.车牌字符分割,把车牌中的字符分割出来;c.车牌字符识别,把分割好的字符进行识别,最终组成车牌号码。
车牌识别过程中,车牌颜色的识别依据算法不同,可能在上述不同步骤实现,通常与车牌识别互相配合、互相验证。
(1)车牌定位:自然环境下,汽车图像背景复杂、光照不均匀,如何在自然背景中准确地确定车牌区域是整个识别过程的关键。
首先对采集到的视频图像进行大范围相关搜索,找到符合汽车车牌特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳的区域作为车牌区域,并将其从图象中分割出来。
附录车牌识别程序clear ;close all;%Step1 获取图像装入待处理彩色图像并显示原始图像Scolor = imread('3.jpg');%imread函数读取图像文件%将彩色图像转换为黑白并显示Sgray = rgb2gray(Scolor);%rgb2gray转换成灰度图figure,imshow(Scolor),title('原始彩色图像');%figure命令同时显示两幅图figure,imshow(Sgray),title('原始黑白图像');%Step2 图像预处理对Sgray 原始黑白图像进行开操作得到图像背景s=strel('disk',13);%strel函数Bgray=imopen(Sgray,s);%打开sgray s图像figure,imshow(Bgray);title('背景图像');%输出背景图像%用原始图像与背景图像作减法,增强图像Egray=imsubtract(Sgray,Bgray);%两幅图相减figure,imshow(Egray);title('增强黑白图像');%输出黑白图像%Step3 取得最佳阈值,将图像二值化fmax1=double(max(max(Egray)));%egray的最大值并输出双精度型fmin1=double(min(min(Egray)));%egray的最小值并输出双精度型level=(fmax1-(fmax1-fmin1)/3)/255;%获得最佳阈值bw22=im2bw(Egray,level);%转换图像为二进制图像bw2=double(bw22);%Step4 对得到二值图像作开闭操作进行滤波figure,imshow(bw2);title('图像二值化');%得到二值图像grd=edge(bw2,'canny')%用canny算子识别强度图像中的边界figure,imshow(grd);title('图像边缘提取');%输出图像边缘bg1=imclose(grd,strel('rectangle',[5,19]));%取矩形框的闭运算figure,imshow(bg1);title('图像闭运算[5,19]');%输出闭运算的图像bg3=imopen(bg1,strel('rectangle',[5,19]));%取矩形框的开运算figure,imshow(bg3);title('图像开运算[5,19]');%输出开运算的图像bg2=imopen(bg3,strel('rectangle',[19,1]));%取矩形框的开运算figure,imshow(bg2);title('图像开运算[19,1]');%输出开运算的图像%Step5 对二值图像进行区域提取,并计算区域特征参数。
进行区域特征参数比较,提取车牌区域[L,num] = bwlabel(bg2,8);%标注二进制图像中已连接的部分Feastats = imfeature(L,'basic');%计算图像区域的特征尺寸Area=[Feastats.Area];%区域面积BoundingBox=[Feastats.BoundingBox];%[x y width height]车牌框架大小RGB = label2rgb(L, 'spring', 'k', 'shuffle'); %标志图像向RGB图像转换figure,imshow(RGB);title('图像彩色标记');%输出框架的彩色图像lx=0;for l=1:numwidth=BoundingBox((l-1)*4+3);%框架宽度的计算hight=BoundingBox((l-1)*4+4);%框架高度的计算if (width>98 & width<160 & hight>25 & hight<50)%框架的宽度和高度的范围lx=lx+1;Getok(lx)=l;endendfor k= 1:lxl=Getok(k);startcol=BoundingBox((l-1)*4+1)-2;%开始列startrow=BoundingBox((l-1)*4+2)-2;%开始行width=BoundingBox((l-1)*4+3)+8;%车牌宽hight=BoundingBox((l-1)*4+4)+2;%车牌高rato=width/hight;%计算车牌长宽比if rato>2 & rato<4break;endendsbw1=bw2(startrow:startrow+hight,startcol:startcol+width-1); %获取车牌二值子图subcol1=Sgray(startrow:startrow+hight,startcol:startcol+width-1 );%获取车牌灰度子图figure,subplot(2,1,1),imshow(subcol1);title('车牌灰度子图');%输出灰度图subplot(2,1,2),imshow(sbw1);title('车牌二值子图');%输出车牌的二值图%Step6 计算车牌水平投影,并对水平投影进行峰谷分析histcol1=sum(sbw1); %计算垂直投影histrow=sum(sbw1'); %计算水平投影figure,subplot(2,1,1),bar(histcol1);title('垂直投影(含边框)');%输出垂直投影subplot(2,1,2),bar(histrow); title('水平投影(含边框)');%输出水平投影figure,subplot(2,1,1),bar(histrow); title('水平投影(含边框)');%输出水平投影subplot(2,1,2),imshow(sbw1);title('车牌二值子图');%输出二值图%对水平投影进行峰谷分析meanrow=mean(histrow);%求水平投影的平均值minrow=min(histrow);%求水平投影的最小值levelrow=(meanrow+minrow)/2;%求水平投影的平均值count1=0;l=1;for k=1:hightif histrow(k)<=levelrowcount1=count1+1;elseif count1>=1markrow(l)=k;%上升点markrow1(l)=count1;%谷宽度(下降点至下一个上升点)l=l+1;endcount1=0;endendmarkrow2=diff(markrow);%峰距离(上升点至下一个上升点)[m1,n1]=size(markrow2);n1=n1+1;markrow(l)=hight;markrow1(l)=count1;markrow2(n1)=markrow(l)-markrow(l-1);l=0;for k=1:n1markrow3(k)=markrow(k+1)-markrow1(k+1);%下降点markrow4(k)=markrow3(k)-markrow(k);%峰宽度(上升点至下降点)markrow5(k)=markrow3(k)-double(uint16(markrow4(k)/2));%峰中心位置end%Step7 计算车牌旋转角度%(1)在上升点至下降点找第一个为1的点[m2,n2]=size(sbw1);%sbw1的图像大小[m1,n1]=size(markrow4);%markrow4的大小maxw=max(markrow4);%最大宽度为字符if markrow4(1) ~= maxw%检测上边ysite=1;k1=1;for l=1:n2for k=1:markrow3(ysite)%从顶边至第一个峰下降点扫描if sbw1(k,l)==1xdata(k1)=l;ydata(k1)=k;k1=k1+1;break;endendendelse %检测下边ysite=n1;if markrow4(n1) ==0if markrow4(n1-1) ==maxwysite= 0; %无下边elseysite= n1-1;endendif ysite ~=0k1=1;for l=1:n2k=m2;while k>=markrow(ysite) %从底边至最后一个峰的上升点扫描if sbw1(k,l)==1xdata(k1)=l;ydata(k1)=k;k1=k1+1;break;endk=k-1;endendendend%(2)线性拟合,计算与x夹角fresult = fit(xdata',ydata','poly1'); %poly1 Y = p1*x+p2p1=fresult.p1;angle=atan(fresult.p1)*180/pi; %弧度换为度,360/2pi, pi=3.14 %(3)旋转车牌图象subcol = imrotate(subcol1,angle,'bilinear','crop'); %旋转车牌图象sbw = imrotate(sbw1,angle,'bilinear','crop');%旋转图像figure,subplot(2,1,1),imshow(subcol);title('车牌灰度子图');%输出车牌旋转后的灰度图像标题显示车牌灰度子图subplot(2,1,2),imshow(sbw);title('');%输出车牌旋转后的灰度图像title(['车牌旋转角: ',num2str(angle),'度'] ,'Color','r');%显示车牌的旋转角度%Step8 旋转车牌后重新计算车牌水平投影,去掉车牌水平边框,获取字符高度histcol1=sum(sbw); %计算垂直投影histrow=sum(sbw'); %计算水平投影figure,subplot(2,1,1),bar(histcol1);title('垂直投影(旋转后)');subplot(2,1,2),bar(histrow); title('水平投影(旋转后)');figure,subplot(2,1,1),bar(histrow); title('水平投影(旋转后)');subplot(2,1,2),imshow(sbw);title('车牌二值子图(旋转后)');%去水平(上下)边框,获取字符高度maxhight=max(markrow2);findc=find(markrow2==maxhight);rowtop=markrow(findc);rowbot=markrow(findc+1)-markrow1(findc+1);sbw2=sbw(rowtop:rowbot,:); %子图为(rowbot-rowtop+1)行maxhight=rowbot-rowtop+1; %字符高度(rowbot-rowtop+1) %Step9 计算车牌垂直投影,去掉车牌垂直边框,获取车牌及字符平均宽度histcol=sum(sbw2); %计算垂直投影figure,subplot(2,1,1),bar(histcol);title('垂直投影(去水平边框后)');%输出车牌的垂直投影图像subplot(2,1,2),imshow(sbw2); %输出垂直投影图像title(['车牌字符高度:',int2str(maxhight)],'Color','r');%输出车牌字符高度%对垂直投影进行峰谷分析meancol=mean(histcol);%求垂直投影的平均值mincol=min(histcol);%求垂直投影的平均值levelcol=(meancol+mincol)/4;%求垂直投影的1/4count1=0;l=1;for k=1:widthif histcol(k)<=levelcolcount1=count1+1;elseif count1>=1markcol(l)=k; %字符上升点markcol1(l)=count1; %谷宽度(下降点至下一个上升点)l=l+1;endcount1=0;endendmarkcol2=diff(markcol);%字符距离(上升点至下一个上升点)[m1,n1]=size(markcol2);n1=n1+1;markcol(l)=width;markcol1(l)=count1;markcol2(n1)=markcol(l)-markcol(l-1);%Step10 计算车牌上每个字符中心位置,计算最大字符宽度maxwidth l=0;for k=1:n1markcol3(k)=markcol(k+1)-markcol1(k+1);%字符下降点markcol4(k)=markcol3(k)-markcol(k); %字符宽度(上升点至下降点)markcol5(k)=markcol3(k)-double(uint16(markcol4(k)/2));%字符中心位置endmarkcol6=diff(markcol5); %字符中心距离(字符中心点至下一个字符中心点)maxs=max(markcol6); %查找最大值,即为第二字符与第三字符中心距离findmax=find(markcol6==maxs);markcol6(findmax)=0;maxwidth=max(markcol6);%查找最大值,即为最大字符宽度%Step11 提取分割字符,并变换为22行´14列标准子图l=1;[m2,n2]=size(subcol);figure;for k=findmax-1:findmax+5cleft=markcol5(k)-maxwidth/2;cright=markcol5(k)+maxwidth/2-2;if cleft<1cleft=1;cright=maxwidth;endif cright>n2cright=n2;cleft=n2-maxwidth;endSegGray=sbw(rowtop:rowbot,cleft:cright);SegBw1=sbw(rowtop:rowbot,cleft:cright);SegBw2 = imresize(SegBw1,[22 14]);%变换为22行´14列标准子图subplot(2,n1,l),imshow(SegGray);if l==7title(['车牌字符宽度:',int2str(maxwidth)],'Color','r');endsubplot(2,n1,n1+l),imshow(SegBw2);fname=strcat('c:\work\sam\image',int2str(k),'.jpg');imwrite(SegBw2,fname,'jpg')l=l+1;end%Step12 将计算计算获取的字符图像与样本库进行匹配,自动识别出字符代码。