ho_bitmap * ho_bitmap_filter_hlink (ho_bitmap * m, int size, int max_height) { ho_bitmap *m_out; ho_bitmap *m_temp; /* this function use objects by the "_by_size" function this is why it is a * filter and not regular bitmap function */ /* get only the thin objects */ m_temp = ho_bitmap_filter_by_size (m, 5, max_height, 5, m->width / 2); /* hlink the thin objects */ m_out = ho_bitmap_hlink (m_temp, size); /* add the rest of the large objects */ ho_bitmap_or (m_out, m); ho_bitmap_free (m_temp); return m_out; }
/** convert a gray pixbuf to bitmap @param pix_in the input ho_pixbuf @param options image process options @param progress a progress indicator 0..100 @return newly allocated gray ho_bitmap */ ho_bitmap *hocr_image_processing (const ho_pixbuf * pix_in, HEBOCR_IMAGE_OPTIONS *image_options, int *progress) { ho_bitmap *bitmap_out = NULL; ho_bitmap *bitmap_temp = NULL; double angle = 0.0; int scale_by = 0; unsigned char size = 0; /* init progress */ *progress = 0; /* get the raw b/w bitmap from the pixbuf */ bitmap_temp = ho_pixbuf_to_bitmap_wrapper(pix_in, image_options, size); if (!bitmap_temp) return NULL; /* update progress */ *progress = 25; /* do we want to auto scale ? */ if (!image_options->scale && image_options->auto_scale) { /* get fonts size for autoscale */ if (ho_dimentions_font_width_height_nikud (bitmap_temp, 6, 200, 6, 200)) return NULL; /* if fonts are too small, re-scale image */ if (bitmap_temp->font_height < 15) scale_by = 3; else if (bitmap_temp->font_height < 30) scale_by = 2; else scale_by = 1; if (scale_by > 1) { /* re-create bitmap */ ho_bitmap_free (bitmap_temp); bitmap_temp = ho_pixbuf_to_bitmap_wrapper (pix_in, image_options, size); if (!bitmap_temp) return NULL; } } /* update progress */ *progress = 50; /* remove very small and very large things */ bitmap_out = ho_bitmap_filter_by_size (bitmap_temp, 3, 3 * bitmap_temp->height / 4, 3, 3 * bitmap_temp->width / 4); ho_bitmap_free (bitmap_temp); if (!bitmap_out) return NULL; /* update progress */ *progress = 75; /* rotate image */ if (image_options->rotation_angle != 0) { bitmap_temp = ho_bitmap_rotate(bitmap_out, image_options->rotation_angle); ho_bitmap_free (bitmap_out); if (!bitmap_temp) return NULL; bitmap_out = bitmap_temp; } else if (image_options->auto_rotate) { /* get fonts size for auto angle */ if (ho_dimentions_font_width_height_nikud (bitmap_out, 6, 200, 6, 200)) return NULL; angle = ho_dimentions_get_lines_angle (bitmap_out); if (angle) { bitmap_temp = ho_bitmap_rotate (bitmap_out, angle); ho_bitmap_free (bitmap_out); if (!bitmap_temp) return NULL; bitmap_out = bitmap_temp; } } return bitmap_out; }