⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 charcut.cpp

📁 一OCR的相关资料。.希望对研究OCR的朋友有所帮助.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                             IMAGE &clip_image,   //unscaled sq subimage                             float &baseline_pos  //baseline ht in image                            ) {  INT16 clip_image_xsize;        //sub image x size  INT16 clip_image_ysize;        //sub image y size  INT16 x_shift;                 //from pixrow to subim  INT16 y_shift;                 //from pixrow to subim  BOX char_pix_box;              //bbox of char pixels  INT16 y_dest;  INT16 x_min;  INT16 x_max;  INT16 x_min_dest;  INT16 x_max_dest;  INT16 x_width;  INT16 y;  clip_image_xsize = clip_image.get_xsize ();  clip_image_ysize = clip_image.get_ysize ();  char_pix_box = bounding_box ();  /*    The y shift is calculated by first finding the coord of the bottom of the    image relative to the image lines. Then reducing this so by the amount    relative to the clip image size, necessary to vertically position the    character.  */  y_shift = char_pix_box.bottom () - row_offset -    (INT16) floor ((clip_image_ysize - char_pix_box.height () + 0.5) / 2);  /*    The x_shift is the shift to be applied to the page coord in the pixrow to    generate a centred char in the clip image.  Thus the left hand edge of the    char is shifted to the margin width of the centred character.  */  x_shift = char_pix_box.left () -    (INT16) floor ((clip_image_xsize - char_pix_box.width () + 0.5) / 2);  for (y = 0; y < row_count; y++) {    /*      Check that there is something in this row of the source that will fit in the      sub image.  If there is, reduce x range if necessary, then copy it    */    y_dest = y - y_shift;    if ((min[y] <= max[y]) && (y_dest >= 0) && (y_dest < clip_image_ysize)) {      x_min = min[y];      x_min_dest = x_min - x_shift;      if (x_min_dest < 0) {        x_min = x_min - x_min_dest;        x_min_dest = 0;      }      x_max = max[y];      x_max_dest = x_max - x_shift;      if (x_max_dest > clip_image_xsize - 1) {        x_max = x_max - (x_max_dest - (clip_image_xsize - 1));        x_max_dest = clip_image_xsize - 1;      }      x_width = x_max - x_min + 1;      if (x_width > 0) {        x_min -= im_box.left ();                                 //offset pixel ptr        imlines[y].pixels += x_min;        clip_image.put_line (x_min_dest, y_dest, x_width, imlines + y,          0);        imlines[y].init ();      //reset pixel ptr      }    }  }  /*    Baseline position relative to clip image: First find the baseline relative    to the page origin at the x coord of the centre of the character. Then    make this relative to the character bottom. Finally shift by the margin    between the bottom of the character and the bottom of the clip image.  */  if (row == NULL)    baseline_pos = 0;            //Not needed  else    baseline_pos = row->base_line ((char_pix_box.left () +      char_pix_box.right ()) / 2.0)      - char_pix_box.bottom ()      + ((clip_image_ysize - char_pix_box.height ()) / 2);}/************************************************************************* * char_clip_word() * * Generate a PIXROW_LIST with one element for each blob in the word, together * with the image lines for the whole word. *************************************************************************/void char_clip_word(                            //                    WERD *word,                 //word to be processed                    IMAGE &bin_image,           //whole image                    PIXROW_LIST *&pixrow_list,  //pixrows built                    IMAGELINE *&imlines,        //lines cut from image                    BOX &pix_box                //box defining imlines                   ) {  BOX word_box = word->bounding_box ();  PBLOB_LIST *blob_list;  PBLOB_IT blob_it;  PIXROW_IT pixrow_it;  INT16 pix_offset;              //Y pos of pixrow[0]  INT16 row_height;              //No of pix rows  INT16 imlines_x_offset;  PIXROW *prev;  PIXROW *next;  PIXROW *current;  BOOL8 changed;                 //still improving  BOOL8 just_changed;            //still improving  INT16 iteration_count = 0;  INT16 foreground_colour;  if (word->flag (W_INVERSE))    foreground_colour = 1;  else    foreground_colour = 0;  /* Define region for max pixrow expansion */  pix_box = word_box;  pix_box.move_bottom_edge (-pix_word_margin);  pix_box.move_top_edge (pix_word_margin);  pix_box.move_left_edge (-pix_word_margin);  pix_box.move_right_edge (pix_word_margin);  pix_box -= BOX (ICOORD (0, 0 + BUG_OFFSET),    ICOORD (bin_image.get_xsize (),    bin_image.get_ysize () - BUG_OFFSET));  /* Generate pixrows list */  pix_offset = pix_box.bottom ();  row_height = pix_box.height ();  blob_list = word->blob_list ();  blob_it.set_to_list (blob_list);  pixrow_list = new PIXROW_LIST;  pixrow_it.set_to_list (pixrow_list);  for (blob_it.mark_cycle_pt (); !blob_it.cycled_list (); blob_it.forward ()) {    PIXROW *row = new PIXROW (pix_offset, row_height, blob_it.data ());    ASSERT_HOST (!row->      bad_box (bin_image.get_xsize (), bin_image.get_ysize ()));    pixrow_it.add_after_then_move (row);  }  imlines = generate_imlines (bin_image, pix_box);  /* Contract pixrows - shrink min and max back to black pixels */  imlines_x_offset = pix_box.left ();  pixrow_it.move_to_first ();  for (pixrow_it.mark_cycle_pt ();  !pixrow_it.cycled_list (); pixrow_it.forward ()) {    ASSERT_HOST (!pixrow_it.data ()->      bad_box (bin_image.get_xsize (), bin_image.get_ysize ()));    pixrow_it.data ()->contract (imlines, imlines_x_offset,      foreground_colour);    ASSERT_HOST (!pixrow_it.data ()->      bad_box (bin_image.get_xsize (), bin_image.get_ysize ()));  }  /* Expand pixrows iteratively 1 pixel at a time */  do {    changed = FALSE;    pixrow_it.move_to_first ();    prev = NULL;    current = NULL;    next = pixrow_it.data ();    for (pixrow_it.mark_cycle_pt ();    !pixrow_it.cycled_list (); pixrow_it.forward ()) {      prev = current;      current = next;      if (pixrow_it.at_last ())        next = NULL;      else        next = pixrow_it.data_relative (1);      just_changed = current->extend (imlines, pix_box, prev, next,        foreground_colour);      ASSERT_HOST (!current->        bad_box (bin_image.get_xsize (),        bin_image.get_ysize ()));      changed = changed || just_changed;    }    iteration_count++;  }  while (changed);}/************************************************************************* * generate_imlines() * Get an array of IMAGELINES  holding a portion of an image *************************************************************************/IMAGELINE *generate_imlines(                   //get some imagelines                            IMAGE &bin_image,  //from here                            BOX &pix_box) {  IMAGELINE *imlines;            //array of lines  int i;  imlines = new IMAGELINE[pix_box.height ()];  for (i = 0; i < pix_box.height (); i++) {    imlines[i].init (pix_box.width ());                                 //coord to start at    bin_image.fast_get_line (pix_box.left (),      pix_box.bottom () + i + BUG_OFFSET,    //line to get      pix_box.width (),          //width to get      imlines + i);              //dest imline  }  return imlines;}/************************************************************************* * display_clip_image() * All the boring user interface bits to let you see what's going on *************************************************************************/#ifndef GRAPHICS_DISABLEDWINDOW display_clip_image(WERD *word,                //word to be processed                          IMAGE &bin_image,          //whole image                          PIXROW_LIST *pixrow_list,  //pixrows built                          BOX &pix_box               //box of subimage                         ) {  WINDOW clip_window;            //window for debug  BOX word_box = word->bounding_box ();  int border = word_box.height () / 2;  BOX display_box = word_box;  display_box.move_bottom_edge (-border);  display_box.move_top_edge (border);  display_box.move_left_edge (-border);  display_box.move_right_edge (border);  display_box -= BOX (ICOORD (0, 0 - BUG_OFFSET),    ICOORD (bin_image.get_xsize (),    bin_image.get_ysize () - BUG_OFFSET));  pgeditor_msg ("Creating Clip window...");  clip_window =    create_window ("Clipped Blobs",    SCROLLINGWIN,    editor_word_xpos, editor_word_ypos,    3 * (word_box.width () + 2 * border),    3 * (word_box.height () + 2 * border),  //window width,height                                 // xmin, xmax    display_box.left (), display_box.right (),    display_box.bottom () - BUG_OFFSET,    display_box.top () - BUG_OFFSET,  // ymin, ymax    TRUE, FALSE, FALSE, TRUE);   // down event & key only  pgeditor_msg ("Creating Clip window...Done");  clear_view_surface(clip_window);   show_sub_image (&bin_image,    display_box.left (),    display_box.bottom (),    display_box.width (),    display_box.height (),    clip_window,    display_box.left (), display_box.bottom () - BUG_OFFSET);  word->plot (clip_window, RED);  word_box.plot (clip_window, INT_HOLLOW, TRUE, BLUE, BLUE);  pix_box.plot (clip_window, INT_HOLLOW, TRUE, BLUE, BLUE);  plot_pixrows(pixrow_list, clip_window);   overlap_picture_ops(TRUE);   return clip_window;}/************************************************************************* * display_images() * Show a pair of clip and scaled character images and wait for key before * continuing. *************************************************************************/void display_images(IMAGE &clip_image, IMAGE &scaled_image) {   WINDOW clip_im_window;         //window for debug  WINDOW scale_im_window;        //window for debug  INT16 i;  GRAPHICS_EVENT event;          //                                                      c;                                 // xmin xmax ymin ymax  clip_im_window = create_window ("Clipped Blob", SCROLLINGWIN, editor_word_xpos - 20, editor_word_ypos - 100, 5 * clip_image.get_xsize (), 5 * clip_image.get_ysize (), 0, clip_image.get_xsize (), 0, clip_image.get_ysize (),    TRUE, FALSE, FALSE, TRUE);   // down event & key only  clear_view_surface(clip_im_window);   show_sub_image (&clip_image,    0, 0,    clip_image.get_xsize (), clip_image.get_ysize (),    clip_im_window, 0, 0);  line_color_index(clip_im_window, RED);   for (i = 1; i < clip_image.get_xsize (); i++) {    move2d (clip_im_window, i, 0);    draw2d (clip_im_window, i, clip_image.get_xsize ());  }  for (i = 1; i < clip_image.get_ysize (); i++) {    move2d (clip_im_window, 0, i);    draw2d (clip_im_window, clip_image.get_xsize (), i);  }                                 // xmin xmax ymin ymax  scale_im_window = create_window ("Scaled Blob", SCROLLINGWIN, editor_word_xpos + 300, editor_word_ypos - 100, 5 * scaled_image.get_xsize (), 5 * scaled_image.get_ysize (), 0, scaled_image.get_xsize (), 0, scaled_image.get_ysize (),    TRUE, FALSE, FALSE, TRUE);   // down event & key only  clear_view_surface(scale_im_window);   show_sub_image (&scaled_image,    0, 0,    scaled_image.get_xsize (), scaled_image.get_ysize (),    scale_im_window, 0, 0);  line_color_index(scale_im_window, RED);   for (i = 1; i < scaled_image.get_xsize (); i++) {    move2d (scale_im_window, i, 0);    draw2d (scale_im_window, i, scaled_image.get_xsize ());  }  for (i = 1; i < scaled_image.get_ysize (); i++) {    move2d (scale_im_window, 0, i);    draw2d (scale_im_window, scaled_image.get_xsize (), i);  }  overlap_picture_ops(TRUE);   await_event(scale_im_window, TRUE, ANY_EVENT, &event);   destroy_window(clip_im_window);   destroy_window(scale_im_window); }/************************************************************************* * plot_pixrows() * Display a list of pixrows *************************************************************************/void plot_pixrows(  //plot for all blobs                  PIXROW_LIST *pixrow_list,                  WINDOW win) {  PIXROW_IT pixrow_it(pixrow_list);   INT16 colour = RED;  for (pixrow_it.mark_cycle_pt ();  !pixrow_it.cycled_list (); pixrow_it.forward ()) {    if (colour > RED + 7)      colour = RED;    perimeter_color_index (win, (COLOUR) colour);    interior_style(win, INT_HOLLOW, TRUE);     pixrow_it.data ()->plot (win);    colour++;  }}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -