1.简述
简单说一下实现思路:
读取图片,转灰度,计算灰度直方图,估算阈值(这里的阈值计算很重要,经过阈值算法,选取一个最恰当的阈值),之后二值化。显示图像即可。
- 实现目标
输入一张车牌图片,实现车牌定位,字符切割和字符识别三步骤。同时可以根据需要,做成库外识别,语音播报,出入库等功能。
- 设计步骤:
所设计的车牌识别的流程包括图像预处理,车牌分割,字符分割,及字符识别。详见matalb程序。
- 程序讲解
1)第一部分为图像的预处理。
此部分借鉴了别人的程序,将灰度图像以sobel算子检测边缘;再对边缘图像进行腐蚀,去除掉细的,间断的边缘;对剩下的区域进行闭合以填充图像,此时可以看到车牌区域形成了一个大的连通域;调用bwareaopen函数去掉小的连通域,此时整个二值图像只b剩下了车牌区域为1。如下图所示:
- 第二部分为车牌的提取
此部分的工作为将上一步的白色区域取出,其对应的就是车牌区域。设计思路如下:首先将二值图像f中所有为1的点的坐标放入数组location_of_1中,对这些坐标遍历计算,寻找x坐标与y坐标之和最大的点a与最小的点b,a即为车牌的左上角,b为车牌的右下角。通过这两个坐标将车牌分割出来,并对灰度车牌图像以OTSU算法进行自适应二值化分割。最终效果如下:
- 第三部分为字符分割
此部分的工作是将车牌里的7个字符分别提取出来。方法如下:对该二值图从左向右像按列z遍历,计算每一列之和,没有白点的列和为0,有白点的列和非零,转换为逻辑1,记录下所有列和在0与1转换的列,即为需要切割的列,共有14列,可切出7个字符。切割出单个字符后,放入char_(i)中,并切割掉每个字符的上下的空白区域,完成精确切割,效果如下:
- 第四部分为字符的识别
识别的方法主要有模板匹配字符识别算法,统计特征匹配算法,神经网络字符识别算法和支持向量机模式识别算法。由于分割的字符效果较好,为明显畸变,模k板维数低(32*16),且因为时间关系,这里采用了模板匹配识别算法。该程序把切割出的字符与库里的汉字和字符的模板做减法运算,找到差别点最少的模板为对应模板,输出该模板对应的字符,最后识别出其为“京JX9168”。如下:
2.代码
clear all
clc
PS=imread('1.jpg');
subplot(1,2,1);
imshow(PS)
title('原图')
p=rgb2gray(PS);
subplot(1,2,2)
imshow(p)
title('原灰度图')
[m,n]=size(p);
GP=zeros(1,256);
for k=0:255
GP(k+1)=length(find(p==k))/(m*n);
end
figure
subplot(1,2,1);
bar(0:255,GP,'g')
title('原灰度直方图')
max_index=[];
for i=3:length(GP)-2
if((GP(i)>=GP(i+1))&(GP(i)>=GP(i-1)))&((GP(i+1)>=GP(i+2))&(GP(i-1)>=GP(i-2)))
max_index(end+1)=i-1;
end
end
possible=GP(max_index);
[max_value,index]=max(possible);
TT=max_index(index)-2;
[m,n]=size(p);
R=zeros(m,n);
for i=1:m
for j=1:n
if p(i,j)<TT
R(i,j)=0;
else R(i,j)=256;
end
end
end
subplot(1,2,2);
imshow(R);
title('二值图');
3.运行结果