segblob.c
来自「NIST Handwriting OCR Testbed」· C语言 代码 · 共 180 行
C
180 行
/*# proc: segbinblob - segments the given binary bitmap into blobs, storing the# proc: results in an mis memory and returning stats.# proc: segbinblobdigits - segments the given binary bitmap containing a# proc: single line of handprinted digits, storing the# proc: results in an mis memory and returning stats.# proc: paste_digit_blobs - pastes certain blobs back together in an attempt# proc: to put disjoint hats back on fives.*/#include <stdio.h>#include <math.h>#include <mfs.h>#include <ihead.h>#include <mis.h>#include <findblob.h>#include <defs.h>#include <segment.h>/************************************************************/segbinblob(mis, par_x, par_y, prisp_w, prisp_h, bdata, w, h)MIS **mis;int **par_x, **par_y, **prisp_w, **prisp_h;unsigned char *bdata;int w, h;{ int mw, mh, ow, oh, bin_w, bin_h; int ret, blkpix; unsigned char *cdata, *binblob, *allocate_image(); int box_x, box_y, box_w, box_h; int strt_x, strt_y; int mcount, blob_found; mw = ENTW; mh = ENTH; cdata = allocate_image(w, h, 8); bits2bytes(bdata, cdata, w*h); /* mw is not necessarily a multiple of 8, so the output binary width */ /* ow may need to be byte aligned */ ow = (int)(ceil(mw / 8.0))<<3; oh = mh; (*mis) = allocmis(NULL, 1, BPI, ow, oh, MAX_BLOBS); malloc_int(par_x, MAX_BLOBS, "segbinblob : par_x"); malloc_int(par_y, MAX_BLOBS, "segbinblob : par_y"); malloc_int(prisp_w, MAX_BLOBS, "segbinblob : prisp_w"); malloc_int(prisp_h, MAX_BLOBS, "segbinblob : prisp_h"); strt_x = 0; strt_y = 0; blob_found = TRUE; mcount = 0; while (blob_found){ box_w = mw; box_h = mh; ret = findbinblob(cdata, w, h, ERASE, W_H_BLOB, &strt_x, &strt_y, &binblob, &bin_w, &bin_h, &box_x, &box_y, &box_w, &box_h); switch (ret){ case 0: blob_found = FALSE; break; case 1: if(bin_w != ow) fatalerr("segbinblob", "width of blob raster not equal to mis entry", NULL); if(mcount < MAX_BLOBS){ blkpix = black_pixel_count(binblob, bin_w, bin_h); if((blkpix > MINPIXELS) && (blkpix < MAXPIXELS)){ appendmis(binblob, bin_w, bin_h, (*mis)); (*par_x)[mcount] = box_x; (*par_y)[mcount] = box_y; (*prisp_w)[mcount] = box_w; (*prisp_h)[mcount] = box_h; mcount++; } /* if the blob has too few or too many black pixels, */ /* then ignore it */ } else fatalerr("segbinblob", "mis overflow", "MAX_BLOBS exceeded"); free(binblob); break; case 2: /* if blob spatially too big, then ignore it */ free(binblob); break; default: fatalerr("segbinblob", "received unknown return code", "findbinblob"); break; } } free(cdata);}/************************************************************/segbinblobdigits(mis, par_x, par_y, prisp_w, prisp_h, bdata, w, h)MIS **mis;int **par_x, **par_y, **prisp_w, **prisp_h;unsigned char *bdata;int w, h;{ segbinblob(mis, par_x, par_y, prisp_w, prisp_h, bdata, w, h); paste_digit_blobs(*mis, *par_x, *par_y, *prisp_w, *prisp_h);}/************************************************************/paste_digit_blobs(mis, par_x, par_y, prisp_w, prisp_h)MIS *mis;int *par_x, *par_y, *prisp_w, *prisp_h;{ int cur_i, next_i; unsigned char *entry; int entsize; int lx, rx, ty, by, nx, ny, nw, nh; int frx, fry, tox, toy; cur_i = 0; next_i = 1; entsize = SizeFromDepth(mis->entw, mis->enth, mis->misd); malloc_uchar(&entry, entsize, "paste_digit_blobs : entry"); while(next_i < mis->ent_num){ if(((par_y[next_i] + prisp_h[next_i] - par_y[cur_i]) <= (prisp_h[cur_i] >> 1)) && ((par_x[next_i] - par_x[cur_i] - prisp_w[cur_i]) <= (prisp_w[cur_i] >> 1))){ lx = min(par_x[cur_i], par_x[next_i]); rx = max(par_x[cur_i] + prisp_w[cur_i], par_x[next_i] + prisp_w[next_i]); ty = min(par_y[cur_i], par_y[next_i]); by = max(par_y[cur_i] + prisp_h[cur_i], par_y[next_i] + prisp_h[next_i]); nw = rx - lx; nh = by - ty; if((nw <= mis->entw) && (nh <= mis->enth)){ nx = (mis->entw - nw)>>1; ny = (mis->enth - nh)>>1; memset(entry, NULL, entsize); /* copy current blob */ frx = (mis->entw - prisp_w[cur_i])>>1; fry = (cur_i * mis->entw) + ((mis->enth - prisp_h[cur_i])>>1); tox = nx + par_x[cur_i] - lx; toy = ny + par_y[cur_i] - ty; binary_subimage_or(mis->data, mis->misw, mis->mish, entry, mis->entw, mis->enth, frx, fry, prisp_w[cur_i], prisp_h[cur_i], tox, toy); /* copy next blob */ frx = (mis->entw - prisp_w[next_i])>>1; fry = (next_i * mis->entw) + ((mis->enth - prisp_h[next_i])>>1); tox = nx + par_x[next_i] - lx; toy = ny + par_y[next_i] - ty; binary_subimage_or(mis->data, mis->misw, mis->mish, entry, mis->entw, mis->enth, frx, fry, prisp_w[next_i], prisp_h[next_i], tox, toy); /* write new entry into current position */ par_x[cur_i] = lx; remove_from_list(next_i, par_x, mis->ent_num); par_y[cur_i] = ty; remove_from_list(next_i, par_y, mis->ent_num); prisp_w[cur_i] = nw; remove_from_list(next_i, prisp_w, mis->ent_num); prisp_h[cur_i] = nh; remove_from_list(next_i, prisp_h, mis->ent_num); changemis(mis, cur_i, entry); deletemis(mis, next_i); } else{ cur_i++; next_i++; } } else{ cur_i++; next_i++; } } free(entry);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?