最新车牌识别系统MATLAB源代码完整解析
实验报告用MATLAB实现车牌识别系统
图像处理大作业实验报告--用MATLAB实现车牌识别系统作者东南大学电子系李浩翔06006435指导老师张雄实验日期2010-1-10索引:实验目的实验原理实验步骤1.预处理2.边缘识别3.小区块联通4.车牌区域的识别并截取5.字符截取6.字符识别实验思路分析本程序的局限性附录附录1 程序源代码1.主程序2.子函数(code)附录2 测试图像处理过程汇总1.测试图像12.测试图像2附录3 参考文献及参考程序实验目的(返回索引)使用MATLAB对包含车牌的图片进行处理,利用算法识别出车牌所在的区域,并辨认其数字及字母,最后在屏幕上输出所识别出的车牌号。
实验原理(返回索引)1.将拍摄下的彩色图像转换为灰度图,之后用中值滤波对灰度图像进行预处理,从而减少干扰信息。
2.使用sobel算子识别出图像的边缘,并转化为二值化图像。
并对二值化之后的图像进行卷积,加强边缘的轮廓。
3.用膨胀-再腐蚀的方法分别作用于图像的横轴与纵轴,将小块的联通区域连接起来,使车牌的形状更加清晰,为下一步的识别做好准备。
4.利用车牌长宽比的特性对各个联通区域进行判断,识别出车牌所在区域,并截取。
5.对截取出的车牌区域进行进一步的处理,分割出各个字符。
6.对分割出的字符进行特征判断,从而识别出具体的车牌号。
实验步骤(返回索引)1.预处理(返回索引)A. 将拍摄下的彩色图像转换为灰度图,便于进行接下来的算法处理。
图1 拍摄下的图片B.对灰度图进行中值滤波,减少干扰点对二值化运算结果的影响。
图3 进行中值滤波后的灰度图C.将中值滤波后的灰度图用设定门限灰度的方法(取门限值为0.2)转化为二值化图像,在后继的车牌区域截取运算中作为源图像使用。
图4 使用设定灰度门限的方法获得的二值化图像2.边缘识别(返回索引)A.利用sobel算子识别出图3中的边缘区域,并将其转换为二值化图像。
在转换后的二值化图像中,边缘区域被作为白点标出,而非边缘区域被黑色区域覆盖。
matlab车牌号码识别程序代码资料
( 4)字符识别:对分割出来的字符进行预处理(二值化、归一化),然后分析 提取,对分割出的字符图像进行识别给出文本形式的车牌号码。
4 汽车牌照识别系统的 matlab实现 4.1 图像预处理与车牌定位
输入的彩色图像包含大量颜色信息, 会占用较多的存储空间, 且处理时也会 降低系统的执行速度, 因此对图像进行识别等处理时, 常将彩色图像转换为灰度 图像,以加快处理速度。对图像进行灰度化处理、边缘提取、再利用形态学方法 对车牌进行定位。 具体步骤如下: 首先对图像进行灰度转换, 二值化处理然后采 用 4X1的结构元素对图像进行腐蚀,去除图像的噪声。采用 25X25的结构元素, 对图像进行闭合应算使车牌所在的区域形成连通。 在进行形态学滤波去除其它区 域。
Px0=Px1; End
4.3 车牌字符识别
字符识别方法主要有基于模板匹配算法和基于人工神经网络算法。基于模 板匹配算法是首先将分割后的字符二值化 ,并将其尺寸缩放为字符数据库中模板 的大小, 然后与所有模板进行匹配, 最后选取最佳匹配作为结果。 建立数字库对 该方法在车牌识别过程中很重要 , 数字库准确才能保证检测出的数据正确。 基于 人工神经元网络的算法有两种, 一种是先对特征提取待识别字符, 然后用所获得 的特征训练神经网络分配器; 另一种是直接将待处理图像输入网络由网络自动实 现特征提取直至识别结果。 在本程序中用基于人工神经元网络识别车牌字符。 在 车牌字符识别部分 , 字符集中包含约 50个汉字 , 26个大写英文字母及 10个阿拉伯 数字。总的字符样本并不太多。
% 4.2 车牌字符分割
% 确定车牌位置后下一步的任务就是进行字符切分分离出车牌号码的全部字 符图像 。
if isrgb(dw)
I1 = rgb2gray(dw);
基于MATLAB的车牌识别系统的源代码(可以实现)
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);。
(完整版)MATLAB车牌识别
目录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) 技术逐渐发展起来,成为信息处理技术的一项重要研究课题。
车牌自动识别是智能交通管理系统中的关键技术之一。
(完整word版)基于Matlab的车牌识别实现源码
(完整word版)基于Matlab的车牌识别实现源码function[]=main(jpg)close allclctic %测定算法执行的时间[fn,pn]=uigetfile('timg1,jpg','选择图片') %读入图片I=imread([pn,fn]);figure,imshow(I);title('原始图像'); %显示原始图像Im1=rgb2gray(I);figure(2),subplot(1,2,1),imshow(Im1);title('灰度图');figure(2),subplot(1,2,2),imhist(Im1);title('灰度图的直方图'); %显示图像的直方图Tiao=imadjust(Im1,[0.19,0.78],[0,1]); %调整图片figure(3),subplot(1,2,1),imshow(Tiao);title('增强灰度图');figure(3),subplot(1,2,2),imhist(Tiao);title('增强灰度图的直方图');Im2=edge(Tiao,'Roberts','both'); %使用sobel算子进行边缘检测figure(4),imshow(Im2);title('sobel算子实现边缘检测')se=[1;1;1];Im3=imerode(Im2,se);figure(5),imshow(Im3);se=strel('square',40);%'rectangle',[25,25]/'diamond',25/Im4=imclose(Im3,se);figure(6),imshow(Im4);title('平滑图像的轮廓');Im5=bwareaopen(Im4,1500);figure(7),imshow(Im5);title('移除小对象');[y,x,z]=size(Im5); %返回Im5各维的尺寸,并存储在变量y、x、z中Im6=double(Im5); %将Im5换成双精度数值%开始横向扫描tic %tic计时开始,toc结束,计算tic与toc之间程序的运行时间Blue_y=zeros(y,1); %产生y*1的全0矩阵for i=1:y %逐行扫描for j=1:xif(Im6(i,j,1)==1)%如果Im6图像中坐标为(i,j)的点值为1,即为移除小对象的白色区域,Blue_y(i,1)= Blue_y(i,1)+1;%则y*1列矩阵的相应像素点的元素值加1,endendend[temp MaxY]=max(Blue_y);%temp为向量Blue_y的矩阵中的最大值,MaxY为该值的索引(最大值在向量中的位置)%返回包含最大元素的列,即白色区域最宽的列%Y方向车牌区域确定figure(8),subplot(1,2,1),plot(0:y-1,Blue_y),title('行方向白色像素点累计'),xlabel('行数'),ylabel('个数');PY1=MaxY;while ((Blue_y(PY1,1)>=120)&&(PY1>1))PY1=PY1-1;endPY2=MaxY;while ((Blue_y(PY2,1)>=40)&&(PY2<y))< p="">PY2=PY2+1;IY=I(PY1:PY2,:,:);%IY为原始图像I中截取的纵坐标在PY1:PY2之间的部分%横向扫描完成,开始纵向扫描Blue_x=zeros(1,x);%进一步确定x方向的车牌区域for j=1:x %逐列扫描for i=PY1:PY2if(Im6(i,j,1)==1)Blue_x(1,j)= Blue_x(1,j)+1; %根据Im5的x值确定endendendfigure(8),subplot(1,2,2),plot(0:x-1,Blue_x),title('列方向白色像素点累计'),xlabel('列数'),ylabel('个数'); PX1=1;while ((Blue_x(1,PX1)<3)&&(PX1<x))< p="">PX1=PX1+1;endPX2=x;while ((Blue_x(1,PX2)<3)&&(PX2>PX1))PX2=PX2-1;end%end纵向扫描PX1=PX1-2;%对车牌区域的校正PX2=PX2+2;dw=I(PY1:PY2,PX1:PX2,:);t=toc;figure(9),subplot(1,2,1),imshow(IY),title('垂直方向合理区域');figure(9),subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像') imwrite(dw,'dw.jpg'); %将图像写入图形文件中a=imread('dw.jpg');b=rgb2gray(a);imwrite(b,'车牌灰度图像.jpg');figure(10);subplot(3,2,1),imshow(b),title('1.车牌灰度图像')g_max=double(max(max(b)));g_min=double(min(min(b)));T=round(g_max-(g_max-g_min)/3); %T为设定的二值化的阈值,返回一个四舍五入的整数值[m,n]=size(b);d=(double(b)>=T); %d为二值图像imwrite(d,'车牌二值图像.jpg');figure(10);subplot(3,2,2),imshow(d),title('2.车牌二值图像')figure(10),subplot(3,2,3),imshow(d),title('3.均值滤波前')h=fspecial('average',3);%建立预定义的滤波算子,average为均值滤波,模板尺寸为3*3d=imbinarize(round(filter2(h,d))); %im2bw,使用指定的滤波器h对h进行d即均值滤波imwrite(d,'均值滤波后.jpg');figure(10),subplot(3,2,4),imshow(d),title('4.均值滤波后')se=eye(2);%单位矩阵[m,n]=size(d); %d为二值图像,返回信息矩阵if bwarea(d)/m/n>=0.365%二值图像中对象的总面积与整个面积的比大于0.365d=imerode(d,se);%进行腐蚀elseif bwarea(d)/m/n<=0.235%二值图像中对象的总面积与整个面积的比值小于0.235 d=imdilate(d,se);%进行膨胀endimwrite(d,'膨胀或腐蚀处理后.jpg');figure(10),subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后.jpg')d=qiege(d); %切割,寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割k1=1;k2=1;s=sum(d);j=1;while j~=nwhile s(j)==0j=j+1;endk1=j;while s(j)~=0 && j<=n-1j=j+1;endk2=j-1;if k2-k1>=round(n/6.5)[val,num]=min(sum(d(:,[k1+5:k2-5])));d(:,k1+num+5)=0;endendd=qiege(d);y1=10;y2=0.25;flag=0;word1=[];while flag==0[m,n]=size(d);wide=0;while sum(d(:,wide+1))~=0 %扫过的地方不全为黑色,向右移动,直到不是停止wide=wide+1;endif wide<="" p="">d(:,[1:wide])=0;%将此片区域全部转化为黑色,d=qiege(d);%重新切割elsetemp=qiege(imcrop(d,[1 1 wide m]));%返回已经切割好的区域[m,n]=size(temp);all=sum(sum(temp));%统计切割区域所有元素two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:)));%统计切割区域1/3至2/3行所有元素if two_thirds/all>y2 flag=1;word1=temp;endd(:,[1:wide])=0;d=qiege(d);end[word2,d]=getword(d); %分割出第二个字符[word3,d]=getword(d); %分割出第三个字符[word4,d]=getword(d); %分割出第四个字符[word5,d]=getword(d); %分割出第五个字符[word6,d]=getword(d); %分割出第六个字符[word7,d]=getword(d); %分割出第七个字符word1=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]);figure(11);subplot(2,7,1),imshow(word1),title('1');subplot(2,7,2),imshow(word2),title('2');subplot(2,7,3),imshow(word3),title('3');subplot(2,7,4),imshow(word4),title('4');subplot(2,7,5),imshow(word5),title('5');subplot(2,7,6),imshow(word6),title('6');subplot(2,7,7),imshow(word7),title('7');imwrite(word1,'1.jpg');imwrite(word2,'2.jpg');imwrite(word3,'3.jpg');imwrite(word4,'4.jpg');imwrite(word5,'5.jpg');imwrite(word6,'6.jpg');imwrite(word7,'7.jpg');liccode=char(['0':'9' 'A':'Z' '辽粤豫鄂鲁陕京津苏浙']);%建立自动识别字符代码表,将t'0':'9' 'A':'Z' '鲁陕苏豫'多个字符串组成一个字符数组,每行对应一个字符串,字符数不足的自动补空格SubBw2=zeros(40,20);%40*20的零矩阵l=1;ii=int2str(I);%整型转换字符串t=imread([ii,'.jpg']);SegBw2=imresize(t,[40 20],'nearest');%改变图片的大小SegBw2=double(SegBw2)>50;%将灰度图转化为二值图像,double产生0-255的灰度值if l==1 %第一位汉字识别kmin=37;kmax=46;%模板中汉字所在的位置elseif l==2 %第二位字母识别kmin=11;kmax=36;%A-Z字母位置elsel>=3 %第三位后字母或数字识别kmin=1;kmax=36;endfor k2=kmin:kmaxfname=strcat('字符模板\',liccode(k2),'.jpg');SamBw2=imread(fname);SamBw2=double(SamBw2)>50;%将模板转换为二值图,double产生0-255的灰度值for i=1:40for j=1:20SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);endend%相当于两幅图相减得第三幅图Dmax=0;for k1=1:40for l1=1:20if abs(SubBw2(k1,l1))>0Dmax=Dmax+1;endendendError(k2)=Dmax;endError1=Error(kmin:kmax);%模板对应的字符模板进行匹配选择findc=find(Error1==MinError);Code(l*2-1)=liccode(findc(1)+kmin-1);Code(l*2)=' ';l=l+1;endmsgbox(Code,'识别结果')function [word,result]=getword(d) %定义分割字符用函数(1)word=[];flag=0;y1=8;y2=0.5;while flag==0[m,n]=size(d);wide=0;while sum(d(:,wide+1))~=0 && wide<=n-2wide=wide+1;endtemp=imcrop(d,[1 1 wide m]);%用于返回图像的一个裁剪区域[m1,n1]=size(temp);z=sum(temp,2);count=0;for i=1:m1if z(i)~=0count=count+1;endendif count<="" p="">d(:,[1,wide])=0;d=qiege(d);elsetemp=qiege(imcrop(d,[1 1 wide m]));%用于返回图像的一个裁剪区域[m1,n1]=size(temp);if widey2 %宽度过小,或长大于宽的两倍d(:,[1,wide])=0;if sum(sum(d))~=0 %d中所有元素之和d=qiege(d);%切割出最小范围elseword=[];flag=1;endword=qiege(imcrop(d,[1 1 wide m]));%划分出的temp进行切割d(:,[1:wide])=0;%切割完后该区域变为黑色if sum(sum(d))~=0d=qiege(d);flag=1;elsed=[];endendendendresult=d;function e=qiege(d) %定义分割字符用函数(2)[m,n]=size(d);top=1;bottom=m;left=1;right=n; %intewhile sum(d(top,:))==0 && top<=mtop=top+1;endwhile sum(d(bottom,:))==0 && bottom>=1 bottom=bottom-1;endwhile sum(d(:,left))==0 && left<=nleft=left+1;endwhile sum(d(:,right))==0 && right>=1right=right-1;enddd=right-left;hh=bottom-top;e=imcrop(d,[left top dd hh]);//字符实别需要字符图库,没有对照图库是识别不了的</x))<></y))<>。
交通标志检测与识别matlab 和python
交通标志检测与识别可以使用MATLAB和Python进行实现。
这里给出一个简单的例子,使用Python和OpenCV库进行交通标志检测与识别。
首先,确保已经安装了Python和OpenCV库。
可以使用以下命令安装OpenCV:```bashpip install opencv-python```接下来,创建一个名为`traffic_sign_detection.py`的Python文件,并添加以下代码:```pythonimport cv2# 加载预训练的模型model = cv2.dnn.readNetFromTensorflow('frozen_inference_graph.pb', 'graph.pbtxt')# 读取图像image = cv2.imread('test_image.jpg')# 将图像转换为blob格式blob = cv2.dnn.blobFromImage(image, size=(300, 300), swapRB=True, crop=False)# 设置输入并进行前向传播model.setInput(blob)output = model.forward()# 获取检测结果for detection in output[0, 0, :, :]:confidence = detection[2]if confidence > 0.5:class_id = int(detection[1])x1, y1, x2, y2 = (detection[3:7] * [image.shape[1], image.shape[0], image.shape[1], image.shape[0]]).astype(int)# 绘制边界框和类别标签cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)label = f"Class {class_id}: {confidence:.2f}"cv2.putText(image, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)# 显示结果cv2.imshow('Traffic Sign Detection', image)cv2.waitKey(0)cv2.destroyAllWindows()```注意:这个例子需要一个预训练的模型(`frozen_inference_graph.pb`和`graph.pbtxt`),你可以从互联网上找到一些开源的交通标志检测模型。
基于MATLAB的车牌识别系统的实现
基于MATLAB的车牌识别系统的实现
1 引言
车辆牌照是机动车唯一的管理标识符号,在交通管理中具有不可替代的作用,因此车辆牌照识别系统应具有很高的识别率,对环境光照条件、拍摄位置和车辆行驶速度等因素的影响应有较大的容阈,并应满足实时性要求。
牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术,其硬件一般包括触发、摄像、照明、图像采集等设备,其软件核心包括车牌定位、车牌字符分割和字符识别等算法。
2 系统的实现
2.1 系统简述
一个完整的牌照识别系统应包括车辆检测、图像采集、图像预处理、车牌定位、字符分割、字符识别等单元。
当车辆到达触发图像采集单元时,系统采集当前的视频图像,牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。
牌照识别系统原理如图
1 所示。
2.
2 图像预处理
输入的彩色图像包含大量颜色信息,会占用较多的存储空间,且处理时也会降低系统的执行速度,因此对图像进行识别等处理时,常将彩色图像转换为灰度图像,以加快处理速度。
对图像进行灰度化处理、提取背景图像、增强处理、图像二值化、边缘检测、滤波等处理的主要MATLAB 语句如下所示:2.3 车牌定位
自然环境下,汽车图像背景复杂,光照不均匀,在自然背景中准确地确定牌照区域是整个图像识别过程中的关键。
首先对采集到的图像进行大范围相关搜索,找到符合汽车牌照特征的若干区域作为候选区,然后对这些侯选区域做进。
车牌识别的matlab程序-(详细注释,并有使用注意点)
附录车牌识别程序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 图像处理的汽车牌照识别系统仇成群(盐城师范学院,江苏盐城224002)汽车牌照识别系统是建设智能交通系统不可或缺的部分。
基于MATLAB 图像处理的汽车牌照识别系统是通过引入数字摄像技术和计算机信息管理技术,采用先进的图像处理、模式识别和人工智能技术,通过对图像的采集和处理,获得更多的信息,从而达到更高的智能化管理程度。
车牌识别系统整个处理过程分为预处理、边缘提取、车牌定位、字符分割、字符识别五大模块,用MATLAB 软件编程来实现每一个部分处理工程,最后识别出汽车牌照[1-4]。
1MATLAB 及其图像处理工具概述MATLAB 是MATrix LABoratory (矩阵实验室)的缩写,是Math Works 公司开发的一种功能强、效率高、简单易学的数学软件。
MATLAB 的图像处理工具箱,功能十分强大,支持的图像文件格式丰富,如*.BMP 、*.JPG 、*.JPEG 、*.GIF 、*.TIF 、*.TIFF 、*.PNG 、*.PCX 、*.XWD 、*.HDF 、*.ICO 、*.CUR 等。
MATLAB 7.1提供了20多类图像处理函数,几乎涵盖了图像处理的所有技术方法,是学习和研究图像处理的人员难得的宝贵资料和加工工具箱。
这些函数按其功能可分为:图像显示、图像文件I/O 、图像算术运算、几何变换、图像登记、像素值与统计、图像分析、图像增强、线性滤波、线性二元滤波设计、图像去模糊、图像变换、邻域与块处理、灰度与二值图像的形态学运算、基于边缘的处理、色彩映射表操作、色彩空间变换、图像类型与类型转换。
MATLAB 还着重在图形用户界面(GUI )的制作上作了很大的改善,对这方面有特殊要求的用户也可以得到满足。
本文将给出MATLAB 的图像处理工具箱中的图像处理函数实现图像处理与分析的应用技术实例。
2基于MATLAB 图像处理的汽车牌照识别系统2.1系统组成基于MATLAB 图像处理的汽车牌照识别系统主要包括车牌定位、字符车牌分割和车牌字符识别三个关键环节。
基于MATLAB的车牌识别系统研究
基于MATLAB的车牌识别系统探究摘要:随着交通的快速进步和车辆数量的增加,车牌识别系统在车辆管理和交通安全方面扮演着重要角色。
本文基于MATLAB平台,探究和设计了一种车牌识别系统,包括车牌图像的得到、预处理、特征提取和识别等关键技术。
试验结果表明,该系统可以有效地检测和识别车牌图像,并具有较高的识别准确率。
1. 引言车牌作为车辆唯一的标识符,在交通管理和公共安全中具有重要意义。
传统的车牌识别方式主要依靠人工进行,效率低下且容易出错。
近年来,随着计算机视觉和模式识别等技术的进步,基于计算机的车牌识别系统得到广泛应用。
本文旨在探究和设计一种基于MATLAB的车牌识别系统,以提高车辆管理和交通安全的效率和准确性。
2. 方法2.1 车牌图像的得到车牌图像的得到是车牌识别系统的第一步,可以通过摄像头或已有的车牌图像数据库进行得到。
本文使用摄像头采集车辆图像,并对图像进行预处理。
2.2 图像预处理图像预处理是车牌识别的基础,目标是消除图像中的噪声和干扰,提高图像的质量。
本文接受灰度化、二值化、去噪等方法对图像进行预处理。
2.3 特征提取特征提取是车牌识别系统的核心技术之一,依据车牌图像的特点提取有效的特征信息。
本文接受图像分割、轮廓提取和统计特征等方法进行特征提取。
2.4 车牌识别车牌识别是车牌识别系统的最终目标,通过对特征进行分类和匹配来实现对车牌的识别。
本文接受模式识别算法和机器进修方法进行车牌识别,并通过试验验证其准确性和可靠性。
3. 试验与结果本文基于MATLAB平台进行试验,接受了大量的车牌图像进行测试和验证。
试验结果表明,所设计的车牌识别系统在车牌图像的得到、预处理、特征提取和识别等方面具有较高的准确性和效率。
识别率达到了90%,满足了车辆管理和交通安全的需求。
4. 谈论与分析通过对试验结果的分析和对比,可以发现该系统在车牌识别的准确性和效率方面相对较好。
然而,该系统还存在一些问题和不足之处,如对光照和遮挡的敏感性,对多种车牌样式的识别能力等。
基于Matlab的车牌识别系统
一、摘要随着公路逐渐普及,我国的公路交通事业发展迅速,所以人工管理方式已经不能满着实际的需要,微电子、通信和计算机技术在交通领域的应用极大地提高了交通管理效率。
汽车牌照的自动识别技术已经得到了广泛应用。
汽车牌照自动识别整个处理过程分为预处理、边缘提取、车牌定位、字符分割、字符识别五大模块,其中字符识别过程主要由以下3个部分组成:①正确地分割文字图像区域;②正确的分离单个文字;③正确识别单个字符。
用MATLAB软件编程来实现每一个部分,最后识别出汽车牌照。
在研究的同时对其中出现的问题进行了具体分析,处理。
二、课程设计的任务和目的任务:使用MATLAB对包含车牌的图片进行处理,利用算法识别出车牌所在的区域,并辨认其数字及字母,最后在屏幕上输出所识别出的车牌号。
目的:1、让自己巩固理论课上所学的知识,理论联系实践。
2、锻炼自己的动手能力,激发自己的研究潜能,提高我们的协作精神。
三、设计原理由于车辆牌照是机动车唯一的管理标识符号,在交通管理中具有不可替代的作用,因此车辆牌照识别系统应具有很高的识别正确率,对环境光照条件、拍摄位置和车辆行驶速度等因素的影响应有较大的容阈,并且要求满足实时性要求。
图1 牌照识别系统原理图该系统是计算机图像处理与字符识别技术在智能化交通管理系统中的应用,它主要由牌照图像的采集和预处理、牌照区域的定位和提取、牌照字符的分割和识别等几个部分组成,如图1 所示。
其基本工作过程如下:(1)当行驶的车辆经过时,触发埋设在固定位置的传感器,系统被唤醒处于工作状态;一旦连接摄像头光快门的光电传感器被触发,设置在车辆前方、后方和侧面的相机同时拍摄下车辆图像;(2)由摄像机或CCD 摄像头拍摄的含有车辆牌照的图像通视频卡输入计算机进行预处理,图像预处理包括图像转换、图像增强、滤波和水平较正等;(3)由检索模块进行牌照搜索与检测,定位并分割出包含牌照字符号码的矩形区域;(4)对牌照字符进行二值化并分割出单个字符,经归一化后输入字符识别系统进行识别。
matlab在汽车牌照识别系统中的应用
MATLAB在汽车牌照识别系统中的应用摘要:汽车普及程度的提高使得智能交通技术迅猛发展,汽车牌照识别系统是智能交通管理领域和数字图像处理领域里的热点问题。
汽车牌照识别系统主要由图像预处理,边缘提取,字符定位,字符分割,字符识别几个部分组成。
本文介绍了MATLAB在汽车牌照图像处理识别系统中的部分应用。
该系统通过调用MATLAB函数,综合使用多种方法提高系统的有效识别能力。
关键词:MATLAB 边缘提取字符分割字符识别Application of MATLAB in License Plate Recognition SystemWANG Yanyan(School of Transportation Science and Engineering of BeihangUniversity, Beijing, 100191, China)Abstract: In this paper, CAN bus technology and SAE J1939 protocol are studied and a digital vehicle instrument solution based on Freescale's MC9S12HZ256 MCU is proposed. The message frame format and some engine-re lated parameters’ definition in SAE J1939 application layer protocol are introduced in detail. Stepper motor and its driver, also the methods for speed signal processing are introduced too. The hardware platform of digital vehicle instrument is composed by MCU, signal acquisition module and signal processing anddisplaying module. Data receiving and processing from CAN bus and sensors are accomplished by programming and vehicle condition can be reflected in real-time.Key words:digital vehicle instrument; MC9S12HZ256; stepper motor; CAN bus; SAE J1939引言车牌识别(License Plate Recognition System,LPRS)系统是计算机视觉与模式识别技术在智能交通领域应用的重要研究课题之一,是智能交通系统(Intelligent Transportation System,ITS)的重要组成部分。
数字图像处理车牌识别课程设计matlab实现附源代码
基于 matlab 的车牌识别系统一、目的与要求目的:利用 matlab 实现车牌识别系统,熟悉matlab应用软件的根底知识,了解了根本程序设计方法,利用其解决数字信号处理的实际应用问题,从而加深对理论知识的掌握,并把所学的知识系统、高效的贯穿到实践中来,防止理论与实践的脱离,稳固理论课上知识的同时,加强实践能力的提高,理论联系实践,提高自身的动手能力。
同时不断的调试程序也提高了自己独立编程水平,并在实践中不断完善理论根底,有助于自身综合能力的提高。
要求:1.理解各种图像处理方法确切意义。
2.独立进展方案的制定,系统构造设计要合理。
3.在程序开发时,那么必须清楚主要实现函数的目的和作用,需要在程序书写时说明做适当的注释。
如果使用matlab 来进展开发,要理解每个函数的具体意义和适用X围,在写课设报告时,必须要将主要函数的功能和参数做详细的说明。
4、通过多幅不同形式的图像来检测该系统的稳定性和正确性。
二、设计的内容学习 MATLAB 程序设计,利用MATLAB 函数功能,设计和实现通过设计一个车牌识别系统。
车牌识别系统的根本工作原理为:将手机拍摄到的包含车辆牌照的图像输入到计算机中进展预处理,再对牌照进展搜索、检测、定位,并分割出包含牌照字符的矩形区域,然后对牌照字符进展二值化并将其分割为单个字符,然后将其逐个与创立的字符模板中的字符进行匹配,匹配成功那么输出,最终匹配完毕那么输出那么为车牌的数字。
车牌识别系统的根本工作原理图如图1所下所示:车辆字符分割字符识别图像采集车牌的定位三、总体方案设计车辆牌照识别整个系统主要是由车牌定位和字符分割识别两局部组成,其中车牌定位又可以分为图像预处理及边缘提取模块和牌照的定位及分割模块;字符识别可以分为字符分割和单个字符识别两个模块。
为了用于牌照的分割和牌照字符的识别,原始图象应具有适当的亮度,较大的比照度和清晰可辩的牌照图象。
但由于是采用智能手机在开放的户外环境拍照,加之车辆牌照的整洁度、自然光照条件、拍摄时摄像机与牌照的矩离等因素的影响,牌照图象可能出现模糊、歪斜和缺损等严重缺陷,因此需要对原始图象进展识别前的预处理。
车牌识别matlab代码
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平台下的车牌识别系统设计
3、实验改进
3、实验改进
根据实验结果,我们发现车牌定位和字符分割模块是影响系统性能的关键因 素。因此,我们计划从以下两个方面进行改进:
3、实验改进
1、针对车牌定位模块,尝试引入更多的特征提取方法,以便更准确地定位车 牌区域;
2、针对字符分割模块,研究更为稳健的连通域分析方法,减少误分割和漏分 割。
三、实验结果与分析
1、实验设置
1、实验设置
为了评估车牌识别系统的性能,我们构建了一个包含200张车牌图像的数据集, 其中包含了不同的光照条件、车牌位置和尺寸。评估指标主要包括准确率、召回 率和运行时间。
2、实验结果分析
2、实验结果分析
经过大量实验,我们得到了以下结果: 1、车牌定位模块的准确率为95%,召回率为90%;
1、需求分析
3、适应性:系统应能适应不同的环境条件,包括不同的光照条件、车牌位置 和车牌尺寸等;
1、需求分析
4、可靠性:系统应具备一定的可靠性,能够稳定运行,保证识别结果的准确 性。
2、总体设计
2、总体设计
在总体设计阶段,我们将车牌识别系统分解为以下几个模块: 1、车牌定位模块:该模块主要负责寻找并定位车牌区域,排除其他干扰因素;
基于MATLAB平台下的车牌识别 系统设计
01 一、引言
目录
02
二、车牌识别系统设 计
03 三、实验结果与分析
04 四、结论与展望
05 参考内容
一、引言
一、引言
随着社会的快速发展和科技的不断进步,智能化交通管理成为了研究的热点。 车牌识别系统作为智能化交通管理的重要组成部分,能够自动识别车辆身份,提 高交通监管能力和服务质量。本次演示将基于MATLAB平台,设计一套车牌识别系 统,旨在提高车牌识别的准确性和效率,为智能交通管理提供有力支持。
(完整word版)基于Matlab的车牌识别(完整版)
基于Matlab的车牌识别摘要:车牌识别技术是智能交通系统的重要组成部分,在近年来得到了很大的发展。
本文从预处理、边缘检测、车牌定位、字符分割、字符识别五个方面,具体介绍了车牌自动识别的原理。
并用MATLAB软件编程来实现每一个部分,最后识别出汽车车牌。
一、设计原理车辆车牌识别系统的基本工作原理为:将摄像头拍摄到的包含车辆车牌的图像通过视频卡输入到计算机中进行预处理,再由检索模块对车牌进行搜索、检测、定位,并分割出包含车牌字符的矩形区域,然后对车牌字符进行二值化并将其分割为单个字符,然后输入JPEG或BMP格式的数字,输出则为车牌号码的数字。
车牌自动识别是一项利用车辆的动态视频或静态图像进行车牌号码、车牌颜色自动识别的模式识别技术。
其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。
某些车牌识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。
一个完整的车牌识别系统应包括车辆检测、图像采集、车牌识别等几部分。
当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。
车牌识别单元对图像进行处理,定位出车牌位置,再将车牌中的字符分割出来进行识别,然后组成车牌号码输出。
二、设计步骤总体步骤为:基本的步骤:a.车牌定位,定位图片中的车牌位置;b.车牌字符分割,把车牌中的字符分割出来;c.车牌字符识别,把分割好的字符进行识别,最终组成车牌号码。
车牌识别过程中,车牌颜色的识别依据算法不同,可能在上述不同步骤实现,通常与车牌识别互相配合、互相验证。
(1)车牌定位:自然环境下,汽车图像背景复杂、光照不均匀,如何在自然背景中准确地确定车牌区域是整个识别过程的关键。
首先对采集到的视频图像进行大范围相关搜索,找到符合汽车车牌特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳的区域作为车牌区域,并将其从图象中分割出来。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
clc; clear all; close all;[filename, pathname, filterindex] = uigetfile({'*.jpg;*.tif;*.png;*.gif','All Image Files';...'*.*','All Files' }, '选择待处理图像', ...'images\01.jpg');file = fullfile(pathname, filename);%文件路径和文件名创建合成完整文件名id = Get_Id(file);%得到file中的所有对象Img = imread(file);%根据路径和文件名读取图片到Img[Plate, bw, Loc] = Pre_Process(Img); % 车牌区域预处理result = Plate_Process(Plate, id); % 车牌区域二值化处理% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割bw = Segmation(result);words = Main_Process(bw); % 主流程处理Write_Mask(words, id); % 写出到模板库str = Pattern_Recognition(words); % 识别function id = Get_Id(file)% 获取图像id信息% 输入参数:% file——图像路径% 输出参数:% id——图像id信息info = imfinfo(file);FS = [422227 354169 293184 235413 214202 ...130938 490061 120297 98686 137193 ...80558 46208 69947 58110 62115 ...59072 52168 60457 53979 50223];id = find(FS == info.FileSize);if isempty(id)warndlg('未建立该图像模板库,可能运行出错!', '警告');id = 1;endfunction R = Cubic_Spline(P)% 三次样条插值% 输入参数:% P——节点矩阵% 输出参数:% R——样条节点矩阵% 计算相邻插值点之间的弦长chordlen = sqrt(sum(diff(P, [], 1).^2,2));% 将弦长参数归一化到[0,1]上chordlen = chordlen/sum(chordlen);% 计算每个插值节点处的累加弦长,作为给点处的参数cumarc = [0; cumsum(chordlen)];x = cumarc;N = size(P, 1);R = [];% 以下部分为一元三次样条插值的程序,对于空间三维数据,以同样的累加% 弦长作为参数,对x,y,z分量做三次一元样条插值得到的结果便是对三维数据% 做三次样条插值for k = 1 : size(P, 2)y = P(:, k);m = zeros(1, N);M = zeros(1, N);n = m;d = m;A = eye(N);A = 2*A;m(1) = 1;n(N) = 1;m(N) = 1;n(1) = 1;for i = 2:N-1m(i) = (x(i+1)-x(i))/(x(i+1)-x(i-1));n(i) = 1 - m(i);d(i) = 6*((y(i+1) - y(i))/(x(i+1) - x(i)) - (y(i) - y(i-1))/(x(i) - x(i-1)))/(x(i+1)-x(i-1));endfor j = 1 : N-1A(j, j+1) = m(j);A(j+1, j) = n(j+1);endp = A(2:N-1, 2:N-1);q = d(2:N-1);Q = inv(p)*q';M = zeros(1,N);M(1,1) = 0;M(1,N) = 0;M(1,2:N-1)= Q;S = [];temp = [];for i = 1:N-1% 对每一个分量计算出来的插值曲线进行采样,以便将其画出。
s = 50;% 采样点个数z = linspace(x(i),x(i+1),s);h = x(i+1)-x(i);for j = 1:length(z)S(j) = M(i)*((x(i+1)-z(j))^3)/(6*h)+M(i+1)*((z(j)-x(i))^3)/(6*h)+(y(i)-M(i)*(h^2)/6)*((x(i+1)-z(j))/h)+( y(i+1)-M(i+1)*h^2/6)*((z(j)-x(i))/h);endtemp = [temp S];endR(:, k) = temp;endfunction mask = Get_PointSplineMask(Img, Ptn)% 获取封闭有序节点的蒙板图像% Img——图像矩阵% Ptn——封闭有序节点% 输出参数:% mask——蒙板图像if ndims(Img) == 3I = rgb2gray(Img);elseI = Img;endmask = zeros(size(I));Ptn = Cubic_Spline(Ptn); % 样条插值for i = 1 : size(Ptn, 1)-1pt1 = Ptn(i, :); % 线段起点pt2 = Ptn(i+1, :); % 线段终点x1 = pt1(1); y1 = pt1(2);x2 = pt2(1); y2 = pt2(2);% 直线段参数A = (y1 - y2)/(x1*y2 - x2*y1);B = (-x1 + x2)/(x1*y2 - x2*y1);% 直线段取点xk = linspace(min(x1, x2), max(x1, x2));if B == 0yk = linspace(min(y1, y2), max(y1, y2));elseyk = (-1 - A*xk)/B;end% 赋值操作for j = 1 : length(xk)if ~isnan(round(yk(j))) && ~isnan(round(xk(j))) && ...~isinf(round(yk(j))) && ~isinf(round(xk(j))) && ...round(yk(j)) > 0 && round(xk(j)) > 0mask(round(yk(j)), round(xk(j))) = 1;endendendmask = logical(mask); % 类型转换mask = bwmorph(mask, 'bridge'); % 桥接操作mask = imfill(mask, 'hole'); % 补洞操作function Im = Image_Rotate(Img, num, flag)% 旋转校正函数% 输入函数:% Img——图像矩阵% num——图像序号% flag——显示图像窗口% 输出函数:% Im——结果图像if nargin < 3flag = 0;endrole = [6 0 0 -13 5 10 0 10 0 -5 2 -1 2 2 0 -5 -2 0 6 2];Im = imrotate(Img, role(num), 'bilinear');if flagfigure(2);subplot(1, 2, 1); imshow(Img); title('原图像');subplot(1, 2, 2); imshow(Im); title('旋转图像');endfunction words = Main_Process(bw, flag_display)% 主流程处理,分割字符并获取% 输入参数:% bw——车牌区域图像% flag_display——显示图像标记% 输出参数:% words——车牌字符数据if nargin < 2flag_display = 1;end[m, n] = size(bw);k1 = 1;k2 = 1;s = sum(bw); % 列积分投影j = 1; % 列游标while j ~= n% 寻找车牌图像左侧边界while s(j) == 0 && j <= n-1j = j + 1;endk1 = j-1; % 车牌图像左侧边界% 寻找车牌图像右侧边界while s(j) ~= 0 && j <= n-1j = j + 1;endk2 = j-1; % 车牌图像右侧边界Tol = round(n/6.5); % 字符区域宽度约束if k2-k1 > Tol[val, num] = min(sum(bw(:, [k1+5:k2-5])));bw(:, k1+num+5)=0; % 抹去该字符endend% 再切割bw = Segmation(bw);% 切割出7 个字符[m, n] = size(bw);wideTol = round(n/20); % 区域宽度最小约束rateTol = 0.25; % 中心区域比值约束flag = 0;word1 = [];while flag == 0[m, n] = size(bw);left = 1;wide = 0;% 找到空隙位置while sum(bw(:,wide+1)) ~= 0wide = wide+1;endif wide < wideTol% 认为是左侧干扰bw(:, 1:wide) = 0; % 抹去干扰区域bw = Segmation(bw);else% 提取字符区域temp = Segmation(imcrop(bw, [1 1 wide m]));[m, n] = size(temp);tall = sum(temp(:)); % 该字符所有像素之和% 该字符图像2/3图像区域像素和two_thirds = sum(sum( temp(round(m/3):2*round(m/3), :) ));rate = two_thirds/tall; % 中间区域像素/全局区域像素if rate > rateTolflag = 1;word1 = temp; %提取WORD 1endbw(:, 1:wide) = 0; % 抹去已处理的区域bw = Segmation(bw);endend% 分割出第二个字符[word2, bw] = Word_Segmation(bw);% 分割出第三个字符[word3, bw] = Word_Segmation(bw);% 分割出第四个字符[word4, bw] = Word_Segmation(bw);% 分割出第五个字符[word5, bw] = Word_Segmation(bw);% 分割出第六个字符[word6, bw] = Word_Segmation(bw);% 分割出第七个字符[word7, bw] = Word_Segmation(bw);wid = [size(word1, 2) size(word2, 2) size(word3, 2) ...size(word4, 2) size(word5, 2) size(word6, 2) size(word7, 2)];[maxwid, indmax] = max(wid);maxwid = maxwid + 10;wordi = word1;wordi = [zeros(size(wordi, 1), round((maxwid-size(word1, 2))/2)) wordi zeros(size(wordi, 1), round((maxwid-size(word1, 2))/2))];word1 = wordi;wordi = word2;wordi = [zeros(size(wordi, 1), round((maxwid-size(word2, 2))/2)) wordi zeros(size(wordi, 1), round((maxwid-size(word2, 2))/2))];word2 = wordi;wordi = word3;wordi = [zeros(size(wordi, 1), round((maxwid-size(word3, 2))/2)) wordi zeros(size(wordi, 1), round((maxwid-size(word3, 2))/2))];word3 = wordi;wordi = word4;wordi = [zeros(size(wordi, 1), round((maxwid-size(word4, 2))/2)) wordi zeros(size(wordi, 1), round((maxwid-size(word4, 2))/2))];word4 = wordi;wordi = word5;wordi = [zeros(size(wordi, 1), round((maxwid-size(word5, 2))/2)) wordi zeros(size(wordi, 1), round((maxwid-size(word5, 2))/2))];word5 = wordi;wordi = word6;wordi = [zeros(size(wordi, 1), round((maxwid-size(word6, 2))/2)) wordi zeros(size(wordi, 1), round((maxwid-size(word6, 2))/2))];word6 = wordi;wordi = word7;wordi = [zeros(size(wordi, 1), round((maxwid-size(word7, 2))/2)) wordi zeros(size(wordi, 1), round((maxwid-size(word7, 2))/2))];word7 = wordi;% figure(1);% subplot(2, 7, 1); imshow(word1); title('字符1');% subplot(2, 7, 2); imshow(word2); title('字符2');% subplot(2, 7, 3); imshow(word3); title('字符3');% subplot(2, 7, 4); imshow(word4); title('字符4');% subplot(2, 7, 5); imshow(word5); title('字符5');% subplot(2, 7, 6); imshow(word6); title('字符6');% subplot(2, 7, 7); imshow(word7); title('字符7');% 切割出的字符归一化大小为40*20,此处演示word11 = imresize(word1, [40 20]);word21 = imresize(word2, [40 20]);word31 = imresize(word3, [40 20]);word41 = imresize(word4, [40 20]);word51 = imresize(word5, [40 20]);word61 = imresize(word6, [40 20]);word71 = imresize(word7, [40 20]);% subplot(2, 7, 8); imshow(word11); title('字符1');% subplot(2, 7, 9); imshow(word21); title('字符2');% subplot(2, 7, 10); imshow(word31); title('字符3');% subplot(2, 7, 11); imshow(word41); title('字符4');% subplot(2, 7, 12); imshow(word51); title('字符5');% subplot(2, 7, 13); imshow(word61); title('字符6');% subplot(2, 7, 14); imshow(word71); title('字符7');% 赋值操作words.word1 = word11;words.word2 = word21;words.word3 = word31;words.word4 = word41;words.word5 = word51;words.word6 = word61;words.word7 = word71;if flag_displayfigure;subplot(2, 7, 1); imshow(word1); title('字符1', 'FontWeight', 'Bold');subplot(2, 7, 2); imshow(word2); title('字符2', 'FontWeight', 'Bold');subplot(2, 7, 3); imshow(word3); title('字符3', 'FontWeight', 'Bold');subplot(2, 7, 4); imshow(word4); title('字符4', 'FontWeight', 'Bold');subplot(2, 7, 5); imshow(word5); title('字符5', 'FontWeight', 'Bold');subplot(2, 7, 6); imshow(word6); title('字符6', 'FontWeight', 'Bold');subplot(2, 7, 7); imshow(word7); title('字符7', 'FontWeight', 'Bold');subplot(2, 7, 8); imshow(word11); title('字符1', 'FontWeight', 'Bold');subplot(2, 7, 9); imshow(word21); title('字符2', 'FontWeight', 'Bold');subplot(2, 7, 10); imshow(word31); title('字符3', 'FontWeight', 'Bold');subplot(2, 7, 11); imshow(word41); title('字符4', 'FontWeight', 'Bold');subplot(2, 7, 12); imshow(word51); title('字符5', 'FontWeight', 'Bold');subplot(2, 7, 13); imshow(word61); title('字符6', 'FontWeight', 'Bold');subplot(2, 7, 14); imshow(word71); title('字符7', 'FontWeight', 'Bold'); endfunction mask = Mask_Process(Img, id)% 图像蒙版处理函数% 输入参数:% Img——图像矩阵% id——图像序号% 输出参数:% mask——模板图像% 如果已经存在模板图像则不再取模板filename = sprintf('mask\\mask%d.jpg', id);if exist(filename, 'file')mask = imread(filename);if ~isa(mask, 'logical')mask = im2bw(mask);endsz = size(Img);if ~isequal(sz(1:2), size(mask))mask = imresize(mask, sz(1:2));mask = logical(mask);endreturn;endI = Img;Ptn = [];figure;subplot(1, 3, 1); imshow(I);title('取点_{左键取点,右键退出}', 'Color', 'r', ...'FontWeight', 'Bold');hold on;set(gcf, 'units', 'normalized', 'position', [0 0 1 1]);[x, y, button] = ginput(1); % 点击while button == 1plot(x, y, 'r+', 'LineWidth', 2); % 绘制节点Ptn = [Ptn; x y]; % 存储节点[x, y, button] = ginput(1); % 点击endif size(Ptn, 1) < 2return;endPtn = [Ptn; Ptn(1, :)];plot(Ptn(:, 1), Ptn(:, 2), 'ro-', 'LineWidth', 2, 'MarkerFaceColor', 'k'); title('原图像', 'Color', 'k', ...'FontWeight', 'Bold');mask = Get_PointSplineMask(I, Ptn); % 获取蒙板图像subplot(1, 3, 2); imshow(mask);title('蒙板图像', 'Color', 'k', ...'FontWeight', 'Bold');if ndims(I) == 3I1 = I .* uint8(cat(3, mask, mask, mask));elseif ~isequal(size(I), size(mask))mask = imresize(mask, size(I));mask = logical(mask);endI1 = I .* mask;endsubplot(1, 3, 3); imshow(I1);title('蒙板分割结果', 'Color', 'k', ...'FontWeight', 'Bold');imwrite(mask, filename);function str = Pattern_Recognition(words)% 车牌字符识别% 输入参数:% words——车牌字符图像% 输出参数:% str——识别结果pattern = [];dirpath = './标准库/';%读取所有样本文件files = ls([dirpath '*.jpg']);for t = 1 : length(files)imagedata = imread([dirpath, files(t,:)]); %读取样本文件imagedata = im2bw(imagedata, 0.5);pattern(t).feature = imagedata;end% 字符库列表chepaiword=[...'沪' 'C' 'E' 'N' '2' '6' '7' '浙' 'B' 'T' '2' '0' '0' '8' ...'皖' 'N' '6' '9' '3' '3' '5' '皖' 'A' 'M' '3' '7' '6' '7' ...'沪' 'B' '9' '1' '2' '1' '3' '沪' 'F' 'S' '2' '6' '9' '5' ...'吉' 'A' 'E' '3' '1' '2' '7' '沪' 'B' 'B' '3' '3' '9' '3' ...'沪' 'J' 'B' '7' '7' '7' '8' '京' 'H' 'Z' '9' '1' '3' '9' ...'晋' 'K' 'C' '3' '8' '4' '1' '苏' 'D' 'V' '0' '0' '0' '1' ...'苏' 'A' 'V' '8' '8' '8' '8' '浙' 'B' '8' '8' '8' '8' '8' ...'沪' 'F' 'Q' '1' '2' '7' '7' '苏' 'E' 'D' '0' '0' '0' '9' ...'沪' 'E' 'C' '1' '2' '8' '8' '苏' 'G' 'B' '0' '5' '7' '8' ...'沪' 'B' 'B' '2' '0' '2' '9' '沪' 'D' '5' '4' '2' '2' '6'];for m = 1 : 7;for n = 1 : length(files);switch mcase 1distance(n)=sum(sum(abs(words.word1-pattern(n).feature)));case 2distance(n)=sum(sum(abs(words.word2-pattern(n).feature)));case 3distance(n)=sum(sum(abs(words.word3-pattern(n).feature)));case 4distance(n)=sum(sum(abs(words.word4-pattern(n).feature)));case 5distance(n)=sum(sum(abs(words.word5-pattern(n).feature)));case 6distance(n)=sum(sum(abs(words.word6-pattern(n).feature)));case 7distance(n)=sum(sum(abs(words.word7-pattern(n).feature)));endend[yvalue,xnumber]=min(distance);filename = files(xnumber, :);[pathstr, name, ext] = fileparts(filename);result(m) = chepaiword(str2num(name));endstr = ['识别结果为:' result];msgbox(str, '车牌识别', 'modal');str = result;function result = Plate_Process(plate, id, flag)% 车牌区域处理% 输入参数:% plate——车牌区域% id——车牌序号% flag——显示图像标记% 输出参数:% result——结果图像if nargin < 3flag = 1;endif ndims(plate) == 3plate1 = rgb2gray(plate);% figure(1)% imshow(plate1)elseplate1 = plate;endIm = Image_Rotate(plate1, id);th = [0.85 0.50 0.85 0.70 0.30 ...0.40 0.65 0.45 0.45 0.65 ...0.51 0.80 0.40 0.75 0.60 ...0.55 0.40 0.40 0.76 0.72];bw = im2bw(Im, th(id)); % 车牌区域二值化h = fspecial('average', 2); % 均值滤波模板bw1 = imfilter(bw, h, 'replicate'); % 均值滤波% figure(1)% imshow(bw1)mask = Mask_Process(bw1, id); % 模板处理bw2 = bw1 .* mask; % 模板滤波result = bw2;if flagfigure;subplot(2, 2, 1); imshow(plate); title('车牌区域图像', 'FontWeight', 'Bold');subplot(2, 2, 2); imshow(Im); title('车牌区域校正图像', 'FontWeight', 'Bold');subplot(2, 2, 3); imshow(bw1); title('车牌区域二值图像', 'FontWeight', 'Bold');subplot(2, 2, 4); imshow(bw2); title('滤波二值图像', 'FontWeight', 'Bold'); endfunction [Plate, bw, Loc] = Pre_Process(Img, parm, flag)% 车牌图像预处理,提取车牌区域% 输入参数:% Img——图像矩阵% parm——参数向量% flag——是否显示处理结果% 输出参数:% Plate——分割结果if nargin < 3flag = 1;endif nargin < 2 || isempty(parm)if size(Img, 2) > 900parm = [0.35 0.9 90 0.35 0.7 90 2];endif size(Img, 2) > 700 && size(Img, 2) < 900parm = [0.6 0.9 90 0.6 0.8 90 0.5];endif size(Img, 2) > 500 && size(Img, 2) < 700parm = [0.5 0.54 50 0.6 0.7 50 3];endif size(Img, 2) < 500parm = [0.8 0.9 150 0.8 0.9 150 3];endendI = Img;[y, x, z] = size(I); % y方向对应行、x方向对应列、z方向对应深度% 图像尺寸过大会影响处理效率,所以进行放缩处理if y > 800rate = 800/y;I = imresize(I, rate);end[y, x, z] = size(I); % y方向对应行、x方向对应列、z方向对应深度myI = double(I); % 数据类型转换bw1 = zeros(y, x);bw2 = zeros(y, x);Blue_y = zeros(y, 1);% 对每一个像素进行分析,统计满足条件的像素所在的行对应的个数for i = 1 : yfor j = 1 : xrij = myI(i, j, 1)/(myI(i, j, 3)+eps);gij = myI(i, j, 2)/(myI(i, j, 3)+eps);bij = myI(i, j, 3);% 蓝色RGB的灰度范围if (rij < parm(1) && gij < parm(2) && bij > parm(3)) ...|| (gij < parm(1) && rij < parm(2) && bij > parm(3)) Blue_y(i, 1) = Blue_y(i, 1) + 1; % 蓝色象素点统计bw1(i, j) = 1;endendend% Y方向车牌区域确定[temp, MaxY] = max(Blue_y);Th = parm(7);% 向上追溯,直到车牌区域上边界PY1 = MaxY;while ((Blue_y(PY1,1)>Th) && (PY1>1))PY1 = PY1 - 1;end% 向下追溯,直到车牌区域下边界PY2 = MaxY;while ((Blue_y(PY2,1)>Th) && (PY2<y))PY2 = PY2 + 1;% 对车牌区域的修正PY1 = PY1 - 2;PY2 = PY2 + 2;if PY1 < 1PY1 = 1;endif PY2 > yPY2 = y;end% 得到车牌区域IY = I(PY1:PY2, :, :);%%%%%%%% X 方向%%%%%%%%%%% 进一步确定X方向的车牌区域Blue_x = zeros(1,x);for j = 1:xfor i = PY1:PY2rij = myI(i, j, 1)/(myI(i, j, 3)+eps);gij = myI(i, j, 2)/(myI(i, j, 3)+eps);bij = myI(i, j, 3);% 蓝色RGB的灰度范围if (rij < parm(4) && gij < parm(5) && bij > parm(6)) ...|| (gij < parm(4) && rij < parm(5) && bij > parm(6)) Blue_x(1,j) = Blue_x(1,j) + 1; % 蓝色象素点统计bw2(i, j) = 1;endendend% 想右追溯,直到找到车牌区域左边界PX1 = 1;while (Blue_x(1,PX1)<Th) && (PX1<x)PX1 = PX1 + 1;end% 想左追溯,直到找到车牌区域右边界PX2 = x;while (Blue_x(1,PX2)<Th) && (PX2>PX1)PX2 = PX2 - 1;end% 对车牌区域的修正PX1 = PX1 - 2;PX2 = PX2 + 2;if PX1 < 1PX1 = 1;if PX2 > xPX2 = x;end% 得到车牌区域IX = I(:, PX1:PX2, :);% 分割车牌区域Plate = I(PY1:PY2, PX1:PX2, :);Loc.row = [PY1 PY2];Loc.col = [PX1 PX2];bw = bw1 + bw2;bw = logical(bw);bw(1:PY1, :) = 0;bw(PY2:end, :) = 0;bw(:, 1:PX1) = 0;bw(:, PX2:end) = 0;if flagfigure;subplot(2, 2, 3); imshow(IY); title('行过滤结果', 'FontWeight', 'Bold');subplot(2, 2, 1); imshow(IX); title('列过滤结果', 'FontWeight', 'Bold');subplot(2, 2, 2); imshow(I); title('原图像', 'FontWeight', 'Bold');subplot(2, 2, 4); imshow(Plate); title('分割结果', 'FontWeight', 'Bold'); endfunction e = Segmation(d)% 车牌图像切割% 输入参数:% d——车牌图像% 输出参数:% e——切割后的车牌图像[m, n] = size(d);% 初始化参数top = 1; % 矩形框上参数bottom = m; % 矩形框下参数left = 1; % 矩形框左参数right = n; % 矩形框右参数% 寻找矩形框上参数while sum(d(top,:))==0 && top<=mtop = top + 1;% 寻找矩形框下参数while sum(d(bottom,:))==0 && bottom>=1bottom = bottom - 1;end% 寻找矩形框左参数while sum(d(:,left))==0 && left<=nleft = left + 1;end% 寻找矩形框右参数while sum(d(:,right))==0 && right>=1right = right - 1;enddd = right - left; % 矩形框长hh = bottom - top; % 矩形框宽e = imcrop(d, [left top dd hh]); % 车牌图像矩形框裁剪function [word, result] = Word_Segmation(d)% 提取字符% 输入参数:% d——车牌图像% 输出参数:% word——字符图像% result——处理结果word = [];flag = 0;[m, n] = size(d);wideTol = round(n/20); % 区域宽度最小约束rateTol = 0.25; % 中心区域比值约束while flag == 0[m, n] = size(d);wide = 0;while sum(d(:,wide+1)) ~= 0 && wide <= n-2wide = wide + 1;endtemp = Segmation(imcrop(d, [1 1 wide m]));[m1,n1] = size(temp);if wide<wideTol && n1/m1>rateTold(:, 1:wide) = 0;if sum(sum(d)) ~= 0d = Segmation(d); % 切割出最小范围elseword = [];flag = 1;endelseword = Segmation(imcrop(d, [1 1 wide m]));d(:, 1:wide) = 0;if sum(sum(d)) ~= 0;d = Segmation(d);flag = 1;elsed = [];endendendresult = d;function Write_Mask(words, id)% 写出到模板库% 输入参数:% words——字符图像集合% id——序号imwrite(words.word1, sprintf('模板库\\%d_字符%d.jpg', id, 1)); imwrite(words.word2, sprintf('模板库\\%d_字符%d.jpg', id, 2)); imwrite(words.word3, sprintf('模板库\\%d_字符%d.jpg', id, 3)); imwrite(words.word4, sprintf('模板库\\%d_字符%d.jpg', id, 4));imwrite(words.word5, sprintf('模板库\\%d_字符%d.jpg', id, 5));imwrite(words.word6, sprintf('模板库\\%d_字符%d.jpg', id, 6)); imwrite(words.word7, sprintf('模板库\\%d_字符%d.jpg', id, 7));% imwrite(words.word1, sprintf('模板库\\%d.jpg', (id-1)*7+1)); % imwrite(words.word2, sprintf('模板库\\%d.jpg', (id-1)*7+2)); % imwrite(words.word3, sprintf('模板库\\%d.jpg', (id-1)*7+3));% imwrite(words.word4, sprintf('模板库\\%d.jpg', (id-1)*7+4)); % imwrite(words.word5, sprintf('模板库\\%d.jpg', (id-1)*7+5)); % imwrite(words.word6, sprintf('模板库\\%d.jpg', (id-1)*7+6));% imwrite(words.word7, sprintf('模板库\\%d.jpg', (id-1)*7+7));。