目前来说,车牌识别的技术已经相当成熟。在近一个月的学习时间里,将整个车牌识别的流程走了一遍,也有了一个比较清晰、全面的了解。
车牌识别主要分为三大部分:1.车牌的定位;2.车牌字符的分割;3.车牌字符的识别。
关于车牌定位,目前也有很多处理方式,在我学习的方法中,主要是运用到了目前车牌颜色(主要是蓝色和黄色车牌,而两种颜色又互为反色)的特征来进行候选车牌区域的定位(参考郑成勇师兄的论文)。其他的方法,1)基于数学形态学的定位方法,比如直接进行边缘检测,然后进行形态学处理,按照一定的规则去掉不符合车牌区域条件的无效干扰,以此得到车牌候选区域的定位;2)基于神经网络的车牌定位方法,利用已知的车牌区域和非车牌区进行反复训练得出一个比较满意的网络,在分割阶段,使用滑窗法遍历图像,滑动窗口内的图像送入训练网络进行判断。貌似还有基于纹理特征的车牌分割方法、基于小波变换的车牌分割方法等等。在我们的方法中,数学形态学处理,以及如何对候选车牌区域进行进一步的筛选需要花费点脑力。
关于车牌字符的分割,如果车牌存在一定程度的倾斜,还需要进行水平或者垂直角度的矫正。车牌区域已经给定,如何将区域中的字符准确的分隔开,比较通行的处理方式是先去掉上下边框,然后将车牌二值化图像进行垂直投影,去掉干扰,得到最大的投影间隔区,然后在最大间隔处向前分割两个字符,向后分割五个字符。在我的处理中,没有进行车牌的角度矫正,没有考虑第一个汉字(如川)需要字符合并的情形,当然,这些处理都非常简单了。
关于车牌字符的识别,这里的方法就有很多了,什么神经网络,SVM(支持向量机),还有我之前毕设做过的导出核(神经反应,深度学习)都可以用到这里了,并且效果可以非常的鲁邦。我这里使用了一种最粗糙的处理方法,简单的统计字符二值图像与模板二值图像之间不同像素点的个数,将差异最小的模板记号赋给待确定字符,效果也还比较好。当然不如前面的那几种方法厉害了,比如“8”和“B”有时候就会出现错分,复杂的汉字“粤”和“冀”也有时候会出现错分,这些当然也都不是问题啦。
在这段时间里,总算把整个过程都跑了一遍,也算是了解了如今应用如此广泛的车牌识别技术。
下面就是程序以及测试的结果了:
function FinalPlate = LicenseLocate(CarImage,SaveImage)
% *****************************************************************************
% ** 函 数: LicenseLocate 车牌定位
% ** 输 入: CarImage 包含车牌的图像 输入格式 '01.jpg'
% ** SaveImage 保存的图像名称 输入格式 '01_Plate.jpg'(可缺省)
% ** 输 出: FinalPlate 定位的车牌图像
% ** 功 能: 输入一副包含车牌信息的图像,经过车牌定位之后得到车牌区域,并保存
% *****************************************************************************
function codeReg = LicenseRecognition(FinalPlate)
% *****************************************************************************
% ** 函 数: LicenseRecognition 车牌字符识别
% ** 输 入: FinalPlate 包含车牌的图像 输入格式 '01_Plate.jpg'
% ** 输 出: codeReg 识别出来的字符
% ** 功 能: 输入一副已经定位好的车牌的图像,经过字符识别之后得到车牌信息输出
% *****************************************************************************
%主函数测试车牌识别程序
clc,clear,close all
lei = '*.jpg';
%车牌定位
InputPath = '.\CarImage\';
NewFolder = 'MyPlate';
if ~isdir(NewFolder)
system(['mkdir ' NewFolder]);
end
ImageS=dir([InputPath lei]);
L = length(ImageS);
for i = 1:1:L
name = ImageS(i).name;
CarImage = [InputPath name]; ming = name(1:end - 4);
FinalPlate = LicenseLocate(CarImage);
imwrite(FinalPlate,[NewFolder '\' ming '_Plate.jpg'])
end
%车牌识别
InputPath1 = ['.\' NewFolder '\'];
ImageS1=dir([InputPath1 lei]);
L = length(ImageS1);
for i = 1:1:L
name = ImageS1(i).name;
FinalPlate = [InputPath1 name];
ming = name(1:end - 4);
codeReg = LicenseRecognition(FinalPlate)
end