车牌识别的matlab程序

合集下载

(完整版)基于matlab的车牌识别(含子程序)

(完整版)基于matlab的车牌识别(含子程序)

基于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中,可以使用一系列图像处理函数来实现字符分割,包括边缘检测、连通性分析和投影分析等。

这些函数可以帮助我们将车牌中的字符与其他区域进行分离。

四、字符识别字符识别是车牌识别的核心任务。

通过对字符进行识别,我们可以得到车牌中的文本信息。

在Matlab中,可以使用模式识别、神经网络或者深度学习等技术来实现字符识别。

这些技术可以帮助我们训练一个分类器,将字符图像与对应的字符进行匹配。

通过匹配算法,我们可以得到车牌的文本信息。

五、车牌识别结果展示在进行车牌识别之后,我们可以将识别结果进行展示。

通过将识别结果与原始图像进行对比,我们可以验证车牌识别的准确性。

在Matlab中,可以使用图像绘制函数和文本显示函数来实现车牌识别结果的展示。

通过这些函数,我们可以在原始图像中标注出识别结果,并将结果显示在图像上。

实验报告用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车牌识别原理

matlab车牌识别原理

matlab车牌识别原理
MATLAB车牌识别原理涉及图像处理和模式识别技术。

首先,图
像被获取并传入MATLAB环境。

然后,车牌识别过程通常包括以下步骤:
1. 图像预处理,包括灰度化、去噪、增强和边缘检测等。

这些
步骤有助于减少干扰和突出车牌区域。

2. 车牌定位,使用图像处理技术,如边缘检测、形态学操作和
轮廓分析,来定位图像中的车牌位置。

3. 字符分割,在车牌上识别出的字符需要被分割成单独的图像。

这通常需要使用分割算法和形态学转换来分离每个字符。

4. 字符识别,对每个单独的字符进行识别。

这可以使用基于模
式识别的方法,如人工神经网络或支持向量机等,来对字符进行分
类和识别。

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、作业要求:要求:任给一幅符合假定的图片,自动识别出车牌号。

车牌识别的matlab程序的难点与解决方法

车牌识别的matlab程序的难点与解决方法

车牌识别的matlab程序的难点与解决方法车牌识别是近年来越来越流行的人工智能技术之一,其应用包括智能停车、智能交通等领域。

在车牌识别的matlab程序中,存在许多难点和解决方法,下面我们将对其进行详细介绍和拓展。

一、车牌识别算法的难点1.图像质量要求高车牌识别算法对图像质量要求非常高,因为车牌图像的质量直接影响识别准确率。

图像噪声、光线变化、车牌的形状和大小等因素都会影响车牌识别的精度。

2.多牌识别困难在实际的车牌识别中,往往需要同时识别多张牌,如多个车牌、不同号码的车牌等。

这种情况下,多牌识别是一个难点,需要采用一些特殊的算法和技术来解决。

3.车牌号码提取困难车牌号码提取是车牌识别算法中非常重要的一个环节,但也是难点之一。

因为车牌号码提取需要对图像进行特征提取和字符识别,这对图像的清晰度、颜色深度等要求较高,同时也需要考虑到字符大小、字符形状等因素。

4.字符识别错误在车牌识别中,字符识别是一个重要的环节,但也是容易出现错误的。

因为车牌中的字符形状和大小不同,而且有些字符在图像中可能处于不同的位置,这些因素都可能导致字符识别错误。

二、车牌识别matlab程序的解决方法1.提高图像质量提高图像质量是解决车牌识别算法中图像质量要求高的问题的有效方法。

可以通过调整相机参数、使用高质量的图像编辑软件等方式来提高图像质量。

2.优化多牌识别算法针对多牌识别的难点,可以通过优化算法来实现多牌识别。

可以采用一些特殊的算法和技术,如图像分割、特征提取、字符相似度计算等,来提高车牌识别的准确率和稳定性。

3.优化字符识别算法针对字符识别的难点,可以通过优化字符识别算法来实现。

可以采用一些特殊的算法和技术,如图像分割、特征提取、字符相似度计算等,来提高字符识别的准确率和稳定性。

4.优化车牌号码提取算法针对车牌号码提取的难点,可以通过优化车牌号码提取算法来实现。

可以采用一些特殊的算法和技术,如图像分割、特征提取、字符相似度计算等,来提高车牌号码提取的准确率和稳定性。

车牌识别的matlab程序的难点与解决方法(一)

车牌识别的matlab程序的难点与解决方法(一)

车牌识别的matlab程序的难点与解决方法(一)车牌识别的matlab程序的难点与解决引言车牌识别是图像处理领域的一个重要应用,它可以在不同场景下自动识别和提取车辆的车牌信息。

在实际应用中,针对车牌识别的matlab程序存在着一些难点,本文将详细介绍这些难点及相应的解决方法,以帮助资深的创作者更好地实现车牌识别程序。

难点一:车牌识别算法选择子标题一:基于颜色特征的车牌识别算法•难点:车牌颜色在不同光照条件下会发生变化,导致识别算法的准确性下降。

•解决方法:采用颜色空间的变换(例如RGB到HSV),通过调整阈值和颜色范围,去除非车牌区域的干扰。

子标题二:基于边缘检测的车牌识别算法•难点:车牌边缘与周围物体边缘相似,容易造成误判。

•解决方法:利用形态学操作(如膨胀和腐蚀)来实现边缘闭合,并通过设定合适的阈值对边缘进行提取,降低误判概率。

子标题三:基于字符分割的车牌识别算法•难点:字符之间存在粘连和重叠情况,增加了字符分割的难度。

•解决方法:基于连通区域分析的方法,通过计算字符之间的间距和像素个数,对重叠和粘连的字符进行分割。

难点二:噪声影响的处理子标题一:图像预处理•难点:采集到的车牌图像可能存在噪声和模糊问题。

•解决方法:使用图像增强算法(如直方图均衡化和高斯滤波)对车牌图像进行预处理,提高图像的质量。

子标题二:光照不均匀的情况•难点:车牌图像在不同光照条件下会出现明暗不均的问题。

•解决方法:使用自适应阈值化算法,根据图像局部区域的光照情况对图像进行二值化处理,提高车牌识别的准确性。

难点三:多样化的车牌样式和字体子标题一:车牌样式的差异•难点:不同地区和不同国家的车牌样式存在差异,增加了车牌识别的难度。

•解决方法:基于模板匹配的方法,通过建立车牌模板库,对不同样式的车牌进行匹配比对,提高识别的准确性。

子标题二:字体的多样性•难点:不同车牌使用的字体风格各不相同。

•解决方法:使用字符特征提取算法,通过对字符轮廓和特征点的统计分析,识别不同字体的字符。

车牌识别matlab程序1

车牌识别matlab程序1

[, pathname] = uigetfile({'*.jpg', 'JPEG文件(*.jpg)';'*.bmp','BMP文件(*.bmp)';});if( == 0), return, endglobal %声明全局变量= [pathname ];I=imread();imshow(I); %显示图像II1=rgb2gray(I);%RGB图转化为灰度图figure,imshow(I1);w1=medfilt2(I1);figure,imshow(w1);s1=histeq(w1,256);figure,imshow(s1);t1=imadjust(s1);figure,imshow(t1);I2=edge(t1,'robert',0.15,'both'); %用ROBERT算子提取图像边缘figure,imshow(I2);se=[1;1;1];I3=imerode(I2,se); %弱化二进制图像I2的边缘figure,imshow(I3);%为定位车牌,将白色区域膨胀,腐蚀去无关的小物件,包括车牌字符(下面两句)se=strel('rectangle',[25,20]); %用来腐蚀的形状为矩形,面积20*25I4=imclose(I3,se);figure,imshow(I4);I5=bwareaopen(I4,2000); %去除图像中面积过小的,可以肯定不是车牌的区域。

figure,imshow(I5);[y,x,z]=size(I5); %z=1。

y,x分别为I5图像的高和宽myI=double(I5)%myI=I5;tic%begin横向扫描white_y=zeros(y,1); %white_y为y行1列的零矩阵for i=1:yfor j=1:xif(myI(i,j,1)==1)%如果myI(i,j,1)即myI图像中坐标为(i,j)的点为白色%则white_y的相应行的元素white_y(i,1)值加1white_y(i,1)= white_y(i,1)+1;endendend[temp MaxY]=max(white_y); %temp为向量white_y的元素中的最大值,MaxY为该值的索引(在向量中的位置)PY1=MaxY;while ((white_y(PY1,1)>=80)&&(PY1>1))PY1=PY1-1;endPY2=MaxY;while ((white_y(PY2,1)>=80)&&(PY2<y))PY2=PY2+1;endIY=I(PY1:PY2,:,:); %IY为原始图像I中截取的纵坐标在PY1:PY2之间的部分%end横向扫描%begin纵向扫描white_x=zeros(1,x);for j=1:xfor i=PY1:PY2if(myI(i,j,1)==1)white_x(1,j)= white_x(1,j)+1;endendendPX1=1;while ((white_x(1,PX1)<3)&&(PX1<x))PX1=PX1+1;endPX2=x;while ((white_x(1,PX2)<3)&&(PX2>PX1))PX2=PX2-1;end%end纵向扫描PX1=PX1-2;PX2=PX2+2;Plate=I(PY1:PY2,:);t=tocfigure,plot(white_y);gridfigure,plot(white_x);gridfigure,imshow(IY);figure,imshow(Plate);% if isrgd(Plate);Plate3=rgb2gray(Plate);%else% Plate2=Plate;%endplate4=medfilt2(Plate3);plate5=histeq(plate4,256);Plate2=imadjust(plate5);g_max=double(max(max(Plate2))); g_min=double(min(min(Plate2)));t=round(g_max-(g_max-g_min)/2); [m,n]=size(Plate2);Plate2=im2bw(Plate2,t/256); figure,imshow(Plate2);plate=bwareaopen(Plate2,20); figure,imshow(plate);[y1,x1,z1]=size(plate);plate1=double(plate);% tt=1;Y1=zeros(y1,1);for i=1:y1for j=1:x1if(plate1(i,j,1)==1)Y1(i,1)=Y1(i,1)+1;endendendpy1=1;py0=1;while((Y1(py0,1)<20)&&(py0<y1)) py0=py0+1;endpy1=py0;while((Y1(py1,1)>=20)&&(py1<y1)) py1=py1+1;endplate=plate(py0:py1,:,:);figure,imshow(plate);X1=zeros(1,x1);for j=1:x1for i=1:y1if(plate1(i,j,1)==1)X1(1,j)=X1(1,j)+1;endendendfigureplot(0:x1-1,X1)px0=1;px1=1;for i=1:7while((X1(1,px0)<3)&&(px0<x1))px0=px0+1;endpx1=px0;while(((X1(1,px1)>=3)&&(px1<x1))||((px1-px0)<10)) px1=px1+1;endZ=plate(:,px0:px1,:);switch strcat('Z',num2str(i))case 'Z1'PIN0=Z;case 'Z2'PIN1=Z;case 'Z3'PIN2=Z;case 'Z4'PIN3=Z;case 'Z5'PIN4=Z;case 'Z6'PIN5=Z;otherwisePIN6=Z;endfigure% subplot(1,7,i);imshow(Z);px0=px1;end。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

附录车牌识别程序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 将计算计算获取的字符图像与样本库进行匹配,自动识别出字符代码。

相关文档
最新文档