接着昨天的工作,把最后一部分识别讲完。

关于字符识别这块,一种最省事的办法是匹配识别,将所得的字符和自己的标准字符库相减,计算所得结果,值最小的即为识别的结果。不过这种方法是在所得字符较为标准的情况,由于众多因素影响,切割出来的字符往往不是标准的,因此识别效果也不好。本次采用的BP神经网络方法,至于像其他的分类器方法,没有尝试,这里就不说了。

利用神经网络的方法的思路也比较清晰,将已有的字符库输入到神经网络的输入口进行训练,然后用训练好的神经网络对待识别的字符继续识别,输出识别结果。matlab里面已经集成好神经网络,直接调用即可。

这里说明一下,考虑到减小输入量,这里把输入的字符划分为八行四列,计算每块的总数,然后把这些数作为样本输入到神经网络。

字符识别部分代码:

for i=:
ii=int2str(i);
fname=strcat('D:\1_2学习\图像处理\车牌识别\matlab_car_plate-recognization\char_result\character_test\cha&num\',ii,'.bmp');
image=imread(fname);
change_image=catch2chi2character(image);
P(:,i)=change_image;
end
T = [eye() eye() eye() eye()];
alphabet = P;
targets = T; [R,Q] = size(alphabet);
[S2,Q] = size(targets);
S1=;% purelin tansig
net = newff(minmax(alphabet),[S1,S2],{ 'purelin' 'purelin' },'trainscg','learngdm');%trainscg traingdx
net.inputWeights{,}.initFcn ='randnr';
net.layerWeights{,}.initFcn ='randnr';
net.performFcn = 'sse';
net.trainParam.goal = 0.1;
net.trainParam.show = ;
net.trainParam.epochs = ;
net.trainParam.mc = 0.95;
net.trainparam.lr=0.015;%0.01 %设置学习速率
P = alphabet;
T = targets;
[net,tr] = train(net,P,T);%训练好的神经网络

函数catch2chi2character:

function  lett=catch2chi2character(I1)
%% 训练样本前期处理
% bw_7050=imresize(I1,[ ],'nearest');%将图片统一划为50*25大小
[m n]=size(I1);
bw_7050=I1;
% figure,imshow(I1);
histrow=sum(bw_7050'); %计算水平投影
histcol=sum(bw_7050); %计算竖直投影
for i=:m
if(histrow(i)>)
row_x=i;
break;
end
end
for i=:n
if(histcol(i)>)
col_x=i;
break;
end
end
for i=n:-:
if(histcol(i)>)
col_y=i;
break;
end
end
for i=m:-:
if(histrow(i)>)
row_y=i;
break;
end
end
picture(:,:)=bw_7050(row_x:row_y,col_x:col_y);
bw_7050=imresize(picture,[ ],'nearest');%将图片统一划为50*25大小
% figure,imshow(bw_7050) for cnt=:%粗网格特征作为输入矢量
for cnt2=:
Atemp=sum(bw_7050((cnt*-:cnt*),(cnt2*-:cnt2*))); %获取字符的统计特征
lett((cnt-)*+cnt2)=sum(Atemp);
end
end
ma=max(max(lett));
mi=min(min(lett));
lett=(lett-mi)/(ma); histrow=sum(bw_7050'); %计算水平投影
histcol=sum(bw_7050); %计算竖直投影 lett=lett';
end

字符识别:

 for i=:
ii=int2str(i);
fname=strcat('D:\1_2学习\图像处理\车牌识别\matlab_car_plate-recognization\char_result\',ii,'.bmp');
image=imread(fname);
[size_x size_y]=size(image);
max_num=max(max(image));
min_num=min(min(image))-;
for ix=:size_x
for ij=:size_y
if image(ix,ij)>min_num+(max_num-min_num)/
image(ix,ij)=;
else
image(ix,ij)=;
end
end
end
% I2 = bwmorph(image,'remove'); %提取边缘
% image_main = bwmorph(I2,'skel',Inf); %骨架化
% figure,imshow(image)
change_image=catch2chi2character(image);
Ptest(:,i-)=change_image;
end
[a,b]=max(sim(net,Ptest));
disp(b);
liccode=char(['A':'H' 'J':'N' 'P':'Z' '':'']); %建立自动识别字符代码表
for i=:
str(i)=liccode(b(i));
end

汉字识别和字符差不多,这里就不贴上去了。。

总结一下:采用这种方式,基本上字符都可以识别出来。考虑到样本采集、数字处理过程中对字符的影响,像字符O和D,一定情况下无法识别。这也是程序所存在的问题,即没有对相似的字符进行区分。。汉字也存在这种情况,左右结构的也没有考虑。因此想做到完整还有好多工作要做。。

这个是简单的GUI结果图:

总结一下:

1.获取的车牌规格要统一,否则很难把握好车牌定位这块。

2.切割字符关键在于让程序确定在车牌的位置,这样切割起来就比较方便了。不足的地方在于从定位到切割这块要耗费一点时间,感觉是自己程序太过复杂?不知道有没比较简单的思路没。

3.字符识别想要做的好,工作还是比较多的。这次神经网络训练过程中参数设置很重要,土办法是去试,不知道有没有科学点的办法。。

4.算是对这段时间来的一个总结,里面涉及到的内容还是很多的,多看看模式识别方面的知识。

结束。。2015-5-11

基于matlab的蓝色车牌定位与识别---识别的更多相关文章

  1. 【原】基于matlab的蓝色车牌定位与识别---绪论

    本着对车牌比较感兴趣,自己在课余时间摸索关于车牌的定位与识别,现将自己所做的一些内容整理下,也方便和大家交流. 考虑到车牌的定位涉及到许多外界的因素,因此有必要对车牌照的获取条件进行一些限定: 一.大 ...

  2. 基于matlab的蓝色车牌定位与识别---定位

    接着昨天的工作继续.定位的过程有些是基于车牌的颜色进行定位的,自己则根据数字图像一些形态学的方法进行定位的. 合着代码进行相关讲解. 1.相对彩色图像进行灰度化,然后对图像进行开运算.再用小波变换获取 ...

  3. 基于matlab的蓝色车牌定位与识别---分割

    接着上面的工作,接下去就该是进行字符分割了.考虑到为了后面的字符识别,因此在这部分需要实现的目标是需要把车牌的边框全部切除,对重新定位的车牌进行垂直方向水平方向调整,保证字符是正的.最后才是字符的分割 ...

  4. 车牌识别LPR(四)-- 车牌定位

    第四篇:车牌定位 车牌定位就是采用一系列图像处理或者数学的方法从一幅图像中将车牌准确地定位出来.车牌定位提取出的车牌是整个车牌识别系统的数据来源,它的效果的好坏直接影响到整个系统的表现,只有准确地定位 ...

  5. 数字图像处理:基于MATLAB的车牌识别项目 标签: 图像处理matlab算法 2017-06-24 09:17 98人阅读 评论(0)

    学过了数字图像处理,就进行一个综合性强的小项目来巩固一下知识吧.前阵子编写调试了一套基于MATLAB的车牌识别的项目的代码.今天又重新改进了一下代码,识别的效果好一点了,也精简了一些代码.这里没有使用 ...

  6. 基于MATLAB的手写公式识别(2)

    基于MATLAB的手写公式识别 图像的预处理(除去噪声.得到后续定位分割所需的信息.) 预处理其本质就是去除不需要的噪声信息,得到后续定位分割所需要的图像信息.图像信息在采集的过程中由于天气环境的影响 ...

  7. 基于MATLAB的人脸识别算法的研究

    基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...

  8. 基于MATLAB的手写公式识别(3)

    基于MATLAB的手写公式识别 图像的膨胀化,获取边缘(思考是否需要做这种处理,初始参考样本相对简单) %膨胀 imdilate(dilate=膨胀/扩大) clc clear A1=imread(' ...

  9. 基于MATLAB的手写公式识别(9)

    基于MATLAB的手写公式识别(9) 1.2图像的二值化 close all; clear all; Img=imread('drink.jpg'); %灰度化 Img_Gray=rgb2gray(I ...

随机推荐

  1. IT兄弟连 JavaWeb教程 AJAX定义以及解决的问题

    Ajax是"Asynchronous JavaScript And XML"的缩写(即:异步的JavaScript和XML),是一种实现无页面刷新获取服务器数据的混合技术,Ajax ...

  2. JavaWeb案例:上次访问时间 Cookie技术

    package cn.itcast.access; import javax.servlet.ServletException; import javax.servlet.annotation.Web ...

  3. Codeforces 161A(贪心)

    要点 我在想贪心是对的那要二分图何用,自己的想法是:二分图最开始并不知道怎么匹配最好所以就按输入顺序连了,之后慢慢修改:而这道匹配也成对匹配但从一开始你就可以知道选哪个最划算,就是贪心地选最小的.不必 ...

  4. svn安装到myeclipse 和客户端安装

    https://jingyan.baidu.com/article/eae07827a977b61fed548572.html

  5. Funsioncharts 线图 破解

    在线示例:http://jsfiddle.net/henley/xnozyLa8/2/ 下载:http://files.cnblogs.com/files/ycdx2001/chart.zip

  6. Quartz.NET基础入门

    Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和 ...

  7. w3c万维网的介绍和html基本构成

    怎么与浏览器交互? 1.鼠标 2.键盘输入 w3c标准: 中文名:万维网联盟!外文名:world wide web cansortium万维网联盟创建于1994年,是web技术领域最具权威个影响的国际 ...

  8. To the world you may be one person, but to one person you may be the world.

    To the world you may be one person, but to one person you may be the world.对于世界而言,你是一个人:但对于某人而言,你是他的 ...

  9. java中的常用内存区域总结

    <开发实战经典>     (1)栈内存空间:保存所有的对象名称     (2)堆内存空间:保存每个对象的具体属性内容     (3)全局数据区:保存static类型的属性     (4)全 ...

  10. elasticsearch 2.4 windows版jvm内存设置

    本文编写目的是因为网上有很多es修改内存配置的文章,方法也各有不同,但在我的情况下(es 2.4 windows版)发现很多方法都是无效的,有效只有以下方法 第一个是xms,第二个是xmx