基于多特征提取的手写汉字识别算法及其实现 第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] 下一页