车牌识别附源代码Word下载.docx
- 文档编号:18324341
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:23
- 大小:561.30KB
车牌识别附源代码Word下载.docx
《车牌识别附源代码Word下载.docx》由会员分享,可在线阅读,更多相关《车牌识别附源代码Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
%将车牌的原图显示出来,结果如下:
2.将彩图转换为灰度图并绘制直方图:
I1=rgb2gray(I);
%将彩图转换为灰度图
figure
(2),subplot(1,2,1),imshow(I1);
title('
grayimage'
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);
roberts operator edgedetectionimage');
结果如下:
4.图像实施腐蚀操作:
se=[1;
1;
1];
I3=imerode(I2,se);
%对图像实施腐蚀操作,即膨胀的反操作
figure(4),imshow(I3);
title('corrosionimage'
5.平滑图像
se=strel('
rectangle'
[25,25]);
%构造结构元素以正方形构造一个se
I4=imclose(I3,se);
figure(5),imshow(I4);
title('
smothingimage');
ﻩ
6.删除二值图像的小对象
I5=bwareaopen(I4,2000);
% 去除聚团灰度值小于2000的部分
figure(6),imshow(I5);
title('
removethe smallobjects');
%用imshow函数显示滤波后图像
结果如下所示:
7.车牌定位
[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:
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方向车牌区域确定
PY1=MaxY;
while((Blue_y(PY1,1)>
=5)&
&(PY1>
1))
PY1=PY1-1;
end
PY2=MaxY;
while ((Blue_y(PY2,1)>
=5)&
&
(PY2<
y))
PY2=PY2+1;
end
IY=I(PY1:
PY2,:
,:
Blue_x=zeros(1,x);
%进一步确定x方向的车牌区域
forj=1:
x
for i=PY1:
PY2
if(myI(i,j,1)==1)
Blue_x(1,j)=Blue_x(1,j)+1;
end
end
end
PX1=1;
while((Blue_x(1,PX1)<3)&&
(PX1<
x))
PX1=PX1+1;
end
PX2=x;
while((Blue_x(1,PX2)<
3)&
&(PX2>
PX1))
PX2=PX2-1;
PX1=PX1-1;
%对车牌区域的校正
PX2=PX2+1;
dw=I(PY1:
PY2-8,PX1:
PX2,:
t=toc;
figure(7),subplot(1,2,1),imshow(IY),title('
Linedirectionareas'
figure(7),subplot(1,2,2),imshow(dw),title('
positioningcolorimages'
8.字符分割与识别
对分割出的彩色车牌图像进行灰度转换、二值化、均值滤波、腐蚀膨胀以及字符分割以从车牌图像中分离出组成车牌号码的单个字符图像,对分割出来的字符进行预处理(二值化、归一化),然后分析提取,对分割出的字符图像进行识别给出文本形式的车牌号码。
代码如下:
imwrite(dw,'dw.jpg'
%将彩色车牌写入dw文件中
a=imread('dw.jpg'
%读取车牌文件中的数据
b=rgb2gray(a);
%将车牌图像转换为灰度图
imwrite(b,'gray licence plate.jpg'
%将灰度图像写入文件中
figure(8);
subplot(3,2,1),imshow(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);
d=(double(b)>
=T);
%d:
二值图像
imwrite(d,'
binarylicenceplate.jpg'
subplot(3,2,2),imshow(d),title('
beforefiltering binarylicenceplate'
h=fspecial('
average'
3);
d=im2bw(round(filter2(h,d)));
%使用指定的滤波器h对h进行d即均值滤波
imwrite(d,'afteraveragelicenceplate.jpg');
subplot(3,2,3),imshow(d),title('
afteraveragelicenceplate')
se=eye
(2);
% eye(n)returnsthen-by-nidentitymatrix单位矩阵
[m,n]=size(d);
%返回矩阵b的尺寸信息,并存储在m,n中
ifbwarea(d)/m/n>
=0.365%计算二值图像中对象的总面积与整个面积的比是否大于0.365
d=imerode(d,se);
%如果大于0.365则图像进行腐蚀
elseif bwarea(d)/m/n<
=0.235%计算二值图像中对象的总面积与整个面积的比是否小于0.235
d=imdilate(d,se);
%如果小于则实现膨胀操作
end
imwrite(d,'
expansionorcorrosionthelicenceplate.jpg'
subplot(3,2,4),imshow(d),title('
expansion orcorrosion the licenceplate'
运行结果如下所示:
9.字符分割
在汽车牌照自动识别过程中,字符分割有承前启后的作用。
它在前期牌照定位的基础上进行字符的分割,然后再利用分割的结果进行字符识别。
字符识别的算法很多,因为车牌字符间间隔较大,不会出现字符粘连情况,所以此处采用的方法为寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割。
一般分割出来的字符要进行进一步的处理,以满足下一步字符识别的需要。
但是对于车牌的识别,并不需要太多的处理就已经可以达到正确识别的目的。
在此只进行了归一化处理,然后进行后期处理。
% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割
%首先创建子函数qiege与getword,而后调用子程序,将车牌的字符分割开并且进行归一化处理
d=qiege(d);
[m,n]=size(d);
subplot(3,2,5),imshow(d),title(n)
k1=1;
k2=1;
s=sum(d);
j=1;
whilej~=n
while s(j)==0
j=j+1;
end
k1=j;
whiles(j)~=0&
&j<
=n-1
j=j+1;
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);
y1=10;
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,[11 widem]));
[m,n]=size(temp);
all=sum(sum(temp));
two_thirds=sum(sum(temp([round(m/3):
2*round(m/3)],:
)));
if two_thirds/all>
y2
flag=1;
word1=temp;
%WORD 1
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);
figure(9);
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'
[m,n]=size(word1);
word1=imresize(word1,[40 20]);
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(2,7,8),imshow(word1),title('
subplot(2,7,9),imshow(word2),title('
2'
subplot(2,7,10),imshow(word3),title('
3'
subplot(2,7,11),imshow(word4),title('4'
subplot(2,7,12),imshow(word5),title('
5');
subplot(2,7,13),imshow(word6),title('
6');
subplot(2,7,14),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');
运行结果如下:
10.车牌识别:
模板匹配是图象识别方法中最具代表性的基本方法之一,它是将从待识别的图象或图象区域f(i,j)中提取的若干特征量与模板T(i,j)相应的特征量逐个进行比较,计算它们之间规格化的互相关量,其中互相关量最大的一个就表示期间相似程度最高,可将图象归于相应的类。
也可以计算图象与模板特征量之间的距离,用最小距离法判定所属类。
此处采用相减的方法来求得字符与模板中哪一个字符最相似,然后找到相似度最大的输出。
汽车牌照的字符一般有七个,大部分车牌第一位是汉字,通常代表车辆所属省份,紧接其后的为字母与数字。
车牌字符识别与一般文字识别在于它的字符数有限,汉字共约50多个,大写英文字母26个,数字10个。
为了实验方便,结合本次设计所选汽车牌照的特点,只建立了7个数字26个字母与10个数字的模板。
其他模板设计的方法与此相同。
首先取字符模板,接着依次取待识别字符与模板进行匹配,将其与模板字符相减,得到的0越多那么就越匹配。
把每一幅相减后的图的0值个数保存,即为识别出来的结果
源代码如下:
liccode=char(['
0'
:
'
9'
'A'
:
Z'
'
苏豫陕鲁京辽浙'
]);
%建立自动识别字符代码表
SubBw2=zeros(40,20);
l=1;
forI=1:
7
ii=int2str(I);
t=imread([ii,'
.jpg'
]);
SegBw2=imresize(t,[4020],'
nearest'
SegBw2=double(SegBw2)>
20;
ifl==1 %第一位汉字识别
kmin=37;
kmax=43;
elseifl==2 %第二位A~Z字母识别
kmin=11;
kmax=36;
elsel>
=3 %第三位以后是字母或数字识别
kmin=1;
kmax=36;
end
for k2=kmin:
kmax
fname=strcat('
字符模板\'
liccode(k2),'
.jpg'
SamBw2=imread(fname);
SamBw2=double(SamBw2)>
1;
for i=1:
40
forj=1:
20
SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);
end
end
%以上相当于两幅图相减得到第三幅图
Dmax=0;
fork1=1:
for l1=1:
if( SubBw2(k1,l1)>
0|SubBw2(k1,l1)<
0 )
Dmax=Dmax+1;
end
end
end
Error(k2)=Dmax;
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),imshow(dw),title(['
车牌号码:
Code],'
Color','b'
五、设计体会
课程设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。
以前老是觉得自己什么东西都不会,什么东西都不懂,而且又急于求成,结果造成什么都没学好,还是什么都不会。
通过这次课程设计,我才明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质,特别是对于我,基础比较差,一定不能太过于心急,要静下心来慢慢的研究。
虽然这个设计做的也不太好,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富,使我终身受益
六、参考文献:
[1]杨万山等,基于BP神经网络的工程图纸图形符号的识别,微型电脑应用,Vol.16,No.2,2000
[2] 王年、李婕、任彬、汪炳权.多层次汽车车牌照定位分割方法.安徽大学学报,1999(6)Vol.23.No.2
[3]崔 江、王友仁.车牌自动识别方法中的关键技术研究.计算机测量与控制,2003.11(4)
[4] 许志影、李晋平.MATLAB极其在图像处理中的应用.计算机与现代化,2004(4)
I=imread('
C:
\Users\yunshuni\Desktop\新建文件夹\0.jpg'
figure
(1),imshow(I);
title('
原始车牌'
%将车牌的原图显示出来
I1=rgb2gray(I);
figure
(2),subplot(1,2,1),imshow(I1);
title('
figure
(2),subplot(1,2,2),imhist(I1);
title('
灰度图直方图');
I2=edge(I1,'
roberts'
0.18,'
both'
%选择阈值0.18,用roberts算子进行边缘检测
figure(3),imshow(I2);
title('
边缘检测图像'
se=[1;
1];
I3=imerode(I2,se);
%对图像实施腐蚀操作,即膨胀的反操作
figure(4),imshow(I3);
title('腐蚀后图像'
se=strel('
rectangle'
[25,25]);
%构造结构元素以正方形构造一个se
I4=imclose(I3,se);
%图像聚类、填充图像
figure(5),imshow(I4);
闭运算后图像'
I5=bwareaopen(I4,2000);
% 去除聚团灰度值小于2000的部分
figure(6),imshow(I5);
去除后图像'
[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:
forj=1:
if(myI(i,j,1)==1)
%如果myI(i,j,1)即myI的图像中坐标为(i,j)的点值为1,即该点为车牌背景颜色蓝色
%则Blue_y(i,1)的值加1
Blue_y(i,1)=Blue_y(i,1)+1;
end
end
[tempMaxY]=max(Blue_y);
%Y方向车牌区域确定
%temp为向量yellow_y的元素中的最大值,MaxY为该值的索引
PY1=MaxY;
while((Blue_y(PY1,1)>
=5)&
(PY1>
1))
PY1=PY1-1;
end
PY2=MaxY;
while((Blue_y(PY2,1)>=5)&
(PY2<
y))
PY2=PY2+1;
en
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 车牌 识别 源代码