基于MATLAB的图片中文字的提取与识别要点
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于MATLAB的图片中文字的提取及识别
邹浩,余龙,邹勇博,宇童,和振乔,少梅
(电子科技大学电子工程学院,,710126)
摘要
随着现代社会的发展,信息的形式和数量正在迅猛增长。
其中很大一部分是图像,图像可以把事物生动地呈现在我们面前,让我们更直观地接受信息。
同时,计算机已经作为一种人们普遍使用的工具为人们的生产生活服务。
从图像中提取文字属于信息智能化处理的前沿课题,是当前人工智能与模式识别领域中的研究热点。
由于文字具有高级语义特征,对图片容的理解、索引、检索具有重要作用,因此,研究图片文字提取具有重要的实际意义。
又由于静态图像文字提取是动态图像文字提取的基础,故着重介绍了静态图像文字提取技术。
关键词:MATLAB 图像处理文字提取文字识别
Text Extraction and Recognition in Images Based on MATLAB
ZOU Hao, YU long, ZOU Yongbo, LIU Yutong, HE Zhenqiao, LI Shaomei
(Xidian University Electronic Engineering College,Xi'an,710126)
Abstract
With the development of society,the form and quantity of imformation are increasing quickly.A large part of them are images,which can make things vividly presented in front of us,let us more intuitive to accept information.At the same time, the computer has been as a widely used tool for people's production and living services.Extracting text from image belongs to the frontier of intelligent information processing, and it is the current hot research topic in the field of artificial intelligence and pattern recognition.As the text with high-level semantic feature and plays an important role on understanding,indexing and retrieval image content.Therefore,the study on extracting texts from images have important actual meanings. And because extracting texts from still images is the basis for extracting texts from dynamic images, the article emphatically introduces the technology of extracting texts from still images.
Key Words: MATLAB image processing word extraction word recognition
一.引言
随着计算机科学的飞速发展,以图像为
主的多媒体信息迅速成为重要的信息传递
媒介,在图像中,文字信息(如新闻标题等
字幕) 包含了丰富的高层语义信息,提取出这些文字,对于图像高层语义的理解、索引和检索非常有帮助。
图像文字提取又分为动态图像文字提取和静态图像文字提取两种,其中,静态图像文字提取是动态图像文字提取的基础,其应用围更为广泛,对它的研究具有基础性,所以本文主要讨论静态图像的文字提取技术。
静态图像中的文字可分成两大类: 一种是图像中场景本身包含的文字, 称为场景文字;另一种是图像后期制作中加入的文字, 称为人工文字,如右图所示。
场景文字由于其出现的位置、小、颜色和形态的随机性, 一般难于检测和提取;而人工文字则字体较规、大小有一定的限度且易辨认,颜色为单色, 相对与前者更易被检测和提取,又因其对图像容起到说明总结的作用,故适合用来做图像的索引和检索关键字。
对图像中场景文字的研究难度大,目前这方面的研究成果与文献也不是很丰富,本文主要讨论图像中人工文字提取技术。
二.静态图像中文字的特点
静态图像中文字(本文特指人工文字,下同)具有以下主要特征:
(1)文字位于前端,且不会被遮挡;
(2)文字一般是单色的;
(3)文字大小在一幅图片中固定,并且宽度和高度大体相同,从满足人眼视觉感受的角度来说,图像中文字的尺寸既不会过大也不会过小;
(4)文字的分布比较集中;
(5)文字的排列一般为水平方向或垂直方向;
(6)多行文字之间,以及单行各个字之间存在不同于文字区域的空隙。
在静态图片文字的检测与提取过程中, 一般情况下都是依据上述特征进行处理的。
三.文字提取、识别的一般流程
静态图像文字提取一般分为以下步骤:文字区域检测与定位、文字分割与文字提取、文字后处理。
其流程如图1所示。
(图1)
四.文字提取、识别的详细步骤
1. 在Matlab中调用i1=imread('字符.jpg'),可得到原始图像,如图2所示:
(图2)
2. 调用i2=rgb2gray(i1),则得到了灰度图像,如图3所示:
(图3)
⎩⎨⎧≥<=thresh i thresh i i 2,12,03
调用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所示:
for j=1:cnum %cnum为统计的字符个数
subplot(5,8,j),imshow(word{j}),title(int2str(j)); %显示字符
end
(图13)
可以看到,字符宽度不一致
11.调用以下代码,将字符规格化,便于识别:
for j=1:cnum
word{j}=imresize(word{j},[40 40]); %字符规格化成40×40的end
得到规格化之后的字符如图14所示:
(图14)
12.调用以下代码创建字符集:
code=char('由于作者水平有限书中难免存在缺点和疏漏之处恳请读批评指正,。
'); 将创建的字符集保存在一个文件夹里面,以供匹配时候调用,如图15所示:
(图15)
13.字符匹配采用模板匹配算法:将现有字符逐个与模板字符相减,认为相减误差最小的现 有字符与该模板字符匹配。
假设:字符⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=100100100100
1001A ,模板字符⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=00000000111111111T ,模板字符⎪⎪⎪⎪⎪⎭
⎫ ⎝⎛=10010110011010012T
2
)))(((,8)))(((21=-=-T T A abs sum sum A abs sum sum
也就是说,字符A与模板字符T1更相似,我们可以认为字符集中的字符T2就是字符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] .MATLAB 6.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=[1 1 1];
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);
for i=1:m
for j=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<m) tempY2=tempY2+1;
tempY1=tempY1-1;
tempY2=tempY2+1;
iiY=I(tempY1:tempY2,:); %确定了Y方向上的文字区域
%figure(5);imshow(iiY);title('Y方向区域大致确定后的图像','color','b');
%横向扫描
countX=zeros(1,n);
for j=1:n
for i=tempY1:tempY2
if ii(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;
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)
while size(myI,2)>10 %当myI的长度小等于10,可确定没有字符了[word{k},myI]=getword(myI); %获取字符
k=k+1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%
if k==2
subplot(5,1,1);imshow(myI);title('第一次切割后的图像','color','b');
end
if k==3
subplot(5,1,2);imshow(myI);title('第二次切割后的图像','color','b');
end
if k==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);
for j=1:cnum
subplot(5,8,j),imshow(word{j}),title(int2str(j)); %显示字符
end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%
for j=1:cnum
word{j}=imresize(word{j},[40 40]); %字符规格化成40×40的
end
figure(12);
for j=1:cnum
subplot(5,8,j),imshow(word{j}),title(int2str(j)); %显示字符
end
for j=1:cnum
imwrite(word{j},[int2str(j),'.jpg']); %保存字符
end
defx=40;defy=40;
code=char('由于作者水平有限书中难免存在缺点和疏漏之处恳请读批评指正,。
');%创建字符集
codenum=size(code,2); %获取字符集中字符个数
for i=1:cnum
ch=int2str(i); %数字转化为字符
tempbw=imread([ch '.jpg']); %打开预匹配字符
for k=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(字符分割)函数源代码:
%字符分割
function y=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
while sum(ii(bottom,:))==0 && bottom>=1
bottom=bottom-1;
end
while sum(ii(:,left))==0 && left<n
left=left+1;
end
while sum(ii(:,right))==0 && right>=1
right=right-1;
end
ydiff=bottom-top;
xdiff=right-left;
y=imcrop(ii,[left top xdiff ydiff]);
getword(字符获取)函数源代码:
%字符获取
function [word,result]=getword(ii)
word=[];flag=0;y1=8;y2=0.5;
while flag==0
[m,n]=size(ii);
wide=0;
while sum(ii(:,wide+1))~=0 && wide<=n-2 wide=wide+1;
end
temp=charslice(imcrop(ii,[1 1 wide m]));
[m1,n1]=size(temp);
if wide<y1 && n1/m1>y2
ii(:,1:wide)=0;
if sum(sum(ii))~=0
ii=charslice(ii); % 切割出最小围
else word=[];flag=1;
end
else
word=charslice(imcrop(ii,[1 1 wide m]));
ii(:,1:wide)=0;
if sum(sum(ii))~=0;
ii=charslice(ii);
flag=1;
else ii=[];
end
end
end
result=ii;。