#122: [TRAITS] image_if_base
---------------------+------------------------------------------------------
Reporter: duhamel | Owner: Olena Team
Type: defect | Status: new
Priority: major | Milestone: Olena 1.0ß
Component: Milena | Version: 1.0
Keywords: |
---------------------+------------------------------------------------------
In source:trunk/milena/mln/core/internal/image_if_base.hh data trait is
suspect.
For example an image_if from an image1d has always data trait raw !
--
Ticket URL: <https://trac.lrde.org/olena/ticket/122>
Olena <http://olena.lrde.epita.fr>
Olena, a generic and efficient C++ image library.
* filter/large_components.hh,
* filter/small_components.hh,
* filter/thick_bboxes.hh,
* filter/thin_bboxes.hh: Move...
* filter/large_objects.hh,
* filter/small_objects.hh,
* filter/thick_objects.hh,
* filter/thin_objects.hh: ... here. Make use of labeled_image type and
cleanup comments.
---
scribo/ChangeLog | 15 +++
scribo/filter/large_components.hh | 214 -----------------------------------
scribo/filter/large_objects.hh | 198 +++++++++++++++++++++++++++++++++
scribo/filter/small_components.hh | 222 -------------------------------------
scribo/filter/small_objects.hh | 217 ++++++++++++++++++++++++++++++++++++
scribo/filter/thick_bboxes.hh | 204 ----------------------------------
scribo/filter/thick_objects.hh | 191 +++++++++++++++++++++++++++++++
scribo/filter/thin_bboxes.hh | 200 ---------------------------------
scribo/filter/thin_objects.hh | 191 +++++++++++++++++++++++++++++++
9 files changed, 812 insertions(+), 840 deletions(-)
delete mode 100644 scribo/filter/large_components.hh
create mode 100644 scribo/filter/large_objects.hh
delete mode 100644 scribo/filter/small_components.hh
create mode 100644 scribo/filter/small_objects.hh
delete mode 100644 scribo/filter/thick_bboxes.hh
create mode 100644 scribo/filter/thick_objects.hh
delete mode 100644 scribo/filter/thin_bboxes.hh
create mode 100644 scribo/filter/thin_objects.hh
diff --git a/scribo/ChangeLog b/scribo/ChangeLog
index 0c8eae6..05ca9d5 100644
--- a/scribo/ChangeLog
+++ b/scribo/ChangeLog
@@ -1,5 +1,20 @@
2009-05-28 Guillaume Lazzara <lazzara(a)lrde.epita.fr>
+ Cleanup object filters in Scribo.
+
+ * filter/large_components.hh,
+ * filter/small_components.hh,
+ * filter/thick_bboxes.hh,
+ * filter/thin_bboxes.hh: Move...
+
+ * filter/large_objects.hh,
+ * filter/small_objects.hh,
+ * filter/thick_objects.hh,
+ * filter/thin_objects.hh: ... here. Make use of labeled_image type and
+ cleanup comments.
+
+2009-05-28 Guillaume Lazzara <lazzara(a)lrde.epita.fr>
+
Make use of labeled_image type in Scribo.
* text/extract_bboxes.hh,
diff --git a/scribo/filter/large_components.hh b/scribo/filter/large_components.hh
deleted file mode 100644
index c3ea79b..0000000
--- a/scribo/filter/large_components.hh
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory
-//
-// This file is part of the Olena Library. This library is free
-// software; you can redistribute it and/or modify it under the terms
-// of the GNU General Public License version 2 as published by the
-// Free Software Foundation.
-//
-// This library 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 this library; see the file COPYING. If not, write to
-// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-// Boston, MA 02111-1307, USA.
-//
-// As a special exception, you may use this file as part of a free
-// software library 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_FILTER_LARGE_COMPONENTS_HH
-# define SCRIBO_FILTER_LARGE_COMPONENTS_HH
-
-/// \file scribo/filter/large_components.hh
-///
-/// Remove large components in a binary image.
-
-
-# include <mln/core/concept/image.hh>
-# include <mln/core/concept/neighborhood.hh>
-# include <mln/core/concept/function.hh>
-
-# include <mln/labeling/blobs.hh>
-# include <mln/labeling/relabel.hh>
-
-# include <mln/util/array.hh>
-# include <mln/value/label_16.hh>
-
-# include <mln/pw/all.hh>
-
-# include <scribo/make/text.hh>
-
-namespace scribo
-{
-
- namespace filter
- {
-
- using namespace mln;
-
-
- /// Remove large components in a binary image.
- /// Set to 'false' all the removed components.
- ///
- /// \param[in] input_ A binary image.
- /// \param[in] nbh_ A neighborhood used for labeling \p input_.
- /// \param[in] label_type The label type used for labeling.
- /// \param[in] max_size The minimum cardinality of a component.
- ///
- /// \return A binary image without large components.
- template <typename I, typename N, typename V>
- mln_concrete(I)
- large_components(const Image<I>& input_,
- const Neighborhood<N>& nbh_,
- const V& label_type,
- unsigned max_size);
-
- /// Remove too large text components.
- ///
- /// \param[in] text Text data.
- /// \param[in] min_size The minimum cardinality of a component.
- ///
- /// \return updated text data.
- template <typename I>
- scribo::util::text<I>
- large_components(const scribo::util::text<I>& text,
- unsigned min_size);
-
-
-
-# ifndef MLN_INCLUDE_ONLY
-
-
- namespace internal
- {
-
-
- /// Filter Functor.
- /// Return false for all components which are too large.
- template <typename R>
- struct filter_large_components_functor
- : Function_l2b< filter_large_components_functor<R> >
- {
-
- /// Constructor
- ///
- /// \param[in] compbboxes Component bounding boxes.
- /// \param[in] max_size Maximum component size.
- filter_large_components_functor(const mln::util::array<R>& compbboxes,
- unsigned max_size)
- : compbboxes_(compbboxes), max_size_(max_size)
- {
- }
-
-
- /// Check if the component is large enough.
- ///
- /// \param l A label.
- ///
- /// \return false if the component area is strictly inferion to
- /// \p max_size_.
- bool operator()(const value::label_16& l) const
- {
- return compbboxes_[l] <= max_size_;
- }
-
-
- /// The component bounding boxes.
- const mln::util::array<R>& compbboxes_;
- /// The maximum area.
- unsigned max_size_;
- };
-
-
- } // end of namespace scribo::filter::internal
-
-
-
- template <typename I, typename N, typename V>
- inline
- mln_concrete(I)
- large_components(const Image<I>& input_,
- const Neighborhood<N>& nbh_,
- const V& label_type,
- unsigned max_size)
- {
- trace::entering("scribo::filter::large_components");
-
- const I& input = exact(input_);
- const N& nbh = exact(nbh_);
-
- mln_precondition(input.is_valid());
- mln_precondition(nbh.is_valid());
-
- V nlabels;
- mln_ch_value(I,V) lbl = labeling::blobs(input, nbh, nlabels);
-
- typedef accu::count<mln_psite(I)> accu_count_t;
- typedef mln_result(accu_count_t) accu_count_res_t;
- typedef mln::util::array<accu_count_res_t> nsitecomp_t;
- nsitecomp_t nsitecomp = labeling::compute(accu_count_t(), lbl, nlabels);
-
- typedef internal::filter_large_components_functor<accu_count_res_t> func_t;
- func_t fl2b(nsitecomp, max_size);
- labeling::relabel_inplace(lbl, nlabels, fl2b);
-
- mln_concrete(I) output = duplicate(input);
- data::fill((output | pw::value(lbl) == literal::zero).rw(), false);
-
- trace::exiting("scribo::filter::large_components");
- return output;
- }
-
-
- template <typename I>
- inline
- scribo::util::text<I>
- large_components(const scribo::util::text<I>& text,
- unsigned max_size)
- {
- trace::entering("scribo::filter::large_components");
-
- mln_precondition(text.is_valid());
-
- typedef mln_site(I) P;
- typedef accu::count<P> accu_count_t;
- typedef mln_result(accu_count_t) accu_count_res_t;
- typedef mln::util::array<accu_count_res_t> nsitecomp_t;
-
- fun::i2v::array<bool> f(text.nbboxes().next(), false);
- f(0) = true;
- mln::util::array<box<P> > bresult;
- bresult.append(box<P>());
- for_all_components(i, text.bboxes())
- {
- accu_count_res_t count = set::compute(accu_count_t(), text.bbox(i));
- if (count <= max_size)
- {
- bresult.append(text.bbox(i));
- f(i) = true;
- }
- }
-
- util::text<I> output = scribo::make::text(text, f);
-
- trace::exiting("scribo::filter::large_components");
- return output;
- }
-
-
-# endif // ! MLN_INCLUDE_ONLY
-
- } // end of namespace scribo::filter
-
-} // end of namespace scribo
-
-#endif // ! SCRIBO_FILTER_LARGE_COMPONENTS_HH
diff --git a/scribo/filter/large_objects.hh b/scribo/filter/large_objects.hh
new file mode 100644
index 0000000..16e50c6
--- /dev/null
+++ b/scribo/filter/large_objects.hh
@@ -0,0 +1,198 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library 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 this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library 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_FILTER_LARGE_OBJECTS_HH
+# define SCRIBO_FILTER_LARGE_OBJECTS_HH
+
+/// \file scribo/filter/large_objects.hh
+///
+/// Remove large objects in a binary image.
+
+
+# include <mln/core/concept/image.hh>
+# include <mln/core/concept/neighborhood.hh>
+# include <mln/core/concept/function.hh>
+
+# include <mln/labeling/compute.hh>
+# include <mln/accu/count.hh>
+
+# include <mln/util/array.hh>
+
+# include <mln/pw/all.hh>
+
+# include <scribo/core/object_image.hh>
+# include <scribo/extract/primitive/objects.hh>
+
+namespace scribo
+{
+
+ namespace filter
+ {
+
+ using namespace mln;
+
+
+ /// Remove large objects in a binary image.
+ /// Set to 'false' all the removed objects.
+ ///
+ /// \param[in] input_ A binary image.
+ /// \param[in] nbh_ A neighborhood used for labeling \p input_.
+ /// \param[in] label_type The label type used for labeling.
+ /// \param[in] max_size The minimum cardinality of an object.
+ ///
+ /// \return A binary image without large objects.
+ template <typename I, typename N, typename V>
+ mln_concrete(I)
+ large_objects(const Image<I>& input_,
+ const Neighborhood<N>& nbh_,
+ const V& label_type,
+ unsigned max_size);
+
+ /// Remove too large text objects.
+ ///
+ /// \param[in] objects An object image.
+ /// \param[in] max_size The minimum cardinality of an object.
+ ///
+ /// \return updated text data.
+ template <typename L>
+ object_image(L)
+ large_objects(const object_image(L)& objects,
+ unsigned max_size);
+
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ namespace internal
+ {
+
+
+ /// Filter Functor.
+ /// Return false for all objects which are too large.
+ template <typename L>
+ struct large_objects_filter
+ : Function_v2b< large_objects_filter<L> >
+ {
+
+ typedef accu::count<mln_psite(L)> card_t;
+
+ /// Constructor
+ ///
+ /// \param[in] compbboxes Component bounding boxes.
+ /// \param[in] max_size Maximum object size.
+ large_objects_filter(const object_image(L)& objects,
+ unsigned max_size)
+ {
+ card_ = labeling::compute(card_t(), objects, objects.nlabels());
+ max_size_ = max_size;
+ }
+
+
+ /// Check if the object is large enough.
+ ///
+ /// \param l A label.
+ ///
+ /// \return false if the object area is strictly inferior to
+ /// \p max_size_.
+ bool operator()(const mln_value(L)& l) const
+ {
+ return card_[l] <= max_size_;
+ }
+
+
+ /// The object bounding boxes.
+ mln::util::array<mln_result(card_t)> card_;
+ /// The maximum area.
+ unsigned max_size_;
+ };
+
+
+ } // end of namespace scribo::filter::internal
+
+
+
+ template <typename I, typename N, typename V>
+ inline
+ mln_concrete(I)
+ large_objects(const Image<I>& input_,
+ const Neighborhood<N>& nbh_,
+ const V& label_type,
+ unsigned max_size)
+ {
+ trace::entering("scribo::filter::large_objects");
+
+ const I& input = exact(input_);
+ const N& nbh = exact(nbh_);
+
+ mln_precondition(input.is_valid());
+ mln_precondition(nbh.is_valid());
+
+ V nlabels;
+ typedef object_image(mln_ch_value(I,V)) lbl_t;
+ lbl_t lbl = extract::primitive::objects(input, nbh, nlabels);
+
+ typedef internal::large_objects_filter<lbl_t> func_t;
+ func_t fv2b(lbl, max_size);
+ labeling::relabel_inplace(lbl, nlabels, fv2b);
+
+ mln_concrete(I) output = duplicate(input);
+ data::fill((output | pw::value(lbl) == literal::zero).rw(), false);
+
+ trace::exiting("scribo::filter::large_objects");
+ return output;
+ }
+
+
+ template <typename L>
+ inline
+ object_image(L)
+ large_objects(const object_image(L)& objects,
+ unsigned max_size)
+ {
+ trace::entering("scribo::filter::large_objects");
+
+ mln_precondition(objects.is_valid());
+
+ internal::large_objects_filter<L> f(objects, max_size);
+
+ object_image(L) output;
+ output.init_from_(objects);
+ output.relabel(f);
+
+ trace::exiting("scribo::filter::large_objects");
+ return output;
+ }
+
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace scribo::filter
+
+} // end of namespace scribo
+
+#endif // ! SCRIBO_FILTER_LARGE_OBJECTS_HH
diff --git a/scribo/filter/small_components.hh b/scribo/filter/small_components.hh
deleted file mode 100644
index c28772b..0000000
--- a/scribo/filter/small_components.hh
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory
-//
-// This file is part of the Olena Library. This library is free
-// software; you can redistribute it and/or modify it under the terms
-// of the GNU General Public License version 2 as published by the
-// Free Software Foundation.
-//
-// This library 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 this library; see the file COPYING. If not, write to
-// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-// Boston, MA 02111-1307, USA.
-//
-// As a special exception, you may use this file as part of a free
-// software library 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_FILTER_SMALL_COMPONENTS_HH
-# define SCRIBO_FILTER_SMALL_COMPONENTS_HH
-
-/// \file scribo/filter/small_components.hh
-///
-/// Remove small components in a binary image.
-
-
-# include <mln/core/concept/image.hh>
-# include <mln/core/concept/neighborhood.hh>
-# include <mln/core/concept/function.hh>
-
-# include <mln/labeling/blobs.hh>
-# include <mln/labeling/relabel.hh>
-
-# include <mln/make/relabelfun.hh>
-
-# include <mln/util/array.hh>
-
-# include <mln/pw/all.hh>
-
-# include <mln/accu/count.hh>
-
-# include <mln/set/compute.hh>
-
-# include <scribo/util/text.hh>
-# include <scribo/make/text.hh>
-
-
-namespace scribo
-{
-
- namespace filter
- {
-
- using namespace mln;
-
-
- /// Remove small components in a binary image.
- /// Set to 'false' all the removed components.
- ///
- /// \param[in] input_ A binary image.
- /// \param[in] nbh_ A neighborhood used for labeling \p input_.
- /// \param[in] label_type The label type used for labeling.
- /// \param[in] min_size The minimum cardinality of a component.
- ///
- /// \return A binary image without small components.
- template <typename I, typename N, typename V>
- mln_concrete(I)
- small_components(const Image<I>& input_,
- const Neighborhood<N>& nbh_,
- const V& label_type,
- unsigned min_size);
-
-
- /// Remove too small text components.
- ///
- /// \param[in] text Text data.
- /// \param[in] min_size The minimum cardinality of a component.
- ///
- /// \return Lines of text without too small components.
- template <typename I>
- scribo::util::text<I>
- small_components(const scribo::util::text<I>& text,
- unsigned min_size);
-
-
-# ifndef MLN_INCLUDE_ONLY
-
-
- namespace internal
- {
-
-
- /// Filter Functor.
- /// Return false for all components which are too small.
- template <typename B>
- struct filter_small_components_functor
- : Function_v2b< filter_small_components_functor<B> >
- {
-
- /// Constructor
- ///
- /// \param[in] compbboxes Component bounding boxes.
- /// \param[in] min_size Minimum component size.
- filter_small_components_functor(const mln::util::array<B>& compbboxes,
- unsigned min_size)
- : compbboxes_(compbboxes), min_size_(min_size)
- {
- }
-
-
- /// Check if the component is large enough.
- ///
- /// \param l A label.
- ///
- /// \return false if the component area is strictly inferion to
- /// \p min_size_.
- template <typename L>
- bool operator()(const L& l) const
- {
- return compbboxes_[l] >= min_size_;
- }
-
- /// The component bounding boxes.
- const mln::util::array<B>& compbboxes_;
-
- /// The minimum area.
- unsigned min_size_;
- };
-
-
- } // end of namespace scribo::filter::internal
-
-
-
- template <typename I, typename N, typename V>
- inline
- mln_concrete(I)
- small_components(const Image<I>& input_,
- const Neighborhood<N>& nbh_,
- const V& label_type,
- unsigned min_size)
- {
- trace::entering("scribo::filter::small_components");
-
- const I& input = exact(input_);
- const N& nbh = exact(nbh_);
-
- mln_precondition(input.is_valid());
- mln_precondition(nbh.is_valid());
-
- V nlabels;
- mln_ch_value(I,V) lbl = labeling::blobs(input, nbh, nlabels);
-
- typedef accu::count<mln_psite(I)> accu_count_t;
- typedef mln_result(accu_count_t) accu_count_res_t;
- typedef mln::util::array<accu_count_res_t> compbboxes_t;
- compbboxes_t compbboxes = labeling::compute(accu_count_t(), lbl, nlabels);
-
- typedef internal::filter_small_components_functor<accu_count_res_t> func_t;
- func_t fv2b(compbboxes, min_size);
- labeling::relabel_inplace(lbl, nlabels, fv2b);
-
- mln_concrete(I) output = duplicate(input);
- data::fill((output | pw::value(lbl) == literal::zero).rw(), false);
-
- trace::exiting("scribo::filter::small_components");
- return output;
- }
-
-
- template <typename L>
- inline
- scribo::util::text<L>
- small_components(const scribo::util::text<L>& text,
- unsigned min_size)
- {
- trace::entering("scribo::filter::small_components");
-
- mln_precondition(text.is_valid());
-
- typedef mln_site(L) P;
- typedef accu::count<P> accu_count_t;
- typedef mln_result(accu_count_t) accu_count_res_t;
- typedef mln::util::array<accu_count_res_t> nsitecomp_t;
-
- fun::i2v::array<bool> f(text.nbboxes().next(), false);
- f(0) = true;
- mln::util::array<box<P> > bresult;
- bresult.append(box<P>());
- for_all_components(i, text.bboxes())
- {
- accu_count_res_t count = set::compute(accu_count_t(), text.bbox(i));
- if (count >= min_size)
- {
- bresult.append(text.bbox(i));
- f(i) = true;
- }
- }
-
- util::text<L> output = scribo::make::text(text, f);
-
- trace::exiting("scribo::filter::small_components");
- return output;
- }
-
-
-# endif // ! MLN_INCLUDE_ONLY
-
- } // end of namespace scribo::filter
-
-} // end of namespace scribo
-
-#endif // ! SCRIBO_FILTER_SMALL_COMPONENTS_HH
diff --git a/scribo/filter/small_objects.hh b/scribo/filter/small_objects.hh
new file mode 100644
index 0000000..0b7844e
--- /dev/null
+++ b/scribo/filter/small_objects.hh
@@ -0,0 +1,217 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library 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 this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library 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_FILTER_SMALL_OBJECTS_HH
+# define SCRIBO_FILTER_SMALL_OBJECTS_HH
+
+/// \file scribo/filter/small_objects.hh
+///
+/// Remove small objects in a binary image.
+
+
+# include <mln/core/concept/image.hh>
+# include <mln/core/concept/neighborhood.hh>
+# include <mln/core/concept/function.hh>
+
+# include <mln/labeling/blobs.hh>
+# include <mln/labeling/relabel.hh>
+
+# include <mln/make/relabelfun.hh>
+
+# include <mln/util/array.hh>
+
+# include <mln/pw/all.hh>
+
+# include <mln/accu/count.hh>
+
+# include <mln/set/compute.hh>
+
+# include <scribo/core/object_image.hh>
+# include <scribo/extract/primitive/objects.hh>
+
+
+//forward declaration.
+namespace mln
+{
+ namespace accu
+ {
+ template <typename T> struct count;
+ }
+}
+
+namespace scribo
+{
+
+ namespace filter
+ {
+
+ using namespace mln;
+
+
+ /// Remove small objects in a binary image.
+ /// Set to 'false' all the removed objects.
+ ///
+ /// \param[in] input_ A binary image.
+ /// \param[in] nbh_ A neighborhood used for labeling \p input_.
+ /// \param[in] label_type The label type used for labeling.
+ /// \param[in] min_size The minimum cardinality of an object.
+ ///
+ /// \return A binary image without small objects.
+ template <typename I, typename N, typename V>
+ mln_concrete(I)
+ small_objects(const Image<I>& input_,
+ const Neighborhood<N>& nbh_,
+ const V& label_type,
+ unsigned min_size);
+
+
+ /// Remove too small objects.
+ ///
+ /// \param[in] objects An object image.
+ /// \param[in] min_size The minimum cardinality of an object.
+ ///
+ /// \return An object image without small objects.
+ template <typename L>
+ object_image(L)
+ small_objects(const object_image(L)& objects,
+ unsigned min_size);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ namespace internal
+ {
+
+
+ /// Filter Functor.
+ /// Return false for all objects which are too small.
+ template <typename L>
+ struct small_objects_filter
+ : Function_v2b< small_objects_filter<L> >
+ {
+ typedef accu::count<mln_psite(L)> card_t;
+
+ /// Constructor
+ ///
+ /// \param[in] objects Component bounding boxes.
+ /// \param[in] min_size Minimum component size.
+ //
+ small_objects_filter(const object_image(L)& objects,
+ unsigned min_size)
+ {
+ card_ = labeling::compute(card_t(), objects, objects.nlabels());
+ min_size_ = min_size;
+ }
+
+
+ /// Check if the component is large enough.
+ ///
+ /// \param l A label.
+ ///
+ /// \return false if the component area is strictly inferion to
+ /// \p min_size_.
+ //
+ bool operator()(const mln_value(L)& l) const
+ {
+ if (l == literal::zero)
+ return true;
+ return card_[l] >= min_size_;
+ }
+
+ /// The component bounding boxes.
+ mln::util::array<mln_result(card_t)> card_;
+
+ /// The minimum area.
+ unsigned min_size_;
+ };
+
+
+ } // end of namespace scribo::filter::internal
+
+
+
+ template <typename I, typename N, typename V>
+ inline
+ mln_concrete(I)
+ small_objects(const Image<I>& input_,
+ const Neighborhood<N>& nbh_,
+ const V& label_type,
+ unsigned min_size)
+ {
+ trace::entering("scribo::filter::small_objects");
+
+ const I& input = exact(input_);
+ const N& nbh = exact(nbh_);
+
+ mln_precondition(input.is_valid());
+ mln_precondition(nbh.is_valid());
+
+ V nlabels;
+ typedef object_image(mln_ch_value(I,V)) lbl_t;
+ lbl_t lbl = extract::primitive::objects(input, nbh, nlabels);
+
+ typedef internal::small_objects_filter<lbl_t> func_t;
+ func_t fv2b(lbl, min_size);
+ labeling::relabel_inplace(lbl, nlabels, fv2b);
+
+ mln_concrete(I) output = duplicate(input);
+ data::fill((output | pw::value(lbl) == literal::zero).rw(), false);
+
+ trace::exiting("scribo::filter::small_objects");
+ return output;
+ }
+
+
+ template <typename L>
+ inline
+ object_image(L)
+ small_objects(const object_image(L)& objects,
+ unsigned min_size)
+ {
+ trace::entering("scribo::filter::small_objects");
+
+ mln_precondition(objects.is_valid());
+
+ internal::small_objects_filter<L> f(objects, min_size);
+
+ object_image(L) output;
+ output.init_from_(objects);
+ output.relabel(f);
+
+ trace::exiting("scribo::filter::small_objects");
+ return output;
+ }
+
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace scribo::filter
+
+} // end of namespace scribo
+
+#endif // ! SCRIBO_FILTER_SMALL_OBJECTS_HH
diff --git a/scribo/filter/thick_bboxes.hh b/scribo/filter/thick_bboxes.hh
deleted file mode 100644
index 9f717b3..0000000
--- a/scribo/filter/thick_bboxes.hh
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory
-//
-// This file is part of the Olena Library. This library is free
-// software; you can redistribute it and/or modify it under the terms
-// of the GNU General Public License version 2 as published by the
-// Free Software Foundation.
-//
-// This library 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 this library; see the file COPYING. If not, write to
-// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-// Boston, MA 02111-1307, USA.
-//
-// As a special exception, you may use this file as part of a free
-// software library 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_FILTER_THICK_BBOXES_HH
-# define SCRIBO_FILTER_THICK_BBOXES_HH
-
-/// \file scribo/filter/thick_bboxes.hh
-///
-/// Remove too thick bboxes.
-
-# include <mln/labeling/blobs.hh>
-# include <mln/labeling/compute.hh>
-# include <mln/util/array.hh>
-
-# include <scribo/util/text.hh>
-
-# include <scribo/make/text.hh>
-
-
-namespace scribo
-{
-
- namespace filter
- {
-
- /// Remove components thicker or equal to \p max_thickness.
- ///
- /// \param[in] input_ A binary image.
- /// \param[in] nbh_ A neighborhood used in labeling algorithms.
- /// \param[in] label_type The label type used for labeling.
- /// \param[in] max_thickness The maximum thickness value.
- ///
- /// \result A binary image without thick components.
- template <typename I, typename N, typename V>
- inline
- mln_concrete(I)
- thick_bboxes(const Image<I>& input_,
- const Neighborhood<N>& nbh_,
- const V& label_type,
- unsigned max_thickness);
-
-
- /// Remove lines of text thicker or equal to \p max_thickness.
- ///
- /// \param[in] text Lines of text.
- /// \param[in] max_thickness The maximum thickness value.
- ///
- /// \result Lines of text without too thick lines.
- template <typename L>
- inline
- scribo::util::text<L>
- thick_bboxes(const scribo::util::text<L>& text,
- unsigned max_thickness);
-
-
-# ifndef MLN_INCLUDE_ONLY
-
- namespace internal
- {
-
- /// Filter Functor. Return false for all components which are too
- /// large.
- template <typename R>
- struct filter_too_thick_component_functor
- : Function_l2b< filter_too_thick_component_functor<R> >
- {
-
- /// Constructor
- ///
- /// \param[in] compbboxes component bounding boxes.
- /// \param[in] max_thickness the maximum thickness allowed.
- filter_too_thick_component_functor(const mln::util::array<R>& compbboxes,
- unsigned max_thickness)
- : compbboxes_(compbboxes), max_thickness_(max_thickness)
- {
- }
-
-
- /// Return false if the components is thicker than
- /// \p max_thickness_.
- ///
- /// \param[in] l An image value.
- bool operator()(const value::label_16& l) const
- {
- return compbboxes_[l].nrows() < max_thickness_
- && compbboxes_[l].ncols() < max_thickness_;
- }
-
-
- /// Component bounding boxes.
- const mln::util::array<R>& compbboxes_;
-
- /// The maximum thickness.
- unsigned max_thickness_;
- };
-
-
- } // end of namespace scribo::filter::internal
-
-
- template <typename I, typename N, typename V>
- inline
- mln_concrete(I)
- thick_bboxes(const Image<I>& input_,
- const Neighborhood<N>& nbh_,
- const V& label_type,
- unsigned max_thickness)
- {
- trace::entering("scribo::filter::thick_bboxes");
-
- const I& input = exact(input_);
- const N& nbh = exact(nbh_);
-
- mln_precondition(input.is_valid());
- mln_precondition(nbh.is_valid());
-
- V nlabels;
- mln_ch_value(I,V) lbl = labeling::blobs(input, nbh, nlabels);
-
- typedef accu::bbox<mln_psite(I)> accu_bbox_t;
- typedef mln_result(accu_bbox_t) accu_bbox_res_t;
- typedef mln::util::array<accu_bbox_res_t> compbboxes_t;
- compbboxes_t compbboxes = labeling::compute(accu_bbox_t(), lbl, nlabels);
-
- typedef internal::filter_too_thick_component_functor<accu_bbox_res_t> func_t;
- func_t fl2b(compbboxes, max_thickness);
- labeling::relabel_inplace(lbl, nlabels, fl2b);
-
- mln_concrete(I) output = duplicate(input);
- data::fill((output | pw::value(lbl) == literal::zero).rw(), false);
-
- trace::exiting("scribo::filter::thick_bboxes");
- return output;
- }
-
-
- template <typename L>
- inline
- scribo::util::text<L>
- thick_bboxes(const scribo::util::text<L>& text,
- unsigned max_thickness)
- {
- trace::entering("scribo::filter::thick_bboxes");
-
- mln_precondition(text.is_valid());
-
- typedef mln_site(L) P;
- typedef accu::bbox<P> accu_bbox_t;
- typedef mln_result(accu_bbox_t) accu_bbox_res_t;
- typedef mln::util::array<accu_bbox_res_t> nsitecomp_t;
-
- typedef internal::filter_too_thick_component_functor<accu_bbox_res_t> func_t;
- func_t is_not_too_thick(text.bboxes(), max_thickness);
-
- fun::i2v::array<bool> f(text.nbboxes().next(), false);
- f(0) = true;
- mln::util::array<box<P> > bresult;
- bresult.append(box<P>());
- for_all_components(i, text.bboxes())
- if (is_not_too_thick(i))
- {
- bresult.append(text.bbox(i));
- f(i) = true;
- }
-
- util::text<L> output = scribo::make::text(text, f);
-
- trace::exiting("scribo::filter::thick_bboxes");
- /// FIXME: construct a new util::text from the old one.
- return output;
- }
-
-# endif // ! MLN_INCLUDE_ONLY
-
- } // end of namespace scribo::filter
-
-} // end of namespace scribo
-
-
-#endif // ! SCRIBO_FILTER_THICK_BBOXES_HH
diff --git a/scribo/filter/thick_objects.hh b/scribo/filter/thick_objects.hh
new file mode 100644
index 0000000..d7ef128
--- /dev/null
+++ b/scribo/filter/thick_objects.hh
@@ -0,0 +1,191 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library 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 this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library 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_FILTER_THICK_OBJECTS_HH
+# define SCRIBO_FILTER_THICK_OBJECTS_HH
+
+/// \file scribo/filter/thick_objects.hh
+///
+/// Remove too thick objects.
+
+# include <mln/core/concept/image.hh>
+# include <mln/core/concept/neighborhood.hh>
+
+# include <mln/util/array.hh>
+
+# include <scribo/core/object_image.hh>
+# include <scribo/extract/primitive/objects.hh>
+
+
+
+namespace scribo
+{
+
+ namespace filter
+ {
+
+ using namespace mln;
+
+ /// Remove objects thicker or equal to \p max_thickness.
+ ///
+ /// \param[in] input_ A binary image.
+ /// \param[in] nbh_ A neighborhood used in labeling algorithms.
+ /// \param[in] label_type The label type used for labeling.
+ /// \param[in] max_thickness The maximum thickness value.
+ ///
+ /// \result A binary image without thick objects.
+ //
+ template <typename I, typename N, typename V>
+ inline
+ mln_concrete(I)
+ thick_objects(const Image<I>& input_,
+ const Neighborhood<N>& nbh_,
+ const V& label_type,
+ unsigned max_thickness);
+
+
+ /// Remove lines of text thicker or equal to \p max_thickness.
+ ///
+ /// \param[in] objects An object image.
+ /// \param[in] max_thickness The maximum thickness value.
+ ///
+ /// \result An object image without too thick objects.
+ //
+ template <typename L>
+ inline
+ object_image(L)
+ thick_objects(const object_image(L)& objects,
+ unsigned max_thickness);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ namespace internal
+ {
+
+ /// Filter Functor. Return false for all objects which are too
+ /// large.
+ template <typename L>
+ struct thick_object_filter
+ : Function_v2b< thick_object_filter<L> >
+ {
+
+ /// Constructor
+ ///
+ /// \param[in] objects An object image.
+ /// \param[in] max_thickness the maximum thickness allowed.
+ thick_object_filter(const object_image(L)& objects,
+ unsigned max_thickness)
+ : objects_(objects), max_thickness_(max_thickness)
+ {
+ }
+
+
+ /// Return false if the objects is thicker than
+ /// \p max_thickness_.
+ ///
+ /// \param[in] l An image value.
+ bool operator()(const mln_value(L)& l) const
+ {
+ return objects_.bbox(l).nrows() < max_thickness_
+ && objects_.bbox(l).ncols() < max_thickness_;
+ }
+
+
+ /// An object image.
+ object_image(L) objects_;
+
+ /// The maximum thickness.
+ unsigned max_thickness_;
+ };
+
+
+ } // end of namespace scribo::filter::internal
+
+
+ template <typename I, typename N, typename V>
+ inline
+ mln_concrete(I)
+ thick_objects(const Image<I>& input_,
+ const Neighborhood<N>& nbh_,
+ const V& label_type,
+ unsigned max_thickness)
+ {
+ trace::entering("scribo::filter::thick_objects");
+
+ const I& input = exact(input_);
+ const N& nbh = exact(nbh_);
+
+ mln_precondition(input.is_valid());
+ mln_precondition(nbh.is_valid());
+
+ V nlabels;
+ typedef mln_ch_value(I,V) lbl_t;
+ object_image(lbl_t) objects
+ = extract::primitive::objects(input, nbh, nlabels);
+
+ typedef internal::thick_object_filter<lbl_t> func_t;
+ func_t fv2b(objects, max_thickness);
+ objects.relabel(fv2b);
+
+ mln_concrete(I) output = duplicate(input);
+ data::fill((output | pw::value(objects) == literal::zero).rw(), false);
+
+ trace::exiting("scribo::filter::thick_objects");
+ return output;
+ }
+
+
+ template <typename L>
+ inline
+ object_image(L)
+ thick_objects(const object_image(L)& objects,
+ unsigned max_thickness)
+ {
+ trace::entering("scribo::filter::thick_objects");
+
+ mln_precondition(text.is_valid());
+
+ typedef internal::thick_object_filter<L> func_t;
+ func_t is_not_too_thick(objects, max_thickness);
+
+ object_image(L) output;
+ output.init_from_(objects);
+ output.relabel(is_not_too_thick);
+
+ trace::exiting("scribo::filter::thick_objects");
+ return output;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace scribo::filter
+
+} // end of namespace scribo
+
+
+#endif // ! SCRIBO_FILTER_THICK_OBJECTS_HH
diff --git a/scribo/filter/thin_bboxes.hh b/scribo/filter/thin_bboxes.hh
deleted file mode 100644
index 1463a64..0000000
--- a/scribo/filter/thin_bboxes.hh
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory
-//
-// This file is part of the Olena Library. This library is free
-// software; you can redistribute it and/or modify it under the terms
-// of the GNU General Public License version 2 as published by the
-// Free Software Foundation.
-//
-// This library 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 this library; see the file COPYING. If not, write to
-// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-// Boston, MA 02111-1307, USA.
-//
-// As a special exception, you may use this file as part of a free
-// software library 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_FILTER_THIN_BBOXES_HH
-# define SCRIBO_FILTER_THIN_BBOXES_HH
-
-/// \file scribo/filter/thin_bboxes.hh
-///
-/// Remove too thin bboxes.
-
-# include <mln/labeling/blobs.hh>
-# include <mln/labeling/compute.hh>
-# include <mln/util/array.hh>
-
-# include <scribo/util/text.hh>
-
-namespace scribo
-{
-
- namespace filter
- {
-
- /// Remove components thinner or equal to \p min_thickness.
- ///
- /// \param[in] input_ a binary image.
- /// \param[in] nbh_ a neighborhood used in labeling algorithms.
- /// \param[in] label_type the label type used for labeling.
- /// \param[in] min_thickness the minimum thickness value.
- ///
- /// \result A binary image without thin components.
- template <typename I, typename N, typename V>
- inline
- mln_concrete(I)
- thin_bboxes(const Image<I>& input_,
- const Neighborhood<N>& nbh_,
- const V& label_type,
- unsigned min_thickness);
-
- /// Remove lines of text thinner or equal to \p min_thickness.
- ///
- /// \param[in] text lines of text.
- /// \param[in] min_thickness the minimum thickness value.
- ///
- /// \result Lines of text without too thin lines.
- template <typename L>
- inline
- scribo::util::text<L>
- thin_bboxes(const scribo::util::text<L>& text,
- unsigned min_thickness);
-
-
-# ifndef MLN_INCLUDE_ONLY
-
- namespace internal
- {
-
-
- /// Filter Functor.
- /// Return false for all components which are too large.
- template <typename R>
- struct filter_too_thin_component_functor
- : Function_v2b< filter_too_thin_component_functor<R> >
- {
-
- /// Constructor
- ///
- /// \param[in] compbboxes component bounding boxes.
- /// \param[in] min_thickness the minimum thickness allowed.
- filter_too_thin_component_functor(const mln::util::array<R>& compbboxes,
- unsigned min_thickness)
- : compbboxes_(compbboxes), min_thickness_(min_thickness)
- {
- }
-
-
- /// Return false if the components is thinner than
- /// \p min_thickness_.
- ///
- /// \param[in] l An image value.
- bool operator()(const value::label_16& l) const
- {
- return compbboxes_[l].nrows() > min_thickness_
- && compbboxes_[l].ncols() > min_thickness_;
- }
-
-
- /// Component bounding boxes.
- const mln::util::array<R>& compbboxes_;
-
- /// The minimum thickness.
- unsigned min_thickness_;
- };
-
-
- } // end of namespace scribo::filter::internal
-
-
- template <typename I, typename N, typename V>
- inline
- mln_concrete(I)
- thin_bboxes(const Image<I>& input_,
- const Neighborhood<N>& nbh_,
- const V& label_type,
- unsigned min_thickness)
- {
- trace::entering("scribo::filter::thin_bboxes");
-
- const I& input = exact(input_);
- const N& nbh = exact(nbh_);
-
- mln_precondition(input.is_valid());
- mln_precondition(nbh.is_valid());
-
- V nlabels;
- mln_ch_value(I,V) lbl = labeling::blobs(input, nbh, nlabels);
-
- typedef accu::bbox<mln_psite(I)> accu_bbox_t;
- typedef mln_result(accu_bbox_t) accu_bbox_res_t;
- typedef mln::util::array<accu_bbox_res_t> compbboxes_t;
- compbboxes_t compbboxes = labeling::compute(accu_bbox_t(), lbl, nlabels);
-
- typedef internal::filter_too_thin_component_functor<accu_bbox_res_t> func_t;
- func_t fv2b(compbboxes, min_thickness);
- labeling::relabel_inplace(lbl, nlabels, fv2b);
-
- mln_concrete(I) output = duplicate(input);
- data::fill((output | pw::value(lbl) == literal::zero).rw(), false);
-
- trace::exiting("scribo::filter::thin_bboxes");
- return output;
- }
-
-
- template <typename L>
- inline
- scribo::util::text<L>
- thin_bboxes(const scribo::util::text<L>& text,
- unsigned min_thickness)
- {
- trace::entering("scribo::filter::thin_bboxes");
-
- mln_precondition(text.is_valid());
-
- typedef mln_site(L) P;
- typedef accu::bbox<P> accu_bbox_t;
- typedef mln_result(accu_bbox_t) accu_bbox_res_t;
- typedef mln::util::array<accu_bbox_res_t> nsitecomp_t;
-
- typedef internal::filter_too_thin_component_functor<accu_bbox_res_t> func_t;
- func_t is_not_too_thin(text.bboxes(), min_thickness);
-
- fun::i2v::array<bool> f(text.nbboxes().next(), false);
- f(0) = true;
- mln::util::array<box<P> > bresult;
- bresult.append(box<P>());
- for_all_components(i, text.bboxes())
- if (is_not_too_thin(i))
- {
- bresult.append(text.bbox(i));
- f(i) = true;
- }
-
- util::text<L> output = scribo::make::text(text, f);
-
- trace::exiting("scribo::filter::thin_bboxes");
- return output;
- }
-
-# endif // ! MLN_INCLUDE_ONLY
-
- } // end of namespace scribo::filter
-
-} // end of namespace scribo
-
-
-#endif // ! SCRIBO_FILTER_THIN_BBOXES_HH
diff --git a/scribo/filter/thin_objects.hh b/scribo/filter/thin_objects.hh
new file mode 100644
index 0000000..45e491a
--- /dev/null
+++ b/scribo/filter/thin_objects.hh
@@ -0,0 +1,191 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library 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 this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library 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_FILTER_THIN_OBJECTS_HH
+# define SCRIBO_FILTER_THIN_OBJECTS_HH
+
+/// \file scribo/filter/thin_objects.hh
+///
+/// Remove too thin objects.
+
+# include <mln/core/concept/image.hh>
+# include <mln/core/concept/neighborhood.hh>
+
+# include <mln/util/array.hh>
+
+# include <scribo/core/object_image.hh>
+# include <scribo/extract/primitive/objects.hh>
+
+namespace scribo
+{
+
+ namespace filter
+ {
+
+ using namespace mln;
+
+ /// Remove objects thinner or equal to \p min_thickness.
+ ///
+ /// \param[in] input_ a binary image.
+ /// \param[in] nbh_ a neighborhood used in labeling algorithms.
+ /// \param[in] label_type the label type used for labeling.
+ /// \param[in] min_thickness the minimum thickness value.
+ ///
+ /// \result A binary image without thin objects.
+ //
+ template <typename I, typename N, typename V>
+ inline
+ mln_concrete(I)
+ thin_objects(const Image<I>& input_,
+ const Neighborhood<N>& nbh_,
+ const V& label_type,
+ unsigned min_thickness);
+
+ /// Remove lines of text thinner or equal to \p min_thickness.
+ ///
+ /// \param[in] objects An object image.
+ /// \param[in] min_thickness the minimum thickness value.
+ ///
+ /// \result An object image without too thin objects.
+ //
+ template <typename L>
+ inline
+ object_image(L)
+ thin_objects(const object_image(L)& text,
+ unsigned min_thickness);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ namespace internal
+ {
+
+
+ /// Filter Functor.
+ /// Return false for all objects which are too large.
+ template <typename L>
+ struct thin_objects_filter
+ : Function_v2b< thin_objects_filter<L> >
+ {
+ typedef accu::bbox<mln_psite(L)> box_accu_t;
+
+ /// Constructor
+ ///
+ /// \param[in] objects object bounding boxes.
+ /// \param[in] min_thickness the minimum thickness allowed.
+ thin_objects_filter(const object_image(L)& objects,
+ unsigned min_thickness)
+ : objects_(objects), min_thickness_(min_thickness)
+ {
+ }
+
+
+ /// Return false if the objects is thinner than
+ /// \p min_thickness_.
+ ///
+ /// \param[in] l An image value.
+ bool operator()(const mln_value(L)& l) const
+ {
+ if (l == literal::zero)
+ return true;
+ return objects_.bbox(l).nrows() > min_thickness_
+ && objects_.bbox(l).ncols() > min_thickness_;
+ }
+
+ /// Component bounding boxes.
+ object_image(L) objects_;
+
+ /// The minimum thickness.
+ unsigned min_thickness_;
+ };
+
+
+ } // end of namespace scribo::filter::internal
+
+
+ template <typename I, typename N, typename V>
+ inline
+ mln_concrete(I)
+ thin_objects(const Image<I>& input_,
+ const Neighborhood<N>& nbh_,
+ const V& label_type,
+ unsigned min_thickness)
+ {
+ trace::entering("scribo::filter::thin_objects");
+
+ const I& input = exact(input_);
+ const N& nbh = exact(nbh_);
+
+ mln_precondition(input.is_valid());
+ mln_precondition(nbh.is_valid());
+
+ V nlabels;
+ typedef mln_ch_value(I,V) lbl_t;
+ object_image(lbl_t) objects
+ = extract::primitive::objects(input, nbh, nlabels);
+
+ typedef internal::thin_objects_filter<lbl_t> func_t;
+ func_t fv2b(objects, min_thickness);
+ objects.relabel(fv2b);
+
+ mln_concrete(I) output = duplicate(input);
+ data::fill((output | pw::value(objects) == literal::zero).rw(), false);
+
+ trace::exiting("scribo::filter::thin_objects");
+ return output;
+ }
+
+
+ template <typename L>
+ inline
+ object_image(L)
+ thin_objects(const object_image(L)& objects,
+ unsigned min_thickness)
+ {
+ trace::entering("scribo::filter::thin_objects");
+
+ mln_precondition(objects.is_valid());
+
+ typedef internal::thin_objects_filter<L> func_t;
+ func_t is_not_too_thin(objects, min_thickness);
+
+ object_image(L) output;
+ output.init_from_(objects);
+ output.relabel(is_not_too_thin);
+
+ trace::exiting("scribo::filter::thin_objects");
+ return output;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace scribo::filter
+
+} // end of namespace scribo
+
+
+#endif // ! SCRIBO_FILTER_THIN_OBJECTS_HH
--
1.5.6.5
* text/extract_bboxes.hh,
* core/component_bboxes.hh: useless so removed.
* core/object_image.hh: new. Define a macro wrapping labeled_image
type.
* table/extract_lines_with_opening.hh: removed. Replaced by
lines_*_thick.
* table/extract_lines_with_rank.hh: removed. Replaced by
lines_*_discontinued.
* extract/primitive/lines_discontinued.hh,
* extract/primitive/lines_h_discontinued.hh,
* extract/primitive/lines_h_thick.hh,
* extract/primitive/lines_thick.hh,
* extract/primitive/lines_v_discontinued.hh,
* extract/primitive/lines_v_thick.hh,
* extract/primitive/objects.hh,
* table/extract.hh,
* text/grouping/group_from_double_link.hh,
* text/grouping/group_from_graph.hh,
* text/grouping/group_with_several_left_links.hh,
* text/grouping/group_with_several_right_links.hh,
* text/grouping/internal/find_left_link.hh,
* text/grouping/internal/find_right_link.hh,
* text/recognition.hh: make use of labeled_image type.
---
scribo/ChangeLog | 32 +++++
scribo/core/component_bboxes.hh | 92 ------------
scribo/core/object_image.hh | 42 ++++++
scribo/debug/usage.hh | 49 +++++++
scribo/extract/primitive/lines_discontinued.hh | 98 ++++----------
scribo/extract/primitive/lines_h_discontinued.hh | 62 +++------
scribo/extract/primitive/lines_h_thick.hh | 133 ++++++++++++++++++
scribo/extract/primitive/lines_thick.hh | 55 +-------
scribo/extract/primitive/lines_v_discontinued.hh | 60 ++------
scribo/extract/primitive/lines_v_thick.hh | 133 ++++++++++++++++++
scribo/extract/primitive/objects.hh | 47 ++-----
scribo/table/extract.hh | 20 ++--
scribo/table/extract_lines_with_opening.hh | 141 -------------------
scribo/table/extract_lines_with_rank.hh | 146 --------------------
scribo/text/extract_bboxes.hh | 103 --------------
scribo/text/grouping/group_from_double_link.hh | 31 ++---
scribo/text/grouping/group_from_graph.hh | 64 +++------
.../text/grouping/group_with_several_left_links.hh | 34 +++--
.../grouping/group_with_several_right_links.hh | 39 +++---
scribo/text/grouping/internal/find_left_link.hh | 18 +--
scribo/text/grouping/internal/find_right_link.hh | 16 +--
scribo/text/recognition.hh | 37 +++--
22 files changed, 592 insertions(+), 860 deletions(-)
delete mode 100644 scribo/core/component_bboxes.hh
create mode 100644 scribo/core/object_image.hh
create mode 100644 scribo/debug/usage.hh
create mode 100644 scribo/extract/primitive/lines_h_thick.hh
create mode 100644 scribo/extract/primitive/lines_v_thick.hh
delete mode 100644 scribo/table/extract_lines_with_opening.hh
delete mode 100644 scribo/table/extract_lines_with_rank.hh
delete mode 100644 scribo/text/extract_bboxes.hh
diff --git a/scribo/ChangeLog b/scribo/ChangeLog
index 86d8a0f..0c8eae6 100644
--- a/scribo/ChangeLog
+++ b/scribo/ChangeLog
@@ -1,3 +1,35 @@
+2009-05-28 Guillaume Lazzara <lazzara(a)lrde.epita.fr>
+
+ Make use of labeled_image type in Scribo.
+
+ * text/extract_bboxes.hh,
+ * core/component_bboxes.hh: useless so removed.
+
+ * core/object_image.hh: new. Define a macro wrapping labeled_image
+ type.
+
+ * table/extract_lines_with_opening.hh: removed. Replaced by
+ lines_*_thick.
+
+ * table/extract_lines_with_rank.hh: removed. Replaced by
+ lines_*_discontinued.
+
+ * extract/primitive/lines_discontinued.hh,
+ * extract/primitive/lines_h_discontinued.hh,
+ * extract/primitive/lines_h_thick.hh,
+ * extract/primitive/lines_thick.hh,
+ * extract/primitive/lines_v_discontinued.hh,
+ * extract/primitive/lines_v_thick.hh,
+ * extract/primitive/objects.hh,
+ * table/extract.hh,
+ * text/grouping/group_from_double_link.hh,
+ * text/grouping/group_from_graph.hh,
+ * text/grouping/group_with_several_left_links.hh,
+ * text/grouping/group_with_several_right_links.hh,
+ * text/grouping/internal/find_left_link.hh,
+ * text/grouping/internal/find_right_link.hh,
+ * text/recognition.hh: make use of labeled_image type.
+
2009-05-27 Roland Levillain <roland(a)lrde.epita.fr>
Add the list of SCRIBO's unit tests.
diff --git a/scribo/core/component_bboxes.hh b/scribo/core/component_bboxes.hh
deleted file mode 100644
index 16b6fa0..0000000
--- a/scribo/core/component_bboxes.hh
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory
-// (LRDE)
-//
-// This file is part of the Olena Library. This library is free
-// software; you can redistribute it and/or modify it under the terms
-// of the GNU General Public License version 2 as published by the
-// Free Software Foundation.
-//
-// This library 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 this library; see the file COPYING. If not, write to
-// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-// Boston, MA 02111-1307, USA.
-//
-// As a special exception, you may use this file as part of a free
-// software library 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_CORE_COMPONENT_BBOXES_HH
-# define SCRIBO_CORE_COMPONENT_BBOXES_HH
-
-/// \file scribo/core/component_bboxes.hh
-///
-/// Extract the bounding boxes of image components.
-
-# include <mln/core/concept/image.hh>
-# include <mln/core/concept/neighborhood.hh>
-# include <mln/core/site_set/box.hh>
-
-# include <mln/labeling/blobs.hh>
-# include <mln/labeling/compute.hh>
-
-# include <mln/util/array.hh>
-
-# include <mln/debug/println.hh>
-
-namespace scribo
-{
-
- using namespace mln;
-
- /// Extract the components bboxes.
- template <typename I, typename N, typename V>
- util::couple<util::array< box<mln_site(I)> >, mln_ch_value(I,V)>
- component_bboxes(const Image<I>& input,
- const Neighborhood<N>& nbh,
- V& nbboxes);
-
-# ifndef MLN_INCLUDE_ONLY
-
- template <typename I, typename N, typename V>
- inline
- util::couple<util::array< box<mln_site(I)> >, mln_ch_value(I,V)>
- component_bboxes(const Image<I>& input,
- const Neighborhood<N>& nbh,
- V& nbboxes)
- {
- trace::entering("scribo::component_bboxes");
-
- mlc_equal(mln_value(I),bool)::check();
- mlc_is_a(V, mln::value::Symbolic)::check();
- mln_precondition(exact(input).is_valid());
- mln_precondition(exact(nbh).is_valid());
-
- mln_ch_value(I,V) lbl = labeling::blobs(input, nbh, nbboxes);
- mln_assertion(exact(lbl).is_valid());
-
- typedef util::array< box<mln_site(I)> > bboxes_t;
- bboxes_t bboxes = labeling::compute(accu::meta::bbox(), lbl, nbboxes);
- mln_postcondition(bboxes.nelements() == nbboxes.next());
-
- trace::exiting("scribo::component_bboxes");
- return mln::make::couple(bboxes, lbl);
- }
-
-# endif // ! MLN_INCLUDE_ONLY
-
-} // end of namespace scribo
-
-
-#endif // ! SCRIBO_CORE_COMPONENT_BBOXES_HH
diff --git a/scribo/core/object_image.hh b/scribo/core/object_image.hh
new file mode 100644
index 0000000..98c5b83
--- /dev/null
+++ b/scribo/core/object_image.hh
@@ -0,0 +1,42 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory
+// (LRDE)
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library 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 this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library 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_CORE_OBJECT_IMAGE_HH
+# define SCRIBO_CORE_OBJECT_IMAGE_HH
+
+/// \file scribo/core/object_image.hh
+///
+/// FIXME.
+
+# include <mln/core/image/imorph/labeled_image.hh>
+
+# define object_image(L) \
+ labeled_image<L>
+
+#endif // ! SCRIBO_CORE_OBJECT_IMAGE_HH
diff --git a/scribo/debug/usage.hh b/scribo/debug/usage.hh
new file mode 100644
index 0000000..733083e
--- /dev/null
+++ b/scribo/debug/usage.hh
@@ -0,0 +1,49 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library 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 this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library 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.
+
+/// \file scribo/debug/usage.hh
+///
+/// Format program usage.
+
+
+int usage(char* argv[], const char *desc, const char* args,
+ const char*args_desc[][2], const char *out_desc)
+{
+ std::cout << desc << std::endl;
+ std::cout << "-----------" << std::endl;
+ std::cout << "Usage: " << argv[0] << " " << args << std::endl;
+
+ for (unsigned i = 0; args_desc[i][0] != 0; ++i)
+ std::cout << " " << args_desc[i][0] << ": " << args_desc[i][1]
+ << std::endl;
+
+ std::cout << std::endl << "Output: " << out_desc << std::endl;
+ std::cout << "-----------" << std::endl;
+ std::cout << "EPITA/LRDE - Scribo 2009" << std::endl;
+ return 1;
+}
+
diff --git a/scribo/extract/primitive/lines_discontinued.hh b/scribo/extract/primitive/lines_discontinued.hh
index 5730fcc..1218c2a 100644
--- a/scribo/extract/primitive/lines_discontinued.hh
+++ b/scribo/extract/primitive/lines_discontinued.hh
@@ -30,7 +30,7 @@
#ifndef SCRIBO_EXTRACT_PRIMITIVE_LINES_DISCONTINUED_HH
# define SCRIBO_EXTRACT_PRIMITIVE_LINES_DISCONTINUED_HH
-/// \file scribo/primitive/lines/discontinued.hh
+/// \file scribo/primitive/lines/lines_discontinued.hh
///
/// Extract discontinued lines in a binary image.
@@ -38,19 +38,15 @@
# include <mln/core/concept/image.hh>
# include <mln/core/concept/window.hh>
# include <mln/core/concept/neighborhood.hh>
-# include <mln/core/site_set/box.hh>
# include <mln/labeling/blobs.hh>
# include <mln/morpho/rank_filter.hh>
-
-# include <mln/accu/bbox.hh>
-
-# include <mln/util/array.hh>
-# include <mln/util/couple.hh>
+# include <mln/morpho/dilation.hh>
# include <scribo/core/macros.hh>
-# include <scribo/core/component_bboxes.hh>
+# include <scribo/core/object_image.hh>
+# include <scribo/extract/primitive/objects.hh>
namespace scribo
{
@@ -70,28 +66,18 @@ namespace scribo
*
* \param[in] input_ A binary image.
* \param[in] nbh_ The neighborhood used for labeling image
- * components.
+ * the lines.
* \param[in,out] nlines The label type used for labeling.
* \param[in] win_ A Window used to extract lines.
* \param[in] rank_k Rank used for filtering.
- * \param[in,out] line_bboxes line bounding boxes.
*
* \return An image in which lines are labeled.
*/
template <typename I, typename N, typename V, typename W>
- mln_ch_value(I,V)
- discontinued(const Image<I>& input_,
- const Neighborhood<N>& nbh_, V& nlines,
- const Window<W>& win_, unsigned rank_k,
- util::array<box<mln_site(I)> >& line_bboxes);
-
-
- /// \overload
- template <typename I, typename N, typename V, typename W>
- mln_ch_value(I,V)
- discontinued(const Image<I>& input_,
- const Neighborhood<N>& nbh_, V& nlines,
- const Window<W>& win_, unsigned rank_k);
+ object_image(mln_ch_value(I,V))
+ lines_discontinued(const Image<I>& input_,
+ const Neighborhood<N>& nbh_, V& nlines,
+ const Window<W>& win_, unsigned rank_k);
@@ -104,12 +90,12 @@ namespace scribo
template <typename I, typename N, typename V, typename W>
void
- discontinued_tests(const Image<I>& input_,
- const Neighborhood<N>& nbh_, V& nlines,
- const Window<W>& win_, unsigned rank_k)
+ lines_discontinued_tests(const Image<I>& input,
+ const Neighborhood<N>& nbh, V& nlines,
+ const Window<W>& win, unsigned rank_k)
{
mlc_equal(mln_value(I),bool)::check();
- mlc_equal(mln_site(I)::dim, 2)::check();
+ mlc_bool(mln_site_(I)::dim == 2)::check();
mlc_is_a(V, mln::value::Symbolic)::check();
mln_precondition(exact(input).is_valid());
@@ -126,61 +112,33 @@ namespace scribo
template <typename I, typename N, typename V, typename W>
inline
- mln_ch_value(I,V)
- discontinued(const Image<I>& input_,
- const Neighborhood<N>& nbh_, V& nlines,
- const Window<W>& win_, unsigned rank_k)
- {
- trace::entering("scribo::primitive::discontinued");
-
- internal::discontinued_tests(input_, nbh_, nlines, win_, rank_k);
-
- const I& input = exact(input_);
- const N& nbh = exact(nbh_);
- const W& win = exact(win_);
-
- mln_ch_value(I,bool) filter = morpho::rank_filter(input, win, vrank_k);
- mln_ch_value(I,V) output = labeling::blobs(filter, nbh, nlines);
-
- trace::exiting("scribo::primitive::discontinued");
- return output;
- }
-
-
-
-
- template <typename I, typename N, typename V, typename W>
- inline
- mln_ch_value(I,V)
- discontinued(const Image<I>& input_,
- const Neighborhood<N>& nbh_, V& nlines,
- const Window<W>& win_, unsigned rank_k,
- util::array<box<mln_site(I)> >& line_bboxes)
+ object_image(mln_ch_value(I,V))
+ lines_discontinued(const Image<I>& input_,
+ const Neighborhood<N>& nbh_, V& nlines,
+ const Window<W>& win_, unsigned rank_k)
{
- trace::entering("scribo::primitive::discontinued");
+ trace::entering("scribo::primitive::lines_discontinued");
- internal::discontinued_tests(input_, nbh_, nlines, win_, rank_k);
+ internal::lines_discontinued_tests(input_, nbh_, nlines, win_, rank_k);
const I& input = exact(input_);
const N& nbh = exact(nbh_);
const W& win = exact(win_);
- mln_ch_value(I,V)
- output = discontinued(input, nbh, nlines, win, rank_k);
+ mln_ch_value(I,bool) filter
+ = morpho::dilation(morpho::rank_filter(input, win, rank_k), W(win.length() / 2));
+ object_image(mln_ch_value(I,V)) output
+ = extract::primitive::objects(filter, nbh, nlines);
- line_bboxes = labeling::compute(accu::meta::bbox(), output, nlines);
- mln_postcondition(line_bboxes.nelements() == nlines.next());
- // for_all_components(i, line_bboxes)
- // {
- // line_bboxes[i].enlarge(0, win.length() / 2);
- // line_bboxes[i].crop_wrt(input.domain());
- // }
+ //FIXME: we would like to enlarge the component in the right direction,
+ // in order to avoid rank filter side effects (smaller components).
- trace::exiting("scribo::primitive::discontinued");
+ trace::exiting("scribo::primitive::lines_discontinued");
return output;
}
-# endif // !MLN_INCLUDE_ONLY
+
+# endif // ! MLN_INCLUDE_ONLY
} // end of namespace scribo::extract::primitive
diff --git a/scribo/extract/primitive/lines_h_discontinued.hh b/scribo/extract/primitive/lines_h_discontinued.hh
index 7f31bff..c20c51d 100644
--- a/scribo/extract/primitive/lines_h_discontinued.hh
+++ b/scribo/extract/primitive/lines_h_discontinued.hh
@@ -37,6 +37,11 @@
# include <mln/core/concept/neighborhood.hh>
# include <mln/win/hline2d.hh>
+# include <scribo/core/object_image.hh>
+# include <scribo/extract/primitive/lines_discontinued.hh>
+
+
+
namespace scribo
{
@@ -46,6 +51,7 @@ namespace scribo
namespace primitive
{
+ using namespace mln;
/// Extract horizontal discontinued lines.
/*!
@@ -60,43 +66,36 @@ namespace scribo
* from 0.
*/
template <typename I, typename N, typename V>
- mln_ch_value(I,V)
+ object_image(mln_ch_value(I,V))
lines_h_discontinued(const Image<I>& input,
const Neighborhood<N>& nbh, V& nlines,
unsigned line_length, unsigned rank_k);
- /// \overload
- template <typename I, typename N, typename V>
- mln_ch_value(I,V)
- lines_h_discontinued(const Image<I>& input,
- const Neighborhood<N>& nbh, V& nlines,
- unsigned line_length, unsigned rank_k,
- util::array<box<mln_site(I)> >& line_bboxes);
-
-
# ifndef MLN_INCLUDE_ONLY
namespace internal
{
- template <typename I, typename N, typename V, typename W>
+ template <typename I, typename N, typename V>
void
- lines_h_discontinued_tests(const Image<I>& input_,
- const Neighborhood<N>& nbh_, V& nlines,
+ lines_h_discontinued_tests(const Image<I>& input,
+ const Neighborhood<N>& nbh, V& nlines,
unsigned line_length, unsigned rank_k)
{
mlc_equal(mln_value(I),bool)::check();
- mlc_equal(mln_site(I)::dim, 2)::check();
+ mlc_bool(mln_site_(I)::dim == 2)::check();
mlc_is_a(V, mln::value::Symbolic)::check();
mln_precondition(exact(input).is_valid());
mln_precondition(exact(nbh).is_valid());
- mln_precondition(exact(win).is_valid());
- mln_precondition(!(line_length % 2));
+ mln_precondition(line_length % 2);
+ (void) input;
+ (void) nbh;
(void) nlines;
+ (void) line_length;
(void) rank_k;
}
@@ -105,20 +104,20 @@ namespace scribo
template <typename I, typename N, typename V>
- mln_ch_value(I,V)
+ object_image(mln_ch_value(I,V))
lines_h_discontinued(const Image<I>& input,
const Neighborhood<N>& nbh, V& nlines,
unsigned line_length, unsigned rank_k)
{
trace::entering("scribo::primitive::lines_h_discontinued");
- internal::line_h_discontinued_tests(input, nbh, nlines,
+ internal::lines_h_discontinued_tests(input, nbh, nlines,
line_length, rank_k);
win::hline2d win(line_length);
- mln_ch_value(I,V)
- output = lines_discontinued(input, nh, nlines, win, rank_k);
+ object_image(mln_ch_value(I,V))
+ output = lines_discontinued(input, nbh, nlines, win, rank_k);
trace::exiting("scribo::primitive::lines_h_discontinued");
return output;
@@ -126,29 +125,6 @@ namespace scribo
- template <typename I, typename N, typename V>
- mln_ch_value(I,V)
- lines_h_discontinued(const Image<I>& input,
- const Neighborhood<N>& nbh, V& nlines,
- unsigned line_length, unsigned rank_k,
- util::array<box<mln_site(I)> >& line_bboxes)
- {
- trace::entering("scribo::primitive::lines_h_discontinued");
-
- internal::line_h_discontinued_tests(input, nbh, nlines,
- line_length, rank_k);
-
- win::hline2d win(line_length);
- mln_ch_value(I,V)
- output = internal::line_h_discontinued_tests(input, nbh, nlines,
- line_length, rank_k,
- line_bboxes);
-
- trace::exiting("scribo::primitive::lines_h_discontinued");
- return output;
- }
-
-
# endif // ! MLN_INCLUDE_ONLY
} // end of namespace scribo::extract::primitive
diff --git a/scribo/extract/primitive/lines_h_thick.hh b/scribo/extract/primitive/lines_h_thick.hh
new file mode 100644
index 0000000..0762bbc
--- /dev/null
+++ b/scribo/extract/primitive/lines_h_thick.hh
@@ -0,0 +1,133 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory
+// (LRDE)
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library 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 this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library 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_EXTRACT_PRIMITIVE_LINES_H_THICK_HH
+# define SCRIBO_EXTRACT_PRIMITIVE_LINES_H_THICK_HH
+
+/// \file scribo/primitive/lines_h_thick.hh
+///
+/// Extract horizontal thick lines.
+
+# include <mln/core/concept/image.hh>
+# include <mln/core/concept/neighborhood.hh>
+# include <mln/win/hline2d.hh>
+
+# include <scribo/core/object_image.hh>
+# include <scribo/extract/primitive/lines_thick.hh>
+
+namespace scribo
+{
+
+ namespace extract
+ {
+
+ namespace primitive
+ {
+
+ using namespace mln;
+
+ /// Extract thick lines in a binary image.
+ /*!
+ * Only non discontinued lines are correctly extracted with this routine.
+ *
+ * \param[in] input_ A binary image.
+ * \param[in] nbh_ The neighborhood used for labeling image
+ * components.
+ * \param[in,out] nlines Type used for labeling.
+ * \param[in] line_length The minimum line length.
+ *
+ * \return An image in which lines are labeled.
+ */
+ template <typename I, typename N, typename V, typename W>
+ object_image(mln_ch_value(I,V))
+ lines_thick(const Image<I>& input_,
+ const Neighborhood<N>& nbh_, V& nlines,
+ unsigned line_length);
+
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ namespace internal
+ {
+
+ template <typename I, typename N, typename V>
+ void
+ lines_h_thick_tests(const Image<I>& input,
+ const Neighborhood<N>& nbh, V& nlines,
+ unsigned line_length)
+ {
+ mlc_equal(mln_value(I),bool)::check();
+ mlc_bool(mln_site_(I)::dim == 2)::check();
+ mlc_is_a(V, mln::value::Symbolic)::check();
+
+ mln_precondition(exact(input).is_valid());
+ mln_precondition(exact(nbh).is_valid());
+ mln_precondition(line_length % 2);
+
+ (void) input;
+ (void) nbh;
+ (void) nlines;
+ (void) line_length;
+ }
+
+ } // end of namespace scribo::primitive::internal
+
+
+
+ template <typename I, typename N, typename V>
+ object_image(mln_ch_value(I,V))
+ lines_h_thick(const Image<I>& input,
+ const Neighborhood<N>& nbh, V& nlines,
+ unsigned line_length)
+ {
+ trace::entering("scribo::primitive::lines_h_thick");
+
+ internal::lines_h_thick_tests(input, nbh, nlines,
+ line_length);
+
+ win::hline2d win(line_length);
+
+ object_image(mln_ch_value(I,V))
+ output = lines_thick(input, nbh, nlines, win);
+
+ trace::exiting("scribo::primitive::lines_h_thick");
+ return output;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace scribo::extract::primitive
+
+ } // end of namespace scribo::extract
+
+} // end of namespace scribo
+
+#endif // ! SCRIBO_EXTRACT_PRIMITIVE_LINES_H_THICK_HH
+
diff --git a/scribo/extract/primitive/lines_thick.hh b/scribo/extract/primitive/lines_thick.hh
index ea5e8d1..3777822 100644
--- a/scribo/extract/primitive/lines_thick.hh
+++ b/scribo/extract/primitive/lines_thick.hh
@@ -38,17 +38,12 @@
# include <mln/core/concept/image.hh>
# include <mln/core/concept/window.hh>
# include <mln/core/concept/neighborhood.hh>
-# include <mln/core/site_set/box.hh>
-# include <mln/morpho/erosion.hh>
-
-# include <mln/accu/bbox.hh>
-
-# include <mln/util/array.hh>
-# include <mln/util/couple.hh>
+# include <mln/morpho/opening/structural.hh>
+# include <scribo/core/object_image.hh>
# include <scribo/core/macros.hh>
-# include <scribo/core/component_bboxes.hh>
+# include <scribo/extract/primitive/objects.hh>
namespace scribo
{
@@ -71,20 +66,11 @@ namespace scribo
* components.
* \param[in,out] nlines Type used for labeling.
* \param[in] win_ Window used to extract the lines
- * \param[in,out] line_bboxes Line bounding boxes.
*
* \return An image in which lines are labeled.
*/
template <typename I, typename N, typename V, typename W>
- mln_ch_value(I,V)
- lines_thick(const Image<I>& input_,
- const Neighborhood<N>& nbh_, V& nlines,
- const Window<W>& win_,
- util::array<box<mln_site(I)>& line_bboxes);
-
- /// \overload
- template <typename I, typename N, typename V, typename W>
- mln_ch_value(I,V)
+ object_image(mln_ch_value(I,V))
lines_thick(const Image<I>& input_,
const Neighborhood<N>& nbh_, V& nlines,
const Window<W>& win_);
@@ -104,7 +90,7 @@ namespace scribo
const Window<W>& win_)
{
mlc_equal(mln_value(I),bool)::check();
- mlc_equal(mln_site(I)::dim, 2)::check();
+ mlc_bool(mln_site_(I)::dim == 2)::check();
mlc_is_a(V, mln::value::Symbolic)::check();
mln_precondition(exact(input).is_valid());
@@ -120,7 +106,7 @@ namespace scribo
template <typename I, typename N, typename V, typename W>
inline
- mln_ch_value(I,V)
+ object_image(mln_ch_value(I,V))
lines_thick(const Image<I>& input_,
const Neighborhood<N>& nbh_, V& nlines,
const Window<W>& win_)
@@ -134,39 +120,14 @@ namespace scribo
const W& win = exact(win_);
mln_ch_value(I,bool) filter = morpho::opening::structural(input, win);
- mln_ch_value(I,V) output = labeling::blobs(filter, nbh, nlines);
+ object_image(mln_ch_value(I,V)) output
+ = extract::primitive::objects(filter, nbh, nlines);
trace::exiting("scribo::primitive::lines_thick");
return output;
}
-
- template <typename I, typename N, typename V, typename W>
- inline
- mln_ch_value(I,V)
- lines_thick(const Image<I>& input_,
- const Neighborhood<N>& nbh_, V& nlines,
- const Window<W>& win_,
- util::array<box<mln_site(I)>& line_bboxes)
- {
- trace::entering("scribo::primitive::lines_thick");
-
- internal::lines_thick_tests(input_, nbh_, nlines, win_);
-
- const I& input = exact(input_);
- const N& nbh = exact(nbh_);
- const W& win = exact(win_);
-
- mln_ch_value(I,V) output = lines_thick(input, nbh, nlines, win);
-
- line_bboxes = labeling::compute(accu::meta::bbox(), output, nlines);
- mln_postcondition(line_bboxes.nelements() == nlines.next());
-
- trace::exiting("scribo::primitive::lines_thick");
- return output;
- }
-
# endif // !MLN_INCLUDE_ONLY
} // end of namespace scribo::extract::primitive
diff --git a/scribo/extract/primitive/lines_v_discontinued.hh b/scribo/extract/primitive/lines_v_discontinued.hh
index 26edbb4..050e371 100644
--- a/scribo/extract/primitive/lines_v_discontinued.hh
+++ b/scribo/extract/primitive/lines_v_discontinued.hh
@@ -36,6 +36,10 @@
# include <mln/core/concept/image.hh>
# include <mln/core/concept/neighborhood.hh>
+# include <scribo/core/object_image.hh>
+# include <scribo/extract/primitive/lines_discontinued.hh>
+
+
namespace scribo
{
@@ -55,21 +59,12 @@ namespace scribo
* \param[in] line_length The minimum line length expected. (must be
* odd).
* \param[in] rank_k Rank filter parameter.
- * \param[in,out] line_bboxes Will store the line bounding boxes.
*
* \result An image in which lines are labeled with a value different
* from 0.
*/
template <typename I, typename N, typename V>
- mln_ch_value(I,V)
- lines_v_discontinued(const Image<I>& input,
- const Neighborhood<N>& nbh, V& nlines,
- unsigned line_length, unsigned rank_k,
- util::array<box<mln_site(I)> >& line_bboxes);
-
- /// \overload
- template <typename I, typename N, typename V>
- mln_ch_value(I,V)
+ object_image(mln_ch_value(I,V))
lines_v_discontinued(const Image<I>& input,
const Neighborhood<N>& nbh, V& nlines,
unsigned line_length, unsigned rank_k);
@@ -81,20 +76,19 @@ namespace scribo
namespace internal
{
- template <typename I, typename N, typename V, typename W>
+ template <typename I, typename N, typename V>
void
- lines_v_discontinued_tests(const Image<I>& input_,
- const Neighborhood<N>& nbh_, V& nlines,
+ lines_v_discontinued_tests(const Image<I>& input,
+ const Neighborhood<N>& nbh, V& nlines,
unsigned line_length, unsigned rank_k)
{
mlc_equal(mln_value(I),bool)::check();
- mlc_equal(mln_site(I)::dim, 2)::check();
+ mlc_bool(mln_site_(I)::dim == 2)::check();
mlc_is_a(V, mln::value::Symbolic)::check();
mln_precondition(exact(input).is_valid());
mln_precondition(exact(nbh).is_valid());
- mln_precondition(exact(win).is_valid());
- mln_precondition(!(line_length % 2));
+ mln_precondition(line_length % 2);
(void) nlines;
(void) rank_k;
@@ -105,44 +99,20 @@ namespace scribo
template <typename I, typename N, typename V>
- mln_ch_value(I,V)
+ object_image(mln_ch_value(I,V))
lines_v_discontinued(const Image<I>& input,
const Neighborhood<N>& nbh, V& nlines,
unsigned line_length, unsigned rank_k)
{
trace::entering("scribo::primitive::lines_v_discontinued");
- internal::line_v_discontinued_tests(input, nbh, nlines,
- line_length, rank_k);
-
- win::hline2d win(line_length);
-
- mln_ch_value(I,V)
- output = lines_discontinued(input, nh, nlines, win, rank_k);
-
- trace::exiting("scribo::primitive::lines_v_discontinued");
- return output;
- }
-
-
-
- template <typename I, typename N, typename V>
- mln_ch_value(I,V)
- lines_v_discontinued(const Image<I>& input,
- const Neighborhood<N>& nbh, V& nlines,
- unsigned line_length, unsigned rank_k,
- util::array<box<mln_site(I)> >& line_bboxes)
- {
- trace::entering("scribo::primitive::lines_v_discontinued");
-
- internal::line_v_discontinued_tests(input, nbh, nlines,
+ internal::lines_v_discontinued_tests(input, nbh, nlines,
line_length, rank_k);
win::vline2d win(line_length);
- mln_ch_value(I,V)
- output = internal::line_v_discontinued_tests(input, nbh, nlines,
- line_length, rank_k,
- line_bboxes);
+
+ object_image(mln_ch_value(I,V))
+ output = lines_discontinued(input, nbh, nlines, win, rank_k);
trace::exiting("scribo::primitive::lines_v_discontinued");
return output;
diff --git a/scribo/extract/primitive/lines_v_thick.hh b/scribo/extract/primitive/lines_v_thick.hh
new file mode 100644
index 0000000..6cdecb7
--- /dev/null
+++ b/scribo/extract/primitive/lines_v_thick.hh
@@ -0,0 +1,133 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory
+// (LRDE)
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library 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 this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library 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_EXTRACT_PRIMITIVE_LINES_V_THICK_HH
+# define SCRIBO_EXTRACT_PRIMITIVE_LINES_V_THICK_HH
+
+/// \file scribo/primitive/lines_v_thick.hh
+///
+/// Extract vertical thick lines.
+
+# include <mln/core/concept/image.hh>
+# include <mln/core/concept/neighborhood.hh>
+# include <mln/win/vline2d.hh>
+
+# include <scribo/core/object_image.hh>
+# include <scribo/extract/primitive/lines_thick.hh>
+
+namespace scribo
+{
+
+ namespace extract
+ {
+
+ namespace primitive
+ {
+
+ using namespace mln;
+
+ /// Extract thick lines in a binary image.
+ /*!
+ * Only non discontinued lines are correctly extracted with this routine.
+ *
+ * \param[in] input_ A binary image.
+ * \param[in] nbh_ The neighborhood used for labeling image
+ * components.
+ * \param[in,out] nlines Type used for labeling.
+ * \param[in] line_length The minimum line length.
+ *
+ * \return An image in which lines are labeled.
+ */
+ template <typename I, typename N, typename V, typename W>
+ object_image(mln_ch_value(I,V))
+ lines_thick(const Image<I>& input_,
+ const Neighborhood<N>& nbh_, V& nlines,
+ unsigned line_length);
+
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ namespace internal
+ {
+
+ template <typename I, typename N, typename V>
+ void
+ lines_v_thick_tests(const Image<I>& input,
+ const Neighborhood<N>& nbh, V& nlines,
+ unsigned line_length)
+ {
+ mlc_equal(mln_value(I),bool)::check();
+ mlc_bool(mln_site_(I)::dim == 2)::check();
+ mlc_is_a(V, mln::value::Symbolic)::check();
+
+ mln_precondition(exact(input).is_valid());
+ mln_precondition(exact(nbh).is_valid());
+ mln_precondition(line_length % 2);
+
+ (void) input;
+ (void) nbh;
+ (void) nlines;
+ (void) line_length;
+ }
+
+ } // end of namespace scribo::primitive::internal
+
+
+
+ template <typename I, typename N, typename V>
+ object_image(mln_ch_value(I,V))
+ lines_v_thick(const Image<I>& input,
+ const Neighborhood<N>& nbh, V& nlines,
+ unsigned line_length)
+ {
+ trace::entering("scribo::primitive::lines_v_thick");
+
+ internal::lines_v_thick_tests(input, nbh, nlines,
+ line_length);
+
+ win::vline2d win(line_length);
+
+ object_image(mln_ch_value(I,V))
+ output = lines_thick(input, nbh, nlines, win);
+
+ trace::exiting("scribo::primitive::lines_v_thick");
+ return output;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace scribo::extract::primitive
+
+ } // end of namespace scribo::extract
+
+} // end of namespace scribo
+
+#endif // ! SCRIBO_EXTRACT_PRIMITIVE_LINES_V_THICK_HH
+
diff --git a/scribo/extract/primitive/objects.hh b/scribo/extract/primitive/objects.hh
index cc55d72..4ac0bed 100644
--- a/scribo/extract/primitive/objects.hh
+++ b/scribo/extract/primitive/objects.hh
@@ -35,7 +35,6 @@
/// Extract objects in a binary image.
-# include <mln/core/concept/image.hh>
# include <mln/core/concept/neighborhood.hh>
# include <mln/core/site_set/box.hh>
@@ -46,6 +45,12 @@
# include <mln/debug/println.hh>
+# include <scribo/core/object_image.hh>
+
+#include <mln/accu/bbox.hh>
+#include <mln/accu/center.hh>
+
+
namespace scribo
{
@@ -63,24 +68,12 @@ namespace scribo
/// and background to 'false'.
/// \param[in] nbh A neighborhood to be used for labeling.
/// \param[in,out] nobjects Will store the numbers of objects found.
- /// \param[in,out] bboxes Will store the objects bounding boxes.
///
/// \return An image of labeled objects.
//
template <typename I, typename N, typename V>
inline
- mln_ch_value(I,V)
- objects(const Image<I>& input,
- const Neighborhood<N>& nbh, V& nobjects,
- util::array< box<mln_site(I)> >& bboxes);
-
-
- /// Extract objects in a binary image.
- /// \overload
- //
- template <typename I, typename N, typename V>
- inline
- mln_ch_value(I,V)
+ object_image(mln_ch_value(I,V))
objects(const Image<I>& input,
const Neighborhood<N>& nbh, V& nobjects);
@@ -112,27 +105,7 @@ namespace scribo
template <typename I, typename N, typename V>
inline
- mln_ch_value(I,V)
- objects(const Image<I>& input,
- const Neighborhood<N>& nbh, V& nobjects,
- util::array< box<mln_site(I)> >& bboxes)
- {
- trace::entering("scribo::objects");
-
- internal::objects_tests(input, nbh, nobjects);
-
- mln_ch_value(I,V) object = objects(input, nbh, nobjects);
-
- bboxes = labeling::compute(accu::meta::bbox(), lbl, nobjects);
-
- trace::exiting("scribo::objects");
- return output;
- }
-
-
- template <typename I, typename N, typename V>
- inline
- mln_ch_value(I,V)
+ object_image(mln_ch_value(I,V))
objects(const Image<I>& input,
const Neighborhood<N>& nbh, V& nobjects)
{
@@ -140,7 +113,9 @@ namespace scribo
internal::objects_tests(input, nbh, nobjects);
- mln_ch_value(I,V) object = labeling::blobs(input, nbh, nobjects);
+ mln_ch_value(I,V) objects = labeling::blobs(input, nbh, nobjects);
+
+ object_image(mln_ch_value(I,V)) output(objects, nobjects);
trace::exiting("scribo::objects");
return output;
diff --git a/scribo/table/extract.hh b/scribo/table/extract.hh
index ebe4955..32f8965 100644
--- a/scribo/table/extract.hh
+++ b/scribo/table/extract.hh
@@ -40,7 +40,8 @@
# include <scribo/table/rebuild.hh>
# include <scribo/table/erase.hh>
-# include <scribo/table/extract_lines_with_rank.hh>
+# include <scribo/extract/primitive/lines_h_discontinued.hh>
+# include <scribo/extract/primitive/lines_v_discontinued.hh>
# include <scribo/make/debug_filename.hh>
@@ -83,20 +84,19 @@ namespace scribo
mln_precondition(input.is_valid());
mlc_equal(mln_value(I), bool)::check();
- typedef util::array< box<mln_site(I)> > boxarray_t;
- typedef util::couple<boxarray_t, boxarray_t> tblboxes_t;
-
- win::line<mln_grid(I::site), 0, mln_coord(I::site)> vline(51);
- win::line<mln_grid(I::site), 1, mln_coord(I::site)> hline(51);
- tblboxes_t lineboxes
- = table::extract_lines_with_rank(input, c8(), ncells,
- vline, hline, 6, 6);
+ V nhlines, nvlines;
+ object_image(mln_ch_value(I,V))
+ hlines = extract::primitive::lines_h_discontinued(input, c8(), nhlines, 51, 6),
+ vlines = extract::primitive::lines_v_discontinued(input, c8(), nvlines, 51, 6);
typedef mln::util::couple<mln_ch_value(I,V),
util::couple<util::array<box<mln_site(I)> >,
util::array<box<mln_site(I)> > > >
tables_t;
- tables_t tables = scribo::table::rebuild(input, lineboxes, 30, ncells);
+ tables_t tables
+ = scribo::table::rebuild(input,
+ mln::make::couple(vlines.bboxes(), hlines.bboxes()),
+ 30, ncells);
trace::exiting("scribo::table::extract");
return tables;
diff --git a/scribo/table/extract_lines_with_opening.hh b/scribo/table/extract_lines_with_opening.hh
deleted file mode 100644
index c3454db..0000000
--- a/scribo/table/extract_lines_with_opening.hh
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory
-// (LRDE)
-//
-// This file is part of the Olena Library. This library is free
-// software; you can redistribute it and/or modify it under the terms
-// of the GNU General Public License version 2 as published by the
-// Free Software Foundation.
-//
-// This library 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 this library; see the file COPYING. If not, write to
-// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-// Boston, MA 02111-1307, USA.
-//
-// As a special exception, you may use this file as part of a free
-// software library 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_TABLE_EXTRACT_LINES_WITH_OPENING_HH
-# define SCRIBO_TABLE_EXTRACT_LINES_WITH_OPENING_HH
-
-/// \file scribo/table/extract_lines_with_opening.hh
-///
-/// Extract table lines using a morphological opening filter.
-
-
-# include <mln/core/concept/image.hh>
-# include <mln/core/concept/window.hh>
-# include <mln/core/concept/neighborhood.hh>
-# include <mln/core/site_set/box.hh>
-
-# include <mln/morpho/erosion.hh>
-
-# include <mln/accu/bbox.hh>
-
-# include <mln/util/array.hh>
-# include <mln/util/couple.hh>
-
-# include <scribo/core/macros.hh>
-# include <scribo/core/component_bboxes.hh>
-
-namespace scribo
-{
-
- namespace table
- {
-
- using namespace mln;
-
- /// Find table bboxes thanks to a opening filter.
- /*!
- *
- * \param[in] input_ A binary image.
- * \param[in] nbh_ The neighborhood used for labeling image components.
- * \param[in] label_type Type used for labeling.
- * \param[in] vwin_ Window used to extract the vertical lines in a morphological
- * opening
- * \param[in] hwin_ Window used to extract the horizontal lines in a morphological
- * opening
- *
- * \return pair of array of bounding boxes. The first array holds the
- * vertical lines bounding boxes and the second one the
- * horizontal lines bounding boxes.
- */
- template <typename I, typename N, typename V, typename VW, typename HW>
- util::couple<util::array<box<mln_site(I)> >,
- util::array<box<mln_site(I)> > >
- extract_lines_with_opening(const Image<I>& input_,
- const Neighborhood<N>& nbh_, const V& label_type,
- const Window<VW>& vwin_, const Window<HW>& hwin_);
-
-
-# ifndef MLN_INCLUDE_ONLY
-
- template <typename I, typename N, typename V, typename VW, typename HW>
- inline
- util::couple<util::array<box<mln_site(I)> >,
- util::array<box<mln_site(I)> > >
- extract_lines_with_opening(const Image<I>& input_,
- const Neighborhood<N>& nbh_, const V& label_type,
- const Window<VW>& vwin_, const Window<HW>& hwin_)
- {
- trace::entering("scribo::table::extract_lines_with_opening");
-
- mlc_equal(mln_value(I),bool)::check();
- mlc_is_a(V, mln::value::Symbolic)::check();
-
- const I& input = exact(input_);
- const N& nbh = exact(nbh_);
- const VW& vwin = exact(vwin_);
- const HW& hwin = exact(hwin_);
-
- mln_precondition(input.is_valid());
- mln_precondition(nbh.is_valid());
- mln_precondition(vwin.is_valid());
- mln_precondition(hwin.is_valid());
-
- typedef util::array<box<mln_site(I)> > boxes_t;
-
- V ncomps;
-
- // Vertical lines
- mln_ch_value(I,bool) vfilter = morpho::erosion(input, vwin);
- boxes_t vboxes = component_bboxes(vfilter, nbh, ncomps).first();
- for_all_components(i, vboxes)
- {
- vboxes[i].enlarge(0, vwin.length() / 2);
- vboxes[i].crop_wrt(input.domain());
- }
-
- // Horizontal lines.
- mln_ch_value(I,bool) hfilter = morpho::erosion(input, hwin);
- boxes_t hboxes = component_bboxes(hfilter, nbh, ncomps).first();
- for_all_components(i, hboxes)
- {
- hboxes[i].enlarge(1, hwin.length() / 2);
- hboxes[i].crop_wrt(input.domain());
- }
-
- trace::exiting("scribo::table::extract_lines_with_opening");
- return mln::make::couple(vboxes, hboxes);
- }
-
-# endif // !MLN_INCLUDE_ONLY
-
- } // end of namespace scribo::table
-
-} // end of namespace scribo
-
-#endif // ! SCRIBO_TABLE_EXTRACT_LINES_WITH_OPENING_HH
diff --git a/scribo/table/extract_lines_with_rank.hh b/scribo/table/extract_lines_with_rank.hh
deleted file mode 100644
index c6eb1fa..0000000
--- a/scribo/table/extract_lines_with_rank.hh
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory
-// (LRDE)
-//
-// This file is part of the Olena Library. This library is free
-// software; you can redistribute it and/or modify it under the terms
-// of the GNU General Public License version 2 as published by the
-// Free Software Foundation.
-//
-// This library 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 this library; see the file COPYING. If not, write to
-// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-// Boston, MA 02111-1307, USA.
-//
-// As a special exception, you may use this file as part of a free
-// software library 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_TABLE_EXTRACT_LINES_WITH_RANK_HH
-# define SCRIBO_TABLE_EXTRACT_LINES_WITH_RANK_HH
-
-/// \file scribo/table/extract_lines_with_rank.hh
-///
-/// Extract table lines using a rank filter.
-
-
-# include <mln/core/concept/image.hh>
-# include <mln/core/concept/window.hh>
-# include <mln/core/concept/neighborhood.hh>
-# include <mln/core/site_set/box.hh>
-
-# include <mln/morpho/rank_filter.hh>
-
-# include <mln/accu/bbox.hh>
-
-# include <mln/util/array.hh>
-# include <mln/util/couple.hh>
-
-# include <scribo/core/macros.hh>
-# include <scribo/core/component_bboxes.hh>
-
-namespace scribo
-{
-
- namespace table
- {
-
- using namespace mln;
-
- /// Find table bboxes thanks to a rank filter.
- /*!
- *
- * \param[in] input_ A binary image.
- * \param[in] nbh_ The neighborhood used for labeling image components.
- * \param[in] label_type The label type used for labeling.
- * \param[in] vwin_ Window used to extract the vertical lines in the rank
- * filter.
- * \param[in] hwin_ Window used to extract the horizontal lines in the rank
- * filter.
- * \param[in] vrank_k Rank used for vertical lines filtering.
- * \param[in] hrank_k Rank used for horizontal lines filtering.
- *
- * \return pair of array of bounding boxes. The first array holds the
- * vertical lines bounding boxes and the second one the
- * horizontal lines bounding boxes.
- */
- template <typename I, typename N, typename V, typename VW, typename HW>
- util::couple<util::array<box<mln_site(I)> >,
- util::array<box<mln_site(I)> > >
- extract_lines_with_rank(const Image<I>& input_,
- const Neighborhood<N>& nbh_, const V& label_type,
- const Window<VW>& vwin_, const Window<HW>& hwin_,
- unsigned vrank_k, unsigned hrank_k);
-
-
-# ifndef MLN_INCLUDE_ONLY
-
- template <typename I, typename N, typename V, typename VW, typename HW>
- inline
- util::couple<util::array<box<mln_site(I)> >,
- util::array<box<mln_site(I)> > >
- extract_lines_with_rank(const Image<I>& input_,
- const Neighborhood<N>& nbh_, const V& label_type,
- const Window<VW>& vwin_, const Window<HW>& hwin_,
- unsigned vrank_k, unsigned hrank_k)
- {
- trace::entering("scribo::table::extract_lines_with_rank");
-
- mlc_equal(mln_value(I),bool)::check();
- mlc_is_a(V, mln::value::Symbolic)::check();
-
- const I& input = exact(input_);
- const N& nbh = exact(nbh_);
- const VW& vwin = exact(vwin_);
- const HW& hwin = exact(hwin_);
- (void) label_type;
-
- mln_precondition(input.is_valid());
- mln_precondition(nbh.is_valid());
- mln_precondition(vwin.is_valid());
- mln_precondition(hwin.is_valid());
-
- typedef util::array<box<mln_site(I)> > boxes_t;
-
- V nbboxes;
-
- // Vertical lines
- mln_ch_value(I,bool) vfilter = morpho::rank_filter(input, vwin, vrank_k);
- boxes_t vboxes = component_bboxes(vfilter, nbh, nbboxes).first();
- for_all_components(i, vboxes)
- {
- vboxes[i].enlarge(0, vwin.length() / 2);
- vboxes[i].crop_wrt(input.domain());
- }
-
- // Horizontal lines.
- mln_ch_value(I,bool) hfilter = morpho::rank_filter(input, hwin, hrank_k);
- boxes_t hboxes = component_bboxes(hfilter, nbh, nbboxes).first();
- for_all_components(i, hboxes)
- {
- hboxes[i].enlarge(1, hwin.length() / 2);
- hboxes[i].crop_wrt(input.domain());
- }
-
- trace::exiting("scribo::table::extract_lines_with_rank");
- return mln::make::couple(vboxes, hboxes);
- }
-
-# endif // !MLN_INCLUDE_ONLY
-
- } // end of namespace scribo::table
-
-} // end of namespace scribo
-
-#endif // ! SCRIBO_TABLE_EXTRACT_LINES_WITH_RANK_HH
diff --git a/scribo/text/extract_bboxes.hh b/scribo/text/extract_bboxes.hh
deleted file mode 100644
index 8908677..0000000
--- a/scribo/text/extract_bboxes.hh
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory
-// (LRDE)
-//
-// This file is part of the Olena Library. This library is free
-// software; you can redistribute it and/or modify it under the terms
-// of the GNU General Public License version 2 as published by the
-// Free Software Foundation.
-//
-// This library 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 this library; see the file COPYING. If not, write to
-// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-// Boston, MA 02111-1307, USA.
-//
-// As a special exception, you may use this file as part of a free
-// software library 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_TEXT_GROUPING_EXTRACT_BBOXES_HH
-# define SCRIBO_TEXT_GROUPING_EXTRACT_BBOXES_HH
-
-/// \file scribo/text/extract_bboxes.hh
-///
-/// Extract text bounding boxes from a binary image.
-
-# include <mln/core/concept/image.hh>
-# include <mln/core/concept/neighborhood.hh>
-# include <mln/core/site_set/box.hh>
-# include <mln/labeling/blobs.hh>
-# include <mln/labeling/compute.hh>
-# include <mln/util/array.hh>
-
-# include <scribo/core/component_bboxes.hh>
-# include <scribo/util/text.hh>
-# include <scribo/make/text.hh>
-
-namespace scribo
-{
-
- namespace text
- {
-
- using namespace mln;
-
- /// Extract text bounding boxes from a binary image.
- ///
- /// \param[in] input_ A binary imag.
- /// \param[in] nbh_ The neighborhood used for labeling.
- /// \param[in,out] nbboxes Will hold the number of bounding boxes at
- /// the end of the routine.
- ///
- /// \return an array of bounding boxes. The first bounding box is
- /// the background's.
- template <typename I, typename N, typename V>
- scribo::util::text<mln_ch_value(I,V)>
- extract_bboxes(const Image<I>& input_,
- const Neighborhood<N>& nbh_, V& nbboxes);
-
-# ifndef MLN_INCLUDE_ONLY
-
-
- template <typename I, typename N, typename V>
- inline
- scribo::util::text<mln_ch_value(I,V)>
- extract_bboxes(const Image<I>& input_,
- const Neighborhood<N>& nbh_, V& nbboxes)
- {
- trace::entering("scribo::text::extract_bboxes");
-
- const I& input = exact(input_);
- const N& nbh = exact(nbh_);
-
- mlc_equal(mln_value(I), bool)::check();
- mln_precondition(input.is_valid());
- mln_precondition(nbh.is_valid());
-
- typedef mln::util::array< box<mln_site(I)> > bboxes_t;
- typedef mln::util::couple<bboxes_t, mln_ch_value(I,V)> bboxes_and_lbl_t;
- bboxes_and_lbl_t bboxes_and_lbl = component_bboxes(input, nbh, nbboxes);
-
- trace::exiting("scribo::text::extract_bboxes");
- return scribo::make::text(bboxes_and_lbl.first(),
- bboxes_and_lbl.second(), nbboxes);
- }
-
-# endif // ! MLN_INCLUDE_ONLY
-
- } // end of namespace scribo::text
-
-} // end of namespace scribo
-
-#endif // ! SCRIBO_TEXT_GROUPING_EXTRACT_BBOXES_HH
diff --git a/scribo/text/grouping/group_from_double_link.hh b/scribo/text/grouping/group_from_double_link.hh
index 7caac87..4ed5d74 100644
--- a/scribo/text/grouping/group_from_double_link.hh
+++ b/scribo/text/grouping/group_from_double_link.hh
@@ -66,16 +66,16 @@ namespace scribo
/// Group text bounding boxes from left and right links and validate
/// These links. A link must exist in both ways to be validated.
/*!
- ** \param[in] text The Lines of text.
+ ** \param[in] objects The Lines of text.
** \param[in] left_link The left neighbor of each line of text.
** \param[in] right_link The right neighbor of each line of text.
**
** \return New lines of text. Some of the lines of \p text may have
** been grouped.
*/
- template <typename I>
- scribo::util::text<I>
- group_from_double_link(const scribo::util::text<I>& text,
+ template <typename L>
+ object_image(L)
+ group_from_double_link(const object_image(L)& objects,
const mln::util::array<unsigned>& left_link,
const mln::util::array<unsigned>& right_link);
@@ -84,10 +84,10 @@ namespace scribo
# ifndef MLN_INCLUDE_ONLY
- template <typename I>
+ template <typename L>
inline
- scribo::util::text<I>
- group_from_double_link(const scribo::util::text<I>& text,
+ object_image(L)
+ group_from_double_link(const object_image(L)& objects,
const mln::util::array<unsigned>& left_link,
const mln::util::array<unsigned>& right_link)
{
@@ -95,12 +95,9 @@ namespace scribo
mln_precondition(left_link.nelements() == right_link.nelements());
- mln::util::array< accu::bbox<mln_site(I)> > tboxes;
- tboxes.resize(text.bboxes().nelements());
-
mln::util::array<unsigned> parent(left_link.nelements());
internal::init_link_array(parent);
- for_all_components(i, text.bboxes())
+ for_all_ncomponents(i, objects.nlabels())
{
mln::util::couple<bool, unsigned>
nbh = internal::is_link_valid(left_link, right_link, i);
@@ -114,19 +111,15 @@ namespace scribo
}
}
- for_all_elements(i, parent)
for (unsigned i = parent.nelements() - 1; i < parent.nelements(); --i)
- {
parent[i] = parent[parent[i]];
- tboxes[parent[i]].take(text.bbox(i));
- }
- fun::i2v::array<unsigned> f;
- convert::from_to(parent, f);
+ object_image(L) output;
+ output.init_from_(objects);
+ output.relabel(parent);
- scribo::util::text<I> result = make::text(text, f);
trace::exiting("scribo::text::grouping::group_from_double_link");
- return result;
+ return output;
}
diff --git a/scribo/text/grouping/group_from_graph.hh b/scribo/text/grouping/group_from_graph.hh
index 3c6ac3a..d28e047 100644
--- a/scribo/text/grouping/group_from_graph.hh
+++ b/scribo/text/grouping/group_from_graph.hh
@@ -46,6 +46,7 @@
# include <mln/fun/i2v/array.hh>
# include <mln/util/array.hh>
+# include <mln/util/graph_ids.hh>
# include <scribo/core/macros.hh>
# include <scribo/util/text.hh>
@@ -83,15 +84,14 @@ namespace scribo
/// Functor to be passed to depth_first_search.
/// Map each component vertex with its representative vertex id.
template <typename V>
- struct map_vertex_to_component_id_functor
+ struct map_vertex_to_representative_id_functor
{
/// Initialize the functor.
template <typename G>
void init(const Graph<G>& g)
{
- vertextocomp.resize(exact(g).v_nmax(), mln_max(V));
- ncomp = 0;
+ vertextorep.resize(exact(g).v_nmax(), mln_max(V));
}
/// All components have been processed.
@@ -100,35 +100,40 @@ namespace scribo
/// Starting to treat a new component.
void next_component()
- { ++ncomp; }
+ {}
/// A vertex with id \p id has been found in the current
/// component.
- void new_component_from_vertex(unsigned id)
- { vertextocomp(id) = ncomp; }
+ void new_component_from_vertex(const mln::util::vertex_id_t& id)
+ {
+ current_ = id;
+ vertextorep(id) = id;
+ }
/// A new neighbor with id \p id have been found for the
/// current vertex.
- void added_to_queue(unsigned id)
- { new_component_from_vertex(id); }
+ void added_to_queue(const mln::util::vertex_id_t&)
+ {}
/// Starting to process a new vertex.
- void process_vertex(unsigned)
- {}
+ void process_vertex(const mln::util::vertex_id_t& id)
+ {
+ vertextorep(id) = current_;
+ }
/// Does the vertex with id \p id have been already treated?
- bool to_be_treated(unsigned id)
- { return vertextocomp(id) == mln_max(V); }
+ bool to_be_treated(const mln::util::vertex_id_t& id)
+ { return vertextorep(id) == mln_max(V); }
/// Does the neighbor vertex \p id have been already treated?
- bool to_be_queued(unsigned id)
+ bool to_be_queued(const mln::util::vertex_id_t& id)
{ return to_be_treated(id); }
/// The number of components found.
- unsigned ncomp;
+ mln::util::vertex_id_t current_;
/// Map a verted id to its component id.
- fun::i2v::array<V> vertextocomp;
+ fun::i2v::array<V> vertextorep;
};
} // end of namespace scribo::text::grouping::internal
@@ -147,36 +152,13 @@ namespace scribo
mln_assertion(g.is_valid());
- internal::map_vertex_to_component_id_functor<mln_value(I)> f;
+ internal::map_vertex_to_representative_id_functor<mln_value(I)> f;
canvas::browsing::depth_first_search(g, f);
-// mln::util::array< accu::bbox<mln_site(I)> > tboxes;
-// tboxes.resize(text.nbboxes().next());
-// for_all_components(i, text.bboxes())
-// tboxes[f.vertextocomp(i)].take(text.bbox(i));
-//
-// // Update bounding boxes.
-// mln::util::array<box<mln_site(I)> > bresult;
-// // Component 0 - the background has not valid bboxes.
-// bresult.append(box<mln_site(I)>());
-// for_all_components(i, text.bboxes())
-// if (tboxes[i].is_valid())
-// bresult.append(tboxes[i].to_result());
-//
-// mln_assertion(bresult.nelements() == f.ncomp);
-//
-// // Update label image.
-// mln_value(I) new_nbboxes;
-// I new_lbl = labeling::relabel(text.label_image(),
-// text.nbboxes(),
-// f.vertextocomp);
-//
-// mln_assertion(new_nbboxes.next() == bresult.nelements());
+ scribo::util::text<I> output = scribo::make::text(text, f.vertextorep);
trace::exiting("scribo::text::grouping::group_from_graph");
- /// FIXME: construct a new util::text from the old one.
-// return scribo::make::text(bresult, new_lbl, new_nbboxes);
- return scribo::make::text(text, f.vertextocomp);
+ return output;
}
diff --git a/scribo/text/grouping/group_with_several_left_links.hh b/scribo/text/grouping/group_with_several_left_links.hh
index 666a283..ce113b2 100644
--- a/scribo/text/grouping/group_with_several_left_links.hh
+++ b/scribo/text/grouping/group_with_several_left_links.hh
@@ -64,7 +64,7 @@ namespace scribo
template <typename L>
inline
mln::util::array<unsigned>
- group_with_several_left_links(const scribo::util::text<L>& text,
+ group_with_several_left_links(const object_image(L)& objects,
unsigned neighb_max_distance);
# ifndef MLN_INCLUDE_ONLY
@@ -72,21 +72,25 @@ namespace scribo
template <typename L>
inline
mln::util::array<unsigned>
- group_with_several_left_links(const scribo::util::text<L>& text,
+ group_with_several_left_links(const object_image(L)& objects,
unsigned neighb_max_distance)
{
trace::entering("scribo::text::grouping::group_with_several_left_links");
- mln_precondition(text.is_valid());
+ mln_precondition(objects.is_valid());
mln::util::array<unsigned>
- link_1(text.nbboxes().next()), link_2(text.nbboxes().next()),
- link_3(text.nbboxes().next()), final_link(text.nbboxes().next());
+ link_1(objects.nlabels().next()), link_2(objects.nlabels().next()),
+ link_3(objects.nlabels().next()), final_link(objects.nlabels().next());
internal::init_link_array(link_1);
internal::init_link_array(link_2);
internal::init_link_array(link_3);
- for_all_ncomponents(i, text.nbboxes())
+ mln::util::array<mln_result(accu::center<mln_psite(L)>)>
+ mass_centers = labeling::compute(accu::meta::center(),
+ objects, objects.nlabels());
+
+ for_all_ncomponents(i, objects.nlabels())
{
// -------
// <------X |
@@ -97,27 +101,27 @@ namespace scribo
// | |
// <------X |
// -------
- unsigned midcol = (text.bbox(i).pmax().col()
- - text.bbox(i).pmin().col()) / 2;
+ unsigned midcol = (objects.bbox(i).pmax().col()
+ - objects.bbox(i).pmin().col()) / 2;
int dmax = midcol + neighb_max_distance;
- mln_site(L) c = text.bbox(i).center();
+ mln_site(L) c = objects.bbox(i).center();
/// Left link from the top anchor.
mln_site(L) a1 = c;
- a1.row() = text.bbox(i).pmin().row() + (c.row() - text.bbox(i).pmin().row()) / 4;
- internal::find_left_link(text, link_1, i, dmax, a1);
+ a1.row() = objects.bbox(i).pmin().row() + (c.row() - objects.bbox(i).pmin().row()) / 4;
+ internal::find_left_link(objects, link_1, i, dmax, a1);
/// Left link from the central site
- internal::find_left_link(text, link_2, i, dmax, text.mass_center(i));
+ internal::find_left_link(objects, link_2, i, dmax, mass_centers[i]);
/// Left link from the bottom anchor.
mln_site(L) a2 = c;
- a2.row() = text.bbox(i).pmax().row() - (c.row() - text.bbox(i).pmin().row()) / 4;
- internal::find_left_link(text, link_3, i, dmax, a2);
+ a2.row() = objects.bbox(i).pmax().row() - (c.row() - objects.bbox(i).pmin().row()) / 4;
+ internal::find_left_link(objects, link_3, i, dmax, a2);
}
- for_all_ncomponents(i, text.nbboxes())
+ for_all_ncomponents(i, objects.nlabels())
{
if (link_2[i] != i)
final_link[i] = link_2[i];
diff --git a/scribo/text/grouping/group_with_several_right_links.hh b/scribo/text/grouping/group_with_several_right_links.hh
index f7d38a7..05c6e52 100644
--- a/scribo/text/grouping/group_with_several_right_links.hh
+++ b/scribo/text/grouping/group_with_several_right_links.hh
@@ -64,29 +64,34 @@ namespace scribo
template <typename L>
inline
mln::util::array<unsigned>
- group_with_several_right_links(const scribo::util::text<L>& text,
- unsigned neighb_max_distance);
+ group_with_several_right_links(const object_image(L)& objects,
+ unsigned neighb_max_distance);
# ifndef MLN_INCLUDE_ONLY
template <typename L>
inline
mln::util::array<unsigned>
- group_with_several_right_links(const scribo::util::text<L>& text,
- unsigned neighb_max_distance)
+ group_with_several_right_links(const object_image(L)& objects,
+ unsigned neighb_max_distance)
{
trace::entering("scribo::text::grouping::group_with_several_right_links");
- mln_precondition(text.is_valid());
+ mln_precondition(objects.is_valid());
mln::util::array<unsigned>
- link_1(text.nbboxes().next()), link_2(text.nbboxes().next()),
- link_3(text.nbboxes().next()), final_link(text.nbboxes().next());
+ link_1(objects.nlabels().next()), link_2(objects.nlabels().next()),
+ link_3(objects.nlabels().next()), final_link(objects.nlabels().next());
internal::init_link_array(link_1);
internal::init_link_array(link_2);
internal::init_link_array(link_3);
- for_all_ncomponents(i, text.nbboxes())
+ mln::util::array<mln_result(accu::center<mln_psite(L)>)>
+ mass_centers = labeling::compute(accu::meta::center(),
+ objects, objects.nlabels());
+
+
+ for_all_ncomponents(i, objects.nlabels())
{
// -------
// | X------->
@@ -97,27 +102,27 @@ namespace scribo
// | |
// | X------->
// -------
- unsigned midcol = (text.bbox(i).pmax().col()
- - text.bbox(i).pmin().col()) / 2;
+ unsigned midcol = (objects.bbox(i).pmax().col()
+ - objects.bbox(i).pmin().col()) / 2;
int dmax = midcol + neighb_max_distance;
- mln_site(L) c = text.bbox(i).center();
+ mln_site(L) c = objects.bbox(i).center();
/// Right link from the top anchor.
mln_site(L) a1 = c;
- a1.row() = text.bbox(i).pmin().row() + (c.row() - text.bbox(i).pmin().row()) / 4;
- internal::find_right_link(text, link_1, i, dmax, a1);
+ a1.row() = objects.bbox(i).pmin().row() + (c.row() - objects.bbox(i).pmin().row()) / 4;
+ internal::find_right_link(objects, link_1, i, dmax, a1);
/// Right link from the central site
- internal::find_right_link(text, link_2, i, dmax, text.mass_center(i));
+ internal::find_right_link(objects, link_2, i, dmax, mass_centers[i]);
/// Right link from the bottom anchor.
mln_site(L) a2 = c;
- a2.row() = text.bbox(i).pmax().row() - (c.row() - text.bbox(i).pmin().row()) / 4;
- internal::find_right_link(text, link_3, i, dmax, a2);
+ a2.row() = objects.bbox(i).pmax().row() - (c.row() - objects.bbox(i).pmin().row()) / 4;
+ internal::find_right_link(objects, link_3, i, dmax, a2);
}
- for_all_ncomponents(i, text.nbboxes())
+ for_all_ncomponents(i, objects.nlabels())
{
if (link_2[i] != i)
final_link[i] = link_2[i];
diff --git a/scribo/text/grouping/internal/find_left_link.hh b/scribo/text/grouping/internal/find_left_link.hh
index e4fed4f..f598115 100644
--- a/scribo/text/grouping/internal/find_left_link.hh
+++ b/scribo/text/grouping/internal/find_left_link.hh
@@ -59,14 +59,14 @@ namespace scribo
/// Find the left neighbor of a line of text if exists.
///
- /// \param text The lines of text.
+ /// \param objects An image of objects.
/// \param left_link The left neighbors.
/// \param current_comp A text line id.
/// \param dmax The maximum lookup distance.
/// \param c The lookup start point.
template <typename L>
void
- find_left_link(const scribo::util::text<L>& text,
+ find_left_link(const object_image(L)& objects,
mln::util::array<unsigned>& left_link,
unsigned current_comp,
int dmax,
@@ -76,7 +76,7 @@ namespace scribo
template <typename L>
void
- find_left_link(const scribo::util::text<L>& text,
+ find_left_link(const object_image(L)& objects,
mln::util::array<unsigned>& left_link,
unsigned current_comp,
int dmax,
@@ -86,16 +86,14 @@ namespace scribo
/// First site on the right of the central site
mln_site(L) p = c + left;
- const L& lbl = text.label_image();
-
- while (lbl.domain().has(p) // Not outside image domain
- && (lbl(p) == literal::zero // Is the background
- || lbl(p) == current_comp // Is the current component
- || left_link[lbl(p)] == current_comp) // Creates a loop
+ while (objects.domain().has(p) // Not outside image domain
+ && (objects(p) == literal::zero // Is the background
+ || objects(p) == current_comp // Is the current component
+ || left_link[objects(p)] == current_comp) // Creates a loop
&& math::abs(p.col() - c.col()) < dmax) // Not to far
--p.col();
- update_link_array(lbl, left_link, p, c, current_comp, dmax);
+ update_link_array(objects, left_link, p, c, current_comp, dmax);
}
# endif // MLN_INCLUDE_ONLY
diff --git a/scribo/text/grouping/internal/find_right_link.hh b/scribo/text/grouping/internal/find_right_link.hh
index 768861b..3f137c5 100644
--- a/scribo/text/grouping/internal/find_right_link.hh
+++ b/scribo/text/grouping/internal/find_right_link.hh
@@ -66,7 +66,7 @@ namespace scribo
/// \param c The lookup start point.
template <typename L>
void
- find_right_link(const scribo::util::text<L>& text,
+ find_right_link(const object_image(L)& text,
mln::util::array<unsigned>& right_link,
unsigned current_comp,
int dmax,
@@ -76,7 +76,7 @@ namespace scribo
template <typename L>
void
- find_right_link(const scribo::util::text<L>& text,
+ find_right_link(const object_image(L)& objects,
mln::util::array<unsigned>& right_link,
unsigned current_comp,
int dmax,
@@ -86,16 +86,14 @@ namespace scribo
/// First site on the right of the central site
mln_site(L) p = c + right;
- const L& lbl = text.label_image();
-
- while (lbl.domain().has(p) // Not outside image domain
- && (lbl(p) == literal::zero // Is the background
- || lbl(p) == current_comp // Is the current component
- || right_link[lbl(p)] == current_comp) // Creates a loop
+ while (objects.domain().has(p) // Not outside image domain
+ && (objects(p) == literal::zero // Is the background
+ || objects(p) == current_comp // Is the current component
+ || right_link[objects(p)] == current_comp) // Creates a loop
&& math::abs(p.col() - c.col()) < dmax) // Not too far
++p.col();
- update_link_array(lbl, right_link, p, c, current_comp, dmax);
+ update_link_array(objects, right_link, p, c, current_comp, dmax);
}
# endif // MLN_INCLUDE_ONLY
diff --git a/scribo/text/recognition.hh b/scribo/text/recognition.hh
index 287be34..8cfd20e 100644
--- a/scribo/text/recognition.hh
+++ b/scribo/text/recognition.hh
@@ -86,7 +86,7 @@ namespace scribo
/// \return An image of characters.
template <typename L>
mln_ch_value(L,char)
- recognition(const scribo::util::text<L>& text,
+ recognition(const object_image(L)& objects,
const char *language);
@@ -96,17 +96,17 @@ namespace scribo
template <typename L>
mln_ch_value(L,char)
- recognition(const scribo::util::text<L>& text,
+ recognition(const object_image(L)& objects,
const char *language)
{
trace::entering("scribo::text::recognition");
- mln_precondition(text.is_valid());
+ mln_precondition(objects.is_valid());
// Initialize Tesseract.
TessBaseAPI::InitWithLanguage(NULL, NULL, language, NULL, false, 0, NULL);
- mln_ch_value(L,char) txt(text.label_image().domain());
+ mln_ch_value(L,char) txt(objects.domain());
data::fill(txt, ' ');
typedef mln_ch_value(L,bool) I;
@@ -118,35 +118,40 @@ namespace scribo
w_window2d_int dmap_win = mln::make::w_window2d_int(vals);
/// Use text bboxes with Tesseract
- for_all_components(i, text.bboxes())
+ for_all_ncomponents(i, objects.nlabels())
{
- I text_ima(text.bbox(i));
+ I text_ima(objects.bbox(i));
data::fill(text_ima, false);
- data::fill((text_ima | (pw::value(text.label_image()) == pw::cst(i))).rw(),
+ data::fill((text_ima | (pw::value(objects) == pw::cst(i))).rw(),
true);
/// Improve text quality.
+
+ /// text_ima_cleand domain is larger than text_ima's.
I text_ima_cleaned = text::clean(text_ima, dmap_win);
border::resize(text_ima_cleaned, 0); // Make sure there is no border.
// Recognize characters.
char* s = TessBaseAPI::TesseractRect(
(unsigned char*) text_ima_cleaned.buffer(),
- sizeof (bool), // Pixel size.
- text_ima.ncols() * sizeof (bool), // Row_offset
- 0, // Left
- 0, // Top
- text_ima.ncols(), // n cols
- text_ima.nrows()); // n rows
+ sizeof (bool), // Pixel size.
+ text_ima_cleaned.ncols() * sizeof (bool), // Row_offset
+ 0, // Left
+ 0, // Top
+ text_ima_cleaned.ncols(), // n cols
+ text_ima_cleaned.nrows()); // n rows
- mln_site(L) p = text.bbox(i).center();
- p.col() -= (text.bbox(i).pmax().col()
- - text.bbox(i).pmin().col()) / 2;
+ mln_site(L) p = objects.bbox(i).center();
+ p.col() -= (objects.bbox(i).pmax().col()
+ - objects.bbox(i).pmin().col()) / 2;
if (s != 0)
+ {
+ std::cout << s << std::endl;
mln::debug::put_word(txt, p, s);
+ }
// The string has been allocated by Tesseract. We must free it.
free(s);
--
1.5.6.5