基于MATLAB的图片中字符的提取源代码.docx
《基于MATLAB的图片中字符的提取源代码.docx》由会员分享,可在线阅读,更多相关《基于MATLAB的图片中字符的提取源代码.docx(5页珍藏版)》请在冰豆网上搜索。
基于MATLAB的图片中字符的提取(源代码)
functiongetPicChar%%建立字符提取函数,在MATLAB平台上直接运行即可
%运用MATLAB的UI,直接打牌需要提取的字符图片即可
[filename,pathname,~]=uigetfile({'*.jpg';'*.bmp';'*.png'},'Choseapicture');
picstr=[pathnamefilename];
if~ischar(picstr)
return;
end
pic=imread(picstr);%打开图片
iflength(size(pic))==3%判断图片的维数,统一为灰度图片
pic=rgb2gray(pic);
end
pic=(pic<127);%转化为二值图片
pic=xylimit(pic);%图片区域的第一次边界限定
%%%%%%%第一阶段%%%%%%
m=size(pic,1);
Ycount=zeros(1,m);
fori=1:
m
Ycount(i)=sum(pic(i,:
));
end
lenYcount=length(Ycount);
Yflag=zeros(1,lenYcount);
fork=1:
lenYcount-2
ifYcount(k)<3&&Ycount(k+1)<3&&Ycount(k+2)<3
Yflag(k)=1;
end
end
fork=lenYcount:
1+2
ifYcount(k)<3&&Ycount(k-1)<3&&Ycount(k-2)<3
Yflag(k)=1;
end
end
Yflag2=[0Yflag(1:
end-1)];
Yflag3=abs(Yflag-Yflag2);%做差分运算
[~,row]=find(Yflag3==1);%找突变位置
row=[1rowm];%调整突变位置点
row1=zeros(1,length(row)/2);%截取图像的起始位置向量
row2=row1;%截取图像的终止位置向量
fork=1:
length(row)
ifmod(k,2)==1;%奇数为起始
row1((k+1)/2)=row(k);
else%偶数为终止
row2(k/2)=row(k);
end
end
pic2=pic(row1
(1):
row2
(1),:
);%截取第一列字符
alpha=1024/size(pic2,2);%计算放缩比例
pic2=imresize(pic2,alpha);%调整第一列字符图片大小,作为基准
fork=2:
length(row)/2
pictemp=imresize(pic(row1(k):
row2(k),:
),[size(pic2,1)size(pic2,2)]);
pic2=cat(2,pic2,pictemp);%横向连接图像块
end
pic=xylimit(pic2);%限定图像区域
%%%%%%%第二阶段%%%%%%
[~,n]=size(pic);
Xcount=zeros(1,n);
forj=1:
n
Xcount(j)=sum(pic(:
j));
end
lenXcount=length(Xcount);
Xflag=zeros(1,lenXcount);
fork=1:
lenXcount-2
ifXcount(k)<3&&Xcount(k+1)<3&&Xcount(k+2)<3
Xflag(k)=1;
end
end
fork=lenXcount:
1+2
ifXcount(k)<3&&Xcount(k-1)<3&&Xcount(k-2)<3
Xflag(k)=1;
end
end
Xflag2=[0Xflag(1:
end-1)];
Xflag3=abs(Xflag-Xflag2);
[~,col]=find(Xflag3==1);
col=[1colsize(pic,2)];
coltemp=col(2:
end)-col(1:
end-1);
[~,ind]=find(coltemp<3);
col(ind)=0;
col(ind+1)=0;
col=col(col>0);
col1=zeros(1,length(col)/2);
col2=col1;
fork=1:
length(col)
ifmod(k,2)==1
col1((k+1)/2)=col(k);
else
col2(k/2)=col(k);
end
end
picnum2=length(col)/2;
piccell2=cell(1,picnum2);
fork=1:
picnum2
piccell2{k}=pic(:
col1(k):
col2(k));
piccell2{k}=xylimit(piccell2{k});
piccell2{k}=imresize(piccell2{k},[128128]);
end
%显示提取出的字符,每行最多输出8个字符
ifmod(picnum2,8)
rownum=ceil(picnum2/8)+1;
else
rownum=picnum2/8;
end
fork=1:
picnum2
subplot(rownum,8,k);
imshow(piccell2{k});
end
%%函数xylimit如下:
functionnewpic=xylimit(pic)
%functionname:
XYLIMIT
%Inputpic:
binaryimage
%Outputnewpic:
binaryimage
%用途:
对二值图像边界进行限定,要求图像是黑底白图
%example:
%%pic=imread('数字字符.jpg');
%%pic=rgb2gray(pic);
%%pic=(pic<127);
%%pic=xylimit(pic);
%%imshow(pic);
[m,n]=size(pic);
%%%%纵向扫描%%%
Ycount=zeros(1,m);
fori=1:
m
Ycount(i)=sum(pic(i,:
));%获取每一行的像素点个数
end
Ybottom=m;%底部定界
Yvalue=Ycount(Ybottom);
while(Yvalue<3)
Ybottom=Ybottom-1;
Yvalue=Ycount(Ybottom);
end
Yceil=1;%顶部定界
Yvalue=Ycount(Yceil);
while(Yvalue<3)
Yceil=Yceil+1;
Yvalue=Ycount(Yceil);
end
%%%横向扫描%%%
Xcount=zeros(1,n);
forj=1:
n
Xcount(j)=sum(pic(:
j));%获取每一列的像素点个数
end
Xleft=1;%左侧定界
Xvalue=Xcount(Xleft);
while(Xvalue<2)
Xleft=Xleft+1;
Xvalue=Xcount(Xleft);
end
Xright=n;%右侧定界
Xvalue=Xcount(Xright);
while(Xvalue<2)
Xright=Xright-1;
Xvalue=Xcount(Xright);
end
%%%截取图片%%%
newpic=pic(Yceil:
Ybottom,Xleft:
Xright);
(输入的样品图片1)
(输出结果1)
(输入的样品图片2)
(输出结果2)
(输入的样品图片3)
(输出结果3)