30 #include <mln/core/image/image2d.hh>
31 #include <mln/core/image/imorph/tr_image.hh>
32 #include <mln/core/alias/neighb2d.hh>
34 #include <mln/data/stretch.hh>
36 #include <mln/io/pbm/all.hh>
37 #include <mln/io/ppm/save.hh>
38 #include <mln/io/magick/all.hh>
40 #include <mln/math/min.hh>
42 #include <mln/logical/not.hh>
44 #include <mln/literal/colors.hh>
45 #include <mln/value/rgb8.hh>
47 #include <mln/fun/v2v/rgb_to_luma.hh>
49 #include <mln/data/wrap.hh>
51 #include <mln/draw/box.hh>
53 #include <mln/geom/translate.hh>
55 #include <mln/subsampling/antialiased.hh>
57 #include <scribo/draw/bounding_boxes.hh>
58 #include <scribo/draw/groups_bboxes.hh>
60 #include <scribo/binarization/sauvola_ms.hh>
61 #include <scribo/binarization/sauvola.hh>
63 #include <scribo/primitive/extract/components.hh>
65 #include <scribo/primitive/link/merge_double_link.hh>
66 #include <scribo/primitive/link/with_single_left_link.hh>
67 #include <scribo/primitive/link/with_single_right_link.hh>
69 #include <scribo/primitive/group/apply.hh>
70 #include <scribo/primitive/group/from_double_link.hh>
71 #include <scribo/primitive/group/from_single_link.hh>
73 #include <scribo/primitive/regroup/from_single_left_link.hh>
74 #include <scribo/primitive/regroup/from_single_left_link_wrt_h_ratio.hh>
76 #include <scribo/filter/objects_size_ratio.hh>
78 #include <scribo/filter/object_groups_with_holes.hh>
80 #include <scribo/filter/object_links_bbox_h_ratio.hh>
81 #include <scribo/filter/object_links_bbox_overlap.hh>
83 #include <scribo/filter/common/objects_photo.hh>
85 #include <scribo/filter/object_groups_small.hh>
86 #include <scribo/filter/object_groups_mean_width.hh>
88 #include <scribo/debug/highlight_text_area.hh>
90 #include <scribo/debug/decision_image.hh>
92 #include <scribo/debug/option_parser.hh>
94 #include <scribo/preprocessing/split_bg_fg.hh>
95 #include <scribo/preprocessing/rotate_90.hh>
97 #include <scribo/debug/logger.hh>
98 #include <scribo/toolchain/text_in_picture.hh>
100 #include <mln/util/timer.hh>
103 #include <scribo/afp/components.hh>
104 #include <scribo/afp/link.hh>
106 #include <scribo/core/line_set.hh>
107 #include <scribo/text/recognition.hh>
108 #include <scribo/text/look_like_text_lines.hh>
111 #include <scribo/io/text_boxes/save.hh>
116 {
"input.*",
"An image." },
117 {
"output.ppm",
"A color image where the text is highlighted." },
118 {
"output.txt",
"Recognized text with its position." },
126 {
"fg-extraction",
"Detect and slit foreground/background components. (default: disabled)",
false },
127 {
"ms-bin",
"Use a multi-scale binarization. (default: enabled)",
true },
136 {
"debug-prefix",
"Enable debug image outputs. Prefix image name with that "
137 "given prefix.",
"<prefix>", 0, 1, 0 },
138 {
"lambda",
"Set the maximum area of the background objects. It is only useful if fg-extraction is enabled.",
"<size>",
140 {
"max-dim-size",
"Set the maximum size of the largest image dimension.",
"<size>", 0, 1,
"1024" },
141 {
"ocr-lang",
"Set the language to be recognized by the OCR (Tesseract). "
142 "According to your system, you can choose between eng (default), "
143 "fra, deu, ita, nld, por, spa, vie",
144 "<lang>", scribo::debug::check_ocr_lang, 1,
"eng" },
145 {
"verbose",
"Enable verbose mode", 0, 0, 0, 0 },
152 int main(
int argc,
char* argv[])
154 using namespace scribo;
155 using namespace scribo::primitive;
160 if (!options.parse(argc, argv))
163 if (options.is_set(
"debug-prefix"))
177 bool verbose = options.is_set(
"verbose");
178 unsigned max_dim_size = atoi(options.opt_value(
"max-dim-size").c_str());
179 bool fg_extraction = options.is_enabled(
"fg-extraction");
180 bool multi_scale_bin = options.is_enabled(
"ms-bin");
181 unsigned lambda = atoi(options.opt_value(
"lambda").c_str());
184 std::cout <<
"Using max_dim_size = " << max_dim_size
185 <<
" - fg_extraction = " << fg_extraction
186 <<
" - multi_scale_bin = " << multi_scale_bin
187 <<
" - lambda = " << lambda << std::endl;
192 f.enable_bg_removal = fg_extraction;
193 f.enable_multi_scale_bin = multi_scale_bin;
194 f.max_dim_size = max_dim_size;
206 options.arg(
"output.ppm"));
214 std::cout << output.nelements() <<
" text lines found." << std::endl;