⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 all1024dinggohome.m

📁 一个用matlab编写的 关于笔画提取的仿真试验程序
💻 M
字号:
close all;
clear;
%A2=imread('D:\a实验用\nh1.bmp','bmp');
%figure(9),imshow(A2);
tic;
A1=imread('yw.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)=0;
    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);
%%%%%%%%%%%%%%
%统计字符的笔画宽度
[rowabh]=widthrow(A,m,n);
bb1=mean2(rowabh);
[colabh]=widthcol(A,m,n);
bb2=mean2(colabh);
if bb1>bb2
    bb=round(bb2);
else bb=round(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
%%%%%%%%%%%%%列补点
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>5
            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
% 
figure(33),imshow(ath);
%%%%%%%%%%%滤波
dd=0;sum1=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
             sum1=sum1+1;
              startshui(1,sum1)=i;%起始点行坐标
             startshuj(1,sum1)=j;% 起始点列号
             i=i+dd-1;
             endshui(1,sum1)=i;
             endshuj(1,sum1)=j;
        end
        dd=0;
       
    end
     i=i+1;  
 end
  
end

kj=0;
    for i=1:(sum1-1)
    
        if (abs(startshuj(1,i)-endshuj(1,i+1))<4 & ((startshui(1,i+1)>startshui(1,i))&(startshui(1,i+1)<endshui(1,i)))||(startshui(1,i)>startshui(1,i+1)&startshui(1,i)<endshui(1,i+1)))
        lonshu1=abs(endshui(1,i)-startshui(1,i) );
        lonshu2=abs(endshui(1,i+1)-startshui(1,i+1));
        kj=kj+1;
        if lonshu1 >lonshu2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%重叠的竖的检测!!!
            
        end
        
    end  
     end
 alie=aaah;
figure(2),imshow(alie),title('alie竖'); 
    %%%%%%%%%%%行补点
aaa=atl2;%负侧的每行边缘
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>=bb/2
             dddd=0;
           if A(i,j) >100
           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 < bb 
              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)
    na1(i,j)=ana(i,j)-aaah(i,j)-aaa(i,j);
end
end
figure(30),imshow(na1),title('===');
 cunna=zeros(m,n);
 na=na1;tc=0;
 for  i=1:(m)
     j=1;
    while(j<=n)
        t1=na(i,j);
        kk8=i;kk10=i;
         kk9=j;kk11=j;
        if  t1 >0 
            tb=1; cunna(kk8,kk9)=t1;
          [t2,kk8,kk9]=napos2(na,kk8,kk9);
        while t2>0 && kk9<n
          cunna(kk8,kk9)=t2; na(kk8,kk9)=0;
         [t2,kk8,kk9]=napos2(na,kk8,kk9);
        cunna(kk8,kk9)=t2;
       tb=tb+1;
         end
             if ((double(kk8)-i)==0 && (double(kk9)-j) >10)||((double(kk8)-i)>10 && (double(kk9)-j)==0)
                   for ss=i:kk8
                       for tt=j:kk9
                           na(ss,tt)=0;
                           cunna(ss,tt)=0;
                       end
                   end
               elseif  (abs(double(kk9)-j)<=1||abs(double(kk8)-i)<=1)||(tb <8 && tb>0)
                   for ss=i:kk8
                       for tt=j:kk9
                           na(ss,tt)=0;1
                           cunna(ss,tt)=0;
                       end
                   end 
               
           elseif tb>=8
            tc=tc+1;
            hann(1,tc)=kk8;lien(1,tc)=kk9;hanni(1,tc)=i;lienj(1,tc)=j;  
          %  tt2=cunna; figure(112),imshow(tt2),title('.....');  
        else
       
         k=1 ;
     end
            end
            j=j+1;  
      end
  end
k12=tc;
  k4=0;
   if tc >1
          for n2=1:(tc) 
             c1= hann(1,n2)+round(bb/2);  %%%%%%%%%%%终点
              c2=lien(1,n2)+round(bb/2);
              for n1=(n2+1):tc
            c3=abs( hanni(1,n1)-c1) ;
             c4=abs( lienj(1,n1)-c2) ;
             if (c3<=bb/2) && (c4<=bb/2) 
                k4=k4+1;
                 BBBB(1,k4)=n2;%%%%%%%%%%%终点
                 AAAA(1,k4)=n1;%%%%%%%%%%%起点
            end
              end
          end
      end

  %%%%%%%%%%%%%%%%%%撇
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

 %%%%%%%%%%
 
for    j=1:(n)
for  i=1:(m)
    pie1(i,j)=apie(i,j)-aaah(i,j)-aaa(i,j);
end
end
%figure(108),imshow(pie1),title('00');
 cunpie=zeros(m,n);
 pie=pie1;
 tc=0;
 for  i=1:(m)
     j=n;
    while(j>=1)
        t1=pie(i,j); kk9=j;
          kk8=i;
        if  t1 >0 
            tb=0; cunpie(kk8,kk9)=t1;
          [t3,kk8,kk9]=piepos(pie,kk8,kk9);
        while t3>0&& kk9<n
        cunpie(kk8,kk9)=t3; pie(kk8,kk9)=0;
        [t3,kk8,kk9]=piepos(pie,kk8,kk9);
         cunpie(kk8,kk9)=t3;
       
        tb=tb+1;
         end
       if ((double(kk8)-i)==0 && (j-double(kk9)) >10)||((double(kk8)-i)>10 && (j-double(kk9))==0)
                   for ss=i:kk8
                       for tt=j:-1:kk9
                           pie(ss,tt)=0;
                           cunpie(ss,tt)=0;
                       end
                   end
       elseif  (tb < 6&&tb >0) || (abs(double(kk9)-j)<=2&&abs(double(kk8)-i)<=2  )
                   for ss=i:kk8
                       for tt=j:-1:kk9
                        pie(ss,tt)=0;
                           cunpie(ss,tt)=0;
                       end
                   end 
           elseif tb>=6
            tc=tc+1;
            hanp(1,tc)=kk8;liep(1,tc)=kk9;hanpi(1,tc)=i;liepj(1,tc)=j;  
              
               else
          
            k=1 ;
        end
    end
            j=j-1;
      end
  end
  figure(109),imshow(cunpie),title('撇');
k13=tc;

   k5=0;
   if tc >1
          for n2=1:(tc) 
             c1= hanp(1,n2)+round(bb/2);  %%%%%%%%%%%终点
              c2=abs(liep(1,n2)-round(bb/2));
              for n1=(n2+1):tc
            c3=abs( hanpi(1,n1)-c1) ;
             c4=abs( liepj(1,n1)-c2) ;
             if c3<=bb/2 && c4<=bb/2
                k5=k5+1;
                 BBBBp(1,k5)=n2;%%%%%%%%%%%终点
                 AAAAp(1,k5)=n1;%%%%%%%%%%%起点
            end
              end
          end
      end
  
  
  
  %%%%%%%%%%%%%%%%%%撇
  k12;
  k13;
               
k6=0;
  for i=1:k12
      c1= hanni(1,i);  %%%%%%%%%%%终点
      c2=(lienj(1,i));
      for j=(1):k13
            c3=abs( hanp(1,j)-c1) ;
             c4=abs( liep(1,j)-c2) ;
             if c3<=4 && c4<=4
                k6=k6+1;
                 BBBBnn(1,k6)=i;%%%%%%%%%%%终点
                 AAAApn(1,k6)=j;%%%%%%%%%%%起点
            end
        end
    end
    
    for i=1:k6
        kk8=hanni(1,BBBBnn(1,i));
        kk9=lienj(1,BBBBnn(1,i));
         cl3=hann(1,BBBBnn(1,i));
        cl4=lien(1,BBBBnn(1,i));
        t6=cunna(kk8,kk9)
       while t6>0 
        [t6,cunna,kk8,kk9]=clrna(cunna,kk8,kk9);
    end
    end
    

figure(104),imshow(cunpie),title('撇');
figure(102),imshow(cunna),title('a3捺');

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(cunpie(i,j))>0
            cunpie(i,j)=255;
        else
            cunpie(i,j)=0;
        end
    end
end
for j=1:n
        if double(cunna(i,j))>0
            cunna(i,j)=255;
        else
            cunna(i,j)=0;
        end
    end
end
   for i=1:m 
    for j=1:n
                  all(i,j)=double(ahen(i,j))+double(cunna(i,j))+double(alie(i,j))+double(cunpie(i,j)); %所有边缘
            end
        end

    figure(104),imshow(all),title('全字');
   
toc;


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -