车牌识别模板匹配优质代码.docx
- 文档编号:23604426
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:14
- 大小:18.58KB
车牌识别模板匹配优质代码.docx
《车牌识别模板匹配优质代码.docx》由会员分享,可在线阅读,更多相关《车牌识别模板匹配优质代码.docx(14页珍藏版)》请在冰豆网上搜索。
车牌识别模板匹配优质代码
closeall
clc
[filename,filepath]=uigetfile('.jpg','输入一个需要识别的车牌图像');%直接自动读入%
file=strcat(filepath,filename);%strcat函数:
连接字符串;把filepath的字符串与filename的连接,即路径/文件名
I=imread(file);
figure('name','原图'),imshow(I);title('原图')
%图像增强
%h=ones(5,5)/25;%过滤器h
%I=imfilter(I,h);%真彩色增强
%figure('name','真彩色增强');imshow(I);title('真彩色增强');
I1=rgb2gray(I);%RGB图像转灰度图像
%%figure('name','灰度处理前'),subplot(1,2,1),imshow(I1);title('灰度处理前的灰度图');
%%subplot(1,2,2),imhist(I1);title('灰度处理前的灰度图直方图');
%线性灰度变换
I1=imadjust(I1,[0.3,0.7],[]);
figure('name','灰度处理后'),subplot(1,2,1),imshow(I1);title('灰度处理后的灰度图');
subplot(1,2,2),imhist(I1);title('灰度处理后的灰度图直方图');
%进行中值滤波
I1=medfilt2(I1);
figure,imshow(I1);title('中值滤波');
%边缘检测:
sobel,roberts,canny,prewitt等
I2=edge(I1,'roberts',0.25,'both');%边缘检测算法,强度小于阈值0.15的边缘被省略掉,'both'两个方向检测(缺省默认)
figure('name','边缘检测'),imshow(I2);title('robert算子边缘检测')
se=[1;1;1];
I3=imerode(I2,se);%腐蚀Imerode(X,SE).其中X是待处理的图像,SE是结构元素对象
figure('name','腐蚀后图像'),imshow(I3);title('腐蚀后的图像');
se=strel('rectangle',[20,20]);%25X25的矩形strel(膨胀、腐蚀、开运算、闭运算)是创建由指定形状shape对应的结构元素,se=strel('rectangle',20,20)%SE=strel('rectangle',MN)
I4=imclose(I3,se);%用25*25的矩形对图像进行闭运算(先膨胀后腐蚀)有平滑边界作用
figure('name','平滑处理'),imshow(I4);title('平滑图像的轮廓');
I5=bwareaopen(I4,1000);%从二进制图像中移除所有少于2000像素的连接对象,消失的是连续的白色像素数量少于2000的字符
figure('name','移除小对象'),imshow(I5);title('从对象中移除小对象');
[y,x,z]=size(I5);%y是行数,x是列数,z是维数
myI=double(I5);%转成双精度型
tic%开始计时
Blue_y=zeros(y,1);%zeros(M,N)表示的是M行*N列的全0矩阵
fori=1:
y
forj=1:
x
if(myI(i,j,1)==1)%%判断蓝色像素
Blue_y(i,1)=Blue_y(i,1)+1;%蓝色像素点统计
end
end
end
[tempMaxY]=max(Blue_y);%Y方向车牌区域确定[tempMaxY]临时变量MaxY
PY1=MaxY;%以下为找车牌Y方向最小值
while((Blue_y(PY1,1)>=5)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;%以下为找车牌Y方向最大值
while((Blue_y(PY2,1)>=5)&&(PY2 PY2=PY2+1; end %IY=I(PY1: PY2,: : ); %%%%%%%%%%%%%%%%%X方向%%%%%%%%% Blue_x=zeros(1,x);%进一步确定x方向的车牌区域 forj=1: x fori=PY1: PY2%只需扫描的行 if(myI(i,j,1)==1)%%判断蓝色像素 Blue_x(1,j)=Blue_x(1,j)+1;%蓝色像素点统计 end end end PX1=1;%以下为找车牌X方向最小值 while((Blue_x(1,PX1)<5)&&(PX1 ) PX1=PX1+1; end PX2=x;%以下为找车牌X方向最大值 while((Blue_x(1,PX2)<3)&&(PX2>PX1)) PX2=PX2-1; end PY1=PY1-2;%对车牌区域的校正为什么要这么+- PX1=PX1-2; PX2=PX2+3; PY2=PY2+10; dw=I(PY1: PY2-8,PX1: PX2,: );%裁剪图像 toc%t=toc;%停止计时 %figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域'); figure('name','定位剪切后的彩色车牌图像'),%subplot(1,2,2), imshow(dw),title('定位剪切后的彩色车牌图像') imwrite(dw,'dw.jpg'); a=imread('dw.jpg'); b=rgb2gray(a); imwrite(b,'1.车牌灰度图像.jpg'); figure('name','车牌处理');subplot(3,2,1),imshow(b),title('1.车牌灰度图像') %g_max=double(max(max(b)));%以下作阈值化(灰度图转二值图) %线性灰度变换 b=imadjust(b,[0.3,0.7],[]); subplot(3,2,2),imshow(b);title('2.线性灰度处理后的灰度图'); %进行二值化处理 d=im2bw(b,0.4);%将灰度图像进行二值化处理 imwrite(d,'2.车牌二值图像.jpg'); subplot(3,2,3),imshow(d),title('3.车牌二值图像');%显示二值化图像 %进行中值滤波 d=medfilt2(d); imwrite(d,'4.均值滤波后.jpg'); subplot(3,2,4),imshow(d);title('4.中值滤波后'); se=eye (2);%eye(n)返回n乘n单一矩阵;单位矩阵 [m,n]=size(d); ifbwarea(d)/m/n>=0.365%函数bwarea计算目标物的面积,单位是像素;bwarea/m/n即为单个像素? ? d=imerode(d,se);%腐蚀 elseifbwarea(d)/m/n<=0.235 d=imdilate(d,se);%膨胀 end imopen(d,se); %se=eye(7); %imopen(d,se); imwrite(d,'5.膨胀或腐蚀处理后.jpg'); subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%进行字符识别%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割 d=qiege(d);%调用qiege()子程序 [m,n]=size(d); figure,subplot(2,1,1),imshow(d),title(n) k1=1;k2=1; j=1; s=sum(d);%sum(x)就是竖向相加,求每列的和,结果是行向量;sum(x,2)表示矩阵x的横向相加,求每行的和,结果是列向量。 sum(X(: ))表示矩阵求和 whilej~=n%%%%%什么原理 whiles(j)==0%%无文字为什么 j=j+1; end k1=j; whiles(j)~=0&&j<=n-1 j=j+1; end k2=j-1; ifk2-k1>=round(n/6.5) [val,num]=min(sum(d(: [k1+5: k2-5]))); d(: k1+num+5)=0;%分割 end end %再切割 %d=qiege(d); %切割出7个字符 y1=10;y2=0.25;flag=0;word1=[]; whileflag==0%flag为自定义,以便标记循环用 [m,n]=size(d); left=1; wide=0; whilesum(d(: wide+1))~=0%二值图像: 黑色像素代表感兴趣的对象而白色像素代表背景。 逻辑矩阵只包括0(显示为黑色)和1(显示为白色) wide=wide+1;%? wide的意义? end ifwide d(: [1: wide])=0;%将白色汉字前的白色弄成黑色 %figure,imshow(d); d=qiege(d);%处理干扰后再次调用切割子程序 else temp=qiege(imcrop(d,[11widem]));%imcrop函数截取图像[xminyminwidthheight] [m,n]=size(temp); all=sum(sum(temp)); two_thirds=sum(sum(temp([round(m/3): 2*round(m/3)],: ))); iftwo_thirds/all>y2%? ? 什么意思? ? flag=1;word1=temp;%第一个字符 end d(: [1: wide])=0;d=qiege(d);%? 为什么又处理一次? end 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); subplot(5,7,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); %商用系统程序中归一化大小为40*20,此处演示 word1=imresize(word1,[4020]);%imresize对图像做缩放处理,常用调用格式为: B=imresize(A,ntimes,method);其中method可选nearest,bilinear(双线性),bicubic,box,lanczors2,lanczors3等 word2=imresize(word2,[4020]); word3=imresize(word3,[4020]); word4=imresize(word4,[4020]); word5=imresize(word5,[4020]); word6=imresize(word6,[4020]); word7=imresize(word7,[4020]); subplot(5,7,15),imshow(word1),title('11'); subplot(5,7,16),imshow(word2),title('22'); subplot(5,7,17),imshow(word3),title('33'); subplot(5,7,18),imshow(word4),title('44'); subplot(5,7,19),imshow(word5),title('55'); subplot(5,7,20),imshow(word6),title('66'); subplot(5,7,21),imshow(word7),title('77'); 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''京辽陕苏鲁浙']); SubBw2=zeros(40,20);%创建一个40行20列的0矩阵 l=1; forI=1: 7 ii=int2str(I);%将整型数据转换为字符串型数据 t=imread([ii,'.jpg']);%依次读入七位车牌字符 SegBw2=imresize(t,[4020],'nearest');%对读入的字符进行缩放 ifI==1%第一位汉字识别 kmin=37; kmax=42; elseifI==2%第二位A~Z字母识别 kmin=11; kmax=36; elseI>=3%第三位以后是字母或数字识别;即I>=3 kmin=1; kmax=36; end fork2=kmin: kmax fname=strcat('namebook\',liccode(k2),'.jpg');%strcat函数: 连接字符串 SamBw2=imread(fname); fori=1: 40 forj=1: 20 SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j); end end %以上相当于两幅图相减得到第三幅图进行匹配 Dmax=0;%与模板不同的点个数 fork1=1: 40 forl1=1: 20 if(SubBw2(k1,l1)>5|SubBw2(k1,l1)<-5)%"|"/"||"或操作(>215)20以上无区别 Dmax=Dmax+1; end end end Error(k2)=Dmax;%记录下字符与模板k2不同的点个数 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; end figure(10),subplot(5,7,1: 7),imshow(dw),title('第一步: 车牌定位'), xlabel({'第二步: 车牌分割'});%'', subplot(6,7,15),imshow(word1); subplot(6,7,16),imshow(word2); subplot(6,7,17),imshow(word3); subplot(6,7,18),imshow(word4); subplot(6,7,19),imshow(word5); subplot(6,7,20),imshow(word6); subplot(6,7,21),imshow(word7); subplot(6,7,22: 42),imshow('dw.jpg'); =============================================================== Qiege.m切割子程序 functione=qiege(d) [m,n]=size(d); top=1;bottom=m;left=1;right=n;%init whilesum(d(top,: ))==0&&top<=m top=top+1; end whilesum(d(bottom,: ))==0&&bottom>=1 bottom=bottom-1; end whilesum(d(: left))==0&&left<=n left=left+1; end whilesum(d(: right))==0&&right>=1 right=right-1; end dd=right-left; hh=bottom-top; e=imcrop(d,[lefttopddhh]); =============================================================== Getword.m取出字符子程序 function[word,result]=getword(d) word=[];flag=0;y1=8;y2=0.5; whileflag==0 [m,n]=size(d); wide=0; whilesum(d(: wide+1))~=0&&wide<=n-2 wide=wide+1; end temp=qiege(imcrop(d,[11widem])); [m1,n1]=size(temp); ifwide d(: [1: wide])=0; ifsum(sum(d))~=0 d=qiege(d);%切割出最小范围 elseword=[];flag=1; end else word=qiege(imcrop(d,[11widem])); d(: [1: wide])=0; ifsum(sum(d))~=0; d=qiege(d);flag=1; elsed=[]; end end end %end result=d;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 车牌 识别 模板 匹配 优质 代码