基于matlab的文字识别算法 课程设计文档格式.docx
- 文档编号:20425586
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:19
- 大小:282.68KB
基于matlab的文字识别算法 课程设计文档格式.docx
《基于matlab的文字识别算法 课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《基于matlab的文字识别算法 课程设计文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
在对场景文字识别的研究中,获取自然场景图片时候,由于背景物体、光线、阴影、拍摄角度引起的图片背景千变万化,摄像器材的精度、拍摄人员的技术等软硬件的不同为拍摄同样的自然场景图片也带来了相当大的差别,被拍摄的图片中包含的文字大小、颜色、书写风格的各不相同等因素都为自然场景文字识别的实现增加的相当的难度。
需要对自然场景图片中的识别首先需要对图片中的文本进行定位,然后再对己经精确定位的图片进行识别.文本定位技术作为整个自然场景文本信息获取系统中的基础技术,已经得到较好发展,相同地,文本识别技术在近年来也得到了比较好的发展,但是由于文本的复杂性和随机性,较文本定位技术来说,文本识别技术发展较为缓慢.
3相关知识
1。
在Matlab中调用i1=imread(‘8.jpg'
),可得到原始图像,如图所示:
图2文字识别算法调制器模型
2。
调用i2=rgb2gray(i1),则得到了灰度图像,如图所示:
图3灰度图像
调用a=size(i1);
b=size(i2);
可得到:
a=3,b=2即三维图像变成了二维灰度图像
3。
调用i3=(i2》=thresh);
其中thresh为门限,介于图4所示之间
图4thresh门限值
图5取得二值
得到二值图像,如图所示:
图6二值图像
4。
把二值图像放大观察,可看到离散的黑点对其采用腐蚀膨胀处理,得到处理后的图像,如图所示
图7腐蚀膨胀处理后的二值图像
可见,腐蚀膨胀处理后的图像质量有了很大的改观。
横向、纵向分别的腐蚀膨胀运算比横向、纵向同时的腐蚀膨胀运算好上很多.
5、对腐蚀膨胀后的图像进行Y方向上的区域选定,限定区域后的图像如图所示:
扫描方法:
中间往两边扫。
6、对腐蚀膨胀后的图像进行X方向上的区域选定,限定区域后的图像如图11所示:
扫描方法:
两边往中间扫,纵向扫描后的图像与原图像的对照.
7。
调用i8=(iiXY~=1),使背景为黑色(0),字符为白色
(1),便于后期处理。
8.调用自定义函数(字符获取函数)i9=getchar(i8)。
9、调用自定义的字符获取函数对图像进行字符切割,并把切割的字符装入一维阵列。
10.调用以下代码,可将阵列word中的字符显示出来.
forj=1:
cnum%cnum为统计的字符个数
subplot(5,8,j),imshow(word{j}),title(int2str(j));
%显示字符
end
11.调用以下代码,将字符规格化,便于识别:
forj=1:
cnumword{j}=imresize(word{j},[4040]);
%字符规格化成40×
40
end
12.调用以下代码创建字符集:
code=char(‘由于作者水平有限书中难免存在缺点和疏漏之处恳请读批评指正,。
’);
将创建的字符集保存在一个文件夹里面,以供匹配时候调用。
13.字符匹配采用模板匹配算法:
将现有字符逐个与模板字符相减,认为相减误差最小的现有字符与该模板字符匹配。
图8字符匹配
也就是说,字符A与模板字符T1更相似,我们可以认为字符集中的字符T2就是字符A。
经模板匹配。
14、调用以下代码,将字符放入newtxt.txt文本:
new=[‘newtxt’,‘.txt'
];
c=fopen(new,‘a+’);
fprintf(c,‘%s\n’,Code(1:
cnum));
fclose(c);
4课程设计分析
1、算法具有局限性。
对于左右结构的字符(如:
川)容易造成误识别,“川”字将会被识别成三部分。
当图片中文字有一定倾斜角度时,这将造成识别困难.
2、模板匹配效率低。
对于处理大小为m&
TImes;
m的字符,假设有n个模板字符,则识别一个字符至少需要m&
m×
n×
2次运算,由于汉字有近万个,这将使得运算量十分巨大!
此次字符识别一共花了2.838秒。
3、伸缩范围比较小。
对于受污染的图片,转换成二值图像将使字符与污染源混合在一起。
对于具体的图片,需反复选择合适的thresh进行二值化处理,甚至在处理之前必须进行各种滤波.
5系统实现
文字识别算法仿真代码如下:
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))〈PT)
if(LeftD(j)<
0)
SL=SL+1;
elseif(LeftD(j)>
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)))))
L’;
elseif((SR>
SL)&&
((SR〉=0.5*SV)&&((SL<
=1)||(SL>
Str=’R’;
elseif(max(SL,SR)〉=3)&
&
(min(SL,SR)>
=2)
Str=’C'
Stroke=[StrokeStr];
if((j>
=2+Y1)&&((j<
=Y2—2)))
Stroke=[Stroke'
P'
];
SL=0;
SR=0;
SV=0;
Count=0;
T’;
%=========提取结构===============%
if(Count〉=fix(Range/4)+1)%发生突变后,剩余部分可能无法形成字符结构
if((SL〉=ST)&
&(SR〉=ST))
elseif((SV〉=2*(SL+SR))&&((max(SL,SR)<
3)||(min(SL,SR)〈2)))
Str=’V’;
=0.5*SV)&
&((SR<
=2)||(SL〉=(SR+SV)))))
L’;
SL)&&((SR〉=0.5*SV)&&((SL〈=2)||(SL〉=(SR+SV)))))
(min(SL,SR)〉=2)
Stroke=[StrokeStr];
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)&&
(XR==2))
if((Comp〉=3)||((StrokeBottom
(2)~='
)&
&(StrokeLeft
(2)==’C’)&
&(StrokeRight
(2)=='
C’)))
RStr=’8’;
RStr=’0'
elseif((StrokeLeft(XL)==’L'
&(StrokeLeft(XL—1)=='
(StrokeLeft
(2)~=’C’))
RStr='
2’;
elseif((StrokeLeft
(2)==’C’)&
(XL>
=3)&&
(StrokeLeft(3)==’P'
))
RStr=’9’;
elseif(XL〉2)
forLi=2:
XL
if(StrokeLeft(Li)==’P'
3'
elseif(XL==2)
forRi=2:
XR-1
if(StrokeRight(Ri)==’P'
RStr=’6’;
elseif(StrokeTop(Ti)==’V'
)%Top
if((XR==2)&
&(StrokeRight
(2)==’C'
))%数字3右端只有一个结构
3’;
elseif((XR==2)&
((StrokeLeft
(2)==’P'
)||(StrokeLeft(3)=='
)||(StrokeLeft(XL)=='
V’)))
7’;
elseif(XR>
2)
forRi=2:
XR
if(StrokeRight(Ri)=='
RStr=’5'
I0=imread('
8.jpg'
);
%必须为二值图像
I=im2bw(I0,0。
4);
[y0x0]=size(I);
Range=sum((~I)'
Hy=0;
y0
if(Range(j)>
=1)
Hy=Hy+1;
RangeX=sum((~I));
Wx=0;
fori=1:
x0
if(RangeX(i)〉=1)
Wx=Wx+1;
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);
%左端轮廓检测
y
i=1;
while((i〈=x)&
&(I(j,i)==1))
i=i+1;
if(i〈=x)
Left(j)=i;
y-1
LeftD(j)=Left(j+1)-Left(j);
%==========结构特征提取=============%
j=1;
while((Left(j)<
1)&&
(j〈y))
j=j+1;
Y1=j;
j=y;
while((Left(j)〈1)&
&(j〉1))
j=j—1;
Y2=j-1;
%去掉急剧变化的两端
%==============右边==================%
Right=zeros(1,y);
i=x;
while((i〉=1)&
i=i—1;
if(i〉=1)
Right(j)=i;
RightD(j)=Right(j+1)-Right(j);
%=====================================%
Top=zeros(1,x);
%顶端轮廓检测
x
j=1;
while((j<
=y)&&(I(j,i)==1))
j=j+1;
if(j<
=y)
Top(i)=j;
x-1
TopD(i)=Top(i+1)-Top(i);
%==============================%
i=1;
while((Top(i)〈1)&&(i<
x))
i=i+1;
X1=i;
i=x;
while((Top(i)〈1)&
&(i〉1))
X2=i—1;
%===================================%
Bottom=zeros(1,x);
%底部轮廓检测
fori=1:
j=y;
while((j>
=1)&
(I(j,i)==1))
j=j—1;
if(j>
Bottom(i)=j;
BottomD(i)=Bottom(i+1)—Bottom(i);
%==========数字1的宽度特征=========%
Width=zeros(1,y);
Width(j)=Right(j)—Left(j);
W=m
6系统测试与分析
6。
1文字识别算法仿真结果
识别原图如图9(a)所示,仿真结果如图9(b)所示。
图9(a)识别原图
图9(b)仿真结果
2基于字符及单词的识别
6.2.1基于字符的识别
Strokelets:
ALearnedMulti-scaleRepresentationforSceneTextRecognition(CVPR2014)通过聚类图像块来学习中层笔画特征,然后使用霍夫(HOG)投票算法检测字符。
在笔画特征和HOG特征的基础上,使用随机森林分类器来进行字符分类。
End—to—endscenetextrecognition(2011)借鉴计算机视觉通用的目标检测方法,提出了一个新的文本识别系统。
他们利用字符置信度以及字符之间的空间约束关系,给出最可能的检测和识别结果。
但是该算法只能用于水平方向排列的文本的检测识别。
End-to—EndTextRecognitionwithHybridHMMMaxoutModels(2013)和PhotoOCR:
ReadingTextinUncontrolledConditions(2013)等人通过无监督的二分类技术或有监督的分类器,将单词图像分割为潜在的字符区域。
End-to—EndTextRecognitionwithHybridHMMMaxoutModels(2013)使用一种复杂的,包含分割、矫正以及字符识别的CNN网络,结合使用固定词典的隐马尔科夫模型(HMM),生成最终的识别结果。
PhotoOCR系统使用基于HOG特征的神经网络分类器,对分割得到的候选结果进行打分,使用结合N元语言模型(N-gram)的Beam搜索算法,得到候选字符集合.最后,再进一步使用语言模型和形状模型对候选字符组合进行重新排序.
DeepFeaturesforTextSpotting(2014)结合了文本一非文本分类器、字符分类器、二元语言模型分类器,对整张图进行稠密的基于滑动窗口的扫描。
最后结合固定词典,对图片中的单词进行分析。
基于字符的识别技术依赖于使用字符分类器对图像进行逐字符识别,最终将识别得到的字符进行集成,得到图像中的整个单词。
6.2。
2基于单词的识别
SceneTextRecognitionusingHigherOrderLanguagePriors以及Large-LexiconAttribute—ConsistentTextRecognitioninNaturalImages的工作依旧依赖于显式的字符分类器,但是通过构建一个图结构来推导整个单词。
这会遇到和基于字符识别方法类似的困难。
WholeisGreaterthanSumofParts:
RecognizingSceneTextWords(2013)使用整张文字图片来识别单词:
他们使用基于梯度的特征图与预先制作好的单词图像进行对比,利用动态k近邻来判断当前图片所包含的单词.该方法依赖于一个固定词典以及预先生成的单词图片。
Labelembeddingfortextrecognition(2013)使用集成的Fisher向量以及结构化的支持向量机框架来建立图片和整个单词编码的关系。
WordSpottingandRecognitionwithEmbeddedAttributes(2014)进一步探索了单词编码的概念,他们为图片和单词字符串创建了一个编码空间.这其实是Supervisedmid—levelfeaturesforwordimagerepresentation(2014)方法的扩展:
显式利用字符级别的训练数据来学习中间特征。
Multi-digitNumberRecognitionfromStreetViewImageryusingDeepConvolutionalNeuralNetworks(2013)等人使用深度CNN对整张图片进行编码,并使用多个位置敏感的字符级分类器来进行文字识别。
他们在街景门牌号识别任务中取得了极大的成功。
他们还将该模型应用到长达8位的验证码识别任务上,并使用了合成的训练数据对模型进行训练。
该方法在goggle街景门牌号识别任务中获得了96%以上的识别率。
同时还在对goggle验证码识别任务中获得了99%以上的识别率。
SyntheticDataandArtificialNeuralNetworksforNaturalSceneTextRecognition(2014)和ReadingTextintheWildwithConvolutionalNeuralNetworks(2014)对上述模型做了细微变动:
取消了预测字符长度的分类器,并引入了结束符表示文字结尾。
他们随后证明了,使用合成的训练数据训练出的模型,能够成功应用到现实世界的识别问题中。
将单词编码为向量是一种可行的词典单词识别方法,但是在无约束情况下,字符之间可以任意组合。
当字符数量足够多时,基于固定长度向量编码的方法性能会显著下降。
但是依然存在一些不足:
一些研究将深度学习技术用于单个字符的识别
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于matlab的文字识别算法 课程设计 基于 matlab 文字 识别 算法