MATLAB车牌识别论文加源码Word下载.docx
《MATLAB车牌识别论文加源码Word下载.docx》由会员分享,可在线阅读,更多相关《MATLAB车牌识别论文加源码Word下载.docx(25页珍藏版)》请在冰点文库上搜索。
![MATLAB车牌识别论文加源码Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/95ec6d9c-637f-4c27-b42c-0997103ae705/95ec6d9c-637f-4c27-b42c-0997103ae7051.gif)
不同的气候条件、背景光照环境、车牌反光程度都决定了车牌的亮度特征。
2)外界背景的复杂程度也影响车牌的定位准确率。
背景中和车牌区域当中
有许多和车牌特征相似的长方形区域,这些容易给车牌定位造成误判导致车牌定位的准确率降低。
2主要理论概况
本图像预处理模块是将图像灰度化和用Roberts算子进行边缘检测的步骤。
车牌定位和分割采用的是利用数学形态法来确定车牌位置,再利用车牌彩色信息的彩色分割法来完成车牌部位分割。
字符的分割采用的方法是以二值化后的车牌部分进行垂直投影,然后在对垂直投影进行扫描,从而完成字符的分割。
本文即是针对其核心部分进行阐述并使用MATLAB软件环境中进行字符分割的仿真。
一个完整的车牌号识别系统要完成从图像采集到字符识别输出,过程相当复杂,基本可以分成硬件部分跟软件部分,硬件部分包括系统触发、图像采集,软件部分包括图像预处理、车牌位置提取、字符分割、字符识别四大部分。
3研究的主要内容
3.1车牌识别研究内容
车牌定位的研究现状车牌定位决定其后的车牌字符分割和识别,因此车牌定位是车牌识别技术中最关键的一步。
车牌定位的目的是从包含整个车辆的图像中找到车牌区域的图像。
车牌定位方法的出发点是利用车牌区域的特征来判断牌照,将车牌区域从整幅车辆图像中分割出来。
车牌字符识别的研究现状车牌字符识别就是对分割出的待识别的字符进行识别处理。
车牌的字符由有限的汉字、英文字母和数字组成。
目前车牌字符识别最常用于车牌字符识别的方法是基于模板匹配的方法、基于特征分类的方法两大类。
字符分割算法一直在不断的完善。
针对车牌的字符分割,是字符分割的一个具体应用,目前根据车牌的字符特征提出的算法主要有:
基于先验知识的分割算法、基于投影轮廓和拓扑结构的分割算法等。
例如,黄可为等利用视觉神经生理学和认知学实验结果,归纳出一种仿生目标搜索策略将其运行到车牌字符分割中。
吴进军等根据车牌字符的排列规律和字符的几何特征,提出了一种基于第三个字符定位的车牌字符分割方法,很好地解决了车牌定位后的字符缺损情况。
3.2车牌识别系统程序设计
3.2.1车牌区域提取
图像读取及车牌区域提取主要有:
图像灰度图转化、图像边缘检测、灰度图腐蚀、图像的平滑处理以及车牌区域的边界值计算。
其程序流程图如下:
图3.1预处理及边缘提取框图
3.2.2图像灰度图转化
由于车牌的底色不同,所以从RGB图像直接进行车牌区域提取存在很大困难,但不管哪种底色的车牌,其底色与上面的字符颜色的对比度大,将RGB图像转化成灰度图像时,车牌底色跟字符的灰度值会相差很大。
。
原图、灰度对于将彩色图象转换成灰度图象时,图象灰度值H可由下面的公式计算:
(3.1)
(3.2)
通过程序运行其效果图见图3.2和图3.3:
图3.2原始图像
图3.3灰度图像
经过程序运行出来的灰度图可以比较容易的识别出车牌的区域,达到了预期的灰度效果。
3.2.3图像的边缘检测
在Matlab中利用函数edge()实现边缘检测,具体的用法如下所示:
Car_Image_Bin=edge(Car_Image_Gray,'
robert'
0.15,'
both'
);
Robert算子采用对角方向相邻两像素之差,其计算公式如下:
(3.3)
(3.4)
其幅值为:
(3.5)
使用边缘检测,腐蚀效果如图3.4所示:
图3.4边缘效果图
基本上达到了边缘检测的效果。
但是,在车牌附近的其他区域也由于各种干扰的影响,也存在一些白色区域。
所以要对图像做进一步的处理,用灰度图腐蚀来消除多余的边界点。
3.2.4灰度图腐蚀
所谓腐蚀即一种消除边界点,使边界向内部收缩的过程。
利用它可以消除小而且无意义的物体。
腐蚀的规则是输出图像的最小值是输入图像领域中的最小值,在一个二值图像中,只要有一个像素值为0,则相应的输出像素值为0。
本系统使用imerode()函数,
Car_Image_Erode=imerode(Car_Image_Bin,Se);
腐蚀后如图:
图3.5腐蚀效果图
已经得到了车牌图像的轮廓线了,只要再经过适当的处理即可把车牌提出出来。
3.2.5图像平滑处理
得到车牌区域的图像轮廓线后,由于图像的数字化误差和噪声直接影响了脚点的提取,因此在脚点提取之前必须对图像进行平滑处理,Matlab有一个图像平滑处理函数imclose()
Car_Image_Perform=imclose(Car_Image_Erode,Se);
结构单元中Se一个小于对象闭合图形,只要两个封闭域的距离小于Se,就将这两个连接成一个连通域,Se生成方式采用
Se=strel('
rectangle'
[25,25]);
由于车牌图像经过腐蚀以后只剩下车牌区域以及车的标志。
在程序运行的图像平滑后效果如下:
图3.6平滑处理后效果
从平滑后的效果图分析,达到了预定的目标。
消除了图像的数字化误差和噪声对脚点的直接提取的影响。
3.2.6移除小对象
图像平滑处理了,可能会有多个闭合区域,对于不是车牌区域的必须予以删除,Matlab提供了一个函数bwareaopen(),用于删除二值图像中面积小于一个定值的对象,默认情况下使用8邻域,
Car_Image_Perform2=bwareaopen(Car_Image_Perform,2000);
这样,Car_Image_Perform中面积小于2000的对象都被删除了。
小对象被删除后的图像如图3.7所示:
图3.7移除小对象后效果图
移除小对象后的效果图已经非常明显了,图像中最后只存在车牌区域,其他的图像已经完全滤除掉了,包括小物体,车的标志等影响已经没有了。
3.2.7车牌区域的边界值计算
采用水平与垂直双向投影法。
水平坐标的确定,先定义一个
的数组,其中
为原始图像的宽度值,然后将二值图像垂直投影到
轴。
从直方图中基本可以看书水平方向上的两个分界线,为了便于处理,该课题将像素值临界值定量化,取值5个像素。
从左向右寻找第一个1值像素大于5的
坐标为水平方向左侧分界线,从右向左寻找到第一个1值像素量大于5的为右侧分界线,程序可以用for循环语句。
垂直方向的分界线可用同样的方法实现。
分界线计算后,即可从原图像中剪切出只包含车牌的区域图像。
剪切得到的图像如下。
图3.9为RGB图像切割出来的图像:
图3.9原图中的车牌区域图像
对比原始图像与二值图裁减图可以看出,车牌的四个边界值基本上被确定下来了,这样就可以从原始图像中直接确定车牌的区域了。
所以车牌就成功地被提取出来了
3.2.8车牌处理
先将RGB图像转换成灰度值,再将灰度图转化成二进制图,在Matlab实现方式如下:
T=round(License_Image_Gray_max-(License_Image_Gray_max-License_Image_Gray_min)/3);
同时采集大的图像噪点依然存在,因此可以通过处理图像的低频部分来锐化图像。
这里采用高通滤波算法。
腐蚀已经在在上文介绍,膨胀刚好与腐蚀相反,运算规则是输出图像的像素值是输入图像邻域中的最大值,在一个二值图像中,只要一个像素值为1,则相应的输出像素值为1。
根据经验值,车牌图像中,字符面积与车牌面积之比在(0.235,0.365)之间,因此计算字符面积与车牌面积比值,如果大于0.365则对图像进行腐蚀,如果小于0.235则对图像进行膨胀,
在这里结构元素Se使用一个二维单位矩阵
图3.12车牌处理后效果
4结论
根据车牌特点,车牌定位的算法分为三类,一类是基于边缘的,一类是基于颜色的,一类是基于机器学习的等。
这里我采用的是边缘检测的方法实现定的。
字符分割的方法也有多种:
1.
基于聚类分析的字符分割;
2.
投影分割的方法;
3.基于模板匹配的字符分割等。
最常用的是投影分割,主要是针对在车牌定位,图像预处理后比较规则的车牌图像。
优点是程序逻辑设计简单,循环执行功能单一,便于设计和操作,程序执行时间短。
字符识别的基本方法通常又三类:
1.结构特征分析方法;
2.模板匹配法;
3.神经网络法。
此处采用的是模板匹配的方法,即是将要识别的字符与事先构造好的模板进行比对,根据与模板的相似度的大小来确定最终的识别结果。
但是系统本身还存在许多不足,特别是对图像的分割与识别,目前还存在一定问题。
距离具体实用的要求仍有很大差距,但我却在这次学习中学到了很多知识!
参考文献
[1]
张红,数字图像处理与分析
[2]
叶晨洲,廖金周,一种基于纹理的牌照图象二值化方法
[3]
刘阳,伊铁源等.数字图象处理应用于车辆牌照的识别
[4]
崔江、王友仁.车牌自动识别方法中的关键技术研究
[5]
韩勇强、李世祥.汽车牌照子图像的定位算
附录:
程序源码
%function[d]=main()
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('
真彩色增强'
imshow(I);
I1=rgb2gray(I);
%RGB图像转灰度图像
灰度处理前'
),subplot(1,2,1),imshow(I1);
灰度处理前的灰度图'
subplot(1,2,2),imhist(I1);
灰度处理前的灰度图直方图'
%线性灰度变换
I1=imadjust(I1,[0.3,0.7],[]);
灰度处理后'
灰度处理后的灰度图'
灰度处理后的灰度图直方图'
%进行中值滤波
I1=medfilt2(I1);
figure,imshow(I1);
中值滤波'
%边缘检测:
sobel,roberts,canny,prewitt等
I2=edge(I1,'
roberts'
0.25,'
%边缘检测算法,强度小于阈值0.15的边缘被省略掉,'
两个方向检测(缺省默认)
边缘检测'
),imshow(I2);
robert算子边缘检测'
)
se=[1;
1;
1];
I3=imerode(I2,se);
%腐蚀Imerode(X,SE).其中X是待处理的图像,SE是结构元素对象
腐蚀后图像'
),imshow(I3);
腐蚀后的图像'
se=strel('
[20,20]);
%25X25的矩形strel
I4=imclose(I3,se);
%用25*25的矩形对图像进行闭运算(先膨胀后腐蚀)有平滑边界作用
平滑处理'
),imshow(I4);
平滑图像的轮廓'
I5=bwareaopen(I4,1000);
%从二进制图像中移除所有少于2000像素的连接对象,消失的是连续的白色像素数量少于2000的字符
移除小对象'
),imshow(I5);
从对象中移除小对象'
[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
[tempMaxY]=max(Blue_y);
%Y方向车牌区域确定[tempMaxY]临时变量MaxY
PY1=MaxY;
%以下为找车牌Y方向最小值
while((Blue_y(PY1,1)>
=5)&
&
(PY1>
1))%%为什么判断蓝色像素点>
=5(才算蓝色)
PY1=PY1-1;
PY2=MaxY;
%以下为找车牌Y方向最大值难道最大值不是MaxY
while((Blue_y(PY2,1)>
(PY2<
y))
PY2=PY2+1;
%IY=I(PY1:
PY2,:
:
%%%%%%%%%%%%%%%%%X方向%%%%%%%%%
Blue_x=zeros(1,x);
%进一步确定x方向的车牌区域
forj=1:
fori=PY1:
PY2
%只需扫描的行
Blue_x(1,j)=Blue_x(1,j)+1;
%蓝色像素点统计
PX1=1;
%以下为找车牌X方向最小值
while((Blue_x(1,PX1)<
3)&
(PX1<
x))%%为什么判断蓝色像素点<
3(不算蓝色?
PX1=PX1+1;
PX2=x;
%以下为找车牌X方向最大值
while((Blue_x(1,PX2)<
(PX2>
PX1))
PX2=PX2-1;
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('
行方向合理区域'
定位剪切后的彩色车牌图像'
),%subplot(1,2,2),
imshow(dw),title('
imwrite(dw,'
dw.jpg'
%直接自动读入%[filename,filepath]=uigetfile('
输入一个定位裁剪后的车牌图像'
%jpg=strcat(filepath,filename);
%strcat函数:
a=imread('
b=rgb2gray(a);
imwrite(b,'
1.车牌灰度图像.jpg'
车牌处理'
subplot(3,2,1),imshow(b),title('
1.车牌灰度图像'
%g_max=double(max(max(b)));
%以下作阈值化(灰度图转二值图)
%g_min=double(min(min(b)));
%max(a)求的每列的最大值,是一维数据;
max(max(a))是求这一维数据的最大值。
%T=round(g_max-(g_max-g_min)/2);
%T为二值化的阈值
round:
取整为最近的整数
%[m,n]=size(b);
%m:
b的行向量数n:
b的列向量数
%d=(double(b)>
=T);
%d:
二值图像
%imwrite(d,'
2.车牌二值图像.jpg'
b=imadjust(b,[0.3,0.7],[]);
subplot(3,2,2),imshow(b);
2.线性灰度处理后的灰度图'
%进行二值化处理
d=im2bw(b,0.4);
%将灰度图像进行二值化处理
imwrite(d,'
subplot(3,2,3),imshow(d),title('
3.车牌二值图像'
%显示二值化图像
d=medfilt2(d);
4.均值滤波后.jpg'
subplot(3,2,4),imshow(d);
4.中值滤波后'
%均值滤波
%h=fspecial('
average'
3);
%d=im2bw(round(filter2(h,d)));
%滤波后,im2bw():
将图像转成二值图像(可以不用round函数也是一样的)
%subplot(3,2,4),imshow(d),title('
4.均值滤波后'
%某些图像进行操作
%膨胀或腐蚀
感觉没什么效果咧
%se=strel('
square'
%使用一个3X3的正方形结果元素对象对创建的图像进行膨胀
%'
line'
/'
diamond'
ball'
dish'
...线/菱形/球/正方形/圆
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);
%膨胀
imopen(d,se);
%se=eye(7);
%imopen(d,se);
5.膨胀或腐蚀处理后.jpg'
subplot(3,2,5),imshow(d),title('
5.膨胀或腐蚀处理后'
%寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割
d=qiege(d);
%调用qiege()子程序
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
k2=j-1;
ifk2-k1>
=round(n/6.5)
[val,num]=min(sum(d(:
[k1+5:
k2-5])));
d(:
k1+num+5)=0;
%分割
%再切割
%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的意义?
ifwide<
y1
%认为是左侧干扰为什么是10?
[1:
wide])=0;
%将白色汉字前的白色弄成黑色
%
figure,imshow(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%?
什么意思?