基于多特征提取的手写汉字识别算法及其实现 第6页

基于多特征提取的手写汉字识别算法及其实现 第6页
 if(store[i][j+2].y<store[i][j].y)
   {
    if(store[i][j+2].x>store[i][j].x)
     fxm[i][j]=8;
    else if(store[i][j+2].x<store[i][j].x)
     fxm[i][j]=6;
   }
  }
  //去除噪声点
 for(i=0;i<15;i++)
  for(j=0;j<288;j++)
   fxm[i][j]=fxm[i][j+2];
 for(i=0;i<15;i++)
  for(j=3;(j<300)&&(fxm[i][j]!=0);j++)
  {
   if((fxm[i][j-1]!=fxm[i][j])&&(fxm[i][j+1]!=fxm[i][j]))
    for(k=j;fxm[i][k]!=0;k++)
     fxm[i][k]=fxm[i][k+1];
  }
 //得到方向特征
 for(i=0;i<15;i++)
  for(j=0;(j<300)&&fxm[i][j]!=0;j++)
  {
   fxtz[i].totaldian++;
   for(k=1;k<=8;k++)
    if(fxm[i][j]==k)
     fxtz[i].b[k-1]++;
  }
 //去除噪声方向点
 for(i=0;i<15;i++)
  for(j=0;j<8;j++)
  {
   if((float(fxtz[i].b[j])/float(fxtz[i].totaldian))<0.3)
    fxtz[i].b[j]=0;
   if(fxtz[i].b[j]!=0)
    fxtz[i].total++;
  }
 
 //得到笔画序列  
 for(i=0;i<15;i++)
 {
  if(fxtz[i].total==1)
  {
   if(fxtz[i].b[0]!=0)
    test.bh[i]=1;
   else if(fxtz[i].b[2]!=0)
    test.bh[i]=2;
   else if(fxtz[i].b[3]!=0)
    test.bh[i]=3;
   else if(fxtz[i].b[1]!=0)
    test.bh[i]=4;
  }
  else if(fxtz[i].total>1)
   test.bh[i]=5;
 
 }
}
//将图像3*3分区,得到各区特征(具体见2.3节)
void CRecogDlg::obtp()
{
 int x1,x2,y1,y2,x,y,i;
 int sum=0;
 int po[9];
 char s[20];
 HDC hdc=::GetDC(m_hWnd);
 x1=xmin+(xmax-xmin)/3;
 x2=x1+(xmax-xmin)/3;
 y1=ymin+(ymax-ymin)/3;
 y2=y1+(ymax-ymin)/3;
 
 for(i=0;i<9;i++)
  po[i]=0;
 for(y=ymin;y<y1;y++)
 {
  for(x=xmin;x<x1;x++)
   if(GetPixel(hdc,x,y)!=16777215)
   {
    po[0]++;
    sum++;
   }
  for(x=x1;x<x2;x++)
   if(GetPixel(hdc,x,y)!=16777215)
   {
    po[1]++;
    sum++;
   }
  for(x=x2;x<xmax;x++)
   if(GetPixel(hdc,x,y)!=16777215)
   {
    po[2]++;
    sum++;
   }
 }
 for(y=y1;y<y2;y++)
 {
   for(x=xmin;x<x1;x++)
   if(GetPixel(hdc,x,y)!=16777215)
   {
    po[3]++;
    sum++;
   }
  for(x=x1;x<x2;x++)
   if(GetPixel(hdc,x,y)!=16777215)
   {
    po[4]++;
    sum++;
   }
  for(x=x2;x<xmax;x++)
   if(GetPixel(hdc,x,y)!=16777215)
   {
    po[5]++;
    sum++;
   }
 }
 for(y=y2;y<ymax;y++)
 {
   for(x=xmin;x<x1;x++)
   if(GetPixel(hdc,x,y)!=16777215)
   {
    po[6]++;
    sum++;
   }
  for(x=x1;x<x2;x++)
   if(GetPixel(hdc,x,y)!=16777215)
   {
    po[7]++;
    sum++;
   }
  for(x=x2;x<xmax;x++)
   if(GetPixel(hdc,x,y)!=16777215)
   {
    po[8]++;
    sum++;
   }
 }
 for(i=0;i<9;i++)
  test.p[i]=float(po[i])/float(sum);
 //sprintf(s,"%d,%d,%lf",po[0],sum,test.p[0]);
 //AfxMessageBox(s);
}

3.2  识别算法
//识别函数
void CRecogDlg::OnRecogn()
{
 // TODO: Add your control notification handler code here
www.751com.cn for(i=0;i<=zong;i++)
 {
  if(tez[i].total==test.total)
  {
   d1=0;
   for(j=0;j<test.total;j++)
    d1=d1+(1-dis(test.bh[j],tez[i].bh[j]));
   d1=d1/float(test.total);
   
   d2=0;
   for(j=0;j<9;j++)
    d2=d2+fabs(test.p[j]-tez[i].p[j]);

   if(d1<0.02)
      if(d2<0.2)//阙值
      {
    flagok=1;
    sprintf(s,"您输入的是: %s",tez[i].zifu);
    AfxMessageBox(s);
    break;
      }
  }
 }
 if(i>zong)
  AfxMessageBox("无法识别!书写不规范或字库中无次字。");
}

上一页  [1] [2] [3] [4] [5] [6] [7] [8] 下一页

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有