图像处理车牌识别系统设计实验报告1文档格式.docx
《图像处理车牌识别系统设计实验报告1文档格式.docx》由会员分享,可在线阅读,更多相关《图像处理车牌识别系统设计实验报告1文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
对于提取出的单个字符,先进行归一化操作,再与给定的模板做对比,识别出字符。
三、详细设计步骤
1.车牌定位:
车辆牌照识别整个系统主要是由车牌定位和字符识别两部分组成,其中车牌定位又可以分为图像预处理及边缘提取模块和牌照的定位;
流程图:
1.1图像的预处理
为了用于牌照的分割和牌照字符的识别,原始图象应具有适当的亮度,较大的对比度和清晰可辩的牌照图象。
但由于该系统的摄像部分工作于开放的户外环境,加之车辆牌照的整洁度、自然光照条件、拍摄时摄像机与牌照的矩离和角度以及车辆行驶速度等因素的影响,牌照图象可能出现模糊、歪斜和缺损等严重缺陷,因此需要对原始图象进行识别前的预处理。
(1)一般的车牌识别只对小对象进行移除,但是有时候因为拍照原因,即使对图像进行了很好的预处理,还是不能排除一些比较大的又和车牌比较相像的地方,例如图
(1)中,车后面的玻璃窗仅仅进行灰度处理和形态学处理,平滑处理是无法排除其对车牌定位的影响的,因此需要对大对象移除(移除大对象前需对图像进行统一化--压缩)。
图
(1)
实现的代码:
img=image;
I=img;
[x,y,z]=size(img);
ifx>
2000||y>
2000
img=img(1:
2:
end,1:
end,:
);
[x,y,z]=size(img);
end
hsi=rgb2hsi(img);
fori=1:
x
forj=1:
y
if(hsi(i,j,1)<
=0.65&
&
hsi(i,j,1)>
=0.55&
hsi(i,j,2)>
0.4);
%0.40.
hsi(i,j,2)=0;
hsi(i,j,3)=1;
;
else
hsi(i,j,3)=0;
end
end
origonImg=hsi2rgb(hsi);
rgbnew=origonImg;
(2)灰度校正:
由于牌照图象在拍摄时受到种种条件的限制和干扰,图象的灰度值往往与实际景物不完全匹配,这将直接影响到图象的后续处理。
如果造成这种影响的原因主要是由于被摄物体的远近不同,使得图象中央区域和边缘区域的灰度失衡,或是由于摄像头在扫描时各点的灵敏度有较大的差异而产生图象灰度失真,或是由于曝光不足而使得图像的灰度变化范围很窄。
这时就可以采用灰度校正的方法来处理,增强灰度的变化范围、丰富灰度层次,以达到增强图象的对比度和分辨率。
灰度校正图graynew=rgb2gray(rgbnew);
(3)边缘检测:
边缘是指图像局部亮度变化显著的部分,是图像风、纹理特征提取和形状特征提取等图像分析的重要基础。
所以在此我们要对图像进行边缘检测。
图象增强处理对图象牌照的可辩认度的改善和简化后续的牌照字符定位和分割的难度都是很有必要
实现代码:
graynew=rgb2gray(rgbnew);
graynew=imfill(graynew,'
holes'
fori=1:
3
se1=[111;
111;
111];
graynew=imdilate(graynew,se1);
se=[1;
1;
1];
graynew=imerode(graynew,se);
%腐蚀Imerode(X,SE).其中X是待处理的像,%SE是结构元素对象
graynew=getcenter(graynew);
graynew=double(graynew);
[rowcol]=size(graynew);
1.2车牌定位
牌照的定位是在经图象预处理后的原始灰度图象中确定牌照的具体位置,并将包含牌照字符的一块子图象从整个图象中分割出来,供字符识别子系统识别之用。
图为定位出的车牌
车牌裁剪:
colArray=zeros(row,1);
row
col
if(graynew(i,j,1)==1)
colArray(i,1)=colArray(i,1)+1;
[maxcountmaxIndex]=max(colArray);
roughY=maxIndex;
while((colArray(roughY,1)>
=5)&
(roughY>
1))
roughY=roughY-1;
y1=roughY;
(roughY<
row))
roughY=roughY+1;
y2=roughY;
rowArray=zeros(1,col);
forj=y1:
y2
ifgraynew(j,i)==1
rowArray(1,i)=rowArray(1,i)+1;
[maxcountmaxIndex]=max(rowArray);
roughX=maxIndex;
while((rowArray(1,roughX)>
(roughX>
roughX=roughX-1;
x1=roughX;
(roughX<
col))
roughX=roughX+1;
x2=roughX;
dw=img(y1:
y2,x1:
x2,:
greenframe=drawframe(img,y1,y2,x1,x2);
imwrite(greenframe,'
imgAfterLocation/greenframe.jpg'
imwrite(dw,'
imgAfterLocation/dw.jpg'
2、字符分割:
传统的字符分割方法有投影法、模板匹配法、聚类分析法。
由于投影法比较准确、编程较简单,且易于实际操作,能满足在复杂环境下,所以我们采用的是投影法分割车牌字符。
车牌分割总流程图:
各部分代码实现和运行效果:
2.1、对读入图像进行预处理操作
I=imread('
%读取图像
I1=rgb2gray(I);
%彩色图像转化为灰度图像
T=graythresh(I1);
%找到灰度图像的阈值
[y,x,z]=size(I1);
%计算I1各维的大小
Se=strel('
disk'
fix(y/45));
%创建一个平坦的圆盘形结构元素
I2=imopen(I1,Se);
%取圆盘形的开运算
subplot(2,2,3);
%图一的第三幅图
imshow(I2),title('
开运算后图像'
diamond'
fix(y/140));
%创建一个平坦的菱形结构元素
I3=imclose(I2,Se);
%取菱形结构的闭运算
I4=double(I3);
%变为双精度
2.2图像校正
代码:
bw1=edge(I1,'
sobel'
'
horizontal'
%用Sobel水平算子对图像边化
figure,imshow(bw1)
bw1=imcrop(bw1,[00500100]);
%对图像进行剪切,保留图像的%一条直线,减小运算量
theta=0:
179;
%定义theta角度范围
r=radon(bw1,theta);
%对图像进行Radon变换
figure,imshow(r)
[m,n]=size(r);
c=90;
m
forj=1:
n
ifr(1,1)<
r(i,j)
r(1,1)=r(i,j);
c=j;
end%检测Radon变换矩阵中的峰值所对应的列坐标
rot=90-c;
%确定旋转角度
A=imrotate(I1,rot,'
crop'
%对图像进行旋转矫正
2.3计算行方向的像素,用来去除行方向上的边框
计算行像素:
Y1=zeros(y,1);
if(I4(i,j,1)==1)
Y1(i,1)=Y1(i,1)+1;
%计算I3第j列有几个一
end
figure
(2);
plot(Y1,0:
y-1),title('
行方向像素点灰度值累计和'
),xlabel('
累计像素量'
),ylabel('
行'
去除行方向边框:
Py0=fix(y/2);
Py1=fix(y/2)+1;
while((Y1(Py0,1)>
=30)&
(Py0>
2))
Py0=Py0-1;
%找到去除边框后上边的位置
while((Y1(Py1,1)>
(Py1<
y))
Py1=Py1+1;
%找到去除边框后下边的位置
Z1=I4(Py0:
Py1,:
:
%将二值图像上下边框去除
figure(3);
imshow(Z1),title('
将二值图像上下边框去除后图像'
2.4计算列方向的像素,用来去除垂直方向上的边框
[y,x,z]=size(Z1);
%计算此时图像的大小
计算列像素
X1=zeros(1,x);
if(Z1(i,j,1)==1)
X1(1,j)=X1(1,j)+1;
figure(4);
plot(0:
x-1,X1),title('
列方向像素点灰度值累计和'
列值'
累计像素'
去除垂直边框
x1=fix(x/2)+1;
5
while(i~=5)
while((X1(1,x1