【车牌识别】基于RGB颜色模型的车牌识别系统(MATLAB程序+GUI界面)

1 摘要

车牌识别技术(Vehicle License Plate Recognition,VLPR)是通过计算机对车牌图像进行识别分析,进而确定车牌号码的计算机技术,也是智能交通系统的前端技术。本文研究分析了该技术的各部分所使用的相关算法,并比较了的优缺点,根据需求确定了各部分算法,并使用MATLAB语言进行编程,实现了系统中图像预处理、车牌定位、字符分割和字符识别的具体功能,完成了车牌识别系统软件设计。本文提供了完整的 MATLAB 代码和使用教程,适合新入门的朋友参考。完整代码资源文件请参见文末的下载链接。

目录

1 摘要

2 程序演示

3 程序设计流程

4 图像预处理模块设计与实现

4.1 功能说明

4.2 功能设计

4.2.1 车牌粗定位

4.2.2 车牌灰度化

4.2.3 车牌倾斜校正

5 车牌处理模块设计与实现

5.1 功能说明

5.2 功能设计

5.2.1 二值化

5.2.2 形态学处理

5.2.3 反色处理

6 字符分割与识别模块设计与实现

6.1 功能说明

6.2 功能设计

6.2.1 车牌精准定位

 6.2.2 字符分割

6.2.3 字符识别

7 总结与展望

7.1 本文工作总结

7.2 未来工作展望

8 代码下载


2 程序演示

【车牌识别】基于RGB模型的蓝色车牌识别系统(MATLAB)

3 程序设计流程

完整的车牌识别系统包含四个部分,分别是车牌照片釆集部分,图像预处理部分,车牌的定位与切分,字符切分和字符识别。摄像头拍摄照片,计算机实现图像预处理、车牌定位与分割,字符分割和识别。

计算机程序识别的步骤顺序如下:

图像预处理:对获取到的车辆照片首先进行处理,处理的目的是得到亮度和对比度足够,边缘清晰的灰度图。

车牌定位:将上一步骤处理之后的图像进行腐蚀运算和闭运算,然后再对车牌区域进行纵向投影和横向投影,根据投影结果确定车牌范围,并对车牌的倾斜角度进行校正。

车牌分割:根据车牌几何形状的大小,确定车牌边缘,然后对上一步得到的车牌图像进行切分。

牌照区域二值化:把车牌图像处理为二值化图像,也就是把图像灰度进一步简化为分为黑白两部分,进一步减少处理数据,提高处理速度。

字符分割:根据车牌字符占用的宽度,高度、字符的间隔和字符距离边框的距离等,釆用纵向投影和横向投影的的方法对确定字符边界并切割字符,然后对分割出的字符进行归一化处理。

字符识别:根据上一步骤得到的独立字符,釆用识别算法对其一一进行识别,并输出识别结果。

图像预处理模块设计与实现

4.1 功能说明

图像的预处理是首先基于颜色粗定位蓝色车牌的大概位置,并使用图像处理技术处理拍摄的车辆图像,以便图像更利于定位和分割,主要的步骤是将图像处理为灰度图,并加强图像有效特征,增强有用信息的可检测性,去除影响牌照区域特征的噪点。从而使得图像特征更加明显,易于辨识、对比和识别,通过边缘检测对车牌进行倾斜校正,为车牌的精准定位打好基础。

4.2 功能设计

首先对摄像机拍摄的汽车图像通过设置合适的阈值对蓝色像素分别从Y方向和X方向进行判断,统计蓝色像素出现的位置,粗定位车牌的位置;接着对车牌进行灰度化处理,处理过程使用了加权平均法,减少了计算量,提高了程序的运行速度;最后利用Sobel算子提取车牌边缘,检测边缘的倾斜角,并通过反向旋转相同的角度使倾斜的车牌水平校正。

4.2.1 车牌粗定位

由于车牌颜色比较单一,特征比较明显,所以本次系统采用基于RGB颜色定位的算法对拍摄的图像进行蓝色区域判断粗定位车牌的大概位置。

4.2.2 车牌灰度化

原始的车牌图像是由摄像机拍摄的全彩图像而彩色图像是由R(红)、G(绿)、B(蓝)三通道中每种颜色值在0~255色阶取值叠加得到的。因此RGB图像的内存占用很大,不便计算机的运算处理。而灰度图像是由黑白两种颜色按不同的比例叠加而成的,共分为256个灰度等级,内存占用较小。将RGB图像通过某种算法操作变为灰度图像,这种灰度化处理的过程便于减少图像的维数,减少存储空间,大大减少了图像信息的复杂度和计算处理时的运算量。在进行字符识别时,需要的是图像的轮廓信息,而不需要色彩信息,因此在图像预处理前先进行灰度化处理。系统采用加权平均值的方法,将RGB彩色图像三通道根据各分量的影响指标,分别赋予不同的权重,按比例系数相乘再求和,计算的值作为灰度图像的灰度值。依据人类的色觉感知,按下式分配合理的加权系数。

Gray(i,j)=0.299R(i,j)+0.578G(i,j)+0.114B(i,j)

function huidu = rgb_huiduhua(rgb)
[y,x,~] = size(rgb);
for a=1:y
    for b=1:x
        huidu(a,b) = 0.299*rgb(a,b,1)+0.587*rgb(a,b,2)+0.114*rgb(a,b,3);
    end
end

4.2.3 车牌倾斜校正

图像的倾斜是指摄像机在采集车辆照片时由于种种原因导致车牌未水平垂直居中而偏离正确轨迹的现象。如果不采取措施及时对这些倾斜的图像进行水平校正,将会给后面的定位分割识别带来麻烦。倾斜校正的原理就是通过对车牌进行边缘检测,通过算法分析求出车牌的倾斜角度,然后在原图片坐标中反向旋转同样的角度,使车牌处于水平居中的位置。

function qingxiejiao=rando_bianhuan(I)
I=edge(I);
theta = 1:180;
[R,~] = radon(I,theta);
[~,J] = find(R>=max(max(R)));%J记录了倾斜角
qingxiejiao=90-J;

5 车牌处理模块设计与实现

5.1 功能说明

车牌处理模块包括了车牌的二值化处理和形态学操作。首先通过大津法提取灰度图像的阈值,然后定位提取目标区域,清除无关干扰噪声,突显车牌信息,以便为后续的目标信息字符分割和字符识别做准备。

5.2 功能设计

对车牌图像进行数学形态学处理时,有可能会腐蚀掉部分车牌,直接进行定位可能会造成定位错误或者车牌破损,所以我们尝试先对车牌区域粗略的切分,去除非车牌的部分,然后再按照车牌的边缘特征再次进行准确切分定位。

5.2.1 二值化

对车牌进行二值化操作可将目标信息从背景信息中有效地分割出来,是信息字符分割和识别的关键步骤。二值化处理中最重要的是确定分割阈值T,即把灰度化的车牌图像按阈值分为文字信息区和背景区。阈值法分割方法如下:

①计算图像的阈值。主要是指通过某种算法对图像进行处理,获取图像的阈值T

②根据阈值进行二值化。将灰度图像中像素值小于T的置为0,大于T的置为255

二值化的阈值可以通过自定义灰度值法、最大阈值法或最大类间方差法等不同方法计算得到。经过综合比较,本次系统中决定使用高效快捷的自动提取阈值的最大类间方差法。日本学者大津在1979年最先研究发表了最大类间方差法。因此,此方法也叫大津法,又称全局OTSU算法。它是利用图像直方图,选取某一灰度值将图像分割成背景区和目标区。

在本次系统设计中,使用graythresh函数自动计算车牌灰度图的阈值,再与imbinarize结合使用以将灰度图像转换为二值图像。实验结果如图所示,可以看出二值化效果良好,待识别字体清晰,且周围区域没有明显的噪声干扰,便于后续的分割识别处理。

bw=im2bw(bw,graythresh(bw));   %graythresh函数找到二值化阈值
erzhihua = bw;
axes(handles.show4);      %显示二值化后的图片
imshow(erzhihua);
handles.erzhihua = erzhihua;     %第五张图片,二值化后的图片
guidata(hObject,handles);
5.2.2 形态学处理

对车辆图像检测边缘后得到的图像中,除了得到车牌部分的边缘以外,还会得到许多背景部分的边缘,应先尽可能的消除非车牌区域的边缘信息,非车牌区域的边缘信息,大部分呈现出微小而杂乱的分布,为了消除这些微小而杂乱的分布,我们釆用了腐蚀运算来对图像进行处理。在进行腐蚀时需要确定结构元素矩阵的形式,在先出微小杂乱信息的同时,要尽可能保留车牌区域边缘,数字图像是由一个个像素点排列构成,根据每个像素点相邻位置的不同方向,邻接方式可分为:4邻接和8邻接;与之对应的两种不同的连通关系是4连通和8连通。其邻接示意图如图所示。

经过以上的运算之后,依然有不少边缘信息因腐蚀运算而被消除,使得边缘边缘变得杂乱,但这些杂乱的边缘信息是需要保留的部分,所以这次我们需要对图像进行膨胀运算,来填补中断的边缘,同样可以解决边缘杂乱的现象,但是膨胀之后会再次出现意想不到的毛刺和隔断,我们还需要消除这些毛刺和隔断。这里采用闭运算进行。经过上述处理后,车牌区域位置明显,边缘的毛刺和间隙也被消除,整个斑块内部也变得光滑,各种杂乱但无法消除的斑块也连接到了一起。

以上的处理仍然不能完全消除干扰,但是车牌部分的斑块在经过数学形态学处理后,已经连成一片,而且斑块占据了很大一块面积,其他部分的斑块面积都比较小,我们可以根据面积的大小,确定阈值,如果斑块的面积小于阈值,即删除。MATLAB中的bwareaopen函数正是用来删除小面积斑块的,小面积的干扰部分都已经被删除了。只留下了面积最大的车牌区域部分。

bw=bwmorph(bw,'open',5); %  执行形态学开操作(先腐蚀后膨胀)
bw=bwmorph(bw,'hbreak',inf);% 'hbreak'移除连通的像素
bw=bwmorph(bw,'spur',inf);%   移除刺激(孤立)像素。
bw=bwmorph(bw,'open',5);% 执行形态学开操作(先腐蚀后膨胀)
xingtaixue = bw;
axes(handles.show5);      %显示第一次形态学处理后的图片
imshow(xingtaixue);
handles.xingtaixue = xingtaixue;   %第六张图片,第一次形态学处理后的图片
guidata(hObject,handles);

5.2.3 反色处理

反色处理是为了将之前的黑底白字的车牌图像转化为白底黑字的车牌图像,不仅方便肉眼的观看,更是为了后续分割后的字符与字符模版里的字符图案一致,方便后续的比对。

6 字符分割与识别模块设计与实现

6.1 功能说明

通过二值化和形态学操作处理后,还需要进一步精准定位车牌,清除其他无关信息的连通区域,对目标区域只保留含有七位车牌的字符。然后需要对车牌字符逐一分割,分别提取出每个数字字符,并进行归一化处理,使分割的字符都统一成相同规格大小的标准字符,方便后续与字符模板匹配最大相似度,并输出正确的结果。

6.2 功能设计

在比较了平均分割法、投影分割法和连通域分割法后,最终选择了相对容易的投影分割法,分别得到车牌的水平投影直方图和垂直投影直方图,对波谷的地方进行切割,并将切割后的字符归一化处理,使用模板匹配法进行字符识别。

6.2.1 车牌精准定位

在反色处理之后,由于车牌的边框等因素影响,需要进一步精准定位七个字符的位置,在这里利用投影法,将图像的所有像素点全部投影到X方向和Y方向,根据实验设置合适的阈值,小于该阈值的像素区域全部舍弃,以排除四周边框的区域。

function bw_fir = touying(imane_bw)   %反色图片,黑色为车牌信息,投影法修剪车牌照片。
X_yuzhi=1;
[y,x]=size(imane_bw);
Y_touying=(sum((~imane_bw)'))';%往左边投影统计黑点    再将车牌信息转化为白色
X_touying=sum((~imane_bw));%往下面投影
%找黑体边缘
Y_up=fix(y/2);       %向0取整
Y_yuzhi=mean(Y_touying((fix(y/2)-10):(fix(y/2)+10),1))/1.6;  %mean求平均值,Y方向的阈值。
while ((Y_touying(Y_up,1)>=Y_yuzhi)&&(Y_up>1))%找到图片上边界  
       Y_up=Y_up-1;
end   
Y_down=fix(y/2);
while ((Y_touying(Y_down,1)>=Y_yuzhi)&&(Y_down<y))%找到图片下边界 
       Y_down=Y_down+1;
end
X_right=1; %去除左边边框干扰
if (X_touying(1,fix(x/14)))<=X_yuzhi
   X_right=fix(x/14);
end
bw_fir=imane_bw(Y_up:Y_down,X_right:x); %找黑体边缘

 6.2.2 字符分割

字符分割是把车牌照片中单独的一个个文字分别独立切割出来的过程。字符分割的主要思路是对车牌照片中一个个文字的颜色、形状、骨架、结构、灰度等各种信息进行研究,找到合适的区分不同字符的有效特征信息,再根据这些特征确定字符边界,最后根据字符边界对车牌图像进行切分,把一个个文字从车牌照片中剪切出来,每个文字形成一个单独的图片文件,这些图片文件就就是下一步的输入。字符分割出来的一个一个文字的图像质量将对字符识别的速度和准确度产生极大的影响。

本次系统采用的是基于投影法的分割算法,该算法的原理为车牌像素的投影,对图片的每一列计算白色像素点的数量,每个文字都会生成波峰,而文字的间隔位置会生成波谷。算法的步骤大致如下:首先对车牌图像从左到右扫描,对每一列做垂直投影,然后从左到右扫描波谷位置;首个波谷位置即为一号文字的左侧边界,第二个、第三个波谷依次为一号文字的右侧边界,二号文字的左侧边界等;以此类推,找到所有字符的左右两条边界,确定各字符所有边界后,根据边界条件分别进行切割,分别得到单字符的图像,完成字符分割。车牌图像的投影直方图如图所示。

该算法原理简单,处理速度也很快。但是其缺点与基于连通域的分割算法相类似,对字符粘连、残留边框、钏钉等干扰元素敏感,难以处理此类型干扰。 对左右结构的汉字进行投影时,也较容易发生把左右结构的汉字中间出现的波谷作为汉字边界,把该类型汉字错切分为两个字符的情况。

fenge=shuzifenge(bw);
waitbar(0.7);
%============ 剪裁七个字符===========
han_zi  =bw( 1:y,fenge(1):fenge(2));
zi_mu   =bw( 1:y,fenge(3):fenge(4));
xuhao_1 =bw( 1:y,fenge(5):fenge(6));
xuhao_2 =bw( 1:y,fenge(7):fenge(8));
xuhao_3 =bw( 1:y,fenge(9):fenge(10));
xuhao_4 =bw( 1:y,fenge(11):fenge(12));
xuhao_5 =bw( 1:y,fenge(13):fenge(14));
6.2.3 字符识别

经过上一的处理得到单个文字的图片后,就需要对这些图片进行识别,这也是整个系统的最后一个部分。这一步的计算量是整个系统中最大的一个环节,是整个系统中最重要的步骤。字符识别就是找出字符特征,根据字符特征出现的规律来判断图片中的文字。

能否识别文字,关键点在于如何选取文字的有效特征,有效特征越多,识别结果就越准确,但同时,有效特征的增加,也意味着识别时的计算量的增加,识别速度的降低,同时,字符的任何特征都不能完全的代替图像。选取字符特征时有需要注意以下几点:

1、每个字符都应该有自己独有的特征;

2、字体字型的变化对特征的影响尽可能的小;

3、字符的特征能够量化,便于计算机的计算;

4、字符的特征在一定的情况下是互补的。

本次系统采用的是基于模板匹配的车牌字符识别算法,该算法适用于样本数较小的字符识别,需要标准字符模板,将待识别图像与标准字符模板按照一个个像素点的灰度值进行比较,求出输入图像与每一个文字模板的相似度,取相似度最大的文字模板作为输出。该方法识别速度快,但对输入的要求高,要求输入的文字图像质量较高。为提高模板匹配的准确率,在是实际使用中尺寸较大的模版或者对单个字符建立多模板的方法来提高识别准确率,但提高准确率的同时会牺牲识别速度,随着模板的尺寸增加,数量增加,计算量也随之增加,程序运行的速度也会降低。

7 总结与展望

7.1 本文工作总结

本文分析了车牌识别系统的的流程和算法,并进行了对比,并归纳了相关技术与文献资料,经过总结和思考,在各步骤上都选择了自认为综合性能较好的算法,在MATLAB软件的基础上开发了车牌自动识别系统。本文主要工作内容如下:

1、 在图像预处理部分,先把摄像头获取到到的车辆照片转化为灰度图,处理过程使用了加权平均法,减少了计算量,提高了程序的运行速度;之后发现图像中普遍存在车牌部分和背景部分灰度差异不大的情况,于是采用了灰度拉伸和图像平滑的方法再次处理图片,最后利用Sobel算子提取车牌边缘。

2、 在车牌定位部分,先对图像进行了腐蚀和闭运算的处理,去除了图像中杂乱且无意义的微小部分,保留了图像的主要特征,然后再分别从水平方向和垂直方向对图像的投影,找到车牌位置;之后通过Radon变换校正了倾斜车牌。

3、 在字符分割部分,根据车牌文字的占据的宽度、高度以及文字之间的间隔等信息,对车牌进行纵向的投影,并根据投影结果,把牌照切分为单独的字符, 在对字符的归一化处理中,使用了双线性插值算法。

4、 在最后进行字符识别的部分,使用的是基于模板匹配的算法,对获取字符特征的方式略微进行了改进。

7.2 未来工作展望

本课题虽然已经实现了车牌的识别,并建立了简单的系统,但是因为时间有 限,还有许多实际问题考虑的不够周全,今后可在以下几方面继续进行深入研究:

1、大型车辆的双行车牌的分割。我国号牌标准中,大型车辆的后号牌双行 车牌,把小型汽车单行车牌七个字符中的前两个移到了第一行,剩余5个字符放 在第二行,车牌的长宽比发生了变化,两行字符的高宽比也不相同。对双行车牌 进行字符切分时,增加了垂直切分的步骤,双行车牌的垂直部分切割也应该依靠 车牌的先验知识,由于上下两行车牌字符数目和总宽度不同,切分以后可能需要 对第一行车牌进行二次定位,然后分别对两行车牌文字分别进行切分,最终获得 单个文字的图像。

2、 基于视频流的多车牌定位。在公路监控或者小区监控系统中,汽车牌照 的识别要求在视频的基础上进行识别的,对实时性要求很高,而且视频中某一帧 中可能包含多个车牌,这就需要系统同时对多个车牌进行定位识别。

3、 其他信息的识别。未来可对车牌识别系统进行升级,改为道路交通信息 自动识别系统,以得到更多的车辆或其他交通信息,比如车辆型号,车身颜色, 驾驶员行为甚至是行人的信息等。

8 代码下载

若您想获得博文中涉及的实现完整全部程序文件(包括测试图片,代码文件,GUI文件等,如下图),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,实验效果如下:

项目完整文件下载请见参考视频的简介处给出:➷➷➷

参考视频演示:【车牌识别】基于RGB模型的蓝色车牌识别系统(MATLAB)_哔哩哔哩_bilibili

  • 28
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值