---
scribo/ChangeLog | 5 ++
scribo/src/text_in_photo_fast.cc | 79 ++++++++++++++++++++++++++++---------
2 files changed, 65 insertions(+), 19 deletions(-)
diff --git a/scribo/ChangeLog b/scribo/ChangeLog
index 34a258f..ffd4a39 100644
--- a/scribo/ChangeLog
+++ b/scribo/ChangeLog
@@ -1,5 +1,10 @@
2010-04-13 Guillaume Lazzara <z(a)lrde.epita.fr>
+ * scribo/src/text_in_photo_fast.cc: Group routine parameters in a
+ global structure.
+
+2010-04-13 Guillaume Lazzara <z(a)lrde.epita.fr>
+
Add new Sauvola overloads and update examples.
* scribo/binarization/internal/first_pass_functor.hh,
diff --git a/scribo/src/text_in_photo_fast.cc b/scribo/src/text_in_photo_fast.cc
index 68b2014..d61cc6f 100644
--- a/scribo/src/text_in_photo_fast.cc
+++ b/scribo/src/text_in_photo_fast.cc
@@ -57,8 +57,6 @@
#include <mln/subsampling/antialiased.hh>
-#include <mln/subsampling/antialiased_rgb.hh>
-
#include <scribo/draw/bounding_boxes.hh>
#include <scribo/draw/groups_bboxes.hh>
@@ -112,6 +110,7 @@
const char *args_desc[][2] =
{
{ "input.ppm", "A color image." },
+ { "ouput.ppm", "A color image where the text is highlighted." },
{ "debug_output_dir", "Directory were debug images will be saved"
},
{ "lambda", "Lambda value used for foreground extraction" },
{0, 0}
@@ -121,6 +120,38 @@ const char *args_desc[][2] =
namespace mln
{
+
+ struct config
+ {
+ config()
+ {
+ sauvola_s = 3u;
+ sauvola_min_w = 51u;
+
+ // Group Filtering
+ bbox_h_ratio = 1.50f;
+ bbox_overlap = 0.80f;
+ small_groups = 3;
+ v_thickness = 8;
+ regroup_dmax = 30;
+ group_min_holes = 3;
+ }
+
+
+ // Sauvola ms
+ unsigned sauvola_s;
+ unsigned sauvola_min_w;
+
+ // Group Filtering
+ float bbox_h_ratio;
+ float bbox_overlap;
+ unsigned small_groups;
+ unsigned v_thickness;
+ unsigned regroup_dmax;
+ unsigned group_min_holes;
+ };
+
+
struct mask_non_text : Function_v2v<mask_non_text>
{
typedef value::rgb8 result;
@@ -239,10 +270,9 @@ int main(int argc, char* argv[])
if (argc < 3 || argc > 10)
return scribo::debug::usage(argv,
"Find text in a photo.\n\n\
-Common usage: ./ppm_text_in_photo input.ppm output.ppm 1 1 1 1 1",
+Common usage: ./text_in_photo_fast input.ppm output.ppm 1 1 1 1 1",
"input.ppm output.ppm <bg/fg enabled> <sauvola_ms enabled> <Bg
comp filter enabled> <small group filter enabled> <thin group filter
enabled> [debug_output_dir] [lambda]",
- args_desc,
- "A color image where the text is highlighted.");
+ args_desc);
std::string out_base_dir;
bool debug = false;
@@ -255,6 +285,8 @@ Common usage: ./ppm_text_in_photo input.ppm output.ppm 1 1 1 1
1",
trace::entering("main");
+ config conf;
+
image2d<value::rgb8> input_rgb;
io::magick::load(input_rgb, argv[1]);
@@ -264,7 +296,7 @@ Common usage: ./ppm_text_in_photo input.ppm output.ppm 1 1 1 1
1",
std::cout << "Original domain: " << input_rgb.domain() <<
std::endl;
- input_rgb = mln::subsampling::impl::antialiased_2d_rgb(input_rgb, factor);
+ input_rgb = mln::subsampling::antialiased(input_rgb, factor);
std::cout << "Resized domain: " << input_rgb.domain() <<
std::endl;
@@ -318,11 +350,11 @@ Common usage: ./ppm_text_in_photo input.ppm output.ppm 1 1 1 1
1",
unsigned w = std::min(intensity_ima.nrows() / 3, intensity_ima.ncols() / 3);
if (! w % 2)
++w;
- w = std::min(w, 51u);
+ w = std::min(w, conf.sauvola_min_w);
if (argc > 4 && atoi(argv[4]) != 0)
{
std::cout << "** Using sauvola_ms with w_1 = " << w <<
std::endl;
- input = scribo::binarization::sauvola_ms(intensity_ima, w, 3, 67);
+ input = scribo::binarization::sauvola_ms(intensity_ima, w, conf.sauvola_s);
}
else
{
@@ -420,7 +452,7 @@ Common usage: ./ppm_text_in_photo input.ppm output.ppm 1 1 1 1
1",
timer_.restart();
object_links<L>
hratio_filtered_links = filter::object_links_bbox_h_ratio(merged_links,
- 1.50f);
+ conf.bbox_h_ratio);
@@ -431,7 +463,8 @@ Common usage: ./ppm_text_in_photo input.ppm output.ppm 1 1 1 1
1",
image2d<value::rgb8>
hratio_decision_image = scribo::debug::decision_image(input,
merged_links,
- hratio_filtered_links);
+ hratio_filtered_links,
+ anchor::MassCenter);
io::ppm::save(hratio_decision_image,
scribo::make::debug_filename("hratio_links_decision_image.ppm"));
}
@@ -442,7 +475,8 @@ Common usage: ./ppm_text_in_photo input.ppm output.ppm 1 1 1 1
1",
//Remove links if bboxes overlap too much.
object_links<L> overlap_filtered_links
- = filter::object_links_bbox_overlap(hratio_filtered_links, 0.80f);
+ = filter::object_links_bbox_overlap(hratio_filtered_links,
+ conf.bbox_overlap);
@@ -453,7 +487,8 @@ Common usage: ./ppm_text_in_photo input.ppm output.ppm 1 1 1 1
1",
image2d<value::rgb8> overlap_decision_image
= scribo::debug::decision_image(input,
hratio_filtered_links,
- overlap_filtered_links);
+ overlap_filtered_links,
+ anchor::MassCenter);
io::ppm::save(overlap_decision_image,
scribo::make::debug_filename("overlap_links_decision_image.ppm"));
}
@@ -514,7 +549,8 @@ Common usage: ./ppm_text_in_photo input.ppm output.ppm 1 1 1 1
1",
if (argc > 6 && atoi(argv[6]) != 0)
{
std::cout << "** Using group too small" << std::endl;
- filtered_small_groups = filter::object_groups_small(groups, 3);
+ filtered_small_groups = filter::object_groups_small(groups,
+ conf.small_groups);
}
else
filtered_small_groups = groups;
@@ -532,7 +568,7 @@ Common usage: ./ppm_text_in_photo input.ppm output.ppm 1 1 1 1
1",
scribo::draw::groups_bboxes(decision_image, groups, literal::red);
scribo::draw::groups_bboxes(decision_image, filtered_small_groups,
- literal::blue);
+ literal::green);
io::ppm::save(decision_image,
@@ -549,7 +585,8 @@ Common usage: ./ppm_text_in_photo input.ppm output.ppm 1 1 1 1
1",
{
std::cout << "** Using group too thin" << std::endl;
filtered_thin_groups
- = filter::object_groups_v_thickness(filtered_small_groups, 8);
+ = filter::object_groups_v_thickness(filtered_small_groups,
+ conf.v_thickness);
}
else
filtered_thin_groups = filtered_small_groups;
@@ -565,7 +602,7 @@ Common usage: ./ppm_text_in_photo input.ppm output.ppm 1 1 1 1
1",
scribo::draw::groups_bboxes(decision_image, filtered_small_groups,
literal::red);
scribo::draw::groups_bboxes(decision_image, filtered_thin_groups,
- literal::blue);
+ literal::green);
io::ppm::save(decision_image,
scribo::make::debug_filename("thin_groups_filter.ppm"));
@@ -578,7 +615,8 @@ Common usage: ./ppm_text_in_photo input.ppm output.ppm 1 1 1 1
1",
g_timer.restart();
// Grouping groups together if possible.
- groups = primitive::regroup::from_single_left_link(filtered_thin_groups, 30);
+ groups = primitive::regroup::from_single_left_link(filtered_thin_groups,
+ conf.regroup_dmax);
// component_set<L>
@@ -607,7 +645,8 @@ Common usage: ./ppm_text_in_photo input.ppm output.ppm 1 1 1 1
1",
{
std::cout << "** Using objects_with_two_holes" << std::endl;
- groups = scribo::filter::object_groups_with_holes(groups, 5);
+ groups = scribo::filter::object_groups_with_holes(groups,
+ conf.group_min_holes);
t_ = g_timer;
std::cout << "Objects_with_holes " << t_ << std::endl;
@@ -626,7 +665,9 @@ Common usage: ./ppm_text_in_photo input.ppm output.ppm 1 1 1 1
1",
{
decision_image = data::convert(value::rgb8(), input);
- scribo::draw::groups_bboxes(decision_image, groups, literal::blue);
+ scribo::draw::groups_bboxes(decision_image, filtered_thin_groups,
+ literal::red);
+ scribo::draw::groups_bboxes(decision_image, groups, literal::green);
io::ppm::save(decision_image,
scribo::make::debug_filename("group_with_holes_filter.ppm"));
}
--
1.5.6.5