shear.c
来自「NIST Handwriting OCR Testbed」· C语言 代码 · 共 102 行
C
102 行
/*# proc: shear_mis - takes characters in the specified mis structure and# proc: horizontally shears them in order to straighten them up.# proc: shear_char - takes a binary bitmap of a character and horizontally# proc: shears it in order to straighten the character up.*/#include <stdio.h>#include <ihead.h>#include <mis.h>#include <defs.h>/*************************************************************************/shear_mis(smis, sfctr, imis)MIS **smis, *imis;float **sfctr;{ unsigned char *iptr, *sptr; float shear_char(); int esize; int i; *smis = allocmis(NULL, 1, 0, imis->entw, imis->enth, imis->ent_num); esize = SizeFromDepth(imis->entw, imis->enth, imis->misd); malloc_flt(sfctr, imis->ent_num, "shear_mis : sfctr"); iptr = imis->data; sptr = (*smis)->data; for(i = 0; i < imis->ent_num; i++){ (*sfctr)[i] = shear_char(iptr, sptr, imis->entw, imis->enth); iptr += esize; sptr += esize; } (*smis)->ent_num = imis->ent_num;}/*************************************************************************/float shear_char(idata, odata, w, h)unsigned char *idata, *odata;int w, h;{ int len, toprow, botrow, topleft, botleft; int r, sval, ch; int mh; unsigned char *cdata, *sdata, *cptr, *sptr, *allocate_image(); float fctr; len = w * h; cdata = allocate_image(w, h, 8); bits2bytes(idata, cdata, len); if((toprow = char_top(cdata, w, h)) == -1) fatalerr("shear_char", "top of character not found", NULL); if((botrow = char_bottom(cdata, w, h)) == -1) fatalerr("shear_char", "bottom of character not found", NULL); ch = botrow - toprow + 1; if(ch <= 0) fatalerr("shear_char", "character not found", NULL); if(ch <= 5){ binary_subimage_copy(idata, w, h, odata, w, h, 0, 0, w, h, 0, 0); free(cdata); return(0.0); } /* skip potentially noisy edges */ toprow = min(toprow+2, h-1); botrow = max(botrow-2, 0); if(toprow == botrow) fatalerr("shear_char", "top row of character should not equal bottom row of character", NULL); if((topleft = left_pix(cdata + (toprow * w), w)) == -1){ binary_subimage_copy(idata, w, h, odata, w, h, 0, 0, w, h, 0, 0); free(cdata); return(0.0); } if((botleft = left_pix(cdata + (botrow * w), w)) == -1){ binary_subimage_copy(idata, w, h, odata, w, h, 0, 0, w, h, 0, 0); free(cdata); return(0.0); } if(topleft == botleft){ binary_subimage_copy(idata, w, h, odata, w, h, 0, 0, w, h, 0, 0); free(cdata); return(0.0); } /* compute shear factor so that topleft and botleft line up when done */ fctr = (topleft - botleft)/(float)(botrow - toprow); sdata = allocate_image(w, h, 8); mh = h>>1; cptr = cdata; sptr = sdata; for(r = 0; r < h; r++){ sval = sround((r - mh) * fctr); shift_row(cptr, sptr, w, sval); cptr += w; sptr += w; } bytes2bits(sdata, odata, len); free(cdata); free(sdata); return(fctr);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?