车牌识别代码_第1页
车牌识别代码_第2页
车牌识别代码_第3页
车牌识别代码_第4页
车牌识别代码_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、function d=car(jpg)clcclearclose allfn,pn,fi=uigetfile('*.jpg','选择图片');I=imread(pn fn);subplot(3,2,1),imshow(I);title('原始图像');%显示原始图像I1=rgb2gray(I);%转化为灰度图像subplot(3,2,2),imshow(I1),title('灰度图像');I2=edge(I1,'sobel',0.08,'both');%采用robert算子进行边缘检测subplot

2、(3,2,3),imshow(I2),title('边缘检测后图像');se=1;1;1; %线型结构元素I3=imerode(I2,se); %腐蚀图像subplot(3,2,4),imshow(I3),title('腐蚀后边缘图像');se=strel('rectangle',25,25); %矩形结构元素I4=imclose(I3,se);%图像聚类、填充图像subplot(3,2,5),imshow(I4),title('填充后图像');I5=bwareaopen(I4,1600);%去除聚团灰度值小于1600的部分sub

3、plot(3,2,6),imshow(I5),title('形态滤波后图像')%图像定位%5y,x,z=size(I5);I6=double(I5); Y1=zeros(y,1); for i=1:y%逐行扫描 for j=1:x if(I6(i,j,1)=1) Y1(i,1)= Y1(i,1)+1; end end end %取行和值最大值 temp MaxY=max(Y1); figure; subplot(3,2,1),plot(0:y-1,Y1),title('行方向像素点灰度值累计和'),xlabel('行值'),ylabel('

4、;像素'); PY1=MaxY; %从和值最大行向前遍历和值点数大于50的行,直到最上面一行 while (Y1(PY1,1)>=50)&&(PY1>1) PY1=PY1-1; end fprintf('PY1=%d',PY1); %从和值最大行向后遍历和值点数大于50的行,直到最下面一行 PY2=MaxY; while (Y1(PY2,1)>=50)&&(PY2<y) PY2=PY2+1; end fprintf('PY2=%d',PY2);%行范围确定 IY=I(PY1:PY2,:,:);% f

5、igure;% imshow( IY);titile('行图像'); %列扫描 X1=zeros(1,x); for j=1:x for i=PY1:PY2 if(I6(i,j,1)=1) X1(1,j)= X1(1,j)+1; end end end %取行和值最大值 temp MaxX=max(X1); subplot(3,2,2),plot(0:x-1,X1),title('列方向像素点灰度值累计和'),xlabel('列值'),ylabel('像数'); PX1=1; while (X1(1,PX1)<3)&

6、&(PX1<x) PX1=PX1+1; end PX2=x; while (X1(1,PX2)<3)&&(PX2>PX1) PX2=PX2-1; end PX1=PX1-1; PX2=PX2+1;% PX1=MaxX;% %从和值最大列向前遍历和值点数大于10的行,直到最上面一行% while (X1(1,PX1)>=3)&&(PX1>1)% PX1=PX1-1;% end% fprintf('PX1=%d',PX1);% %从和值最大行向后遍历和值点数大于50的行,直到最下面一行% PX2=MaxX;% w

7、hile (X1(1,PX2)>=3)&&(PX2<x)% PX2=PX2+1;% end% fprintf('PX2=%d',PX2); %分割出车牌图像%dw=I(PY1:PY2,PX1:PX2,:);subplot(3,2,3),imshow(dw),title('定位剪切后的彩色车牌图像')a=dw; %读取图片文件中的数据b=rgb2gray(a); %将真彩色图像转换为灰度图像imwrite(b,'车牌灰度图像.jpg'); %将图像数据写入到图像文件中figure(4);subplot(4,2,1),im

8、show(b),title('车牌灰度图像');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); %返回矩阵b的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数。 d=(double(b)>=T); % d:二值图像imwrite(d,'车牌二值图像.jpg'); %将图像数据写入到图像文件中figure(4);subplot(4,2,2),im

9、show(d),title('车牌二值图像')figure(4),subplot(4,2,3),imshow(d),title('均值滤波前')% 滤波h=fspecial('average',3); %建立预定义的滤波算子,average指定算子的类型,3为相应的参数d=im2bw(round(filter2(h,d); %转换为二值图像imwrite(d,'均值滤波后.jpg'); %将图像数据写入到图像文件中figure(4),subplot(4,2,4),imshow(d),title('均值滤波后')%

10、膨胀或腐蚀se=eye(2); % 2阶单位矩阵m,n=size(d); %返回矩阵b的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数if bwarea(d)/m/n>=0.365 %计算二值图像中对象的总面积 d=imerode(d,se); %图像的腐蚀elseif bwarea(d)/m/n<=0.235 %计算二值图像中对象的总面积 d=imdilate(d,se); %实现膨胀操作endimwrite(d,'膨胀或腐蚀处理后.jpg'); %将图像数据写入到图像文件中figure(4),subplot(4,2,5),imshow(d)

11、,title('膨胀或腐蚀处理后')I2=bwareaopen(d,200);subplot(4,2,6);imshow(I2),title('形态学滤波后的二值化图像')% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割d=qiege(I2); %切割m,n=size(d); %返回矩阵b的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数figure(4),subplot(4,2,7),imshow(d),title('切割前面空白部分后')k1=1;k2=1;s=sum(d);j=1;while

12、j=n while s(j)=0 j=j+1; end k1=j;%起始位置 while s(j)=0 && j<=n-1 j=j+1; end k2=j-1;%结束为止 if k2-k1>=round(n/6.5) val,num=min(sum(d(:,k1+5:k2-5); d(:,k1+num+5)=0; % 分割 endend% figure;imshow(d);title('切割后后');% 再切割d=qiege(d);% 切割出 7 个字符% figure;imshow(d);title('切割后哈哈-');y1=10;

13、y2=0.25;flag=0;word1=;while flag=0 m,n=size(d); left=1;wide=0; while sum(d(:,wide+1)=0 wide=wide+1; end if wide<y1 % 认为是左侧干扰 d(:,1:wide)=0; d=qiege(d); else temp=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),:); if two_thirds/all>

14、;y2 flag=1;word1=temp; % WORD 1 end d(:,1:wide)=0;d=qiege(d); endendword2,d=getword(d);% 分割出第二个字符word3,d=getword(d);% 分割出第三个字符word4,d=getword(d);% 分割出第四个字符word5,d=getword(d);% 分割出第五个字符word6,d=getword(d);% 分割出第六个字符word7,d=getword(d);% 分割出第七个字符m,n=size(word1); %返回矩阵b的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数

15、word1=imresize(word1,40 20); %对图像做缩放处理,高40,宽20word2=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(5),subplot(3,7,8),imshow(word1),title('车牌号为:');subplot(3,7,9),imshow(wo

16、rd2);subplot(3,7,10),imshow(word3);subplot(3,7,11),imshow(word4);subplot(3,7,12),imshow(word5);subplot(3,7,13),imshow(word6);subplot(3,7,14),imshow(word7);imwrite(word1,'1.jpg');imwrite(word2,'2.jpg');imwrite(word3,'3.jpg');imwrite(word4,'4.jpg');imwrite(word5,'5.

17、jpg');imwrite(word6,'6.jpg');imwrite(word7,'7.jpg');%子程序:(getword子程序)liccode=char('0':'9' 'A':'Z' '皖'); %建立自动识别字符代码表,将t'0':'9' 'A':'Z' '皖'多个字符串组成一个字符数组,每行对应一个字符串,字符数不足的自动补空格SubBw2=zeros(32,16);l=1;for

18、 I=1:7 SubBw2=zeros(32,16); %产生32*16的全0矩阵 ii=int2str(I);%转换为串 t=imread(ii '.jpg');%读取图片文件中的数据 SegBw2=imresize(t,32 16,'nearest'); %对图像做缩放处理,高32,宽16,'nearest': 这个参数,是默认的, 即改变图像尺寸时采用最近邻插值算法 SegBw2=double(SegBw2)>20; if l=1 %第一位汉字识别 kmin=37;%10+26 kmax=37; elseif l=2 %第二位 AZ 字母识别 kmin=11; kmax=36; else l>=3 %第三位以后是字母或数字识别 kmin=1; kmax=36

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论