细化算法移植到图像识别文字OCR

本文主要是工程的核心,细化用的是Rosenfeld算法,仅供参考。


void Thinning(HDIB hDIB)

{
// 指向DIB的指针
LPSTR lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)hDIB);

// 指向DIB象素指针
LPSTR    lpDIBBits;


// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);

// 指向源图像的指针
LPSTR lpSrc;


//图像的高度和宽度
LONG lWidth;
LONG lHeight;


//获取图像的宽度
lWidth=::DIBWidth ((char*)lpDIB);


//获取图像的高度
lHeight=::DIBHeight ((char*)lpDIB);


    //计算每行的字节数
    LONG  lLineBytes = (lWidth+3)*4/4;


//循环变量
    int i,j;


    //建立存储区存放2值矩阵
BYTE *image = (BYTE*)malloc(lWidth*lHeight*sizeof(BYTE));


//给2值矩阵赋值


for(i=0;i<lHeight;i++)
{
   for(j=0;j<lWidth;j++)
{
     lpSrc=lpDIBBits+i*lLineBytes+j;
   
     if(*lpSrc==0)
     image[i*lWidth+j]=1;


 else
         image[i*lWidth+j]=0;
}
}


   ThinnerRosenfeld(image,lHeight,lWidth);


   for(i=0;i<lHeight;i++)
   {
     for(j=0;j<lWidth;j++)
{
  lpSrc=lpDIBBits+i*lLineBytes+j;


       if(image[i*lWidth+j]==1)
  *lpSrc=(BYTE)0;


  else
       *lpSrc=(BYTE)255;
}
   
   }




   free(image);
   ::GlobalUnlock ((HGLOBAL)hDIB);


return;

}


void ThinnerRosenfeld(void *image, unsigned long lx, unsigned long ly)
{
    char *f, *g;
    char n[10];
    char a[5] = {0, -1, 1, 0, 0};
    char b[5] = {0, 0, 0, 1, -1};
    char nrnd, cond, n48, n26, n24, n46, n68, n82, n123, n345, n567, n781;
    short k, shori;
    unsigned long i, j;
    long ii, jj, kk, kk1, kk2, kk3, size;
    size = (long)lx * (long)ly;


    g = (char *)malloc(size);
    if(g==NULL)
    {
        printf("error in alocating mmeory!\n");
        return;
    }


    f = (char *)image;
    for(kk=0l; kk<size; kk++)
    {
        g[kk] = f[kk];
    }


    do
    {
        shori = 0;
        for(k=1; k<=4; k++)
        {
            for(i=1; i<lx-1; i++)
            {
                ii = i + a[k];


                for(j=1; j<ly-1; j++)
                {
                    kk = i*ly + j;


                    if(!f[kk])
                        continue;


                    jj = j + b[k];
                    kk1 = ii*ly + jj;


                    if(f[kk1])
                        continue;


                    kk1 = kk - ly -1;
                    kk2 = kk1 + 1;
                    kk3 = kk2 + 1;
                    n[3] = f[kk1];
                    n[2] = f[kk2];
                    n[1] = f[kk3];
                    kk1 = kk - 1;
                    kk3 = kk + 1;
                    n[4] = f[kk1];
                    n[8] = f[kk3];
                    kk1 = kk + ly - 1;
                    kk2 = kk1 + 1;
                    kk3 = kk2 + 1;
                    n[5] = f[kk1];
                    n[6] = f[kk2];
                    n[7] = f[kk3];


                    nrnd = n[1] + n[2] + n[3] + n[4]
                        +n[5] + n[6] + n[7] + n[8];
                    if(nrnd<=1)
                        continue;


                    cond = 0;
                    n48 = n[4] + n[8];
                    n26 = n[2] + n[6];
                    n24 = n[2] + n[4];
                    n46 = n[4] + n[6];
                    n68 = n[6] + n[8];
                    n82 = n[8] + n[2];
                    n123 = n[1] + n[2] + n[3];
                    n345 = n[3] + n[4] + n[5];
                    n567 = n[5] + n[6] + n[7];
                    n781 = n[7] + n[8] + n[1];


                    if(n[2]==1 && n48==0 && n567>0)
                    {
                        if(!cond)
                            continue;
                        g[kk] = 0;
                        shori = 1;
                        continue;
                    }


                    if(n[6]==1 && n48==0 && n123>0)
                    {
                        if(!cond)
                            continue;
                        g[kk] = 0;
                        shori = 1;
                        continue;
                    }


                    if(n[8]==1 && n26==0 && n345>0)
                    {
                        if(!cond)
                            continue;
                        g[kk] = 0;
                        shori = 1;
                        continue;
                    }


                    if(n[4]==1 && n26==0 && n781>0)
                    {
                        if(!cond)
                            continue;
                        g[kk] = 0;
                        shori = 1;
                        continue;
                    }


                    if(n[5]==1 && n46==0)
                    {
                        if(!cond)
                            continue;
                        g[kk] = 0;
                        shori = 1;
                        continue;
                    }


                    if(n[7]==1 && n68==0)
                    {
                        if(!cond)
                            continue;
                        g[kk] = 0;
                        shori = 1;
                        continue;
                    }


                    if(n[1]==1 && n82==0)
                    {
                        if(!cond)
                            continue;
                        g[kk] = 0;
                        shori = 1;
                        continue;
                    }


                    if(n[3]==1 && n24==0)
                    {
                        if(!cond)
                            continue;
                        g[kk] = 0;
                        shori = 1;
                        continue;
                    }


                    cond = 1;
                    if(!cond)
                        continue;
                    g[kk] = 0;
                    shori = 1;
                }
            }


            for(i=0; i<lx; i++)
            {
                for(j=0; j<ly; j++)
                {
                    kk = i*ly + j;
                    f[kk] = g[kk];
                }
            }
        }
    }while(shori);


    free(g);
}       


参考资料:数字图像处理VC++       

你可能感兴趣的:(ocr,文字细化,字符细化,数字英文细化,Rosenfeld细化算法)