车牌识别背景
随着经济的发展与人民的生活水平提高,私家轿车的普及率渐渐提升,车辆的总数量也随之提升,同时也带来了一系列问题,例如交通堵塞,交通事故,停车困难等等。智能交通系统(Intelligent Transportation System)随之产生,智能交通系统是交通信息系统、通讯网络、定位系统和智能化分析的交通系统的总称呼。智能交通系统的出现减少了交通事故的发生,缓解了交通的堵塞,提高了交通效率而智能交通系统的重点就是车牌识别技术,车牌识别技术使车辆管理更加方便快捷。
车牌自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。其硬件基础一般包括触发设备(监测车辆是否进入视野)、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机(如计算机)等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。某些车牌识别系统还具有通过视频图像判断是否有车的功能称之为视频车辆检测。 一个完整的车牌识别系统应包括车辆检测、图像采集、车牌识别等几部分。当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。车牌识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。
程序设计思路
本程序的完整流程图。
第一步是输入车牌原始图像,此处使用了photo.m程序;
第二步是图像预处理,通过图像灰度矫正、利用Sobel算子进行边缘检测、图像腐蚀、图像闭运算及移除小面积对象等操作使原图像转化为较为容易识别的二值化图像;
第三步是车牌定位,通过对图像进行蓝色像素扫描进行车牌的行方向和列方向区域确定完成车牌定位操作;
第四步是字符切割,对定位后的车牌进行再次预处理,并进行字符切割;
第五步是字符识别,使用事先存储的数据进行模板匹配完成字符识别操作。
第一步 输入车牌图像
这一步使用Matlab自带的uigetfile函数提供用户选择图片的对话框,用户选择图像后使用imread函数获取图像信息,这一步骤调用了photo.m函数。 若用户未选择图像,程序返回没有图片的警告提示框。 下面是在选择例子图像后Matlab工作区显示的信息,可以看出来程序已经正确获得了图像的信息。


第二步 图像预处理 ——灰度化处理
图像预处理的第一步是图像灰度化处理。该步骤使图像占用空间减少 这一步使用rgb2gray函数对原图像进行灰度化处理。 灰度化处理结束后输出灰度化图像与灰度直方图。


第二步 图像预处理——算子边缘检测
图像预处理的第二步是算子边缘检测。该步骤可以确定图像边缘。 这一步使用edge函数与Sobel对原图像进行二值化与边缘检测。 该步骤处理结束后输出算子边缘检测图。

第二步 图像预处理——图像腐蚀
图像预处理的第三步是图像腐蚀。该步骤可以消除噪声点。 这一步使用imerode函数对原图像进行图像腐蚀操作。 该步骤处理结束后输出腐蚀后图像。

第二步 图像预处理——图像闭运算
图像预处理的第四步是图像闭运算,闭运算指对图像先膨胀处理再腐蚀处理。该步骤可以消除间隙连接边缘,形成大致车牌区域。 这一步使用imclose函数对原图像进行图像闭运算操作。 该步骤处理结束后闭运算平滑处理图像。

第二步 图像预处理 ——移除小面积对象
图像预处理的第五步是移除小面积对象。该步骤可以移除噪声产生的小面积对象。 这一步使用bwareaopen函数对原图像进行移除小面积对象操作。 该步骤处理结束后仅有车牌大致区域图像。

第三步 车牌定位
图像预处理结束获得车牌号大致位置后将图像转化为双精度图像。之后对像素值进行扫描以确定车牌区域边界。
因为列方向1值像素数变化明显,为了避免误差将两侧边界各向外移动一个像素。
第四步 字符分割
在对字符进行切割之前需要对车牌区域图像再次进行一次处理。 分别是灰度化处理、二值化处理、均值滤波处理、腐蚀(膨胀处理)。

图像处理结束后使用qiege.m对图像进行1值像素扫描,初步切割 切割下来的第一个区域进行判断。 若切割下来的部分宽度大于整个图片宽度的1/6.5,认为该区域有两个字符,需要再次切割。 若切割下来的部分宽度小于10像素,认为是左侧干扰区域,切除该区域。 若切割下来的部分通过检测,认为该区域是第一个字符区域,记为WORD1
切割下第一个字符后,调用子程序qiege.m使用相似方法切割剩下字符。 所有字符都切割完成后将单个字符图像归一化为40*20像素,便于后续的字符识别。
第五步 字符识别
在本程序中,字符识别步骤使用了模板匹配方法,首先建立单个字符二值化图像的样本库,然后将切割后的每个字符二值化图像与所有样本做减法,所得到的1值像素最少的样本即为识别结果。 国内车牌号第一位字符必定是汉字,第二位必定是字母,这两位字符仅需要调用一部分样本库。


结果展示
国内车牌号仅有白色字体与黑色字体两种,由于程序是基于二值化图像进行字符切割与字符识别。而黑色字体车牌图像二值化与白色字体车牌图像二值化结果会相反,因此本程序无法正常识别黑色字体车牌号。
总结
在对程序调试的过程中,我发现这种字符识别方法对样本库依赖较大,对于某些比较复杂字符比如“新”字、以及较为混淆的字符比如“2”“Z”字等识别较为困难,需要不断调试样本库中的样本才能做到正确识别。其中“1”字符在我国车牌号中只为一个竖杠,导致归一化后几乎占据了整个画面,在经过几次调试之后最终确定了一个既可以正常识别又不会影响其他字符识别的样本。