汽车车牌中的数字识别单片机.docx
- 文档编号:26164657
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:29
- 大小:357.97KB
汽车车牌中的数字识别单片机.docx
《汽车车牌中的数字识别单片机.docx》由会员分享,可在线阅读,更多相关《汽车车牌中的数字识别单片机.docx(29页珍藏版)》请在冰豆网上搜索。
汽车车牌中的数字识别单片机
《数字图像处理》
课程设计报告
一、课程设计目的
1、巩固理论课上所学的知识。
2、锻炼动手能力、激发研究潜能,增强理论联系实际的能力。
3、综合运用数字信号处理的理论知识进行图片分析和图片识别设计,通过理论推导得出相应结论,再利用MATLAB作为编程工具进行计算机实现,从而加深对所学知识的理解。
4、对汽车车牌中的数字进行识别(正确获取整个图像中车牌的区域,并识别出车牌号)。
二、课程设计的基本要求
1、对知识点的掌握要求:
(1)掌握图像获取,明白数字化操作。
(2)掌握图像变换,利用离散傅里叶变换对原始图片的正交变换。
(3)掌握图像增强,去除图像中不需要的信息。
(4)掌握图像分析,对图像中感兴趣的目标进行区域分割与特征抽取的手段将原来以像素描述的图像变成比较简洁的对目标描述。
(5)掌握图像识别,知道如何简化识别系统结构,提高系统的实用性和可靠性。
2、分组情况
组长:
组员:
分工情况:
:
设计全过程的监督及协助、部分源程序代码的编写和整个源程序代码的整理,图像的分析、变换、增强、识别与定位。
:
图像采样,源程序代码的编写。
:
使用matlab绘图。
:
将图像转化成二值图像。
:
在书上查找相关概念内容。
3、课程设计内容
将采样来的图片用傅里叶变换成二值图像,将图片增强、识别、定位。
使用matlab绘图,将汽车车牌中的数字识别与定位。
(1)能对图像文件(bmp、jpg、tiff、gif等)进行打开、保存、另存、打印、退出等功能操作。
(2)图像预处理功能:
①直方图的统计及绘制,根据此找到图像的阈值点;
②彩色图像的灰度化变换等、一般灰度图像的二值化处理等;
③数字图像的增强处理功能:
空域中的点运算、直方图的均衡化、各种空间域平滑算法(如局部平滑滤波法、中值滤波等)、锐化算法(如梯度锐化法、高通滤波等);色彩增强:
伪彩色增强、真彩色增强等;
(3)车牌定位,并对其实现方法进行详细叙述;
(4)字符分割,并对其实现方法进行详细叙述;
(5)字符识别,通过运用模版匹配、神经网络和支持向量机(SVM)对汽车车牌的图像进行处理,并对车牌中的数字字符进行识别。
三、课程设计与实现步骤
1、课程设计的线路思想:
汽车车牌的识别过程主要包括车牌定位、字符车牌分割和车牌字符识别三个关键环节。
其识别流程如下:
(1)原始图像:
由数码相机或其它扫描装置拍摄到的图像。
(2)图像预处理:
对动态采集到的图像进行滤波,边界增强等处理以克服图像干扰。
(3)边缘提取:
通过微分运算,2值化处理,得到图像的边缘。
(4)车牌定位:
计算边缘图像的投影面积,寻找峰谷点,大致确定车牌位置,再计算此连通域内的宽高比,剔除不在域值范围内的连通域。
最后得到的便为车牌区域。
(5)字符分割:
利用投影检测的字符定位分割方法得到单个的字符。
(6)字符识别:
利用模板匹配的方法与数据库中的字符进行匹配从而确认出字符,得到最后的汽车牌照,包括英文字母和数字。
2、设计原理与步骤:
定位汽车车牌并识别其中的数字,采用Matlab平台提供的一些图像处理函数,以傅立叶变换通过数字模板与待处理的图像匹配为核心思想。
基本方法如下:
(1)读取待处理的图像,将其转化为二值图像。
(2)去除图像中不是车牌的区域。
(3)为定位车牌,将白色区域膨胀,腐蚀去无关的小物件,包括车牌数字。
(4)此时车牌所在白色连通域已清晰可见,但一个更大的连通域将车牌所在连通域包围了,需将其填充。
(5)查找连通域边界。
同时保留此图形,以备后面在它上面做标记。
(6)找出所有连通域中最可能是车牌的那一个。
判断的标准是:
测得该车牌的长宽比约为X:
1,其面积和周长存在关系:
(X×L×L)/(2×(X+1)×L)2≈1/Y,以此为特征,取metric=Y*area/perimeter^2作为连通域的匹配度,它越接近1,说明对应的连通域越有可能是X:
1的矩形。
(7)将车牌图像反白处理,并扩充为256×256的方阵,以便傅立叶变换中矩阵旋转运算的进行。
(8)从文件读取一个数字模板。
对图像计算傅立叶描述子,用预先定义好的决策函数对描述子进行计算。
变换后的图像中,亮度的高低指示相应区域与模板的匹配程度。
(9)确定一个合适的门限,显示亮度大于该门限的点,也就是与模板的匹配程度最高的位置。
(10)对照图片,可以说明相应数字被识别和定位了。
3、设计流程图:
待处理的图像如下所示。
图像整体比较清晰干净,车牌方向端正,字体清楚,与周围颜色的反差较大。
读取待处理的图像,将其转化为二值图像。
经试验,采用门限值为0.2附近时车牌字符最为清楚,杂点最少。
I=imread('car.jpg');
I2=rgb2gray(I);
I4=im2bw(I2,0.2);
原始图像二值图像
去除图像中面积过小的,可以肯定不是车牌的区域。
为定位车牌,将白色区域膨胀,腐蚀去无关的小物件,包括车牌数字。
此时车牌所在白色连通域已清晰可见,但在黑色区域以外,是一个更大的白色连通域,将车牌所在连通域包围了。
有必要将其填充。
查找连通域边界。
同时保留此图形,以备后面在它上面做标记。
bw=imfill(bw,[11]);
[B,L]=bwboundaries(bw,4);
imshow(label2rgb(L,@jet,[.5.5.5]))
holdon
fork=1:
length(B)
boundary=B{k};
plot(boundary(:
2),boundary(:
1),'w','LineWidth',2)
end
从对象中移除小对象平滑图像的轮廓
找出所有连通域中最可能是车牌的那一个。
判断的标准是:
测得该车牌的长宽比约为4.5:
1,其面积和周长存在关系:
(4.5×L×L)/(2×(4.5+1)×L)2≈1/27,以此为特征,取metric=27*area/perimeter^2作为连通域的匹配度,它越接近1,说明对应的连通域越有可能是4.5:
1的矩形。
%找到每个连通域的质心
stats=regionprops(L,'Area','Centroid');
%循环历遍每个连通域的边界
%找到每个连通域的质心
stats=regionprops(L,'Area','Centroid');
%循环历遍每个连通域的边界
fork=1:
length(B)
%获取一条边界上的所有点
boundary=B{k};
%计算边界周长
delta_sq=diff(boundary).^2;
perimeter=sum(sqrt(sum(delta_sq,2)));
%获取边界所围面积
area=stats(k).Area;
%计算匹配度
metric=27*area/perimeter^2;
%要显示的匹配度字串
metric_string=sprintf('%2.2f',metric);
%标记出匹配度接近1的连通域
ifmetric>=0.9&&metric<=1.1
centroid=stats(k).Centroid;
plot(centroid
(1),centroid
(2),'ko');
%提取该连通域所对应在二值图像中的矩形区域
goalboundary=boundary;
s=min(goalboundary,[],1);e=max(goalboundary,[],1);
goal=imcrop(I4,[s
(2)s
(1)e
(2)-s
(2)e
(1)-s
(1)]);end
%显示匹配度字串
text(boundary(1,2)-35,boundary(1,1)+13,...
metric_string,'Color','g',...
'FontSize',14,'FontWeight','bold');end
图示为找到的各个连通区域,中部被标记“○”的矩形匹配度为1.00,是最可能的区域。
下边是由它确定的二值图像中的车牌区域:
二值图像中的车牌区域
将车牌图像反白处理,并扩充为256×256的方阵(如下左图),以便下面傅立叶变换中矩阵旋转运算的进行。
goal=~goal;goal(256,256)=0;figure;imshow(goal);
从文件读取一个字符模板(以“4”为例,模板图像
直接从上述二值图像中截取得到)。
对图像计算傅立叶描述子,用预先定义好的决策函数对描述子进行计算。
变换后的图像中,亮度的高低指示相应区域与模板的匹配程度(如下中图)。
w=imread('4.bmp');w=~w;
C=real(ifft2(fft2(goal).*fft2(rot90(w,2),256,256)));
通过检查C的最大值,试验确定一个合适的门限(这里240比较合适),显示亮度大于该门限的点,也就是与模板的匹配程度最高的位置(如下右图)。
thresh=200;figure;imshow(C>thresh);
车牌图像反白处理
确定定位点
对照左右两图,可以说明数字“4”被识别和定位了。
同样的方法,可以识别和定位其它数字,当然也可以识别和定位符号。
如:
识别“B”:
w=imread('B.bmp');
w=~w;
C=real(ifft2(fft2(goal).*fft2(rot90(w,2),256,256)));
thresh=290;
识别“P”:
w=imread('P.bmp');
w=~w;
C=real(ifft2(fft2(goal).*fft2(rot90(w,2),256,256)));
thresh=240;
识别“2”:
w=imread('2.bmp');
w=~w;
C=real(ifft2(fft2(goal).*fft2(rot90(w,2),256,256)));
thresh=250;
识别“B”识别“P”识别“2”
识别“M”:
w=imread('M.bmp');
w=~w;
C=real(ifft2(fft2(goal).*fft2(rot90(w,2),256,256)));
thresh=265;
识别“8”:
w=imread('8.bmp');
w=~w;
C=real(ifft2(fft2(goal).*fft2(rot90(w,2),256,256)));
thresh=250;
识别“M”识别“8”
由图可见,该程序对于“8”与“B”这样相似的字符,识别时常常混淆。
4、分析:
(1)输入图片
I=imread('car.jpg');
figure
(1),imshow(I);
title('原始图像');
原始图像
(2)原始图像转化成二值图像
I2=rgb2gray(I);
I4=im2bw(I2,0.2);
figure
(2),imshow(I4);
title('二值图像');
二值图像
(3)从对象中移除小对象
bw=bwareaopen(I4,500);
figure(3),imshow(bw);
title('从对象中移除小对象');
从对象中移除小对象
(4)得出平滑图像的轮廓
se=strel('disk',15);
bw=imclose(bw,se);
figure(4),imshow(bw);
title('平滑图像的轮廓');
平滑图像的轮廓
5、附录:
实验源程序:
I=imread('car.jpg');
figure
(1),imshow(I);
title('原始图像');
I2=rgb2gray(I);%读取待处理的图像,将其转化为二值图像。
I4=im2bw(I2,0.2);%通过设定亮度阈值将真彩色转换成二值图像。
figure
(2),imshow(I4);
title('二值图像');
bw=bwareaopen(I4,500);%删除二值图像bw中面积小于500的图像。
figure(3),imshow(bw);
title('从对象中移除小对象');
se=strel('disk',15);%创建圆盘半径15。
bw=imclose(bw,se);%对图像实现闭运算,平滑图像的轮廓。
figure(4),imshow(bw);
title('平滑图像的轮廓');
bw=imfill(bw,[11]);%孔填充处理
[B,L]=bwboundaries(bw,4);%获取二值图中对象的轮廓,求周长。
imshow(label2rgb(L,@jet,[.5.5.5]))
holdon
fork=1:
length(B)
boundary=B{k};
plot(boundary(:
2),boundary(:
1),'w','LineWidth',2)
end
%找到每个连通域的质心
stats=regionprops(L,'Area','Centroid');
%循环历遍每个连通域的边界
fork=1:
length(B)
%获取一条边界上的所有点
boundary=B{k};
%计算边界周长
delta_sq=diff(boundary).^2;
perimeter=sum(sqrt(sum(delta_sq,2)));
%获取边界所围面积
area=stats(k).Area;
%计算匹配度
metric=27*area/perimeter^2;
%要显示的匹配度字串
metric_string=sprintf('%2.2f',metric);
%标记出匹配度接近1的连通域
ifmetric>=0.9&&metric<=1.1
centroid=stats(k).Centroid;
plot(centroid
(1),centroid
(2),'ko');
%提取该连通域所对应在二值图像中的矩形区域
goalboundary=boundary;
s=min(goalboundary,[],1);
e=max(goalboundary,[],1);
goal=imcrop(I4,[s
(2)s
(1)e
(2)-s
(2)e
(1)-s
(1)]);
end
%显示匹配度字串
text(boundary(1,2)-35,boundary(1,1)+13,...
metric_string,'Color','g',...
'FontSize',14,'FontWeight','bold');
end
goal=~goal;
goal(256,256)=0;
figure(5);
imshow(goal);
w=imread('P.bmp');
w=~w;
C=real(ifft2(fft2(goal).*fft2(rot90(w,2),256,256)));
thresh=240;
figure(6);
imshow(C>thresh);
四、课程设计分析与拓展
汽车车牌上的数字识别这个课题做的方法很多。
但我们小组这次的设计,只是注重车牌上的数字识别。
对原始图像的保存,处理不够详细。
现在我们用另一种方法来做,给前面的课程设计做个比较。
当然我们小组还是认为前面做的比较好,因为我们的主题就是汽车车牌中数字识别。
所以我们应该把重点放在数字识别上。
设计的过程,对原始图像的处理尽量的简洁是对正个设计的方向态度明确化。
现在我们就看看方法二的设计。
1、详细的设计步骤:
一幅汽车图像为例,结合图像处理各方面的知识,利用MATLAB编程,实现了从车牌的预处理到字符识别的完整过程。
各部分的处理情况如下:
(1)处理及边缘提取
图1汽车原图
图像在形成、传输或变换过程中,受多种因素的影响,如:
光学系统失真、系统噪声、暴光不足或过量、相对运动等,往往会与原始景物之间或图像与原始图像之间产生了某种差异,这种差异称为降质或退化。
这种降质或退化对我们的处理往往会造成影响。
因此在图像处理之前必须进行预处理,包括去除噪音,边界增强,增加亮度等等。
因为噪声主要是一些含高频的突变成分,因此可以通过一个低通滤波器来消除图像中包含的噪声,并使低频成分得到增强。
滤波的方式有两种,一种是空间域滤波,一种是频率域滤波。
在空间域,常见的滤波方式有两种方式,均值滤波和中值滤波。
空间域滤波主要有巴特沃斯滤波器。
在车牌边缘提取之前,两种滤波方式均采用了。
并与未进行滤波的边缘进行比较。
以下是经处理后的一些图片。
图2经均值滤波后提取的边缘图像
图3经巴特沃斯低通滤波后提取的边缘图像
图4未滤波直接提取出的边缘信息
图5经高通滤波器增强后得到的边缘图像
对比以上几幅图片,图2的边缘太粗,而图3的边缘已经模糊掉了。
图5中包含的噪声太多,图4未经滤波直接提取出的边缘图像最清晰,所包含的有用信息最多。
分析这种情况产生的原因,归纳起来主要有以下方面:
a、原始图像清晰度比较高,从而简化了预处理
b、图像的平滑处理会使图像的边缘信息受到损失,图像变得模糊
c、图像的锐化可以增强图像中物体的边缘轮廓,但同时也使一些噪声得到了增强
综上所述,结合MATLAB实验过程,得出不是每一种图像处理之初都适合滤波和边界增强。
本次汽车车牌的识别,为了保存更多的有用信息,经过多次比较,选择图4作为后期处理的依据。
边缘的提取采用的是梯度算子,因为其实现过程比较简单,所以在此不多加赘述了。
提取出的边缘含有多个灰度值,要进行二值化处理,选择一个合适的域值。
经多次比较,选取域值T=70,对于灰度值大于T的赋值为255,小于T的赋值为0。
经过处理后的图像如下所示:
图6二值化后的边缘图像
结合后期分割得到的车牌图7,二值化后的图像在后期的识别中并不会提高车牌的识别率,因此不采用二值化的图像来进行识别,因此后面的处理依然使用图4。
2、车牌提取
经过边缘提取得到的图像,车牌区域在水平方向灰度面积值具有明显频繁的跳变,在垂直方向上的面积投影则出现峰-谷-峰的特性。
根据这种峰谷特点,自动检测车牌位置峰点检测的车牌区域定位方法,并对初步定位后的车牌进一步使用微定位技术。
该方法包括三部分:
(1)车牌的横向定位;
(2)车牌的纵向定位;(3)车牌的微定位。
汽车本身具有一定的特点,一般情况下,牌照都挂在缓冲器上或附近,处于车牌照图像的下半部分,本次分割的主要意图是缩小牌照搜索范围,大致确定出牌照的位置。
对如图4所示的汽车边缘图像f(x,y),我们首先进行水平方向一阶差分运算,即
g(i,j)=|f(i,j)-f(i,j+1)|
其中i=1,2,3,⋯,xw-1,j=0,1,2,3,⋯yw-1,其中xw,yw分别为图像的行数和列数。
然后对水平差分图像的像素沿水平方向累加产生一个投影表T(i),如图7所示。
图7汽车边缘图像的水平面积投影图
一般对应于车牌位置的投影值T(i)较大,而在车牌上,下行附近的投影值较小,均有谷点存在。
只要能找到这两个谷点,就能大致确定出车牌照的位置,缩小车牌搜索范围。
由图4可以看出,车牌下方的横栏处的T(i)值应该是最大的,而车牌位置就在其附近。
根据这些特定,可定出车牌位置大概在320~350行之间。
类似的方法得出汽车边缘图像的垂直面积投影图
图8汽车边缘图像的垂直面积投影图
同上可初步得到汽车牌照的列位置在120~210之间。
大致确定的牌照位置如下图。
图9粗略定位出的汽车牌照
对初步确定出来的牌照进行微定位,所谓微定位法,就是对基本定位后的车牌图像进行局部分析,以进一步确定字符范围,缩减车牌的左、右和上、下边界,这有利于后续的牌照字符处理。
具体实现如下:
(1)由于车牌近似为一个矩形,上下边缘近似为一条直线,通过简单的灰度变化分析就可以再次定位车牌图像的上下边界,这种情况适合于倾斜度较小的车牌;对于倾斜程度较大的牌照来说,在其横向定位之前就应该利用相关的技术进行车牌的矫正(例如Hough变换技术)。
(2)确定左边界:
从左向右扫描,当遇到灰度值大于设定值60之后,停止扫描。
上边界也是利用这种方式得到。
这样就得到首字符的起始位置。
再利用牌照的大小,宽高比一般都是固定的这些先验知识,就可以确定出牌照的具体位置。
本设计中采用的车牌,其宽高比为1:
3。
从而确定出汽车牌照的具体位置。
最后提取出的汽车牌照如下图:
图10二值化的汽车牌照
图11未进行二值化的汽车牌照
3、数字分割
在汽车牌照自动识别过程中,字符分割有承前启后的作用。
它在前期牌照定位的基础上进行字符的分割,然后再利用分割的结果进行字符识别。
字符识别的算法很多,常采用垂直面积投影法来实现。
面积投影法的公式如下:
由于字符块在竖直方向上的投影必然在字符间或字符内的间隙处取得局部最小值,并且这个位置应满足车牌的字符书写格式、字符尺寸和其他一些条件的限制。
下图是图10在垂直方向上的面积投影图。
从图形中我们很直观的看出投影值中出现了8条间隙,6个字母中间的间隙只有5个,还有三个间隙是字符间的。
有字符的列其灰度值比较高,无字符的则相对比较低。
依据这一点,再结合图10的特征,很容易得到每个字符的起始终止位置。
第一个字符:
1-10第二个字符:
10-18第三个字符:
28-41第四个字符:
42-48第五个字符:
60-68第六个字符:
68-78
图12车牌垂直方向上的面积投影图
将图10按照上面的分析行数不变,列数分为六组,分别影射到六个不同的数组中。
又因为在字符的模式识别中,其模板大小统一,因此得到的六个数组必须变换其大小,均统一成26×14的形式。
分割出来的六个字符如下所示,分别命名为M1.jpg,M2.jpg,M3.jpg,M4.jpg,M5.jpg,M6jpg并用imwrite函数写入图像文件夹中,以便在后期处理中可以直接进行调用。
图12分割出来的六个字符图像
一般分割出来的字符要进行进一步的处理,以满足下一步字符识别的需要。
因为图像中含有许多燥声,这在预处理的图像中已经看出来了。
因此必须进行滤波,然后归一化,二值处理。
使其最后得到的图像与标准模板一样。
只含有两种灰度值,黑与白。
但是对于车牌的识别,并不需要这么多的处理就已经可以达到正确识别的目的。
在此简化了处理过程,未经滤波归一化,直接进行后期处理。
4、数字识别
数字的识别目前用于车牌字符识别(OCR)中的算法主要有基于模板匹配的OCR算法以及基于人工神经网络的OCR算法。
基于模板匹配的OCR的基本过程是:
首先对待识别字符进行二值化并将其尺寸大
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汽车 车牌 中的 数字 识别 单片机