车牌识别的实现

这几天陆陆续续更新自己做的车牌识别的过程,先上结果
车牌识别的实现_第1张图片
这里我仅仅对字母以及数字进行了训练,汉字结果遵从字母的结果。同时没有对相似字母进行再训练,有兴趣的读者可以在此基础之上加上再训练,或者采用全新的网络结构进行训练。
车牌识别的实现_第2张图片
本次在车牌的定位过程中本算法创新性的融合了形态学的知识和图像的像素特征,这样使得本系统的车牌定位子系统鲁棒性得到了进一步的提升。

1:车牌定位的算法。

这里车牌定位采用了形态学的知识,将输入的图像进行预处理(减去背景,灰度化,均衡化,滤波去噪声)得到图像1,然后将图像1使用沈俊算子进行边缘的检测。
原图像
车牌识别的实现_第3张图片
减去背景的图像
这里采用的是disk的模板对背景先进行了模糊的处理,然后使用原图像减去背景图像可以使得减去的图像的边缘特征更加明显。
车牌识别的实现_第4张图片
使用沈俊算子进行边缘提取的图像
我们这里比较了roberts算子,canny算子和沈俊算子。最后发现是沈俊算子的效果比较好。
车牌识别的实现_第5张图片
在得到上述的图像之后,我们对图像进行开运算和闭运算,然后进行了膨胀和腐蚀,腐蚀的目的是为了去除图像的小目标,膨胀的结果是为了让车牌的区域连片。
腐蚀的结果
车牌识别的实现_第6张图片
膨胀的结果
车牌识别的实现_第7张图片
然后结合目标的蓝色像素点,取蓝色像素点占目标区域比重最大的闭联通区域,这样就完成了车牌位置的初步确定。
初步确定车牌的位置
车牌识别的实现_第8张图片
在初步定位车牌的位置之后,我们对边缘进行裁剪,如果列边缘像素点的总和同列的最大值相比,结果小于0.8,那么我们就继续寻找边缘。同理,我们可以根据这个方法对行边缘进行裁剪。裁剪结果如下:
在这里插入图片描述
将其放在原图中对比:
车牌识别的实现_第9张图片

2:车牌切割算法

将剪切下的图片进行线性灰度化处理和高斯滤波去除噪声,然后进行图像的开闭运算,然后使用最大熵阈值函数进行图像二值化的操作,然后对二值化后的图像进行开运算,目的是去除二值图中的“粘连”部分。
车牌识别的实现_第10张图片
将闭运算后的图片按照列统计像素点,找到统计的“波谷”处进行分割。然后将分割处的坐标值进行左移和右移,终止条件是移动的地方列坐标统计点个数不少于4个。
在这里插入图片描述

3:字符识别模块

在字符识别模块我采用了很适合分类的广义回归网络(GRNN)进行的识别。我们对10个数字和24个字母(除去O和I),每个类别380张图片进行训练,因此我们建立的GRNN模式层有(10+24)*380=12920个神经元,我们的输入层有14个神经元,分别是代表下图所示的14个特征:车牌识别的实现_第11张图片
为了减少运算,我们将线性求和层的数目设为1,然后输出层个数是1(其中0标号为1,a为11,z为34),光滑因子选取为0.5,模式层的中心点选取是根据训练样本的14个特征进行确定。
在构建好网络后进行训练和测试,最后显示的测试结果准确率为83%。
部分提取特征代码:

for i = 1:34
    temp_input = features((i-1)*400+1:i*400,:);
    temp_output = classes((i-1)*400+1:i*400,:);
    n = randperm(400);
    % 训练集——380*34个样本
    P_train = [P_train temp_input(n(1:380),:)'];
    T_train = [T_train temp_output(n(1:380),:)'];

部分训练代码:

 G=radbas(z);
    %期望输出
    % d=y';
    % % 伪逆。求出权值向量
    w=inv(G.'*G)*G.'*d;

将后来的网络训练结果保存下来,然后在识别的时候load Mynet进行导入,然后将分割出来的7个数字的14个特征向量取出来,输入到训练好的网络当中,就可以得到准确的结果。
在这里插入图片描述
汉字的训练集没有找到,使用这里汉字的结果是未知的,只会从34个选择中选取。

你可能感兴趣的:(图像)