基于MATLAB的图片中文字的提取及识别.docx

上传人:b****4 文档编号:6202504 上传时间:2023-05-09 格式:DOCX 页数:21 大小:2.18MB
下载 相关 举报
基于MATLAB的图片中文字的提取及识别.docx_第1页
第1页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第2页
第2页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第3页
第3页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第4页
第4页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第5页
第5页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第6页
第6页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第7页
第7页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第8页
第8页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第9页
第9页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第10页
第10页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第11页
第11页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第12页
第12页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第13页
第13页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第14页
第14页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第15页
第15页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第16页
第16页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第17页
第17页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第18页
第18页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第19页
第19页 / 共21页
基于MATLAB的图片中文字的提取及识别.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于MATLAB的图片中文字的提取及识别.docx

《基于MATLAB的图片中文字的提取及识别.docx》由会员分享,可在线阅读,更多相关《基于MATLAB的图片中文字的提取及识别.docx(21页珍藏版)》请在冰点文库上搜索。

基于MATLAB的图片中文字的提取及识别.docx

基于MATLAB的图片中文字的提取及识别

基于MATLAB的图片中文字的提取及识别

邹浩,余龙,邹勇博,刘宇童,和振乔,李少梅

(西安电子科技大学电子工程学院,西安,710126)

摘要

 随着现代社会的发展,信息的形式和数量正在迅猛增长。

其中很大一部分是图像,图像可以把事物生动地呈现在我们面前,让我们更直观地接受信息。

同时,计算机已经作为一种人们普遍使用的工具为人们的生产生活服务。

从图像中提取文字属于信息智能化处理的前沿课题,是当前人工智能与模式识别领域中的研究热点。

由于文字具有高级语义特征,对图片内容的理解、索引、检索具有重要作用,因此,研究图片文字提取具有重要的实际意义。

又由于静态图像文字提取是动态图像文字提取的基础,故着重介绍了静态图像文字提取技术。

关键词:

MATLAB 图像处理 文字提取文字识别

Text Extraction andRecognitioninImages Based onMATLAB

ZOUHao,YUlong,ZOUYongbo,LIUYutong, HEZhenqiao,LIShaomei

(XidianUniversity ElectronicEngineering College,Xi'an,710126)

Abstract

Withthedevelopmentof society,the formandquantityofimformationareincreasingquickly.Alargepartofthemareimages,whichcanmake thingsvividlypresentedinfrontofus,letus moreintuitive toacceptinformation.At thesametime,thecomputer hasbeenasawidelyusedtoolforpeople'sproduction andlivingservices.Extractingtext fromimage belongsto thefrontierofintelligentinformationprocessing, and it isthe currenthotresearchtopicinthefieldofartificialintelligence andpattern recognition.Asthetext withhigh-levelsemanticfeatureandplaysanimportant roleonunderstanding,indexingand retrievalimage content.Therefore,the studyonextractingtextsfromimages haveimportantactualmeanings. And becauseextractingtextsfromstillimagesis thebasisfor extractingtextsfrom dynamicimages, the articleemphatically introducesthetechnologyof extractingtexts fromstillimages.

KeyWords:

 MATLAB imageprocessingword extraction  wordrecognition

 

一.引言

随着计算机科学的飞速发展,以图像为主的多媒体信息迅速成为重要的信息传递媒介,在图像中,文字信息(如新闻标题等字幕)包含了丰富的高层语义信息,提取出这些文字,对于图像高层语义的理解、索引和检索非常有帮助。

图像文字提取又分为动态图像文字提取和静态图像文字提取两种,其中,静态图像文字提取是动态图像文字提取的基础,其应用范围更为广泛,对它的研究具有基础性,所以本文主要讨论静态图像的文字提取技术。

静态图像中的文字可分成两大类:

一种是图像中场景本身包含的文字,称为场景文字;另一种是图像后期制作中加入的文字,称为人工文字,如右图所示。

场景文字由于其出现的位置、小、颜色和形态的随机性, 一般难于检测和提取;而人工文字则字体较规范、大小有一定的限度且易辨认,颜色为单色,相对与前者更易被检测和提取,又因其对图像内容起到说明总结的作用,故适合用来做图像的索引和检索关键字。

对图像中场景文字的研究难度大,目前这方面的研究成果与文献也不是很丰富,本文主要讨论图像中人工文字提取技术。

二.静态图像中文字的特点

静态图像中文字(本文特指人工文字,下同)具有以下主要特征:

(1)文字位于前端,且不会被遮挡;

(2)文字一般是单色的;

(3)文字大小在一幅图片中固定,并且宽度和高度大体相同,从满足人眼视觉感受的角度来说,图像中文字的尺寸既不会过大也不会过小;

(4)文字的分布比较集中;

(5)文字的排列一般为水平方向或垂直方向;

(6)多行文字之间,以及单行内各个字之间存在不同于文字区域的空隙。

在静态图片文字的检测与提取过程中,一般情况下都是依据上述特征进行处理的。

三.文字提取、识别的一般流程

   静态图像文字提取一般分为以下步骤:

文字区域检测与定位、文字分割与文字提取、文字后处理。

其流程如图1所示。

(图1)

四.文字提取、识别的详细步骤

1. 在Matlab中调用i1=imread('字符.jpg'),可得到原始图像,如图2所示:

(图2)

2.调用i2=rgb2gray(i1),则得到了灰度图像,如图3所示:

(图3)

 调用a=size(i1);b=size(i2);可得到:

a=3,b=2即三维图像变成了二维灰度图像

3.调用i3=(i2>=thresh);其中thresh为门限,在[0,255]之间

这里,i2_max=double(max(max(i2))); %获取亮度最大值 

    i2_min=double(min(min(i2)));%获取亮度最小值

 thresh=round(i2_max-((i2_max-i2_min)/3));

 得到二值图像,如图4所示:

(图4)

4. 把二值图像放大观察,可看到离散的黑点

 对其采用腐蚀膨胀处理,得到处理后的图像,如图5所示

(图5)

   可见,腐蚀膨胀处理后的图像质量有了很大的改观。

横向、纵向分别的腐蚀膨胀运算比横向、纵向同时的腐蚀膨胀运算好上很多,图6可看出差别:

(图6)

5. 对腐蚀膨胀后的图像进行Y方向上的区域选定,限定区域后的图像如图7所示:

  扫描方法:

中间往两边扫

(图7)

 纵向扫描后的图像与原图像的对照,如图8所示:

(图8)

6.对腐蚀膨胀后的图像进行X方向上的区域选定,限定区域后的图像如图9所示:

扫描方法:

两边往中间扫

(图9)

纵向扫描后的图像与原图像的对照,如图10所示:

(图10)

7.调用i8=(iiXY~=1),使背景为黑色(0),字符为白色

(1),便于后期处理。

 背景交换后的图像如图11所示:

(图11)

8.调用自定义函数(字符获取函数)i9=getchar(i8),得到图像如图12所示:

(图9)

9.调用自定义的字符获取函数对图像进行字符切割,并把切割的字符装入一维阵列,切割  过程如图12所示:

(图12)

10.调用以下代码,可将阵列word中的字符显示出来,如图13所示:

forj=1:

cnum%cnum为统计的字符个数

   subplot(5,8,j),imshow(word{j}),title(int2str(j)); %显示字符

 end

(图13)

 可以看到,字符宽度不一致

11.调用以下代码,将字符规格化,便于识别:

  forj=1:

cnum

 word{j}=imresize(word{j},[4040]); %字符规格化成40×40的

 end

得到规格化之后的字符如图14所示:

(图14)

12.调用以下代码创建字符集:

code=char('由于作者水平有限书中难免存在缺点和疏漏之处恳请读批评指正,。

');

将创建的字符集保存在一个文件夹里面,以供匹配时候调用,如图15所示:

(图15)

13.字符匹配采用模板匹配算法:

将现有字符逐个与模板字符相减,认为相减误差最小的现 有字符与该模板字符匹配。

假设:

字符

,模板字符

,模板字符

  也就是说,字符A与模板字符

更相似,我们可以认为字符集中的字符

就是字符A。

 经模板匹配,可得字符信息如下:

   由于读者书评有限书中难免存在缺点和纰漏之处,恳请读者批评指正。

 效果如图16所示:

(图16)

14.调用以下代码,将字符放入newtxt.txt文本:

 new=['newtxt','.txt'];

 c=fopen(new,'a+');

fprintf(c,'%s\n',Code(1:

cnum));

 fclose(c);

newtxt.txt文本内容如图17所示:

(图17)

五.反思与体会

1.算法具有局限性。

对于左右结构的字符(如:

川)容易造成误识别,“川”字将会被识别成三部分。

当图片中文字有一定倾斜角度时,这将造成识别困难。

2.模板匹配效率低。

对于处理大小为m×m的字符,假设有n个模板字符,则识别一个字符至 少需要m×m×n×2次运算,由于汉字有近万个,这将使得运算量十分巨大!

此次字符识 别一共花了2.838秒。

3.伸缩范围比较小。

对于受污染的图片,转换成二值图像将使字符与污染源混合在一起。

对于具体的图片,需反复选择合适的thresh进行二值化处理,甚至在处理之前必须进行 各种滤波。

4.通过这次数字图象处理的学习和报告的撰写,我们小组发挥了团结友爱的协作精神,大 量的资料查阅丰富了我们的视野,同时使我们对这么课更加感兴趣。

参考文献

[1]樊昀,王润生.从图像中提取文字[J].国防科技大学学报,2002,24

(1) :

59-62.

[2]王健,王晨.基于静态图片的文本提取技术的研究[J] .延边大学学报(自然科学版),2007,33

(2):

124-128.

[3]夏莹,马少平,孙茂松等.计算机语言学方法在中文文字识别后处理中的应用[J].中文信息,1996, (2) :

50-51.

[4] 郑阿奇,曹戈,赵阳.MATLAB实用教程[M].北京:

电子工业出版社

[5] 程卫国,冯峰,姚东,徐听.MATLAB5.3应用指南[M].北京:

人民邮电出版社

[6]陈杨.MATLAB6.X图像编程与图像处理[M].西安:

西安电子科技大学出版社

[7] 阮秋琦.数字图像处理[M].电子工业出版社,2001年.

[8] 徐建华.图像处理与分析[M].科学出版社,1999年.

附录

主程序源代码:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%数字图象处理大作业%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%————————图片中文字的提取及识别————————%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

tic

I=imread('字符.jpg');  %打开图片

%figure

(1);imshow(I);title('原始图像','color','b');

I=rgb2gray(I); %RGB图片转化成灰度图像

%figure

(2);imshow(I);title('灰度图像','color','b');

 

i_max=double(max(max(I)));%获取亮度最大值

i_min=double(min(min(I)));%获取亮度最小值

thresh=round(i_max-((i_max-i_min)/3));%计算灰度图像转化成二值图像的门限thresh

I=(I>=thresh);%I为二值图像

%figure(3);imshow(I);title('二值图像','color','b');

 

seY=[1;1;1]; %构造结构元素

I=imdilate(I,seY); %腐蚀图像

I=imerode(I,seY); %膨胀图像

seX=[111];

I=imdilate(I,seX);

I=imerode(I,seX);

%figure(4);imshow(I);title('腐蚀膨胀后的图像','color','b');

ii=double(I);

[m,n]=size(ii); %获取图像大小信息

%确定文字区域

%纵向扫描

countY=zeros(m,1);

fori=1:

m

  forj=1:

n

   if ii(i,j)==0

   countY(i,1)=countY(i,1)+1;

 end

 end

end

[maxY indexY]=max(countY);

tempY1=indexY;

while(countY(tempY1,1)>3)&& (tempY1>1)

  tempY1=tempY1-1;

end

tempY2=indexY;

while(countY(tempY2,1)>3) &&(tempY2

tempY2=tempY2+1;

end

tempY1=tempY1-1;

tempY2=tempY2+1;

iiY=I(tempY1:

tempY2,:

);%确定了Y方向上的文字区域

%figure(5);imshow(iiY);title('Y方向区域大致确定后的图像','color','b');

 

%横向扫描

countX=zeros(1,n);

forj=1:

n

fori=tempY1:

tempY2

ifii(i,j)==0

 countX(1,j)=countX(1,j)+1;

   end

  end

end

tempX1=1;

while(countX(1,tempX1)<3)&&(tempX1<n)

tempX1=tempX1+1;

end

tempX2=n;

while (countX(1,tempX2)<3)&& (tempX2>1)

 tempX2=tempX2-1;

end

tempX1=tempX1-1;

tempX2=tempX2+1;

iiXY=iiY(:

tempX1:

tempX2); %确定了整体的文字区域

%figure(6);imshow(iiXY);title('X、Y方向区域都大致确定后的图像','color','b');

 

ii=(iiXY~=1);%黑色背景,白色字体

%figure(7);imshow(ii);title('背景和文字交换颜色的图像','color','b');

ii=bwareaopen(ii,200);%删除面积小于200的杂质图像

%figure(8);imshow(ii);title('删除杂质干扰的图像','color','b');

myI=charslice(ii);%限定文字区域

%figure(9);imshow(ii);title('限定文字区域的图像','color','b');

y1=10;y2=0.25;flag=0;

maxnum=40;k=1; %maxnum为字符个数限定值,k用于统计实际字符个数

word=cell(1,maxnum);%建立单元阵列,用于储存字符

figure(10)

whilesize(myI,2)>10 %当myI的长度小等于10,可确定没有字符了

[word{k},myI]=getword(myI); %获取字符

k=k+1;

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ifk==2

    subplot(5,1,1);imshow(myI);title('第一次切割后的图像','color','b');

  end

 ifk==3

   subplot(5,1,2);imshow(myI);title('第二次切割后的图像','color','b');

 end

ifk==5

 subplot(5,1,3);imshow(myI);title('第四次切割后的图像','color','b');

 end

if k==16

  subplot(5,1,4);imshow(myI);title('第十五次切割后的图像','color','b');

end

end

subplot(5,1,5);imshow(myI);title('最后一次切割后的图像','color','b');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

cnum=k-1;%实际字符总个数

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

figure(11);

forj=1:

cnum

subplot(5,8,j),imshow(word{j}),title(int2str(j)); %显示字符

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 

for j=1:

cnum

 word{j}=imresize(word{j},[4040]);%字符规格化成40×40的

end

figure(12);

forj=1:

cnum

subplot(5,8,j),imshow(word{j}),title(int2str(j));%显示字符

end

 

forj=1:

cnum

imwrite(word{j},[int2str(j),'.jpg']);%保存字符

end

 

defx=40;defy=40;

code=char('由于作者水平有限书中难免存在缺点和疏漏之处恳请读批评指正,。

');%创建字符集

codenum=size(code,2); %获取字符集中字符个数

fori=1:

cnum

  ch=int2str(i);%数字转化为字符

 tempbw=imread([ch'.jpg']);  %打开预匹配字符

fork=1:

codenum

   fname=strcat('C:

\Users\Administrator\Desktop\数字图像处理大作业\字符匹配库\',code(k),'.jpg'); %字符匹配库中的字符

   sample=imread(fname);

subsam=abs(tempbw-sample);%作比较

 count=sum(sum(subsam)); %匹配误差统计

   err(k)=count;

 end

erro=err(1:

codenum);

  minerror=min(erro); %找出误差最小的模板字符

 findc=find(erro==minerror); %获取模板字符序号

 Code(i)=code(findc); %将字符装入Code

end

 

figure(13);

imshow(ii);

tt=title(['文字信息:

 ', Code(1:

cnum)],'Color','b'); %显示字符信息

set(tt,'fontsize',24); %设置字体

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%将图片文字写入newtxt文本

new=['newtxt','.txt'];

c=fopen(new,'a+'); 

fprintf(c,'%s\n',Code(1:

cnum));

fclose(c);

t=toc

charslice(字符分割)函数源代码:

%字符分割

functiony=charslice(ii)

[m,n]=size(ii);

top=1;bottom=m;left=1;right=n;

while sum(ii(top,:

))==0&&top<m

top=top+1;

end

whilesum(ii(bottom,:

))==0&&bottom>=1

  bottom=bottom-1;

end

whilesum(ii(:

left))==0&&left<n

left=left+1;

end

whilesum(ii(:

right))==0&& right>=1

 right=right-1;

end

ydiff=bottom-top;

xdiff=right-left;

y=imcrop(ii,[left top xdiffydiff]);

getword(字符获取)函数源代码:

%字符获取

function[word,result]=getword(ii)

word=[];flag=0;y1=8;y2=0.5;

whileflag==0

[m,n]=size(ii);

 wide=0;

 whilesum(ii(:

wide+1))~=0 &&wide<=n-2

  wide=wide+1;

  end

 temp=charslice(imcrop(ii,[11widem]));

 [m1,n1]=size(temp);

ifwide<y1 &&n1/m1>y2

   ii(:

1:

wide)=0;

    ifsum(sum(ii))~=0

 ii=charslice(ii);%切割出最小范围

 elseword=[];flag=1;

end

 else

    word=charslice(imcrop(ii,[1 1widem]));

   ii(:

1:

wide)=0;

   if sum(sum(ii))~=0;

   ii=charslice(ii);

    flag=1;

  elseii=[];

  end

 end

end

result=ii;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2