基于特征统计的字符识别.docx
《基于特征统计的字符识别.docx》由会员分享,可在线阅读,更多相关《基于特征统计的字符识别.docx(20页珍藏版)》请在冰豆网上搜索。
![基于特征统计的字符识别.docx](https://file1.bdocx.com/fileroot1/2023-1/10/0e4a419a-43e5-4221-85df-9ae76e17f2bc/0e4a419a-43e5-4221-85df-9ae76e17f2bc1.gif)
基于特征统计的字符识别
基于特征统计的字符识别
摘要
采用数字字符轮廓结构特征和统计特征相结合的方法,并从中选出稳定的局部特征,利用结构语句是别的方法进行数字的识别,能够实现不同字体数字的准确识别,同时还提高了是别的速度。
关键字:
字符识别,MATLAB,统计特征。
前言
字符识别是模式识别的一个分支,它能大大提高信息的采集录入速度,减轻人们的工作强度。
随着计算机技,字符识别技术多年来不断改进和完善,现在已经广泛应用于各个领域,使大量的文档资料能快速、方便、省时省力和及时地自动输入计算机,实现信息处理的电子化。
到目前为止,尽管人们研究中已取得很多可喜成就,但还不能满足我们日常的需求.研究字符识别技术,提高字符识别率具有非常重要的意义。
一.ORC技术简介
OCR技术是光学字符识别的缩写(OpticalCharacterRecognition),是通过扫描等光学输入方式将各种票据、报刊、书籍、文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使用的计算机输入技术。
可应用于银行票据、大量文字资料、档案卷宗、文案的录入和处理领域。
适合于银行、税务等行业大量票据表格的自动扫描识别及长期存储。
相对一般文本,通常以最终识别率、识别速度、版面理解正确率及版面还原满意度4个方面作为OCR技术的评测依据;而相对于表格及票据,通常以识别率或整张通过率及识别速度为测定OCR技术的实用标准。
OCR识别技术不仅具有可以自动判断、拆分、识别和还原各种通用型印刷体表格,在表格理解上做出了令人满意的实用结果,能够自动分析文稿的版面布局,自动分栏、并判断出标题、横栏、图像、表格等相应属性,并判定识别顺序,能将识别结果还原成与扫描文稿的版面布局一致的新文本。
表格自动录入技术,可自动识别特定表格的印刷或打印汉字、字母、数字,可识别手写体汉字、手写体字母、数字及多种手写符号,并按表格格式输出。
提高了表格录入效率,可节省大量人力。
同时支持将表格识别直接还原成PTF、PDF、HTML等格式文档;并可以对图像嵌入横排文本和竖排文本、表格文本进行自动排版面分析。
早在60、70年代,世界各国就开始有OCR的研究,而研究的初期,多以文字的识别方法研究为主,且识别的文字仅为0至9的数字。
以同样拥有方块文字的日本为例,1960年左右开始研究OCR的基本识别理论,初期以数字为对象,直至1965至1970年之间开始有一些简单的产品,如印刷文字的邮政编码识别系统,识别邮件上的邮政编码,帮助邮局作区域分信的作业;也因此至今邮政编码一直是各国所倡导的地址书写方式。
OCR可以说是一种不确定的技术研究,正确率就像是一个无穷趋近函数,知道其趋近值,却只能靠近而无法达到,永远在与100%作拉锯战。
因为其牵扯的因素太多了,书写者的习惯或文件印刷品质、扫描仪的扫描品质、识别的方法、学习及测试的样本……等等,多少都会影响其正确率。
二.识别算法简介
目前用于字符识别中的算法主要有基于模板匹配的算法以及基于人工神经网络的算法。
1.基于模板匹配的算法
基于模板匹配的的基本过程是:
模板匹配方法是一种经典的模式识别方法,是最直接的
识别字符方法,其实现方式是计算输入模式与样本之间的相似性,取相似性最大的样本为输入模式所属类别。
首先要建立模版库,将待识别字符进行二值化并将其尺寸大小缩放为字符数据库中模板的大小,然后与所有的模板进行匹配,最后选择最佳匹配作为结果。
这种方法具有较快的识别速度,尤其对二值图像速度更快,可以满足实时性要求,但是,它对噪声很敏感,而且对字符的字体风格不具有适应性,任何有关光照、字符清晰度和大小的变化都会影响识别的正确率,因此在实际应用中为了提高正确率往往需要使用大的模板或多个模板进行匹配,而处理时间则随着模板的增大以及模板个数的增加而增加。
该算法的一种改进是基于关键点的模板匹配算法,但针对不同的应用环境,关键点的选取方法是不同的。
该算法可用于类似车牌字符等印刷体字符识别。
在字符较规整时,算法对字符图像的缺损、污迹有较强的抗干扰能。
2.基于人工神经网络的算法
神经网络理论自20世纪中期提出以来,取得了一系列的研究成果。
近年来,随着计算机术和非线性科学的发展,神经网络理论的研究又进入一个新的高潮,其应用己经渗透到各个域,并在智能控制、模式识别、计算机视觉、生物医学工程等方面取得了巨大贡献。
用神经网络进行字符识别,主要有两种方法:
一种方法是先对待识别字符进行特征提取,然后用所获得的特征来训练神经网络分类器。
这种方法实际上是传统方法与神经网络技术的结合,可以利用人的经验来获取模式特征,然后充分利用神经网络的分类能力来识别字符,其识别效果与字符特征的提取有关,而字符的特征提取往往比较耗时。
因此,字符特征的提取就成为研究的关键,特征参数过多会增加训练时间,过少会引起判断上的歧义。
另一种方法是充分利用神经网络的特点,直接把待处理图像输入网络,由网络自动实现特征提取直至识别。
这种网络互连较多,待处理信息量大。
这种方法无需特征提取,由网络自动识别字符,抗干扰性能好,识别率高。
但该方法产生的网络结构比较复杂,输入模式维数的增加可能导致网络规模庞大。
虽然,神经网络在识别效果上提高的余地较大,具有较强的容错能力,还可进一步训练学习,识别率较高,但其识别速度较慢,不能满足实时性的要求。
正文
一.特征统计匹配法介绍
特征统计匹配法的要点是先提取待识别模式的一组统计特征,再按照一定准则所确定的决策函数进行分类判决。
汉字的识别是将字符点阵看作一个整体,根据每个字符的笔画特征不同,将字符分解为横、竖、撇、捺、折、圆中的一种或几种结构特征的集合,经过大量的统计得到所用特征,再与字符库中的特征集合进行匹配,从而得到输入字符的识别结果。
1.字符轮廓的定义
由于受噪声和随机污点的干扰,以及二值化和粘连字符处理会引起的字符变形。
为了尽量减少这种变形对信息特征的干扰,或者从变形的字符中提取可靠的特征信息,将字符的整体轮廓分解为顶部,底部,左侧和右侧4个方向的轮廓特征来描述,使得当其中的的某部分的笔画发生变形时,不会改变或者减少对其他部位特征的影响。
左轮廓(LP(K),k=1,2,3….M)定义为字符最左边边界像素点的水平方向坐标值。
LP(i)=min{x|P(x,y)∈C,y=i}i=1,2….M
式中P(x,y)表示图像中的坐标为(x,y)的像素点,C表示字符像素点的集合。
同理,右侧轮廓(RP(k),k=1,2,3….M)定义为字符最右边边界像素点的水平方向坐标值。
LP(i)=max{x|P(x,y)∈C,y=i}i=1,2….M
相应的顶部轮廓(TP(K),k=1,2,3….M)定义为字符最高边界像素点的垂直方向坐标值。
底部轮廓(BP(K),k=1,2,3….M)定义为字符最低边界像素点的垂直方向坐标值。
TP(j)=min{x|P(x,y)∈C,y=j}j=1,2….N
BP(j)=min{x|P(x,y)∈C,y=j}j=1,2….N
为了描述轮廓变化的特征,定义了4个方向的轮廓的一阶微分:
LPD=LP(i+1)-LP(i);
RPD=RP(i+1)-RP(i);
TPD=TP(j+1)-TP(j);
BPD=BP(j+1)-BP(j);
式中i=1,2….M-1;j=1,2…N-1;
2.结构基元
利用定义的一阶微分变化趋势,定义构成字符轮廓的基本基元。
基本基元共有5个,分别是左斜(L),右斜(R),竖直(V),圆弧(C),突变(P)。
以左侧轮廓为例,定义上述基本基元:
(1)竖直
定义:
假设SL,SV和SR分别表示某一侧轮廓的一阶微分值大于零,等于零和小于零的个数,若SR=0,SL=0,则结构为V。
(2)左斜
定义:
假设SL,SV和SR分别表示某一侧轮廓的一阶微分值大于零,等于零和小于零的个数,若SR=0,SL大于阈值LT,则结构为L。
(3)右斜
定义:
假设SL,SV和SR分别表示某一侧轮廓的一阶微分值大于零,等于零和小于零的个数,若SL=0,SR大于阈值RT,则结构为R。
(4)圆弧
定义:
假设SL,SV和SR分别表示某一侧轮廓的一阶微分值大于零,等于零和小于零的个数,若SR大于阈值RT,SL大于阈值LT,则结构为C。
(5)突变
连续的字符轮廓,其一阶微分值的变化量比较小,而当字符轮廓不连续时,其一阶微分值相对较大,因此,定义:
当轮廓的一阶微分值超过阈值PT时,则字符轮廓有突变,即为结构P。
3.基元的检测
根据上述定义,考虑实际应用中存在的干扰,基元的检测如下:
假设PD(K)表示某侧轮廓的一阶微分,k=1,2,….K,SL,SV,和SL分别检测到的PD(K)大于零,等于零和小于零的个数,PT,RT和LT为正整数,则:
(1)若PD(K)≥PT,则在K处检测到的结构为突变P;
若SL若SL>LT,SR>RT,则在K处检测到的结构为左斜L;
若SLRT,则在K处检测到的结构为右斜R;
若SL>LT,SR>RT,则在K处检测到的结构为圆弧C;
(2)由于字符轮廓突变处,表示字符轮廓不连续,则突变前后的字符轮廓特征必须分别检测。
即若K1处检测到P,则在[1,k1-1]的字符轮廓范围内统计SL,SV和SR独立进行结构基元检测。
若在k2处又检测到P,则在[k1+1,k2-1]的范围内进行结构基元检测,以此类推。
(3)由于字符轮廓基元的形成需要一定的数(T)轮廓像素点,即只有当SL+SV+SR≥T时,才能进行基元检测,否则不进行基元检测,例如,当SL+SV+SR=2时,其形成的基元结构是不稳定的。
(4)检测到突变结构P有效的范围在X∈[ST,N-ST+1],y∈[ST,M-ST+1],其中的ST表示字符笔画的宽度。
这主要是为了避免干扰严重的情况下,轮廓边缘光滑处理不够理想时,可能检测到的假突变基元。
4.轮廓的统计特征
采用上述的结构基元还不足以准确识别残缺和完整的数字,引入轮廓的统计特征。
(1)水平方向的最大字符宽度Wmax:
Wmax=max{RP(k)-LP(K)}
该特征主要用于识别数字1.当Wmax≤
即为数字1.
(2)垂直方向的比划数
该特征主要用于识别数字0和8.因为0和8的轮廓结构特征极其相似,所以借助于垂直方向的比划数加以区分,受数字底部残缺的影响8在垂直方向的最大笔画数也可能为2.采用检测到的笔画数为2时垂直方向的最小值来代替。
5.数字识别算法
将数字字符的顶部,左右两侧的局部轮廓结构特征和轮廓统计特征组合成特征向量,用以描述10个数字。
根据特征向量,采用结构语句识别算法识别底部残缺的和完整的数字字符。
由于底部特征丢失,会改变左右两侧的部分特征结构,但不会影响顶部特征,因此特征描述和机构匹配识别都从顶部轮廓特征开始。
实验结果
一.结果显示
数字0的识别结果:
数字1的识别结果:
数字2的识别结果:
数字3的识别结果:
数字4的识别结果:
数字5的识别结果:
数字6的识别结果:
数字7的识别结果:
数字8的识别结果:
数字9的识别结果:
二.结果分析
由于外部原因的存在常常会出现字符模糊、字符倾斜等情况,从而影响识别效果,当字符出现笔画融合、断裂、部分缺失时,此方法更加无能为力。
因此,实际应用效果不理想,鲁棒性不强。
参考文献
[1]冈萨雷斯《数字图像处理》第二版
[2]MATLAB从入门到精通].周建兴2008
[4]S.J.Chapman《MATLAB编程》2008
[5]《MATLAB7_0基础教程》清华大学2005
[6]苏金明《Matlab图形图像》2005
[7]《基于MATLAB图像处理的汽车牌照识别系统》仇成群2008(6)
[8]许志影、李晋平.MATLAB极其在图像处理中的应用.计算机与现代化,2004(4)
[9]一种复杂车辆图像中的多车牌定位方法,光子学报2007
(1)Vol.36No.1
[10]基于图像处理的汽车牌照的识别,陈秋菊
[11]宋建才.汽车牌照识别技术研究[J].工业控制计算机,2002,4:
45-57.
[12]张兴汇,刘玲,杜升之等.车牌照定位及倾斜校正方法研究
[J].系统工程与电子技术,2004,2:
237~239.
[13]崔屹.数字图像处理技术与应用[M].电子工业出版社,1997.
[14]张旭,王宏安,戴国忠等.面向车牌识别的区域分割技术[J].
计算机工程,2002,12:
113~115.
[15]袁志民,潘晓露等.车牌定位算法的研究[J].昆明理工学报,
2001,26
(2):
56~60.
附录
源代码
主函数
I0=imread('2.jpg');%必须为二值图像
I=im2bw(I0,0.4);
[y0x0]=size(I);
Range=sum((~I)');
Hy=0;
forj=1:
y0
if(Range(j)>=1)
Hy=Hy+1;
end
end
RangeX=sum((~I));
Wx=0;
fori=1:
x0
if(RangeX(i)>=1)
Wx=Wx+1;
end
end
Amp=24/Hy;%将文字图像归一化到24像素点的高度。
I=imresize(I,Amp);
[yx]=size(I);
%I=bwmorph(~I,'skel',Inf);
%I=~I;
tic
%======基本结构=======%
%第一类:
竖(V);左斜(L);右斜(R);突变(P)
%第二类:
左半圆弧(C);右半圆弧(Q)
%的三类:
结构待定(T);
%=====================================%
Left=zeros(1,y);%左端轮廓检测
forj=1:
y
i=1;
while((i<=x)&&(I(j,i)==1))
i=i+1;
end
if(i<=x)
Left(j)=i;
end
end
forj=1:
y-1
LeftD(j)=Left(j+1)-Left(j);
end
%==========结构特征提取=============%
j=1;
while((Left(j)<1)&&(jj=j+1;
end
Y1=j;
j=y;
while((Left(j)<1)&&(j>1))
j=j-1;
end
Y2=j-1;%去掉急剧变化的两端
%==============右边==================%
Right=zeros(1,y);%左端轮廓检测
forj=1:
y
i=x;
while((i>=1)&&(I(j,i)==1))
i=i-1;
end
if(i>=1)
Right(j)=i;
end
end
forj=1:
y-1
RightD(j)=Right(j+1)-Right(j);
end
%=====================================%
Top=zeros(1,x);%顶端轮廓检测
fori=1:
x
j=1;
while((j<=y)&&(I(j,i)==1))
j=j+1;
end
if(j<=y)
Top(i)=j;
end
end
fori=1:
x-1
TopD(i)=Top(i+1)-Top(i);
end
%==============================%
i=1;
while((Top(i)<1)&&(ii=i+1;
end
X1=i;
i=x;
while((Top(i)<1)&&(i>1))
i=i-1;
end
X2=i-1;%去掉急剧变化的两端
%===================================%
Bottom=zeros(1,x);%底部轮廓检测
fori=1:
x
j=y;
while((j>=1)&&(I(j,i)==1))
j=j-1;
end
if(j>=1)
Bottom(i)=j;
end
end
fori=1:
x-1
BottomD(i)=Bottom(i+1)-Bottom(i);
end
%==========数字1的宽度特征=========%
Width=zeros(1,y);
forj=1:
y
Width(j)=Right(j)-Left(j);
end
W=max(Width);
Po=0;%用于检测笔划
Ne=0;
NS=0;%笔划数
fori=X1+4:
X2-4
forj=1:
y-1
if((I(j+1,i)-I(j,i))>0)%由黑到白
Po=Po+1;
if((Po>=2)&&(j<=fix(0.7*y)))
Po=3;
end
elseif((I(j+1,i)-I(j,i))<0)%由白到黑
Ne=Ne+1;
if((Ne>=2)&&(j<=fix(0.7*y)))
Ne=3;
end
end
end
end
NS=[NSmax(Po,Ne)];
Po=0;
Ne=0;
end
Comp=max(NS);
%==========轮廓结构特征提取==========%
if(min(W,Wx)>10)
StrokeT=StrDetect01(TopD,X1,X2,3,6);%顶部基本结构检测
StrokeL=StrDetect01(LeftD,Y1,Y2,3,5);%左边基本结构检测
StrokeR=StrDetect01(RightD,Y1,Y2,3,5);%右边基本结构检测
StrokeB=StrDetect01(BottomD,X1,X2,3,6);%底部基本结构检测
%==========识别==========%
Digit=Recognition(StrokeT,StrokeL,StrokeR,StrokeB,Comp)
else
Digit='1'
end
t=toc
%=======显示======%
px=(1:
x);
py=(1:
y);
S=num2str(Digit);
figure
(1);
subplot(231)
imshow(I);
title('源图像')
subplot(232)
plot(Left);grid
title('左轮廓');
subplot(233)
plot(Top);grid
title('上轮廓');
subplot(234)
plot(Right);grid
title('右轮廓');
subplot(235)
plot(Width);grid
title('宽度');
subplot(236)
imshow(I);
title(S)
子函数一
function[Stroke]=StrDetect01(LeftD,Y1,Y2,ST,PT)
%ST为结构阈值,为了指定高度和宽度结构变化的不同
SL=0;
SR=0;
SV=0;
Count=0;
%PT=5;%突变的阈值
Str='T';%T表示结构未定,Str用于保存当前的基本结构
Stroke='T';%用于保存基本结构
Range=Y2-Y1+1;%字符的宽度或者高度
forj=Y1:
Y2
Count=Count+1;
if(abs(LeftD(j))if(LeftD(j)<0)
SL=SL+1;
elseif(LeftD(j)>0)
SR=SR+1;
else
SV=SV+1;
end
end
else%检测到突变的决策
if((Count>=fix(Range/4)+1))%设定字符轮廓可能发生的突变范围
if((SL>=3)&&(SR>=3))
Str='C';
elseif((SV>=2*(SL+SR))&&((max(SL,SR)<3)||(min(SL,SR)<2)))
Str='V';
elseif((SL>SR)&&((SL>=0.5*SV)&&((SR<=1)||(SL>(SR+SV)))))
Str='L';
elseif((SR>SL)&&((SR>=0.5*SV)&&((SL<=1)||(SL>(SR+SV)))))
Str='R';
elseif(max(SL,SR)>=3)&&(min(SL,SR)>=2)
Str='C';
end
end
end
end
end
Stroke=[StrokeStr];
end
if((j>=2+Y1)&&((j<=Y2-2)))
Stroke=[Stroke'P'];
end
SL=0;
SR=0;
SV=0;
Count=0;
Str='T';
end
end
%=========提取结构===============%
if(Count>=fix(Range/4)+1)%发生突变后,剩余部分可能无法形成字符结构
if((SL>=ST)&&(SR>=ST))
Str='C';
elseif((SV>=2*(SL+SR))&&((max(SL,SR)<3)||(min(SL,SR)<2)))
Str='V';
elseif((SL>SR)&&((SL>=0.5*SV)&&((SR<=2)||(SL>=(SR+SV)))))
Str='L';
elseif((SR>SL)&&((SR>=0.5*SV)&&((SL<=2)||(SL>=(SR+SV)))))
Str='R';
elseif(max(SL,SR)>=3)&&(min(SL,SR)>=2)
Str='C';
end
end
end
end
end
Stroke=[StrokeStr];
end
子函数二
function[Numeral]=Recognition(StrokeTop,StrokeLeft,StrokeRight,StrokeBottom,Comp)
%采用四边的轮廓结构特征和笔划统计(仅针对0和8)识别残缺数字
%Comp是用于识别0和8的底部补充信息
StrT='T';
StrL='T';
StrR='T';
StrB='T';
RStr='T';%用于保存识别出的数字
[tempXT]=size(StrokeTop);
[tempXL]=size(StrokeLeft);
[tempXR]=size(StrokeRight);
%[tempXB]=size(StrokeBottom);
forTi=2:
XT
if(StrokeTop(Ti)=='C')
if((XL==2)&