📄 all23.m
字号:
close all;
clear;
%A2=imread('D:\a实验用\nh1.bmp','bmp');
%figure(9),imshow(A2);
tic;
A1=imread('藏1.bmp');%%%% w1/117/a104 qw/126/a157 l2/85/a99 qq/79/a64 yn/78/a75 h2/59/a44 annnew/56/a123 l21
A=rgb2gray(A1);
k=25;
hui=0;
figure(1),imshow(A),title('原字符图像');
[m,n]=size(A);
for i=2:(m-1)
for j=2:(n-1)
hui=hui+double(A(i,j));
end
end
G=[0;-2;2;0];
H=[0.125;0.375;0.375;0.125];
%[A]=filtimag1231(A1);
%[cc]=fenggfuc(A);
%imwrite(cc,'qqying.bmp');figure(3),imshow(cc);
%Ac2=edge(A,'canny');
%figure(15),imshow(Ac2);
%G1=[0;0;-2;0;2;0;0;0];
%H1=[0.125;0;0.375;0;0.375;0;0.125;0];
%G=[0.025;0.475;0.475;0.025];
%H=[0.025;0.475;0.475;0.025];
huit=round(hui/(m*n));
%aaa=[huit,huit/2,huit,huit/2];
%ss=aaa*G;
%ss2=aaa*H;
%%%%边缘扩展
Ak=zeros(m+k,n+k);
for i=1:(m+k)
for j=1:(n+k)
Ak(i,j)=huit;
end
end
for i=6:(m+6-1)
for j=6:(n+6-1)
Ak(i,j)=A(i-5,j-5);
end
end
%%%对行进行1变换
[SSh,WWh]=hanb(Ak);%%%%hanb及hanb2为函数
%%%对行进行2变换
[SSh2,WWh2]=hanb2(SSh);
%%%对行进行2变换[SSh3,WWh3]=hanb3(SSh2);
%%%对列进行1变换%%%%lieb及lieb2为函数
[SSl,WWl]=lieb(Ak);
%%%对列进行2变换
[SSl2,WWl2]=lieb2(SSl);
%%%对列进行2变换[SSl3,WWl3]=lieb3(SSl2);
%%对行进行寻找变换后的最大值点c5=WWh3; [ahmax3]=findmaxminh(c5);
% c1=WWh;
% [ahmax1]=findmaxminh(c1);
c3=WWh2;
[ahmax2]=findmaxminh(c3);
%%寻找1列变换后的最大值点
% c2=WWl;
% [almax1]=findmaxminl(c2);
c4=WWl2;
[almax2]=findmaxminl(c4);
%%%%%%%%%%%%%%%mm=1; c6=WWl3; [almax3]=findmaxminl(c6);
hmax2=ahmax2;
lmax2=almax2;
hmax22=ahmax2;
lmax22=almax2;
%hmax1=ahmax1;
%lmax1=almax1;
%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%
%figure(2),imshow(ccall11);
%%%%%%%%%%%%%%% figure(3),imshow(ahmax2);
%统计字符的笔画宽度
kh=0;
ss=0;dd=0;
for j=1:(n)
i=1;
while(i<=m)
t1=A(i,j);
if t1 >0;
kh=i;
while A(kh,j)>20
dd=dd+1;
kh=kh+1;
if kh > m
break;
end
end
if dd<20 && dd>6
ss=ss+1;
ahank(1,ss)=dd;
i=i+dd-1;
else
dd=0;
i=i+1;
end
end
dd=0;
i=i+1;
end
end
ahank;
bb1=mean2(ahank);
kh=0;
ss=0;dd=0;
for i=1:(m)
j=1;
while(j<=n)
t1=A(i,j);
if t1 >0;
kh=j;
while A(i,kh)>20
dd=dd+1;
kh=kh+1;
if kh > n
break;
end
end
if dd<20 && dd>6
ss=ss+1;
aliek(1,ss)=dd;
j=j+dd-1;
else
dd=0;
j=j+1;
end
end
dd=0;
j=j+1;
end
end
aliek;
bb2=mean2(aliek);
if bb1>bb2
bb=bb2;
else bb=bb1;
end
%%% 统计行或列的不为零的边缘点,若不为零则记录其点值并存于Amh和Aml中
[mch2,nch2]=size(hmax2);
[mcl2,ncl2]=size(lmax2);
for i=6:(m+5)
ererhm=0;
ehm=0;
for j=6:(n+5)
if (abs(hmax2(i,j))>0)
ererhm=ererhm+abs(hmax2(i,j));
ehm=ehm+1;
end
end
if ehm>0
km=ererhm/ehm;
Amh(1,i)=km;
else
Amh(1,i)=0;
end
end
for j=6:(n+5)
ererlm=0;
elm=0;
for i=6:(m+5)
if (abs(lmax2(i,j))>0)
ererlm=ererlm+abs(lmax2(i,j));
elm=elm+1;
end
end
if elm>0
km=ererlm/elm;
Aml(1,j)=km;
else
Aml(1,j)=0;
end
end
%%%%%%%%%%%%%%%%以下为边缘点值的滤波
ath=zeros(m,n);
ath1=zeros(m,n);
ath2=zeros(m,n);
atl=zeros(m,n);
atl1=zeros(m,n);atl2=zeros(m,n);
for i=1:(m)
for j=1:(n)
if abs(hmax2(i+5,j+3))>100
ath(i,j)=(hmax2(i+5,j+3));%正侧的列边缘即竖
ath1(i,j)=abs(hmax2(i+5,j+3));%所有的列边缘即竖
end
end
end
for j=1:(n)
for i=1:(m)
if abs(lmax2(i+3,j+5))>100 %&& abs(lmax2(i+3,j+5))<=255 %%%%%%%%%???????????????????
atl(i,j)=round(lmax2(i+3,j+5));%正侧的行边缘!!!!!!!!!横
atl1(i,j)=abs(lmax2(i+3,j+5));%所有的行边缘
end
end
end
atla=zeros(m,n);
atla1=zeros(m,n);atla2=zeros(m,n);
for i=1:(m)
for j=1:(n)
atla(i,j)=(double(atl(i,j))+double(ath(i,j)));%所有正侧的边缘
atla1(i,j)=double(atl1(i,j))+double(ath1(i,j)); %所有边缘
ath2(i,j)=double(ath1(i,j))-double(ath(i,j));%负侧的列边缘!!!!!
atl2(i,j)=double(atl1(i,j))-double(atl(i,j));%负侧的行边缘
atla2(i,j)=double(atl2(i,j))+double(ath2(i,j));%所有的负侧边缘
%akit(i,j)=double(atl(i,j))+(double(ath1(i,j))-double(ath(i,j)));
apie(i,j)=double(ath(i,j))+(double(atl(i,j)));
ana(i,j)=double(ath(i,j))+(double(atl2(i,j)));
end
end
%figure(13),imshow(ath),title('所有正列边缘');
%figure(14),imshow(atl),title('所有负行边缘');
%figure(12),imshow(apie),title('所有正列负行边缘');
%%%%%%%%%%%%%列补点
%%%%%%%%%%%%%列补点
dddd=0;sumt=0;
aaah=ath;%正侧的每列边缘,
for kkk=1:bb
for j=1:(n)
for i=1:(m)
t1=aaah(i,j);
if t1 >0
dddd=dddd+1;
elseif dddd>4
sumt=dddd;
dddd=0;
if A(i,j) >20
sumt=sumt+1;
aaah(i,j)=aaah(i-1,j);
end
else
dddd=0;
end
end
end
end
end
end
for kkk=1:bb
for j=1:(n)
for i=m:-1:(1)
t1=aaah(i,j);
if t1 >0
dddd=dddd+1;
else
if dddd>bb
dddd=0;
if A(i,j) >20
aaah(i,j)=aaah(i+1,j);
end
else
dddd=0;
end
end
end
end
end
end
%%%%%%%%%%%滤波
dd=0;
for j=1:(n)
i=1;
while(i<=m)
t1=aaah(i,j);
if t1 >0
k9=i;
while aaah(k9,j)>0
dd=dd+1;
k9=k9+1;
if k9 > m
break;
end
end
if dd < bb
for k8=dd:-1:1;
tttt=k9-k8;
aaah(k9-k8,j)=0;
end
i=i+dd-1;
dd=0;
else
i=i+dd-1;
end
dd=0;
end
i=i+1;
end
end
alie=aaah;
figure(2),imshow(alie),title('alie竖');
%%%%%%%%%%%行补点
aaa=atl2;%负侧的每行边缘
dddd=0;
for kkkk=1:bb
for i=1:(m)
for j=1:(n-1)
t1=aaa(i,j);
if t1 >0
dddd=dddd+1;
else
if dddd>5
dddd=0;
if A(i,j) >5
aaa(i,j)=aaa(i,j-1);
end
else
dddd=0;
end
end
end
end
end
end
dddd=0;
for kkkk=1:bb
for i=1:(m)
for j=n:-1:(2)
t1=aaa(i,j);
if t1>0
dddd=dddd+1;
else
if dddd>5
dddd=0;
if A(i,j) >5
aaa(i,j)=aaa(i,j+1);
end
else
dddd=0;
end
end
end
end
end
end
%%%%%%%%%%%滤波
dd=0;
for i=1:(m)
j=1;
while(j<=n)
t1=aaa(i,j);
if t1 >0
k9=j;
while aaa(i,k9)>0
dd=dd+1;
k9=k9+1;
if k9 > n
k9=k9-1;
break;
end
end
if dd < 9
for k8=dd:-1:1;
tttt=k9-k8;
aaa(i,k9-k8)=0;
end
j=j+dd-1;
dd=0;
else
j=j+dd-1;
end
dd=0;
end
j=j+1;
end
end
ahen=aaa;
figure(3),imshow(ahen),title('ahen横');
%%%%%%%%%%%撇的提取
for j=1:(n)
for i=1:(m)
na(i,j)=ana(i,j)-aaah(i,j)-aaa(i,j);
end
end
aleave3=na;
for i=2:(m-1)
for j=2:(n-1)
num=0;
numh=0;
numl=0;
if aleave3(i,j)>0
for tt=-1:1:1
for ss=-1:1:1
if aleave3(i+tt,j+ss)>0
num=num+1;
end
end
end
for tt=-1:1:1
for ss=-1:1:1
if ath(i+tt,j+ss)>0
numh=numh+1;
end
end
end
for tt=-1:1:1
for ss=-1:1:1
if atl2(i+tt,j+ss)>0
numl=numl+1;
end
end
end
end
if (num>numh || num>numl)
aleave3(i,j)= aleave3(i,j);
elseif (ath(i,j)>0 && atl2(i,j)>0)
aleave3(i,j)= aleave3(i,j);
else
aleave3(i,j)= 0;
end
end
end
for i=2:(m-1)
for j=2:(n-1)
num=0;
if aleave3(i,j)>0
for tt=-1:1:1
for ss=-1:1:1
if na(i+tt,j+ss)>0
num=num+1;
end
end
end
end
if num>1
for tt=-1:1:1
for ss=-1:1:1
aleave3(i+tt,j+ss)= na(i+tt,j+ss);
end
end
else
aleave3(i,j)=0;
end
end
end
for kt=1:3
for i=1:(m-2)
for j=1:n-2
num=0;
if aleave3(i,j)>0
for tt=0:1:2
for ss=0:1:2
if aleave3(i+tt,j+ss)>0
num=num+1;
end
end
end
end
if num>1
for tt=0:1:2
for ss=0:1:2
aleave3(i+tt,j+ss)= aleave3(i+tt,j+ss);
end
end
else
aleave3(i,j)=0;
end
end
end
end
figure(102),imshow(aleave3),title('aleave3捺');
%%%%%%%%%%%%%%%%%%撇
aaa=atl;%正侧的行边缘
dddd=0;
for kkkk=1:bb
for i=1:(m)
for j=1:(n-1)
t1=aaa(i,j);
if t1 >0
dddd=dddd+1;
else
if dddd>5
dddd=0;
if A(i,j) >5
aaa(i,j)=aaa(i,j-1);
end
else
dddd=0;
end
end
end
end
end
end
dddd=0;
for kkkk=1:bb
for i=1:(m)
for j=n:-1:(2)
t1=aaa(i,j);
if t1>0
dddd=dddd+1;
else
if dddd>5
dddd=0;
if A(i,j) >5
aaa(i,j)=aaa(i,j+1);
end
else
dddd=0;
end
end
end
end
end
end
%%%%%%%%%%%滤波
dd=0;
for i=1:(m)
j=1;
while(j<=n)
t1=aaa(i,j);
if t1 >0
k9=j;
while aaa(i,k9)>0
dd=dd+1;
k9=k9+1;
if k9 > n
k9=k9-1;
break;
end
end
if dd < 9
for k8=dd:-1:1;
tttt=k9-k8;
aaa(i,k9-k8)=0;
end
j=j+dd-1;
dd=0;
else
j=j+dd-1;
end
dd=0;
end
j=j+1;
end
end
%figure(108),imshow(aaa),title('00');
%%%%%%%%%%
for j=1:(n)
for i=1:(m)
pie(i,j)=apie(i,j)-aaah(i,j)-aaa(i,j);
end
end
aleave2= pie;
for i=2:(m-1)
for j=2:(n-1)
num=0;
numh=0;
numl=0;
if aleave2(i,j)>0
for tt=-1:1:1
for ss=-1:1:1
if aleave2(i+tt,j+ss)>0
num=num+1;
end
if ath(i+tt,j+ss)>0
numh=numh+1;
end
if atl(i+tt,j+ss)>0
numl=numl+1;
end
end
end
if (num>numh && num>numl)
aleave2(i,j)= aleave2(i,j);
elseif ath(i,j)>0 && atl(i,j) >0
aleave2(i,j)= aleave2(i,j);
else
aleave2(i,j)= 0;
end
end
end
end
for i=2:(m-1)
for j=2:(n-1)
num=0;
if aleave2(i,j)>0
for tt=-1:1:1
for ss=-1:1:1
if pie(i+tt,j+ss)>0
num=num+1;
end
end
end
end
if num>1
for tt=-1:1:1
for ss=-1:1:1
aleave2(i+tt,j+ss)= pie(i+tt,j+ss);
end
end
else
aleave2(i,j)=0;
end
end
end
for kt=1:2
for i=1:(m-3)
for j=(n):-1:3
num=0;
if aleave2(i,j)>0
for tt=0:1:2
for ss=0:1:2
if aleave2(i+tt,j-ss)>0
num=num+1;
end
end
end
end
if num>1
for tt=0:1:2
for ss=0:1:2
aleave2(i+tt,j-ss)= aleave2(i+tt,j-ss);
end
end
else
aleave2(i,j)=0;
end
end
end
end
for i=1:m
for j=1:n
if aleave2(i,j)>0 && aaa(i,j)>0
aleave2(i,j)=0;
end
end
end
figure(103),imshow(aleave2),title('aleave2撇');
for i=1:m
for j=1:n
if double(ahen(i,j))>0
ahen(i,j)=255;
else
ahen(i,j)=0;
end
end
end
for i=1:m
for j=1:n
if double( alie(i,j))>0
alie(i,j)=255;
else
alie(i,j)=0;
end
end
end
for i=1:m
for j=1:n
if double(aleave2(i,j))>0
aleave2(i,j)=255;
else
aleave2(i,j)=0;
end
end
end
for j=1:n
if double(aleave3(i,j))>0
aleave3(i,j)=255;
else
aleave3(i,j)=0;
end
end
end
for i=1:m
for j=1:n
all(i,j)=double(ahen(i,j))+double(aleave3(i,j))+double(alie(i,j))+double(aleave2(i,j)); %所有边缘
% all(i,j)=abs(double(ah(i,j)))+abs(double(aaana(i,j)))+abs(double(analeave(i,j)))+abs(double(pie(i,j))); %所有边缘
end
end
figure(104),imshow(all),title('全字');
toc;
%aa1aa2figure(14),imshow(cc3);figure(9),subplot(2,2,1),imshow(ath);subplot(2,2,2),imshow(atl);subplot(2,2,3),imshow(cc);subplot(2,2,4),imshow(cc);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -