基于MATLAB的图片中字符的提取(源代码)

2020-05-06 11:04

基于MATLAB的图片中字符的提取(源代码)

function getPicChar %%建立字符提取函数,在MATLAB平台上直接运行即可

%运用MATLAB的UI,直接打牌需要提取的字符图片即可 [filename,

pathname,~]=uigetfile({'*.jpg';'*.bmp';'*.png'},'Chose a picture');

picstr=[pathname filename]; if ~ischar(picstr) return; end

pic=imread(picstr); %打开图片

if length(size(pic))==3 %判断图片的维数,统一为灰度图片

pic=rgb2gray(pic); end

pic=(pic<127); %转化为二值图片

pic=xylimit(pic); %图片区域的第一次边界限定

%%%%%%%第一阶段%%%%%% m=size(pic,1);

Ycount=zeros(1,m); for i=1:m

Ycount(i)=sum(pic(i,:)); end

lenYcount=length(Ycount); Yflag=zeros(1,lenYcount); for k=1:lenYcount-2

if Ycount(k)<3 && Ycount(k+1)<3 && Ycount(k+2)<3 Yflag(k)=1; end end

for k=lenYcount:1+2

if Ycount(k)<3 && Ycount(k-1)<3 &&

Ycount(k-2)<3 Yflag(k)=1; end end

Yflag2=[0 Yflag(1:end-1)];

Yflag3=abs(Yflag-Yflag2); %做差分运算 [~,row]=find(Yflag3==1); %找突变位置 row=[1 row m]; %调整突变位置点 row1=zeros(1,length(row)/2); %截取图像的起始位置向量

row2=row1; %截取图像的终止位置向量

for k=1:length(row)

if mod(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); %调整第一列字符图片大小,作为基准 for k=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); for j=1:n

Xcount(j)=sum(pic(:,j));

end

lenXcount=length(Xcount); Xflag=zeros(1,lenXcount); for k=1:lenXcount-2

if Xcount(k)<3 && Xcount(k+1)<3 && Xcount(k+2)<3 Xflag(k)=1; end end

for k=lenXcount:1+2

if Xcount(k)<3 && Xcount(k-1)<3 && Xcount(k-2)<3 Xflag(k)=1; end end

Xflag2=[0 Xflag(1:end-1)]; Xflag3=abs(Xflag-Xflag2); [~,col]=find(Xflag3==1); col=[1 col size(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;

for k=1:length(col) if mod(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); for k=1:picnum2

piccell2{k}=pic(:,col1(k):col2(k)); piccell2{k}=xylimit(piccell2{k});

piccell2{k}=imresize(piccell2{k},[128 128]); end

%显示提取出的字符,每行最多输出8个字符if mod(picnum2,8)

rownum=ceil(picnum2/8)+1; else

rownum=picnum2/8; end

for k=1:picnum2

subplot(rownum,8,k); imshow(piccell2{k}); end

%%函数xylimit如下:

function newpic=xylimit(pic) %function name:XYLIMIT % Input pic:binary image %Output newpic:binary image

%用途:对二值图像边界进行限定,要求图像是黑底白图 %example:

% % pic=imread('数字字符.jpg'); % % pic=rgb2gray(pic); % % pic=(pic<127); % % pic=xylimit(pic); % % imshow(pic);

[m,n]=size(pic);

%%%%纵向扫描%%% Ycount=zeros(1,m); for i=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); for j=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)


基于MATLAB的图片中字符的提取(源代码).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2019届河北省武邑中学高三上学期第二次调研考试生物试题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: