author:zox
实验环境:Matlab2019a
课程设计:汽车车牌识别
序号 | 内容 |
---|---|
0 | [任务+原理+设计方案] |
1 | 车牌图像预处理 |
2 | 车牌定位 |
3 | 车牌字符分割 |
4+5 | 车牌字符识别+结果分析 |
6 | 总结 |
∞ | 源代码 |
三、课程设计步骤和结果
4.车牌字符识别
车牌字符识别采用的是模板匹配的方法,字符识别的整体流程如下:
在字符识别过程中的一些关键的变量如下表:
表-5 字符识别变量索引
变量名称 | 变量注解 |
---|---|
image | 循环取到了7个字符的图像数据 |
dirpath | 模板所在子文件夹路径 |
pattern | 模板字符的数据信息 |
diatance | 字符与所有模板的欧氏距离 |
res | 单个字符的匹配结果 |
result | 车牌匹配结果 |
4.1字符归一化处理
在对字符识别之前首先要对字符进行归一化处理,因为字符分割时是选择最大分割宽度对所有字符进行的分割,所以有的字符是贴近边界的,有的则是留有一些距离,所以为了对他们统一,自编写mynormalise函数对字符图像归一化,其操作步骤如下:
1)为每个字符图像添加等宽的左右边界的黑色背景;
2)再将得到的图像缩放到40×20的标准图大小;
关键代码为:
[x,y]=size(image);
ny=y+10;
image=[zeros(x,round((ny-y)/2)) image zeros(x,round((ny-y)/2))];
image=imresize(image,[40,20]);
OUT=im2bw(image,0.5);
归一化处理的结果如下图:
4.2建立模板
模板匹配是图象识别方法中最具代表性的基本方法之一, 本车牌识别系统采用相减的方法来求得字符与模板的欧氏距离,得到与模板哪一个字符最相似,然后找到相似度最大的输出。
模板匹配法虽然识别率低,但实现简单,计算量小,只有矩阵的加减与统计,而且车牌字符只有数字、英文大写字母和部分汉字,需要的模板字库量不大,因此本系统使用这种方法。对于模板匹配,需建立标准模板库,库中字符使用40×20的统一大小。
然后在识别过程中发现如果将所有汉字、字母和数字放在相同的模板库下的话,有可能会出现汉字识别成字母、字母识别成数字的情况。所以仔细分析过后发现汽车车牌的具体特征:
1)第一位是代表省份的汉字;
2)第二位是代表市区的大写字母;
3)后五位字符为任意大写字母或数字;
所以为了实验方便,结合本次设计所选汽车牌照的特点,建立了3个小的模板库分别用于识别不同位置的字符,这样字符识别准确率就会提高。
模板是从网络上搜索到相关的图片,再把图片的像素修改为 40*20和分割出的待识别的字符相同,把修改后的模板图片保存到字符模板文件夹中。
建立模板的关键代码如下:
string=["character","letter","letter+number"];%对应的模板下的子文件夹名称
length_f=zeros(3,1);%每个小模板库下的字符图数量
result=[];%识别结果
for st=1:3%循环建立模板库数据
dirpath = fullfile(pwd, 'Template',string(st),'*.bmp');%后面为地址串(pwd为当前目录所在位置)
files = ls(dirpath);%得到该路径下的所有文件
length_f(st)=length(files);%求该文件夹下的模板图数量
for t = 1 : length_f(st)
filenamet = fullfile(pwd,'Template',string(st), files(t,:));%得到该路径下的所有文件的列表
[filepath,name,ext] = fileparts(filenamet); % fileparts()函数:返回指定文件的路径名称、文件名和扩展名。
imagedata = imread(filenamet);%读取该图片
imagedata = im2bw( imagedata,0.5); %二值化为logic数据
pattern(st,t).feature = imagedata; %取图片特征信息
pattern(st,t).name =name; %取模版字符名字
end
end
4.3字符识别
首先取字符模板,接着依次取待识别字符与模板进行匹配,将其与模板字符相减,得到的0越多,重合的部分就越多,那么就越匹配。把每一幅相减后的图的0值个数保存,选出0最多的图片模板的结果,即为识别出来的结果,保存在res中。
字符识别的关键代码如下:
for m = 1 : 7 %循环分割的字符图像进行匹配
image=imread([str,'Nword',num2str(m),'.bmp']);%读取对应图片
switch m
case 1
for n = 1 : length_f(1)
distance(m,n)=sum(sum(abs(image-pattern(1,n).feature)));%距离数组
end
case 2
for n = 1 : length_f(2)
distance(m,n)=sum(sum(abs(image-pattern(2,n).feature)));%距离数组
end
case {3,4,5,6,7}
for n = 1 : length_f(3)
distance(m,n)=sum(sum(abs(image-pattern(3,n).feature)));%距离数组
end
end
st=m;
if st>3
st=3;
end
[value,number]=min(distance(m,:));%距离最小的
res(m) = pattern(st,number).name;
result = strcat(result,res(m));%将结果字符串连接起来
end
最后将每步识别到的字符串起来得到最终的识别结果,整个车牌识别的过程结果图如下:
为更好的对比每一次的车牌图像的识别效果,将每一次的识别结果都保存在系统目录下的日志文件中,便于查阅。
从结果可以看到车牌识别的效果是非常准确的。
5.结果分析
实际在测试过程中选取了12张比较规范、清晰的车牌图像来进行测试,不断地对代码和模板库进行修正,最终达到这12张车牌图像都能100%识别准确。识别的对比结果如下:
表-6 识别结果1
序号 | 原车牌信息 | 识别的车牌信息 | 识别时间 |
---|---|---|---|
1 | 吉AGH827 | 吉AGH827 | 30-May-2020 07:08:00 |
2 | 辽B5705D | 辽B5705D | 30-May-2020 07:08:23 |
3 | 辽P88888 | 辽P88888 | 30-May-2020 07:08:46 |
4 | 鲁D56829 | 鲁D56829 | 30-May-2020 07:09:09 |
5 | 陕A906L4 | 陕A906L4 | 30-May-2020 07:09:38 |
6 | 豫A04S89 | 豫A04S89 | 30-May-2020 07:10:01 |
7 | 粤A6ZC93 | 粤A6ZC93 | 30-May-2020 07:10:22 |
8 | 粤AC609Z | 粤AC609Z | 30-May-2020 07:10:41 |
9 | 粤SX186Q | 粤SX186Q | 30-May-2020 07:11:04 |
10 | 云AG289N | 云AG289N | 30-May-2020 07:11:24 |
11 | 云AMW061 | 云AMW061 | 30-May-2020 07:11:48 |
12 | 浙GM2U15 | 浙GM2U15 | 30-May-2020 07:12:13 |
另外还在网上找寻了12张相对来说有一些模糊的车牌图像来进行检查设计的汽车车牌识别系统的准确率,识别结果如下:
表-7 识别结果2
序号 | 原车牌信息 | 识别的车牌信息 | 识别时间 |
---|---|---|---|
1 | 黑E99999 | 宁E9999J | 30-May-2020 07:15:35 |
2 | 沪B69999 | 宁U69999 | 30-May-2020 07:16:11 |
3 | 沪DE3156 | 宁DE3156 | 30-May-2020 07:16:32 |
4 | 京A83760 | 京A83760 | 30-May-2020 07:16:54 |
5 | 辽AQ6493 | 沪AQ6493 | 30-May-2020 07:17:15 |
6 | 鲁A12345 | 桂A12345 | 30-May-2020 07:17:38 |
7 | 鲁AZ8886 | 鲁AZ8886 | 30-May-2020 07:18:01 |
8 | 鲁HC9669 | 豫HC9669 | 30-May-2020 07:19:35 |
9 | 苏EK69X0 | 苏EK69X0 | 30-May-2020 07:20:48 |
10 | 湘AB3597 | 鲁A83S97 | 30-May-2020 07:21:20 |
11 | 豫S32B69 | 蒙S32869 | 30-May-2020 07:21:45 |
12 | 粤DB8888 | 粤D88888 | 30-May-2020 07:22:09 |
(表中加粗部分为识别错误的字符)
由此得出系统的识别正确率为1-14/(7×12)=83.3%,正确率还是比较合理的,而且分析错误的字符中,汉字识别错误的最多,这也是由于汉字的复杂性导致的。