基于数字图像处理的车牌识别论文Word格式.docx
《基于数字图像处理的车牌识别论文Word格式.docx》由会员分享,可在线阅读,更多相关《基于数字图像处理的车牌识别论文Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
图像预处理边缘处理字符分割字符识别
1、设计目的
车牌识别系统主要是为了辨别所拍图片中的车牌部分,以此识别车辆。
通过车牌识别系统的设计,来实现经过我校西大门的车辆的识别。
2、设计原理:
设计的原理主要如下图所示:
3、设计步骤:
流程图如下:
4、实行方案
4.1.总体实行方案:
用摄像机获取自然环境下的汽车彩色图像,将彩色图像用matlab软件处理成灰度图像并绘制直方图,然后进行边缘检测图像的腐蚀,平滑图像以与去除二值图像的小对象等操作,再进行车牌的定位和字符分割与识别最终达到识别车牌照的目的。
4.2.各模块的实现:
4.2.1输入待处理的原始图像:
I=imread(‘car.jpg'
);
imshow(I);
%显示车牌的原始图片,结果如下:
图4.2.1原始图像picture1
4.2.2图像的灰度化并绘制直方图:
彩色图像的存储器所需的成本高,且减缓系统的速度执行,所以,在图像识别处理彩色图像一般都转换成灰度图像,以加快图像信息的处理速度。
从彩色图像到灰度图像的转换叫做灰度处理。
灰度直方图的横坐标代表图片的像素数,从左到右由暗到亮,灰度直方图的纵轴就表示其所占有图片的面积,峰值越低就意味着该明暗值的像素数量越少,从图4.2.2可以看出峰值最高的即为车牌区域。
I1=rgb2gray(I);
%灰度处理
subplot(1,2,1),imshow(I1);
title('
grayimage'
subplot(1,2,2),imhist(I1);
灰度图直方图'
%绘制灰度图和直方图
显示结果图像如下:
图4.2.2灰度化并绘制直方图picture2
4.2.3边缘检测
边缘是一定存在在两个拥有不一样灰度值的相邻的区域之间的,是灰度值不连续的一种表现,也是分割图象、纹理和形状特征提取等图像分析的基础。
本文用Roberts算子来实现边缘检测,他是一种利用局部差分算子寻找边缘的算子,Robert算子图像处理后结果边缘不是很平滑,当然还需要后续的腐蚀,平滑图像以与去除二值图像的小对象操作来提高精度。
由于阈值越小检测的边缘越丰富,结合选取的灰度图选择阈值为0.16较为合适。
用roberts算子实行边缘检测:
I2=edge(I1,'
roberts'
0.16,'
both'
imshow(I2);
robertsoperatoredgedetectionimage'
);
结果如下:
图4.2.3边缘检测picture3
4.2.4图像的腐蚀操作:
腐蚀操作就是通过不断的删除图片上的像素,将图片缩小,以此来达到去除小点状图形的效果。
se=[1;
1;
1];
I3=imerode(I2,se);
%图像腐蚀操作
imshow(I3);
corrosionimage'
图4.2.4图像腐蚀操作picture4
4.2.5平滑图像
图像平滑是去掉图像中的高频信息,使图像变的模糊,噪声一般都是高频信息,平滑的过程也就意味着除去图片噪声的过程。
se=strel('
rectangle'
[16,16]);
%建立正方形结构元素
I4=imclose(I3,se);
%图像聚类和填充
imshow(I4);
smothingimage'
图2.5平滑图像picture5
4.2.6除去二值图像的小对象
除去二值图像的小对象就为了去掉面积较小无关的白色区域,将车牌所在的大面积白色区域凸显出来。
I5=bwareaopen(I4,1900);
%除去聚团灰度值在1900以下的部分
imshow(I5);
removethesmallobjects'
%滤波后图像
显示结果如下:
图4.2.6除去二值图像的小对象picture6
4.3车牌定位
自然环境下,汽车图像背景十分复杂,受光照不均匀、污渍等影响,所以在自然背景下准确的将车牌区域确定下来是整个识别过程的关键,所以先要对原图像进行大围横向(X),纵向(Y)像素点相关搜索,找到符合汽车牌照的候选区,然后对候选区做进一步的分析,判断,最终确定一个最佳的区域作为牌照区域。
代码显示如下:
[y,x,z]=size(I5);
%返回I5各维的尺寸,存储在x,y,z中
myI=double(I5);
%将I5转换成双精度
tic%tic计时开始,toc计时结束
Blue_y=zeros(y,1);
%产生一个y*1的零阵
fori=1:
y
forj=1:
x
if(myI(i,j,1)==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方向车牌区域确定
%MaxY是yellow_y元素中最大值temp的索引
PY1=MaxY;
while((Blue_y(PY1,1)>
=5)&
&
(PY1>
1))
PY1=PY1-1;
PY2=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
if(myI(i,j,1)==1)
Blue_x(1,j)=Blue_x(1,j)+1;
end
PX1=1;
while((Blue_x(1,PX1)<
3)&
(PX1<
x))
PX1=PX1+1;
PX2=x;
while((Blue_x(1,PX2)<
(PX2>
PX1))
PX2=PX2-1;
PX1=PX1-1;
%车牌区域校正
PX2=PX2+1;
dw=I(PY1:
PY2-8,PX1:
PX2,:
t=toc;
subplot(1,2,1),imshow(IY),title('
Linedirectionareas'
%车牌行方向区域的确定
subplot(1,2,2),imshow(dw),title('
positioningcolorimages'
%车牌已经定位后的区域显示如下:
图4.3.1车牌的定位picture7
4.4字符的分割与识别
4.4.1.车牌的再处理
划分彩色图像需经过灰度变换,二值化,均值滤波,腐蚀和膨胀到一个字符,并对分割字符进二值化、归一化等图像预处理使车牌图像的车牌号字符分割构成隔离,然后分析识别已经分割字符识的图像并用文本的车牌号的形式呈现出来。
imwrite(dw,'
dw.jpg'
%把彩色车牌写入dw文件里
a=imread('
%读取车牌文件数据
b=rgb2gray(a);
%把车牌图像变换为灰度图
imwrite(b,'
graylicenceplate.jpg'
%把灰度图像写入文件里
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('
beforefilteringbinarylicenceplate'
%均值滤波之前
%滤波
h=fspecial('
average'
3);
%模板的尺寸:
3*3,average:
均值滤波,建立滤波算子
d=im2bw(round(filter2(h,d)));
%用指定的滤波器h然后对其均值滤波即进行d
afteraveragelicenceplate.jpg'
subplot(3,2,3),imshow(d),title('
afteraveragelicenceplate'
%操作某些图象
%膨胀或腐蚀
%se=strel('
square'
%图片膨胀处理
%'
line'
/'
diamond'
ball'
...
se=eye
(2);
%eye(n)returnsthen-by-nidentitymatrix单位矩阵
[m,n]=size(d);
ifbwarea(d)/m/n>
=0.36
d=imerode(d,se);
%假如大于0.36即图像进行腐蚀
elseif
bwarea(d)/m/n<
=0.23
d=imdilate(d,se);
%假如小于即实现膨胀操作
end
expansionorcorrosionthelicenceplate.jpg'
subplot(3,2,4),imshow(d),title('
expansionorcorrosionthelicenceplate'
运行结果显示如下:
图4.4.1字符分割与识别picture8
4.4.2字符分割
字符分割就是把已经定位好的车牌区域上的字符分别提取出来,我们知道中国的车牌上字符之间是存在间隙的,就是利用这个间隙来实现我们对定位区域的车牌分割,通过搜索连续在一起的字符块,若长度高于某一阈值,则为两个字符组成,要分割,对分割好的字符再进行归一化的处理。
%搜索连续在一起的字符块,若长度高于某一阈值,则为两个字符组成,要分割,对分割%建立子函数qiege、getword,调用子程序,分割车牌字符并做归一化的处理
d=qiege(d);
subplot(3,2,5),imshow(d),title(n)
k1=1;
k2=1;
s=sum(d);
j=1;
whilej~=n
whiles(j)==0
j=j+1;
k1=j;
whiles(j)~=0&
j<
=n-1
k2=j-1;
ifk2-k1>
=round(n/6.5)
[val,num]=min(sum