基于MATLAB的图片中字符的提取源代码.docx

上传人:b****1 文档编号:236039 上传时间:2022-10-07 格式:DOCX 页数:5 大小:183.06KB
下载 相关 举报
基于MATLAB的图片中字符的提取源代码.docx_第1页
第1页 / 共5页
基于MATLAB的图片中字符的提取源代码.docx_第2页
第2页 / 共5页
基于MATLAB的图片中字符的提取源代码.docx_第3页
第3页 / 共5页
基于MATLAB的图片中字符的提取源代码.docx_第4页
第4页 / 共5页
基于MATLAB的图片中字符的提取源代码.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于MATLAB的图片中字符的提取源代码.docx

《基于MATLAB的图片中字符的提取源代码.docx》由会员分享,可在线阅读,更多相关《基于MATLAB的图片中字符的提取源代码.docx(5页珍藏版)》请在冰豆网上搜索。

基于MATLAB的图片中字符的提取源代码.docx

基于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)

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

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1