* debug/highlight_text_area.hh,
* debug/save_bboxes_image.hh: Add a new overload.
* debug/save_comp_diff.hh,
* debug/text_areas_image.hh,
* primitive/regroup/from_single_left_link_wrt_h_ratio.hh: New.
---
scribo/ChangeLog | 11 ++
scribo/debug/highlight_text_area.hh | 50 ++++++++
scribo/debug/save_bboxes_image.hh | 34 +++++-
scribo/debug/save_comp_diff.hh | 105 ++++++++++++++++
scribo/debug/text_areas_image.hh | 131 ++++++++++++++++++++
...ink.hh => from_single_left_link_wrt_h_ratio.hh} | 45 ++++---
6 files changed, 356 insertions(+), 20 deletions(-)
create mode 100644 scribo/debug/save_comp_diff.hh
create mode 100644 scribo/debug/text_areas_image.hh
copy scribo/primitive/regroup/{from_single_left_link.hh =>
from_single_left_link_wrt_h_ratio.hh} (73%)
diff --git a/scribo/ChangeLog b/scribo/ChangeLog
index 3b441f7..d346428 100644
--- a/scribo/ChangeLog
+++ b/scribo/ChangeLog
@@ -1,5 +1,16 @@
2010-08-09 Guillaume Lazzara <z(a)lrde.epita.fr>
+ Add new routines in Scribo.
+
+ * debug/highlight_text_area.hh,
+ * debug/save_bboxes_image.hh: Add a new overload.
+
+ * debug/save_comp_diff.hh,
+ * debug/text_areas_image.hh,
+ * primitive/regroup/from_single_left_link_wrt_h_ratio.hh: New.
+
+2010-08-09 Guillaume Lazzara <z(a)lrde.epita.fr>
+
Remove deprecated files.
* core/internal/link_functor_base.hh,
diff --git a/scribo/debug/highlight_text_area.hh b/scribo/debug/highlight_text_area.hh
index 5ab15b9..1ff673e 100644
--- a/scribo/debug/highlight_text_area.hh
+++ b/scribo/debug/highlight_text_area.hh
@@ -45,6 +45,7 @@
# include <scribo/core/component_set.hh>
# include <scribo/core/line_set.hh>
+# include <mln/geom/rotate.hh>
namespace scribo
{
@@ -244,6 +245,55 @@ namespace scribo
}
+ template <typename I, typename L>
+ mln_ch_value(I, value::rgb8)
+ highlight_text_area_rotated(const Image<I>& input_,
+ const scribo::component_set<L>& components,
+ double angle, box2d rb)
+ {
+ trace::entering("scribo::debug::highlight_text_area");
+
+ const I& input = exact(input_);
+
+ mln_precondition(input.is_valid());
+ mlc_is(mln_value(I), value::rgb8)::check();
+
+ typedef mln_ch_value(I, bool) mask_t;
+ mask_t mask;
+ initialize(mask, input);
+ data::fill(mask, false);
+
+ mln::util::array<mln_box(I)> bbox(unsigned(components.nelements()) + 1);
+
+ for_all_comps(i, components)
+ if (components(i).is_valid())
+ {
+ bbox(i) = components(i).bbox();
+ bbox(i).pmin().row() += rb.pmin().row();
+ bbox(i).pmin().col() += rb.pmin().col();
+ bbox(i).pmax().row() += rb.pmin().row();
+ bbox(i).pmax().col() += rb.pmin().col();
+
+ bbox(i) = mln::geom::rotate(bbox(i), - angle,
+ input.domain().pcenter());
+ }
+
+ for_all_comps(i, components)
+ if (components(i).is_valid())
+ data::fill((mask | bbox(i)).rw(), true);
+
+ internal::mask_non_text<mask_t, mln_value(I)> f(mask);
+ mln_ch_value(I, value::rgb8) output = data::transform(input, f);
+
+ for_all_comps(i, components)
+ if (components(i).is_valid())
+ mln::draw::box(output, bbox(i), literal::red);
+
+ trace::exiting("scribo::debug::highlight_text_area");
+ return output;
+ }
+
+
# endif // ! MLN_INCLUDE_ONLY
diff --git a/scribo/debug/save_bboxes_image.hh b/scribo/debug/save_bboxes_image.hh
index f406e08..ee781c1 100644
--- a/scribo/debug/save_bboxes_image.hh
+++ b/scribo/debug/save_bboxes_image.hh
@@ -1,4 +1,5 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2009, 2010 EPITA Research and Development Laboratory
+// (LRDE)
//
// This file is part of Olena.
//
@@ -76,6 +77,14 @@ namespace scribo
const line_set<L>& lines,
const std::string& filename);
+ /// \overload.
+ template <typename I, typename L>
+ inline
+ void
+ save_bboxes_image(const Image<I>& input,
+ const component_set<L>& comps,
+ const std::string& filename,
+ const value::rgb8& value);
# ifndef MLN_INCLUDE_ONLY
@@ -132,6 +141,29 @@ namespace scribo
}
+ template <typename I, typename L>
+ inline
+ void
+ save_bboxes_image(const Image<I>& input,
+ const component_set<L>& comps,
+ const std::string& filename,
+ const value::rgb8& value)
+ {
+ trace::entering("scribo::debug::save_bboxes_image");
+ mln_precondition(exact(input).is_valid());
+
+ mln_ch_value(I, value::rgb8)
+ output = data::convert(value::rgb8(), input);
+
+ for_all_comps(c, comps)
+ if (comps(c).is_valid())
+ mln::draw::box(output, comps(c).bbox(), value);
+
+ mln::io::ppm::save(output, filename);
+ trace::exiting("scribo::debug::save_bboxes_image");
+ }
+
+
# endif // ! MLN_INCLUDE_ONLY
} // end of namespace scribo::debug
diff --git a/scribo/debug/save_comp_diff.hh b/scribo/debug/save_comp_diff.hh
new file mode 100644
index 0000000..f1f93f0
--- /dev/null
+++ b/scribo/debug/save_comp_diff.hh
@@ -0,0 +1,105 @@
+// Copyright (C) 2009, 2010 EPITA Research and Development Laboratory
+// (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+#ifndef SCRIBO_DEBUG_SAVE_COMP_DIFF_HH
+# define SCRIBO_DEBUG_SAVE_COMP_DIFF_HH
+
+/// \file
+///
+/// Show the difference between two object images.
+
+# include <mln/core/image/image2d.hh>
+# include <mln/core/concept/image.hh>
+# include <mln/data/fill.hh>
+# include <mln/labeling/colorize.hh>
+# include <mln/value/rgb8.hh>
+# include <mln/io/ppm/save.hh>
+# include <mln/literal/black.hh>
+# include <mln/literal/colors.hh>
+# include <mln/pw/all.hh>
+# include <mln/core/image/dmorph/image_if.hh>
+
+# include <scribo/core/macros.hh>
+# include <scribo/core/component_set.hh>
+
+namespace scribo
+{
+
+ namespace debug
+ {
+
+ using namespace mln;
+
+ /*! \brief Show the difference between two object images.
+
+ \param[in] lbl A component set.
+ \param[in] lbl_2 Another component set.
+ \param[in] filename The output filename.
+
+ */
+ template <typename L, typename L2>
+ void
+ save_comp_diff(const component_set<L>& cset_1,
+ const component_set<L2>& cset_2,
+ const std::string& filename);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ template <typename L, typename L2>
+ void
+ save_comp_diff(const component_set<L>& cset_1,
+ const component_set<L2>& cset_2,
+ const std::string& filename)
+ {
+ trace::entering("scribo::debug::save_comp_diff");
+
+ image2d<value::rgb8> output;
+ initialize(output, cset_1.labeled_image());
+
+ data::fill(output, literal::black);
+
+ for_all_comps(i, cset_1)
+ data::fill(((output | cset_1(i).bbox()).rw() | (pw::value(cset_1.labeled_image())
== i)).rw(), literal::red);
+
+ for_all_comps(i, cset_2)
+ data::fill(((output | cset_2(i).bbox()).rw() | (pw::value(cset_2.labeled_image())
== i)).rw(), literal::green);
+
+ io::ppm::save(output, filename);
+
+ trace::exiting("scribo::debug::save_comp_diff");
+ }
+
+
+# endif // ! MLN_INCLUDE_ONLY
+
+
+ } // end of namespace scribo::debug
+
+} // end of namespace scribo
+
+#endif // ! SCRIBO_DEBUG_SAVE_COMP_DIFF_HH
diff --git a/scribo/debug/text_areas_image.hh b/scribo/debug/text_areas_image.hh
new file mode 100644
index 0000000..f6a2f0f
--- /dev/null
+++ b/scribo/debug/text_areas_image.hh
@@ -0,0 +1,131 @@
+// Copyright (C) 2010 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+
+#ifndef SCRIBO_DEBUG_TEXT_AREAS_IMAGE_HH
+# define SCRIBO_DEBUG_TEXT_AREAS_IMAGE_HH
+
+/// \file
+///
+/// \brief Compute an image including detected text areas only.
+
+# include <mln/core/concept/image.hh>
+
+# include <mln/core/image/imorph/tr_image.hh>
+
+# include <mln/core/var.hh>
+# include <mln/core/routine/duplicate.hh>
+
+# include <mln/data/paste.hh>
+# include <mln/data/fill.hh>
+
+# include <mln/fun/x2x/translation.hh>
+
+# include <mln/math/max.hh>
+
+# include <scribo/core/component_set.hh>
+
+
+namespace scribo
+{
+
+ namespace debug
+ {
+
+ using namespace mln;
+
+ /*! \brief Compute an image including detected text areas only.
+
+ */
+ template <typename I, typename L>
+ mln_concrete(I)
+ text_areas_image(const Image<I>& input_rgb,
+ const scribo::component_set<L>& comps);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <typename I, typename L>
+ mln_concrete(I)
+ text_areas_image(const Image<I>& input_rgb_,
+ const scribo::component_set<L>& comps)
+ {
+ trace::entering("scribo::debug::text_areas_image");
+
+ const I& input_rgb = exact(input_rgb_);
+ mln_precondition(input_rgb.is_valid());
+
+ typedef mln_site(I) P;
+
+ unsigned shift = 5;
+ float height = 1, width = 0;
+ for_all_comps(i, comps)
+ if (comps(i).is_valid())
+ {
+ height += comps(i).bbox().nrows() + shift;
+ width = math::max(static_cast<float>(comps(i).bbox().ncols()),
+ width);
+ }
+ if (width == 0)
+ width = 1;
+
+ I output(height, width);
+ data::fill(output, literal::black);
+
+ algebra::vec<2, float> dv;
+ dv[0] = 0;
+ dv[1] = 0;
+ for_all_comps(i, comps)
+ if (comps(i).is_valid())
+ {
+ mln_VAR(tmp, duplicate(input_rgb | comps(i).bbox()));
+
+ typedef mln::fun::x2x::translation<P::dim, float> trans_t;
+ trans_t trans(dv - comps(i).bbox().pmin().to_vec());
+
+ mln_domain(I)
+ tr_box(comps(i).bbox().pmin().to_vec() + trans.t(),
+ comps(i).bbox().pmax().to_vec() + trans.t());
+
+ tr_image<mln_domain(I), tmp_t, trans_t> tr_ima(tr_box, tmp, trans);
+
+ data::paste(tr_ima, output);
+ dv[0] += comps(i).bbox().nrows() + shift;
+ }
+
+ trace::exiting("scribo::debug::text_areas_image");
+ return output;
+ }
+
+
+# endif // ! MLN_INCLUDE_ONLY
+
+
+ } // end of namespace scribo::debug
+
+} // end of namespace scribo
+
+
+#endif // ! SCRIBO_DEBUG_TEXT_AREAS_IMAGE_HH
diff --git a/scribo/primitive/regroup/from_single_left_link.hh
b/scribo/primitive/regroup/from_single_left_link_wrt_h_ratio.hh
similarity index 73%
copy from scribo/primitive/regroup/from_single_left_link.hh
copy to scribo/primitive/regroup/from_single_left_link_wrt_h_ratio.hh
index adb5b06..23adfc2 100644
--- a/scribo/primitive/regroup/from_single_left_link.hh
+++ b/scribo/primitive/regroup/from_single_left_link_wrt_h_ratio.hh
@@ -23,12 +23,13 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
-#ifndef SCRIBO_PRIMITIVE_RELINK_FROM_SINGLE_LEFT_LINK_HH
-# define SCRIBO_PRIMITIVE_RELINK_FROM_SINGLE_LEFT_LINK_HH
+#ifndef SCRIBO_PRIMITIVE_REGROUP_FROM_SINGLE_LEFT_LINK_WRT_H_RATIO_HH
+# define SCRIBO_PRIMITIVE_REGROUP_FROM_SINGLE_LEFT_LINK_WRT_H_RATIO_HH
/// \file
///
-/// \brief Regroup groups with their left neighbor.
+/// \brief Regroup groups with their left neighbor w.r.t. their height
+/// ratio.
# include <mln/core/concept/image.hh>
# include <mln/core/concept/neighborhood.hh>
@@ -45,11 +46,8 @@
# include <scribo/core/macros.hh>
# include <scribo/core/component_set.hh>
# include <scribo/core/object_links.hh>
-# include <scribo/core/object_groups.hh>
-# include <scribo/primitive/group/apply.hh>
-# include <scribo/primitive/group/from_single_link.hh>
-# include <scribo/primitive/link/with_single_left_link.hh>
+# include <scribo/filter/object_links_bbox_h_ratio.hh>
# include <scribo/primitive/link/internal/find_link.hh>
# include <scribo/primitive/link/internal/link_single_dmax_base.hh>
@@ -65,7 +63,8 @@ namespace scribo
namespace regroup
{
- /// \brief Regroup groups with their left neighbor.
+ /// \brief Regroup groups with their left neighbor w.r.t. their
+ /// height ratio.
///
/// \param[in] groups Groups data.
/// \param[in] The maximum distance allowed to seach a neighbor object.
@@ -75,16 +74,18 @@ namespace scribo
template <typename L>
inline
object_groups<L>
- from_single_left_link(const object_groups<L>& groups,
- unsigned neighb_max_distance);
+ from_single_left_link_wrt_h_ratio(const object_groups<L>& groups,
+ unsigned neighb_max_distance,
+ double hratio);
/// \overload
/// Max distance is set to mln_max(unsigned).
+ /// hratio is set to 1.60f.
template <typename L>
inline
object_groups<L>
- from_single_left_link(const object_groups<L>& groups);
+ from_single_left_link_wrt_h_ratio(const object_groups<L>& groups);
# ifndef MLN_INCLUDE_ONLY
@@ -95,10 +96,11 @@ namespace scribo
template <typename L>
inline
object_groups<L>
- from_single_left_link(const object_groups<L>& groups,
- unsigned neighb_max_distance)
+ from_single_left_link_wrt_h_ratio(const object_groups<L>& groups,
+ unsigned neighb_max_distance,
+ double hratio)
{
- trace::entering("scribo::primitive::regroup::from_single_left_link");
+ trace::entering("scribo::primitive::regroup::from_single_left_link_wrt_h_ratio");
mln_precondition(groups.is_valid());
@@ -110,7 +112,11 @@ namespace scribo
components = primitive::group::apply(groups, relabel_fun);
object_links<L>
- links = primitive::link::with_single_left_link(components, neighb_max_distance);
+ links = primitive::link::with_single_left_link(components,
+ neighb_max_distance);
+
+ links = filter::object_links_bbox_h_ratio(links, hratio);
+
object_groups<L>
new_groups = primitive::group::from_single_link(links);
@@ -119,7 +125,7 @@ namespace scribo
output(g) = new_groups(relabel_fun(g));
- trace::exiting("scribo::primitive::regroup::from_single_left_link");
+ trace::exiting("scribo::primitive::regroup::from_single_left_link_wrt_h_ratio");
return output;
}
@@ -127,9 +133,10 @@ namespace scribo
template <typename L>
inline
object_groups<L>
- from_single_left_link(const object_groups<L>& groups)
+ from_single_left_link_wrt_h_ratio(const object_groups<L>& groups)
{
- return from_single_left_link(groups, mln_max(unsigned));
+ return from_single_left_link_wrt_h_ratio(groups,
+ mln_max(unsigned), 1.60f);
}
@@ -141,4 +148,4 @@ namespace scribo
} // end of namespace scribo
-#endif // ! SCRIBO_PRIMITIVE_LINK_FROM_SINGLE_LEFT_LINK_HH
+#endif // ! SCRIBO_PRIMITIVE_REGROUP_FROM_SINGLE_LEFT_LINK_WRT_H_RATIO_HH
--
1.5.6.5