目录
1 技术要求 . ................................................................. 1 2 基本原理 . ................................................................. 1 3 各模块的功能 . ............................................................. 2
3.1 图像预处理 .......................................................... 2 3.2 车牌定位 ............................................................ 5 3.3 字符分割和识别 ...................................................... 7 4 调试过程及结论 . .......................................................... 11 5 心得体会 . ................................................................ 11 6 参考文献 . ................................................................ 12
汽车车牌的号码识别
1 技术要求
用相机拍摄获取彩色汽车车牌的图片,应用MATLAB 软件对所拍摄车牌号图片进行相应处理(如,去噪,去除背景提取目标,边缘分割,轮廓提取等)最终从一幅图像中提取车牌中的字母和数字(只能用黑色显示)。
2 基本原理
汽车车辆牌照识别系统的基本工作原理为:将摄像头拍摄到的包含车辆牌照的图像输入到计算机中进行预处理,再由检索模块对牌照进行搜索、检测、定位,并分割出包含牌照字符的矩形区域,然后对牌照字符进行二值化并将其分割为单个字符,然后输入JPEG 或BMP 格式的数字,输出则为车牌号码的数字。汽车车辆牌照识别系统的基本工作原理图如图1所示:
我们知道输入的彩色图像包含大量颜色信息,会占用计算机较多的存储空间,且处理
时也会降低系统的执行速度,因此对图像进行识别等处理时,通常将彩色图像转换为灰度图像,以加快处理速度。对图像进行灰度化处理、边缘提取、再利用形态学方法对车牌进
行定位。具体步骤如下:首先通过MATLAB 软件对图像进行灰度转换,二值化处理然后采用4X1的结构元素对图像进行腐蚀,去除图像的噪声。采用25X25的结构元素,对图像进行闭合应算使车牌所在的区域形成连通。在进行形态学滤波去除其它区域。
3 各模块的功能
3.1 图像预处理
对汽车图像进行图像转换、图像增强和边缘检测等。载入车牌图像如代码如下所示: I=imread('car.jpg');%应用imread 函数从图形文件中读取命名为car 的图像; figure();
imshow(I), title('原始图像');%以“原始图像”为题目将图片显示出来。结果如图2所示:
图-2 原始图像
对提取出来的原始图像进行下列处理:转化为灰度图像,采用Robert 算子进行边缘检测,腐蚀图像,填充图像,形态滤波。具体各个过程的源程序如下所示: I1=rgb2gray(I); %转化为灰度图像
imshow(I1),title('灰度图像');%用imshow 函数显示灰度图像如图3所示:
图-3 灰度图像
I2=edge(I1,'robert',0.09,'both'); %采用robert 算子进行边缘检测
imshow(I2),title('边缘检测后图像');%用imshow 函数显示边缘检测后图像如图4所示:
图-4 边缘检测后图像
se=[1;1;1]; %线型结构元素 I3=imerode(I2,se); %腐蚀图像
imshow(I3),title('腐蚀后边缘图像');%用imshow 函数显示腐蚀后边缘图像如图5所示:
图-5 腐蚀后边缘图像
se=strel('rectangle',[25,25]); %矩形结构元素 I4=imclose(I3,se); %图像聚类、填充图像
imshow(I4),title('填充后图像');%用imshow 函数显示填充后图像如图6所示:
图-6 填充后图像
I5=bwareaopen(I4,2000);%去除聚团灰度值小于2000的部分
imshow(I5),title('形态滤波后图像');%用imshow 函数显示形态滤波后图像如图7所示
图-7 形态滤波后图像
3.2 车牌定位
从预处理后的汽车图像中分割出车牌图像。即在一幅车辆图像中找到车牌所在的位置。具体代码如下所示:
[y,x,z]=size(I5); I6=double(I5); Y1=zeros(y,1); for i=1:y for j=1:x
if(I6(i,j,1)==1) Y1(i,1)= Y1(i,1)+1; end end end
[temp MaxY]=max(Y1);
figure();
PY1=MaxY;
while ((Y1(PY1,1)>=50)&&(PY1>1)) PY1=PY1-1; end PY2=MaxY;
while ((Y1(PY2,1)>=50)&&(PY2
IY=I(PY1:PY2,:,:); X1=zeros(1,x); for j=1:x
for i=PY1:PY2 if(I6(i,j,1)==1)
X1(1,j)= X1(1,j)+1; end end end PX1=1;
while ((X1(1,PX1)
while ((X1(1,PX2)PX1)) PX2=PX2-1; end PX1=PX1-1;
PX2=PX2+1; %分割出车牌图像% dw=I(PY1:PY2,PX1:PX2,:);
imshow(dw),title('定位剪切后的彩色车牌图像') ; 程序运行结果得到如图8所示图形:
图-8 车牌定位和处理后图形
3.3 字符分割和识别
对分割出的车牌图像进行几何校正、去噪、二值化以及字符分割以从车牌图像中分离出组成车牌号码的单个字符图像,对分割出来的字符进行预处理(二值化、归一化),然后分析提取,对分割出的字符图像进行识别给出文本形式的车牌号码。源代码如下所示:
if isrgb(I)
I1 = rgb2gray(dw); %将RGB 图像转化为灰度图像 else I1=I; end
g_max=double(max(max(I1))); g_min=double(min(min(I1)));
T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值 [m,n]=size(I1);% d:二值图像 %h=graythresh(I1); I1=im2bw(I1,T/256); subplot(3,2,2);
imshow(I1),title('二值化车牌图像'); I2=bwareaopen(I1,20); subplot(3,2,3);
imshow(I2),title('形态学滤波后的二值化图像'); [y1,x1,z1]=size(I2); I3=double(I2); TT=1;
%%%%%%%去除图像顶端和底端的不感兴趣区域%%%%% Y1=zeros(y1,1); for i=1:y1 for j=1:x1
if(I3(i,j,1)==1) Y1(i,1)= Y1(i,1)+1 ; end end end Py1=1; Py0=1;
while ((Y1(Py0,1)
while((Y1(Py1,1)>=20)&&(Py1
I2=I2(Py0:Py1,:,:); subplot(3,2,4);
imshow(I2),title('目标车牌区域'); X1=zeros(1,x1); for j=1:x1 for i=1:y1
if(I3(i,j,1)==1) X1(1,j)= X1(1,j)+1; end end end Px0=1; Px1=1; for i=1:7
while ((X1(1,Px0)
while (((X1(1,Px1)>=3)&&(Px1
Z=I2(:,Px0:Px1,:); switch strcat('Z',num2str(i)) case 'Z1' PIN0=Z;
case 'Z2'
PIN1=Z;
case 'Z3'
PIN2=Z;
case 'Z4'
PIN3=Z;
case 'Z5'
PIN4=Z;
case 'Z6'
PIN5=Z;
otherwise
PIN6=Z;
end
figure(3);
subplot(1,7,i);
imshow(Z);%将分割出的字符在figure(3)中显示出来
Px0=Px1;
end
通过执行以上实现字符分割和识别的程序,可以得到如下的图9所示图像,最终实现题目所得要求。
图-9 分割后识别的图形
4 调试过程及结论
通过对程序的调试和修改能实现实验的要求,当输入相应模块的名称进行运行时可以得到相应的图形,并且能最终得到清晰的图像。在调试过程中很多地方出现Missing variable or function提示错误,经过对程序的检查发现此类的错误提示多数是因为输入了不合法的字符或者是错误的标点符号造成的,只要将提示错误位置改为合法字符或标点就能解决这类问题。另外在分割提取图像中不能得到所要的只含有车牌号的图像,而是得到整幅图像,经过排查得知这个错误是在分割时使用了错误的函数名称,将错误的函数名称改过来就能得到符合要求的图像。经过调试和修改最终得到了符合训练要求的图像。
5 心得体会
在选这次能力拓展训练课题时候,觉得这个题目跟我们实际生活联系十分紧密,于是选择了它,本以为课堂上学过它的理论知识,等到操作起来时候,发现我想的太简单,很多时候也许理论知识是没错的,但实际执行时候,各种错误随之而来,其中最明显的就是由于程序的简单性,对于所处理的图片有苛刻要求,图片色彩的要求最明显,对清晰度也有所要求,最后成功与否一定程度上还得由图片的质量所决定。
以前老是觉得自己什么东西都不会,什么东西都不懂,而且又急于求成,结果造成什么都没学好,还是什么都不会。通过这次课程设计,我才明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质,特别是对于我,基础比较差,一定不能太过于心急,要静下心来慢慢的研究。以前对MATLAB 也是仅局限在数学实验上学的那些知识,但是通过此次的课程设计,才了解到MATLAB 在图形图像处理方面的强大功能,这些事C/C++不能所及的。在此要感谢我们的指导老师叶老师对我们悉心的指导,感谢老师给我们的帮助,以前我是不相信我能做出来的,是您的鼓励让我重新找到自信。在设计过程中,我通过查阅大量有关资料,与同学交流经验和自学,并向老师请教等方式,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。在整个设计中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。而且大大提高了动手的能力,使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。
6 参考文献
[1] 何东健,数字图像处理. 西安电子科技大学出版社,2008年.
[2] 阮秋琦,数字图像处理. 电子工业出版社,2001年.
[3] 徐建华,图像处理与分析. 科学出版社,1999年.
[4] 徐中立,数字图像的智能信息处理. 科学教育出版社,2001年.
目录
1 技术要求 . ................................................................. 1 2 基本原理 . ................................................................. 1 3 各模块的功能 . ............................................................. 2
3.1 图像预处理 .......................................................... 2 3.2 车牌定位 ............................................................ 5 3.3 字符分割和识别 ...................................................... 7 4 调试过程及结论 . .......................................................... 11 5 心得体会 . ................................................................ 11 6 参考文献 . ................................................................ 12
汽车车牌的号码识别
1 技术要求
用相机拍摄获取彩色汽车车牌的图片,应用MATLAB 软件对所拍摄车牌号图片进行相应处理(如,去噪,去除背景提取目标,边缘分割,轮廓提取等)最终从一幅图像中提取车牌中的字母和数字(只能用黑色显示)。
2 基本原理
汽车车辆牌照识别系统的基本工作原理为:将摄像头拍摄到的包含车辆牌照的图像输入到计算机中进行预处理,再由检索模块对牌照进行搜索、检测、定位,并分割出包含牌照字符的矩形区域,然后对牌照字符进行二值化并将其分割为单个字符,然后输入JPEG 或BMP 格式的数字,输出则为车牌号码的数字。汽车车辆牌照识别系统的基本工作原理图如图1所示:
我们知道输入的彩色图像包含大量颜色信息,会占用计算机较多的存储空间,且处理
时也会降低系统的执行速度,因此对图像进行识别等处理时,通常将彩色图像转换为灰度图像,以加快处理速度。对图像进行灰度化处理、边缘提取、再利用形态学方法对车牌进
行定位。具体步骤如下:首先通过MATLAB 软件对图像进行灰度转换,二值化处理然后采用4X1的结构元素对图像进行腐蚀,去除图像的噪声。采用25X25的结构元素,对图像进行闭合应算使车牌所在的区域形成连通。在进行形态学滤波去除其它区域。
3 各模块的功能
3.1 图像预处理
对汽车图像进行图像转换、图像增强和边缘检测等。载入车牌图像如代码如下所示: I=imread('car.jpg');%应用imread 函数从图形文件中读取命名为car 的图像; figure();
imshow(I), title('原始图像');%以“原始图像”为题目将图片显示出来。结果如图2所示:
图-2 原始图像
对提取出来的原始图像进行下列处理:转化为灰度图像,采用Robert 算子进行边缘检测,腐蚀图像,填充图像,形态滤波。具体各个过程的源程序如下所示: I1=rgb2gray(I); %转化为灰度图像
imshow(I1),title('灰度图像');%用imshow 函数显示灰度图像如图3所示:
图-3 灰度图像
I2=edge(I1,'robert',0.09,'both'); %采用robert 算子进行边缘检测
imshow(I2),title('边缘检测后图像');%用imshow 函数显示边缘检测后图像如图4所示:
图-4 边缘检测后图像
se=[1;1;1]; %线型结构元素 I3=imerode(I2,se); %腐蚀图像
imshow(I3),title('腐蚀后边缘图像');%用imshow 函数显示腐蚀后边缘图像如图5所示:
图-5 腐蚀后边缘图像
se=strel('rectangle',[25,25]); %矩形结构元素 I4=imclose(I3,se); %图像聚类、填充图像
imshow(I4),title('填充后图像');%用imshow 函数显示填充后图像如图6所示:
图-6 填充后图像
I5=bwareaopen(I4,2000);%去除聚团灰度值小于2000的部分
imshow(I5),title('形态滤波后图像');%用imshow 函数显示形态滤波后图像如图7所示
图-7 形态滤波后图像
3.2 车牌定位
从预处理后的汽车图像中分割出车牌图像。即在一幅车辆图像中找到车牌所在的位置。具体代码如下所示:
[y,x,z]=size(I5); I6=double(I5); Y1=zeros(y,1); for i=1:y for j=1:x
if(I6(i,j,1)==1) Y1(i,1)= Y1(i,1)+1; end end end
[temp MaxY]=max(Y1);
figure();
PY1=MaxY;
while ((Y1(PY1,1)>=50)&&(PY1>1)) PY1=PY1-1; end PY2=MaxY;
while ((Y1(PY2,1)>=50)&&(PY2
IY=I(PY1:PY2,:,:); X1=zeros(1,x); for j=1:x
for i=PY1:PY2 if(I6(i,j,1)==1)
X1(1,j)= X1(1,j)+1; end end end PX1=1;
while ((X1(1,PX1)
while ((X1(1,PX2)PX1)) PX2=PX2-1; end PX1=PX1-1;
PX2=PX2+1; %分割出车牌图像% dw=I(PY1:PY2,PX1:PX2,:);
imshow(dw),title('定位剪切后的彩色车牌图像') ; 程序运行结果得到如图8所示图形:
图-8 车牌定位和处理后图形
3.3 字符分割和识别
对分割出的车牌图像进行几何校正、去噪、二值化以及字符分割以从车牌图像中分离出组成车牌号码的单个字符图像,对分割出来的字符进行预处理(二值化、归一化),然后分析提取,对分割出的字符图像进行识别给出文本形式的车牌号码。源代码如下所示:
if isrgb(I)
I1 = rgb2gray(dw); %将RGB 图像转化为灰度图像 else I1=I; end
g_max=double(max(max(I1))); g_min=double(min(min(I1)));
T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值 [m,n]=size(I1);% d:二值图像 %h=graythresh(I1); I1=im2bw(I1,T/256); subplot(3,2,2);
imshow(I1),title('二值化车牌图像'); I2=bwareaopen(I1,20); subplot(3,2,3);
imshow(I2),title('形态学滤波后的二值化图像'); [y1,x1,z1]=size(I2); I3=double(I2); TT=1;
%%%%%%%去除图像顶端和底端的不感兴趣区域%%%%% Y1=zeros(y1,1); for i=1:y1 for j=1:x1
if(I3(i,j,1)==1) Y1(i,1)= Y1(i,1)+1 ; end end end Py1=1; Py0=1;
while ((Y1(Py0,1)
while((Y1(Py1,1)>=20)&&(Py1
I2=I2(Py0:Py1,:,:); subplot(3,2,4);
imshow(I2),title('目标车牌区域'); X1=zeros(1,x1); for j=1:x1 for i=1:y1
if(I3(i,j,1)==1) X1(1,j)= X1(1,j)+1; end end end Px0=1; Px1=1; for i=1:7
while ((X1(1,Px0)
while (((X1(1,Px1)>=3)&&(Px1
Z=I2(:,Px0:Px1,:); switch strcat('Z',num2str(i)) case 'Z1' PIN0=Z;
case 'Z2'
PIN1=Z;
case 'Z3'
PIN2=Z;
case 'Z4'
PIN3=Z;
case 'Z5'
PIN4=Z;
case 'Z6'
PIN5=Z;
otherwise
PIN6=Z;
end
figure(3);
subplot(1,7,i);
imshow(Z);%将分割出的字符在figure(3)中显示出来
Px0=Px1;
end
通过执行以上实现字符分割和识别的程序,可以得到如下的图9所示图像,最终实现题目所得要求。
图-9 分割后识别的图形
4 调试过程及结论
通过对程序的调试和修改能实现实验的要求,当输入相应模块的名称进行运行时可以得到相应的图形,并且能最终得到清晰的图像。在调试过程中很多地方出现Missing variable or function提示错误,经过对程序的检查发现此类的错误提示多数是因为输入了不合法的字符或者是错误的标点符号造成的,只要将提示错误位置改为合法字符或标点就能解决这类问题。另外在分割提取图像中不能得到所要的只含有车牌号的图像,而是得到整幅图像,经过排查得知这个错误是在分割时使用了错误的函数名称,将错误的函数名称改过来就能得到符合要求的图像。经过调试和修改最终得到了符合训练要求的图像。
5 心得体会
在选这次能力拓展训练课题时候,觉得这个题目跟我们实际生活联系十分紧密,于是选择了它,本以为课堂上学过它的理论知识,等到操作起来时候,发现我想的太简单,很多时候也许理论知识是没错的,但实际执行时候,各种错误随之而来,其中最明显的就是由于程序的简单性,对于所处理的图片有苛刻要求,图片色彩的要求最明显,对清晰度也有所要求,最后成功与否一定程度上还得由图片的质量所决定。
以前老是觉得自己什么东西都不会,什么东西都不懂,而且又急于求成,结果造成什么都没学好,还是什么都不会。通过这次课程设计,我才明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质,特别是对于我,基础比较差,一定不能太过于心急,要静下心来慢慢的研究。以前对MATLAB 也是仅局限在数学实验上学的那些知识,但是通过此次的课程设计,才了解到MATLAB 在图形图像处理方面的强大功能,这些事C/C++不能所及的。在此要感谢我们的指导老师叶老师对我们悉心的指导,感谢老师给我们的帮助,以前我是不相信我能做出来的,是您的鼓励让我重新找到自信。在设计过程中,我通过查阅大量有关资料,与同学交流经验和自学,并向老师请教等方式,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。在整个设计中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。而且大大提高了动手的能力,使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。
6 参考文献
[1] 何东健,数字图像处理. 西安电子科技大学出版社,2008年.
[2] 阮秋琦,数字图像处理. 电子工业出版社,2001年.
[3] 徐建华,图像处理与分析. 科学出版社,1999年.
[4] 徐中立,数字图像的智能信息处理. 科学教育出版社,2001年.