Olena-patches
Threads by month
- ----- 2025 -----
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
March 2009
- 9 participants
- 202 discussions
* mln/convert/from_to.hxx: add forward declaration.
* mln/core/alias/point2d.hh: add point2df alias.
* mln/core/alias/point3d.hh: update comments.
* mln/core/point.hh: add a new from_to_ overload.
---
milena/ChangeLog | 12 ++++++++++++
milena/mln/convert/from_to.hxx | 5 +++++
milena/mln/core/alias/point2d.hh | 3 ++-
milena/mln/core/alias/point3d.hh | 19 ++++++++-----------
milena/mln/core/point.hh | 35 +++++++++++++++++++++++++++++++++++
5 files changed, 62 insertions(+), 12 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 6199774..acb63ae 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,15 @@
+2009-03-16 Guillaume Lazzara <lazzara(a)lrde.epita.fr>
+
+ Add conversion from point<G,C1> to point<G,C2>.
+
+ * mln/convert/from_to.hxx: add forward declaration.
+
+ * mln/core/alias/point2d.hh: add point2df alias.
+
+ * mln/core/alias/point3d.hh: update comments.
+
+ * mln/core/point.hh: add a new from_to_ overload.
+
2009-03-15 Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Add an ''un-projection'' image morpher.
diff --git a/milena/mln/convert/from_to.hxx b/milena/mln/convert/from_to.hxx
index d4ccc22..db38e36 100644
--- a/milena/mln/convert/from_to.hxx
+++ b/milena/mln/convert/from_to.hxx
@@ -145,6 +145,11 @@ namespace mln
void
from_to_(const T& from, T& to);
+ // point -> point.
+ template <typename G, typename C1, typename C2>
+ inline
+ void
+ from_to_(const point<G,C1>& from, point<G,C2>& to);
// algebra::vec -> Gpoint.
template <unsigned n, typename T, typename P>
diff --git a/milena/mln/core/alias/point2d.hh b/milena/mln/core/alias/point2d.hh
index 8c141e1..3059169 100644
--- a/milena/mln/core/alias/point2d.hh
+++ b/milena/mln/core/alias/point2d.hh
@@ -1,4 +1,4 @@
-// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory
+// Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory
// (LRDE)
//
// This file is part of the Olena Library. This library is free
@@ -46,6 +46,7 @@ namespace mln
/// integer coordinates.
///
typedef point<grid::square, def::coord> point2d;
+ typedef point<grid::square, def::coordf> point2df;
namespace internal
diff --git a/milena/mln/core/alias/point3d.hh b/milena/mln/core/alias/point3d.hh
index acbf721..ceff9c1 100644
--- a/milena/mln/core/alias/point3d.hh
+++ b/milena/mln/core/alias/point3d.hh
@@ -29,11 +29,10 @@
#ifndef MLN_CORE_ALIAS_POINT3D_HH
# define MLN_CORE_ALIAS_POINT3D_HH
-/*! \file mln/core/alias/point3d.hh
- *
- * \brief Definition of the mln::point3d alias and of its construction
- * routine.
- */
+/// \file mln/core/alias/point3d.hh
+///
+/// Definition of the mln::point3d alias and of its construction
+/// routine.
# include <mln/core/point.hh>
// For site_const_impl and site_mutable_impl:
@@ -43,14 +42,12 @@
namespace mln
{
- /*! \brief Type alias for a point defined on the 3D square grid with
- * integer coordinates.
- */
+ /// Type alias for a point defined on the 3D square grid with
+ /// integer coordinates.
typedef point<grid::cube, def::coord> point3d;
- /*! \brief Type alias for a point defined on the 3D square grid with
- * floating-point coordinates.
- */
+ /// Type alias for a point defined on the 3D square grid with
+ /// floating-point coordinates.
typedef point<grid::cube, def::coordf> point3df;
namespace internal
diff --git a/milena/mln/core/point.hh b/milena/mln/core/point.hh
index 755f50c..54289fa 100644
--- a/milena/mln/core/point.hh
+++ b/milena/mln/core/point.hh
@@ -61,6 +61,21 @@ namespace mln
/// \}
+ namespace convert
+ {
+
+ namespace over_load
+ {
+
+ template <typename G, typename C1, typename C2>
+ void from_to_(const point<G,C1>& from, point<G,C2>& to);
+
+ } // end of namespace mln::convert::over_load
+
+ } // end of namespace mln::convert
+
+
+
/// Generic point class.
///
/// Parameters are \c n the dimension of the space and \c C the
@@ -213,6 +228,26 @@ namespace mln
# ifndef MLN_INCLUDE_ONLY
+ namespace convert
+ {
+
+ namespace over_load
+ {
+
+ template <typename G, typename C1, typename C2>
+ inline
+ void
+ from_to_(const point<G,C1>& from, point<G,C2>& to)
+ {
+ mlc_converts_to(C1,C2)::check();
+ to = point<G,C2>(from.to_vec());
+ }
+
+ } // end of namespace mln::convert::over_load
+
+ } // end of namespace mln::convert
+
+
template <typename G, typename C>
inline
const C& point<G,C>::operator[](unsigned i) const
--
1.5.6.5
1
0
https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Add sample code for Etienne and Fabien.
* theo/experimental: New directory.
* theo/experimental/projected_histo.cc: New.
projected_histo.cc | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
Index: theo/experimental/projected_histo.cc
--- theo/experimental/projected_histo.cc (revision 0)
+++ theo/experimental/projected_histo.cc (revision 0)
@@ -0,0 +1,66 @@
+#include <mln/core/var.hh>
+
+#include <mln/core/image/image1d.hh>
+#include <mln/core/image/image2d.hh>
+#include <mln/core/image/unproject_image.hh>
+#include <mln/fun/v2v/projection.hh>
+
+#include <mln/core/image/image_if.hh>
+#include <mln/pw/value.hh>
+
+#include <mln/accu/count.hh>
+#include <mln/accu/mean.hh>
+#include <mln/accu/image/init.hh>
+#include <mln/accu/image/take.hh>
+
+#include <mln/io/pbm/load.hh>
+#include <mln/io/pgm/load.hh>
+#include <mln/debug/println.hh>
+
+
+
+int main()
+{
+ using namespace mln;
+
+ {
+ using value::int_u8;
+
+ image2d<int_u8> lena;
+ io::pgm::load(lena, "../../../img/fly.pgm");
+ debug::println(lena);
+
+ typedef accu::mean<int_u8, unsigned, int_u8> A;
+
+ image1d<A> vmean(lena.ncols());
+ accu::image::init(vmean);
+ {
+ fun::v2v::projection<point2d, 0> vproj;
+ mln_VAR( vmean_, unproject(vmean, lena.domain(), vproj) );
+ accu::image::take(vmean_, lena);
+ }
+ debug::println(vmean);
+ }
+
+ std::cout << std::endl;
+
+ {
+
+ image2d<bool> pic;
+ io::pbm::load(pic, "../../../img/fly.pbm");
+ debug::println(pic);
+
+ typedef accu::count<bool> A;
+
+ image1d<A> h(pic.ncols());
+ accu::image::init(h);
+ {
+ fun::v2v::projection<point2d, 0> vproj;
+ mln_VAR( h_, unproject(h, pic.domain(), vproj) );
+ accu::image::take(h_, (pic | pw::value(pic)));
+ }
+ debug::println(h);
+ }
+
+
+}
1
0
https://svn.lrde.epita.fr/svn/oln/trunk/milena
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Add an ''un-projection'' image morpher.
* mln/fun/v2v/projection.hh: New.
* mln/fun/v2v/all.hh: Update.
* tests/fun/v2v/projection.cc: New.
* tests/fun/v2v/Makefile.am: Update.
* mln/core/image/unproject_image.hh: New.
* mln/core/image/all.hh: Update.
* tests/core/image/unproject_image.cc: New.
* tests/core/image/Makefile.am: Update.
mln/core/image/all.hh | 35 ++--
mln/core/image/unproject_image.hh | 272 ++++++++++++++++++++++++++++++++++++
mln/fun/v2v/all.hh | 17 +-
mln/fun/v2v/projection.hh | 91 ++++++++++++
tests/core/image/Makefile.am | 19 +-
tests/core/image/unproject_image.cc | 63 ++++++++
tests/fun/v2v/Makefile.am | 6
tests/fun/v2v/projection.cc | 73 +++++++++
8 files changed, 543 insertions(+), 33 deletions(-)
Index: mln/core/image/all.hh
--- mln/core/image/all.hh (revision 3532)
+++ mln/core/image/all.hh (working copy)
@@ -1,4 +1,5 @@
-// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2008, 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
@@ -33,8 +34,6 @@
/// File that includes all image types.
-//# include <mln/core/image/bgraph_image.hh>
-//# include <mln/core/image/bgraph_psite.hh>
# include <mln/core/image/cast_image.hh>
# include <mln/core/image/ch_piter.hh>
# include <mln/core/image/complex_image.hh>
@@ -46,7 +45,6 @@
# include <mln/core/image/flat_image.hh>
# include <mln/core/image/image_if.hh>
# include <mln/core/image/sub_image.hh>
-//# include <mln/core/image/fi_adaptor.hh>
# include <mln/core/image/image1d.hh>
# include <mln/core/image/decorated_image.hh>
# include <mln/core/image/extended.hh>
@@ -55,28 +53,16 @@
# include <mln/core/image/extension_val.hh>
# include <mln/core/image/flat_image.hh>
# include <mln/core/image/graph_elt_window.hh>
-//# include <mln/core/image/graph_image.hh>
# include <mln/core/image/graph_window_piter.hh>
-//# include <mln/core/image/hexa.hh>
-//# include <mln/core/image/hexa_piter.hh>
# include <mln/core/image/image1d.hh>
# include <mln/core/image/image2d.hh>
-//# include <mln/core/image/image2d_h.hh>
# include <mln/core/image/image3d.hh>
# include <mln/core/image/image_if.hh>
# include <mln/core/image/interpolated.hh>
# include <mln/core/image/lazy_image.hh>
# include <mln/core/image/line_graph_elt_window.hh>
-//# include <mln/core/image/mono_obased_rle_encode.hh>
-//# include <mln/core/image/mono_obased_rle_image.hh>
-//# include <mln/core/image/mono_rle_encode.hh>
-//# include <mln/core/image/mono_rle_image.hh>
-//# include <mln/core/image/obased_rle_encode.hh>
-//# include <mln/core/image/obased_rle_image.hh>
# include <mln/core/image/p2p_image.hh>
# include <mln/core/image/plain.hh>
-//# include <mln/core/image/rle_encode.hh>
-//# include <mln/core/image/rle_image.hh>
# include <mln/core/image/safe.hh>
# include <mln/core/image/slice_image.hh>
# include <mln/core/image/sparse_encode.hh>
@@ -86,6 +72,23 @@
# include <mln/core/image/t_image.hh>
# include <mln/core/image/tr_image.hh>
# include <mln/core/image/tr_mesh.hh>
+# include <mln/core/image/unproject_image.hh>
+
+//# include <mln/core/image/bgraph_image.hh>
+//# include <mln/core/image/bgraph_psite.hh>
+//# include <mln/core/image/fi_adaptor.hh>
+//# include <mln/core/image/graph_image.hh>
+//# include <mln/core/image/hexa.hh>
+//# include <mln/core/image/hexa_piter.hh>
+//# include <mln/core/image/image2d_h.hh>
+//# include <mln/core/image/mono_obased_rle_encode.hh>
+//# include <mln/core/image/mono_obased_rle_image.hh>
+//# include <mln/core/image/mono_rle_encode.hh>
+//# include <mln/core/image/mono_rle_image.hh>
+//# include <mln/core/image/obased_rle_encode.hh>
+//# include <mln/core/image/obased_rle_image.hh>
+//# include <mln/core/image/rle_encode.hh>
+//# include <mln/core/image/rle_image.hh>
//# include <mln/core/image/value_enc_image.hh>
//# include <mln/core/image/value_encode.hh>
Index: mln/core/image/unproject_image.hh
--- mln/core/image/unproject_image.hh (revision 0)
+++ mln/core/image/unproject_image.hh (revision 0)
@@ -0,0 +1,272 @@
+// 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 MLN_CORE_IMAGE_UNPROJECT_IMAGE_HH
+# define MLN_CORE_IMAGE_UNPROJECT_IMAGE_HH
+
+/// \file mln/core/image/unproject_image.hh
+///
+/// Definition of a morpher that un-projects an image.
+/// FIXME: Doc!
+
+# include <mln/core/internal/image_domain_morpher.hh>
+# include <mln/core/grids.hh>
+# include <mln/core/site_set/box.hh>
+
+
+namespace mln
+{
+
+
+ // Forward declaration.
+ template <typename I, typename D, typename F> struct unproject_image;
+
+
+ namespace internal
+ {
+
+ /// Data structure for \c mln::unproject_image<I,D,F>.
+ template <typename I, typename D, typename F>
+ struct data< unproject_image<I,D,F> >
+ {
+ data(I& ima, const D& dom, const F& f);
+
+ I ima_;
+ D dom_;
+ F f_;
+ };
+
+ } // end of namespace mln::internal
+
+
+ namespace trait
+ {
+
+ template <typename I, typename D, typename F>
+ struct image_< unproject_image<I,D,F> > : default_image_morpher< I,
+ mln_value(I),
+ unproject_image<I,D,F> >
+ {
+ typedef trait::image::category::domain_morpher category;
+
+ // FIXME:
+// typedef trait::image::dimension::two_d dimension;
+
+ typedef trait::image::ext_domain::none ext_domain; // No extension of domain.
+ typedef trait::image::ext_value::irrelevant ext_value;
+ typedef trait::image::ext_io::irrelevant ext_io;
+
+ typedef trait::image::vw_io::none vw_io;
+ typedef trait::image::vw_set::none vw_set;
+ typedef trait::image::value_alignment::not_aligned value_alignment;
+ typedef trait::image::value_storage::disrupted value_storage;
+ };
+
+ } // end of namespace mln::trait
+
+
+
+ /// FIXME: Doc!
+ template <typename I, typename D, typename F>
+ struct unproject_image : public internal::image_domain_morpher< I,
+ D,
+ unproject_image<I,D,F> >
+ {
+ // FIXME:
+ typedef void skeleton;
+// /// Skeleton.
+// typedef unproject_image< tag::image_<I> > skeleton;
+
+
+ /// Constructor without argument.
+ unproject_image();
+
+ /// Constructor from an image \p ima, a domain \p dom, and a function \p f.
+ unproject_image(I& ima, const D& dom, const F& f);
+
+ void init_(I& ima, const D& dom, const F& f);
+
+
+ /// Give the definition domain.
+ const D& domain() const;
+
+ /// Read-only access to the image value located at point \p p.
+ mln_rvalue(I) operator()(const mln_psite(D)& p) const;
+
+ /// Read-write access to the image value located at point \p p.
+ mln_morpher_lvalue(I) operator()(const mln_psite(D)& p);
+
+
+// /// Const promotion via conversion.
+// operator unproject_image<const I, D, F>() const;
+ };
+
+
+
+ template <typename I, typename D, typename F>
+ unproject_image<I, D, F>
+ unproject(Image<I>& ima, const Site_Set<D>& dom, const Function_v2v<F>& f);
+
+ template <typename I, typename D, typename F>
+ unproject_image<const I, D, F>
+ unproject(const Image<I>& ima, const Site_Set<D>& dom, const Function_v2v<F>& f);
+
+
+
+
+// namespace trait
+// {
+
+// template <typename I, typename D, typename F,
+// typename V>
+// struct ch_value< unproject_image<I,D,F>, V >
+// {
+// // FIXME: Somthing like:
+// typedef pw::image< pw::cst_<mln_value(I)>, D> I_;
+// typedef mln_ch_value(I_,V) ret;
+// };
+
+// } // end of namespace mln::trait
+
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ // internal::data< unproject_image<I,D,F> >
+
+ namespace internal
+ {
+
+ template <typename I, typename D, typename F>
+ inline
+ data< unproject_image<I,D,F> >::data(I& ima, const D& dom, const F& f)
+ : ima_(ima),
+ dom_(dom),
+ f_(f)
+ {
+ }
+
+ }
+
+
+ // unproject_image<I,D,F>
+
+ template <typename I, typename D, typename F>
+ inline
+ unproject_image<I,D,F>::unproject_image()
+ {
+ }
+
+ template <typename I, typename D, typename F>
+ inline
+ unproject_image<I,D,F>::unproject_image(I& ima, const D& dom, const F& f)
+ {
+ init_(ima, dom, f);
+ }
+
+ template <typename I, typename D, typename F>
+ inline
+ void
+ unproject_image<I,D,F>::init_(I& ima, const D& dom, const F& f)
+ {
+ mln_precondition(! this->is_valid());
+ this->data_ = new internal::data< unproject_image<I,D,F> >(ima, dom, f);
+ }
+
+ template <typename I, typename D, typename F>
+ inline
+ const D&
+ unproject_image<I,D,F>::domain() const
+ {
+ mln_precondition(this->is_valid());
+ return this->data_->dom_;
+ }
+
+ template <typename I, typename D, typename F>
+ inline
+ mln_rvalue(I)
+ unproject_image<I,D,F>::operator()(const mln_psite(D)& p) const
+ {
+ mln_precondition(this->has(p));
+ mln_result(F) p_ = this->data_->f_(p);
+ mln_precondition(this->data_->ima_.has(p_));
+ return this->data_->ima_(p_);
+ }
+
+ template <typename I, typename D, typename F>
+ inline
+ mln_morpher_lvalue(I)
+ unproject_image<I,D,F>::operator()(const mln_psite(D)& p)
+ {
+ mln_precondition(this->has(p));
+ mln_result(F) p_ = this->data_->f_(p);
+ mln_precondition(this->data_->ima_.has(p_));
+ return this->data_->ima_(p_);
+ }
+
+
+ // Routines.
+
+ template <typename I, typename D, typename F>
+ inline
+ unproject_image<I, D, F>
+ unproject(Image<I>& ima_, const Site_Set<D>& dom, const Function_v2v<F>& f)
+ {
+ mlc_converts_to(mln_psite(D), mln_argument(F))::check();
+ mlc_converts_to(mln_result(F), mln_psite(I))::check();
+
+ I& ima = exact(ima_);
+ mln_precondition(ima.is_valid());
+
+ unproject_image<I,D,F> tmp(ima, exact(dom), exact(f));
+ return tmp;
+ }
+
+ template <typename I, typename D, typename F>
+ inline
+ unproject_image<const I, D, F>
+ unproject(const Image<I>& ima_, const Site_Set<D>& dom, const Function_v2v<F>& f)
+ {
+ mlc_converts_to(mln_psite(D), mln_argument(F))::check();
+ mlc_converts_to(mln_result(F), mln_psite(I))::check();
+
+ const I& ima = exact(ima_);
+ mln_precondition(ima.is_valid());
+
+ unproject_image<const I,D,F> tmp(ima, exact(dom), exact(f));
+ return tmp;
+ }
+
+
+# endif // ! MLN_INCLUDE_ONLY
+
+} // end of namespace mln
+
+
+
+#endif // ! MLN_CORE_IMAGE_UNPROJECT_IMAGE_HH
Index: mln/fun/v2v/all.hh
--- mln/fun/v2v/all.hh (revision 3532)
+++ mln/fun/v2v/all.hh (working copy)
@@ -1,4 +1,5 @@
-// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory
+// Copyright (C) 2007, 2008, 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
@@ -28,10 +29,9 @@
#ifndef MLN_FUN_V2V_ALL_HH
# define MLN_FUN_V2V_ALL_HH
-/*! \file mln/fun/v2v/all.hh
- *
- * \brief File that includes all functions from value to value.
- */
+/// \file mln/fun/v2v/all.hh
+///
+/// File that includes all functions from value to value.
namespace mln
@@ -41,12 +41,10 @@
{
/// Namespace of functions from value to value.
- namespace v2v
- {
- }
- }
+ namespace v2v {}
}
+}
# include <mln/fun/v2v/abs.hh>
@@ -57,6 +55,7 @@
# include <mln/fun/v2v/id.hh>
# include <mln/fun/v2v/linear.hh>
# include <mln/fun/v2v/norm.hh>
+# include <mln/fun/v2v/projection.hh>
# include <mln/fun/v2v/rgb_to_hsi.hh>
# include <mln/fun/v2v/saturate.hh>
Index: mln/fun/v2v/projection.hh
--- mln/fun/v2v/projection.hh (revision 0)
+++ mln/fun/v2v/projection.hh (revision 0)
@@ -0,0 +1,91 @@
+// 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 MLN_FUN_V2V_PROJECTION_HH
+# define MLN_FUN_V2V_PROJECTION_HH
+
+/// \file mln/fun/v2v/projection.hh
+///
+/// FIXME.
+
+# include <mln/core/concept/function.hh>
+# include <mln/core/point.hh>
+# include <mln/core/grids.hh>
+
+
+namespace mln
+{
+
+ namespace fun
+ {
+
+ namespace v2v
+ {
+
+ template <typename P, unsigned dir>
+ struct projection : public Function_v2v< projection<P,dir> >
+ {
+ private:
+ typedef mln_grid(P) G_;
+ typedef mln_coord(P) C_;
+ enum { n_ = G_::dim };
+
+ public:
+
+ typedef point<mln_regular_grid_from_dim(n_ - 1), C_> result;
+ typedef P argument;
+
+ result operator()(const P& p) const;
+ };
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <typename P, unsigned dir>
+ inline
+ typename projection<P, dir>::result
+ projection<P, dir>::operator()(const P& p) const
+ {
+ result tmp;
+ for (unsigned i = 0, j = 0; i < n_; ++i)
+ if (i == dir)
+ continue;
+ else
+ tmp[j++] = p[i];
+ return tmp;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::fun::v2v
+
+ } // end of namespace mln::fun
+
+} // end of namespace mln
+
+
+#endif // ! MLN_FUN_V2V_PROJECTION_HH
Index: tests/core/image/unproject_image.cc
--- tests/core/image/unproject_image.cc (revision 0)
+++ tests/core/image/unproject_image.cc (revision 0)
@@ -0,0 +1,63 @@
+// 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 tests/core/image/unproject_image.cc
+///
+/// Tests on mln::unproject_image.
+
+#include <mln/core/image/image1d.hh>
+#include <mln/core/image/image2d.hh>
+#include <mln/core/image/unproject_image.hh>
+#include <mln/core/var.hh>
+
+#include <mln/fun/v2v/projection.hh>
+
+#include <mln/debug/iota.hh>
+#include <mln/debug/println.hh>
+
+
+
+int main()
+{
+ using namespace mln;
+
+ image1d<int> ima(3);
+ debug::iota(ima);
+
+ debug::println(ima);
+ std::cout << std::endl;
+
+ fun::v2v::projection<point2d, 0> f;
+
+ mln_VAR( ima_, unproject(ima, make::box2d(3, 3), f) );
+ debug::println(ima_);
+
+ ima_(point2d(1,1)) = 9;
+ debug::println(ima_);
+
+ debug::println(ima);
+}
Index: tests/core/image/Makefile.am
--- tests/core/image/Makefile.am (revision 3532)
+++ tests/core/image/Makefile.am (working copy)
@@ -4,7 +4,6 @@
##FIXME: re-enable tests
check_PROGRAMS = \
-## bgraph_image \
cast_image \
complex_image \
decorated_image \
@@ -18,20 +17,25 @@
image_if \
interpolated \
line_graph_image \
-## mono_obased_rle_image \
-## mono_rle_image \
-## obased_rle_image \
p2p_image \
plain \
-## rle_image \
safe_image \
slice_image \
-## sparse_image \
sub_image \
t_image \
- tr_image
+ tr_image \
+ unproject_image
+
+## bgraph_image \
+## mono_obased_rle_image \
+## mono_rle_image \
+## obased_rle_image \
+## rle_image \
+## sparse_image \
## value_enc_image
+
+
noinst_HEADERS = complex_image.hh
##bgraph_image_SOURCES = bgraph_image.cc
@@ -60,6 +64,7 @@
sub_image_SOURCES = sub_image.cc
t_image_SOURCES = t_image.cc
tr_image_SOURCES = tr_image.cc
+unproject_image_SOURCES = unproject_image.cc
##value_enc_image_SOURCES = value_enc_image.cc
# Tests depending on the FreeImagePlus library.
Index: tests/fun/v2v/projection.cc
--- tests/fun/v2v/projection.cc (revision 0)
+++ tests/fun/v2v/projection.cc (revision 0)
@@ -0,0 +1,73 @@
+// 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 tests/fun/v2v/projection.cc
+///
+/// Test on mln::fun::v2v::projection.
+
+#include <mln/fun/v2v/projection.hh>
+
+#include <mln/core/alias/point3d.hh>
+#include <mln/core/alias/point2d.hh>
+#include <mln/core/alias/point1d.hh>
+
+
+int main()
+{
+ using namespace mln;
+
+ {
+ typedef point2d P;
+ P p(0,1);
+ {
+ fun::v2v::projection<P,0> f;
+ mln_assertion(f(p) == point1d(1));
+ }
+ {
+ fun::v2v::projection<P,1> f;
+ mln_assertion(f(p) == point1d(0));
+ }
+ }
+
+ {
+ typedef point3d P;
+ P p(0,1,2);
+ {
+ fun::v2v::projection<P,0> f;
+ mln_assertion(f(p) == point2d(1,2));
+ }
+ {
+ fun::v2v::projection<P,1> f;
+ mln_assertion(f(p) == point2d(0,2));
+ }
+ {
+ fun::v2v::projection<P,2> f;
+ mln_assertion(f(p) == point2d(0,1));
+ }
+ }
+
+}
Index: tests/fun/v2v/Makefile.am
--- tests/fun/v2v/Makefile.am (revision 3532)
+++ tests/fun/v2v/Makefile.am (working copy)
@@ -2,9 +2,13 @@
include $(top_srcdir)/milena/tests/tests.mk
-check_PROGRAMS = norm rgb_hsi_conversion
+check_PROGRAMS = \
+ norm \
+ projection \
+ rgb_hsi_conversion
norm_SOURCES = norm.cc
+projection_SOURCES = projection.cc
rgb_hsi_conversion_SOURCES = rgb_hsi_conversion.cc
TESTS = $(check_PROGRAMS)
1
0
https://svn.lrde.epita.fr/svn/oln/trunk/milena
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Add routines to deal with images of accumulators.
* mln/accu/image: New directory.
* mln/accu/image/init.hh: New.
* mln/accu/image/take.hh: New.
* mln/accu/image/set_value.hh: New.
* mln/accu/image/all.hh: New.
* mln/accu/image/take_as_init.hh: New.
* mln/accu/image/to_result.hh: New.
* mln/accu/all.hh: Update.
* tests/accu/image: New.
* tests/accu/image/to_result.cc: New.
* tests/accu/image/init.cc: New.
* tests/accu/image/take.cc: New.
* tests/accu/image/Makefile.am: New.
* tests/accu/image/set_value.cc: New.
* tests/accu/image/take_as_init.cc: New.
* tests/accu/Makefile.am: Update.
mln/accu/all.hh | 8 +
mln/accu/image/all.hh | 56 +++++++++++
mln/accu/image/init.hh | 162 +++++++++++++++++++++++++++++++++
mln/accu/image/set_value.hh | 166 ++++++++++++++++++++++++++++++++++
mln/accu/image/take.hh | 186 +++++++++++++++++++++++++++++++++++++++
mln/accu/image/take_as_init.hh | 166 ++++++++++++++++++++++++++++++++++
mln/accu/image/to_result.hh | 178 +++++++++++++++++++++++++++++++++++++
tests/accu/Makefile.am | 3
tests/accu/image/Makefile.am | 18 +++
tests/accu/image/init.cc | 45 +++++++++
tests/accu/image/set_value.cc | 48 ++++++++++
tests/accu/image/take.cc | 58 ++++++++++++
tests/accu/image/take_as_init.cc | 48 ++++++++++
tests/accu/image/to_result.cc | 49 ++++++++++
14 files changed, 1189 insertions(+), 2 deletions(-)
Index: mln/accu/image/init.hh
--- mln/accu/image/init.hh (revision 0)
+++ mln/accu/image/init.hh (revision 0)
@@ -0,0 +1,162 @@
+// 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 MLN_ACCU_IMAGE_INIT_HH
+# define MLN_ACCU_IMAGE_INIT_HH
+
+/// \file mln/accu/image/init.hh
+///
+/// Initialize an image of accumulators.
+
+# include <mln/core/concept/accumulator.hh>
+# include <mln/core/concept/image.hh>
+
+
+namespace mln
+{
+
+ namespace accu
+ {
+
+ namespace image
+ {
+
+ template <typename I>
+ void
+ init(Image<I>& input);
+
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ namespace impl
+ {
+
+ // Generic version.
+
+ namespace generic
+ {
+
+ template <typename I>
+ void
+ init(Image<I>& input_)
+ {
+ trace::entering("accu::impl::image::generic::init");
+
+ I& input = exact(input_);
+ mln_precondition(input.is_valid());
+
+ mln_piter(I) p(input.domain());
+ for_all(p)
+ input(p).init();
+
+ trace::exiting("accu::impl::image::generic::init");
+ }
+
+ } // end of namespace mln::accu::image::impl::generic
+
+
+ // Fastest version.
+
+ template <typename I>
+ void
+ init_fastest(Image<I>& input_)
+ {
+ trace::entering("accu::impl::image::init_fastest");
+
+ I& input = exact(input_);
+ mln_precondition(input.is_valid());
+
+ mln_pixter(I) px(input);
+ for_all(px)
+ px.val().init();
+
+ trace::exiting("accu::impl::image::init_fastest");
+ }
+
+ } // end of namespace mln::accu::image::impl
+
+
+
+ // Dispatch.
+
+ namespace internal
+ {
+
+ template <typename I>
+ void
+ init_dispatch(trait::image::speed::any,
+ Image<I>& input)
+ {
+ impl::generic::init(input);
+ }
+
+ template <typename I>
+ void
+ init_dispatch(trait::image::speed::fastest,
+ Image<I>& input)
+ {
+ impl::init_fastest(input);
+ }
+
+ template <typename I>
+ void
+ init_dispatch(Image<I>& input)
+ {
+ init_dispatch(mln_trait_image_speed(I)(),
+ input);
+ }
+
+ } // end of namespace mln::accu::image::internal
+
+
+ // Facade.
+
+ template <typename I>
+ void
+ init(Image<I>& input)
+ {
+ trace::entering("accu::image::init");
+
+ mlc_is_a(mln_value(I), Accumulator)::check();
+
+ mln_precondition(exact(input).is_valid());
+ internal::init_dispatch(input);
+
+ trace::exiting("accu::image::init");
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::accu::image
+
+ } // end of namespace mln::accu
+
+} // end of namespace mln
+
+
+#endif // ! MLN_ACCU_IMAGE_INIT_HH
Index: mln/accu/image/take.hh
--- mln/accu/image/take.hh (revision 0)
+++ mln/accu/image/take.hh (revision 0)
@@ -0,0 +1,186 @@
+// 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 MLN_ACCU_IMAGE_TAKE_HH
+# define MLN_ACCU_IMAGE_TAKE_HH
+
+/// \file mln/accu/image/take.hh
+///
+/// Update an image of accumulators by taking the contents of another
+/// image.
+
+# include <mln/core/concept/accumulator.hh>
+# include <mln/core/concept/image.hh>
+
+
+namespace mln
+{
+
+ namespace accu
+ {
+
+ namespace image
+ {
+
+ template <typename I, typename J>
+ void
+ take(Image<I>& input, const Image<J>& arg);
+
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ namespace impl
+ {
+
+ // Generic version.
+
+ namespace generic
+ {
+
+ template <typename I, typename J>
+ void
+ take(Image<I>& input_, const Image<J>& arg_)
+ {
+ trace::entering("accu::impl::image::generic::take");
+
+ I& input = exact(input_);
+ const J& arg = exact(arg_);
+
+ mln_precondition(input.is_valid());
+ mln_precondition(arg.is_valid());
+ mln_precondition(arg.domain() <= input.domain());
+
+ mln_piter(J) p(arg.domain());
+ for_all(p)
+ input(p).take(arg(p));
+
+ trace::exiting("accu::impl::image::generic::take");
+ }
+
+ } // end of namespace mln::accu::image::impl::generic
+
+
+ // Fastest version.
+
+ template <typename I, typename J>
+ void
+ take_fastest(Image<I>& input_, const Image<J>& arg_)
+ {
+ trace::entering("accu::impl::image::take_fastest");
+
+ I& input = exact(input_);
+ const J& arg = exact(arg_);
+
+ mln_precondition(input.is_valid());
+ mln_precondition(arg.is_valid());
+ mln_precondition(arg.domain() == input.domain());
+
+ mln_pixter(I) p_in(input);
+ mln_pixter(const J) p_arg(arg);
+ for_all_2(p_in, p_arg)
+ p_in.val().take( p_arg.val() );
+
+ trace::exiting("accu::impl::image::take_fastest");
+ }
+
+ } // end of namespace mln::accu::image::impl
+
+
+
+ // Dispatch.
+
+ namespace internal
+ {
+
+ template <typename I, typename J>
+ void
+ take_dispatch(trait::image::speed::any,
+ trait::image::speed::any,
+ Image<I>& input, const Image<J>& arg)
+ {
+ impl::generic::take(input, arg);
+ }
+
+ template <typename I, typename J>
+ void
+ take_dispatch(trait::image::speed::fastest,
+ trait::image::speed::fastest,
+ Image<I>& input, const Image<J>& arg)
+ {
+ if (exact(arg).domain() == exact(input).domain())
+ impl::take_fastest(input, arg);
+ else
+ impl::generic::take(input, arg);
+ }
+
+ template <typename I, typename J>
+ void
+ take_dispatch(Image<I>& input, const Image<J>& arg)
+ {
+ take_dispatch(mln_trait_image_speed(I)(),
+ mln_trait_image_speed(J)(),
+ input, arg);
+ }
+
+ } // end of namespace mln::accu::image::internal
+
+
+ // Facade.
+
+ template <typename I, typename J>
+ void
+ take(Image<I>& input_, const Image<J>& arg_)
+ {
+ trace::entering("accu::image::take");
+
+ mlc_is_a(mln_value(I), Accumulator)::check();
+ mlc_converts_to(mln_value(J),
+ mln_deduce(I, value, argument))::check();
+
+ I& input = exact(input_);
+ const J& arg = exact(arg_);
+
+ mln_precondition(input.is_valid());
+ mln_precondition(arg.is_valid());
+ mln_precondition(arg.domain() <= input.domain());
+
+ internal::take_dispatch(input, arg);
+
+ trace::exiting("accu::image::take");
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::accu::image
+
+ } // end of namespace mln::accu
+
+} // end of namespace mln
+
+
+#endif // ! MLN_ACCU_IMAGE_TAKE_HH
Index: mln/accu/image/set_value.hh
--- mln/accu/image/set_value.hh (revision 0)
+++ mln/accu/image/set_value.hh (revision 0)
@@ -0,0 +1,166 @@
+// 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 MLN_ACCU_IMAGE_SET_VALUE_HH
+# define MLN_ACCU_IMAGE_SET_VALUE_HH
+
+/// \file mln/accu/image/set_value.hh
+///
+/// Set the values of an image of accumulators.
+
+# include <mln/core/concept/accumulator.hh>
+# include <mln/core/concept/image.hh>
+
+
+namespace mln
+{
+
+ namespace accu
+ {
+
+ namespace image
+ {
+
+ template <typename I>
+ void
+ set_value(Image<I>& input,
+ const mln_deduce(I, value, result)& res);
+
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ namespace impl
+ {
+
+ // Generic version.
+
+ namespace generic
+ {
+
+ template <typename I>
+ void
+ set_value(Image<I>& input_,
+ const mln_deduce(I, value, result)& res)
+ {
+ trace::entering("accu::impl::image::generic::set_value");
+
+ I& input = exact(input_);
+ mln_precondition(input.is_valid());
+
+ mln_piter(I) p(input.domain());
+ for_all(p)
+ input(p).set_value(res);
+
+ trace::exiting("accu::impl::image::generic::set_value");
+ }
+
+ } // end of namespace mln::accu::image::impl::generic
+
+
+ // Fastest version.
+
+ template <typename I>
+ void
+ set_value_fastest(Image<I>& input_,
+ const mln_deduce(I, value, result)& res)
+ {
+ trace::entering("accu::impl::image::set_value_fastest");
+
+ I& input = exact(input_);
+ mln_precondition(input.is_valid());
+
+ mln_pixter(I) px(input);
+ for_all(px)
+ px.val().set_value(res);
+
+ trace::exiting("accu::impl::image::set_value_fastest");
+ }
+
+ } // end of namespace mln::accu::image::impl
+
+
+
+ // Dispatch.
+
+ namespace internal
+ {
+
+ template <typename I, typename V>
+ void
+ set_value_dispatch(trait::image::speed::any,
+ Image<I>& input, const V& res)
+ {
+ impl::generic::set_value(input, res);
+ }
+
+ template <typename I, typename V>
+ void
+ set_value_dispatch(trait::image::speed::fastest,
+ Image<I>& input, const V& res)
+ {
+ impl::set_value_fastest(input, res);
+ }
+
+ template <typename I, typename V>
+ void
+ set_value_dispatch(Image<I>& input, const V& res)
+ {
+ set_value_dispatch(mln_trait_image_speed(I)(),
+ input, res);
+ }
+
+ } // end of namespace mln::accu::image::internal
+
+
+ // Facade.
+
+ template <typename I>
+ void
+ set_value(Image<I>& input,
+ const mln_deduce(I, value, result)& res)
+ {
+ trace::entering("accu::image::set_value");
+
+ mlc_is_a(mln_value(I), Accumulator)::check();
+
+ mln_precondition(exact(input).is_valid());
+ internal::set_value_dispatch(input, res);
+
+ trace::exiting("accu::image::set_value");
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::accu::image
+
+ } // end of namespace mln::accu
+
+} // end of namespace mln
+
+
+#endif // ! MLN_ACCU_IMAGE_SET_VALUE_HH
Index: mln/accu/image/all.hh
--- mln/accu/image/all.hh (revision 0)
+++ mln/accu/image/all.hh (revision 0)
@@ -0,0 +1,56 @@
+// 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 MLN_ACCU_IMAGE_ALL_HH
+# define MLN_ACCU_IMAGE_ALL_HH
+
+/// \file mln/accu/image/all.hh
+///
+/// File that includes all accumulator image routines.
+
+
+namespace mln
+{
+
+ /// Namespace of accumulators.
+ namespace accu
+ {
+ /// Namespace of accumulator image routines.
+ namespace image {}
+
+ }
+}
+
+
+# include <mln/accu/image/init.hh>
+# include <mln/accu/image/set_value.hh>
+# include <mln/accu/image/take_as_init.hh>
+# include <mln/accu/image/take.hh>
+# include <mln/accu/image/to_result.hh>
+
+
+#endif // ! MLN_ACCU_IMAGE_ALL_HH
Index: mln/accu/image/take_as_init.hh
--- mln/accu/image/take_as_init.hh (revision 0)
+++ mln/accu/image/take_as_init.hh (revision 0)
@@ -0,0 +1,166 @@
+// 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 MLN_ACCU_IMAGE_TAKE_AS_INIT_HH
+# define MLN_ACCU_IMAGE_TAKE_AS_INIT_HH
+
+/// \file mln/accu/image/take_as_init.hh
+///
+/// Initialize an image of accumulators by taking a first value.
+
+# include <mln/core/concept/accumulator.hh>
+# include <mln/core/concept/image.hh>
+
+
+namespace mln
+{
+
+ namespace accu
+ {
+
+ namespace image
+ {
+
+ template <typename I>
+ void
+ take_as_init(Image<I>& input,
+ const mln_deduce(I, value, argument)& v);
+
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ namespace impl
+ {
+
+ // Generic version.
+
+ namespace generic
+ {
+
+ template <typename I>
+ void
+ take_as_init(Image<I>& input_,
+ const mln_deduce(I, value, argument)& v)
+ {
+ trace::entering("accu::impl::image::generic::take_as_init");
+
+ I& input = exact(input_);
+ mln_precondition(input.is_valid());
+
+ mln_piter(I) p(input.domain());
+ for_all(p)
+ input(p).take_as_init(v);
+
+ trace::exiting("accu::impl::image::generic::take_as_init");
+ }
+
+ } // end of namespace mln::accu::image::impl::generic
+
+
+ // Fastest version.
+
+ template <typename I>
+ void
+ take_as_init_fastest(Image<I>& input_,
+ const mln_deduce(I, value, argument)& v)
+ {
+ trace::entering("accu::impl::image::take_as_init_fastest");
+
+ I& input = exact(input_);
+ mln_precondition(input.is_valid());
+
+ mln_pixter(I) px(input);
+ for_all(px)
+ px.val().take_as_init(v);
+
+ trace::exiting("accu::impl::image::take_as_init_fastest");
+ }
+
+ } // end of namespace mln::accu::image::impl
+
+
+
+ // Dispatch.
+
+ namespace internal
+ {
+
+ template <typename I, typename V>
+ void
+ take_as_init_dispatch(trait::image::speed::any,
+ Image<I>& input, const V& v)
+ {
+ impl::generic::take_as_init(input, v);
+ }
+
+ template <typename I, typename V>
+ void
+ take_as_init_dispatch(trait::image::speed::fastest,
+ Image<I>& input, const V& v)
+ {
+ impl::take_as_init_fastest(input, v);
+ }
+
+ template <typename I, typename V>
+ void
+ take_as_init_dispatch(Image<I>& input, const V& v)
+ {
+ take_as_init_dispatch(mln_trait_image_speed(I)(),
+ input, v);
+ }
+
+ } // end of namespace mln::accu::image::internal
+
+
+ // Facade.
+
+ template <typename I>
+ void
+ take_as_init(Image<I>& input,
+ const mln_deduce(I, value, argument)& v)
+ {
+ trace::entering("accu::image::take_as_init");
+
+ mlc_is_a(mln_value(I), Accumulator)::check();
+
+ mln_precondition(exact(input).is_valid());
+ internal::take_as_init_dispatch(input, v);
+
+ trace::exiting("accu::image::take_as_init");
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::accu::image
+
+ } // end of namespace mln::accu
+
+} // end of namespace mln
+
+
+#endif // ! MLN_ACCU_IMAGE_TAKE_AS_INIT_HH
Property changes on: mln/accu/image/take_as_init.hh
___________________________________________________________________
Added: svn:mergeinfo
Index: mln/accu/image/to_result.hh
--- mln/accu/image/to_result.hh (revision 0)
+++ mln/accu/image/to_result.hh (revision 0)
@@ -0,0 +1,178 @@
+// 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 MLN_ACCU_IMAGE_TO_RESULT_HH
+# define MLN_ACCU_IMAGE_TO_RESULT_HH
+
+/// \file mln/accu/image/to_result.hh
+///
+/// Convert an image of accumulators into a result image.
+
+# include <mln/core/concept/accumulator.hh>
+# include <mln/core/concept/image.hh>
+
+
+namespace mln
+{
+
+ namespace accu
+ {
+
+ namespace image
+ {
+
+ template <typename I>
+ mln_ch_value(I, mln_deduce(I, value, result))
+ to_result(const Image<I>& input);
+
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ namespace impl
+ {
+
+ // Generic version.
+
+ namespace generic
+ {
+
+ template <typename I>
+ mln_ch_value(I, mln_deduce(I, value, result))
+ to_result(const Image<I>& input_)
+ {
+ trace::entering("accu::impl::image::generic::to_result");
+
+ const I& input = exact(input_);
+ mln_precondition(input.is_valid());
+
+ typedef mln_deduce(I, value, result) R;
+ mln_ch_value(I, R) output;
+ initialize(output, input);
+
+ mln_piter(I) p(input.domain());
+ for_all(p)
+ output(p) = input(p).to_result();
+
+ trace::exiting("accu::impl::image::generic::to_result");
+ return output;
+ }
+
+ } // end of namespace mln::accu::image::impl::generic
+
+
+ // Fastest version.
+
+ template <typename I>
+ mln_ch_value(I, mln_deduce(I, value, result))
+ to_result_fastest(const Image<I>& input_)
+ {
+ trace::entering("accu::impl::image::to_result_fastest");
+
+ const I& input = exact(input_);
+ mln_precondition(input.is_valid());
+
+ typedef mln_deduce(I, value, result) R;
+ typedef mln_ch_value(I, R) O;
+ O output;
+ initialize(output, input);
+
+ mln_pixter(const I) p_in(input);
+ mln_pixter(O) p_out(output);
+ for_all_2(p_in, p_out)
+ p_out.val() = p_in.val().to_result();
+
+ trace::exiting("accu::impl::image::to_result_fastest");
+ return output;
+ }
+
+ } // end of namespace mln::accu::image::impl
+
+
+
+ // Dispatch.
+
+ namespace internal
+ {
+
+ template <typename I>
+ mln_ch_value(I, mln_deduce(I, value, result))
+ to_result_dispatch(trait::image::speed::any,
+ const Image<I>& input)
+ {
+ return impl::generic::to_result(input);
+ }
+
+ template <typename I>
+ mln_ch_value(I, mln_deduce(I, value, result))
+ to_result_dispatch(trait::image::speed::fastest,
+ const Image<I>& input)
+ {
+ return impl::to_result_fastest(input);
+ }
+
+ template <typename I>
+ mln_ch_value(I, mln_deduce(I, value, result))
+ to_result_dispatch(const Image<I>& input)
+ {
+ return to_result_dispatch(mln_trait_image_speed(I)(),
+ input);
+ }
+
+ } // end of namespace mln::accu::image::internal
+
+
+ // Facade.
+
+ template <typename I>
+ mln_ch_value(I, mln_deduce(I, value, result))
+ to_result(const Image<I>& input)
+ {
+ trace::entering("accu::image::to_result");
+
+ mlc_is_a(mln_value(I), Accumulator)::check();
+
+ mln_precondition(exact(input).is_valid());
+
+ typedef mln_deduce(I, value, result) R;
+ mln_ch_value(I, R) output;
+ output = internal::to_result_dispatch(input);
+
+ trace::exiting("accu::image::to_result");
+ return output;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::accu::image
+
+ } // end of namespace mln::accu
+
+} // end of namespace mln
+
+
+#endif // ! MLN_ACCU_IMAGE_TO_RESULT_HH
Property changes on: mln/accu/image/to_result.hh
___________________________________________________________________
Added: svn:mergeinfo
Index: mln/accu/all.hh
--- mln/accu/all.hh (revision 3531)
+++ mln/accu/all.hh (working copy)
@@ -1,5 +1,5 @@
-// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory
-// (LRDE)
+// Copyright (C) 2007, 2008, 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
@@ -93,5 +93,9 @@
# include <mln/accu/transform_line.hh>
# include <mln/accu/transform_snake.hh>
+// Sub-directories
+
+# include <mln/accu/image/all.hh>
+
#endif // ! MLN_ACCU_ALL_HH
Index: tests/accu/image/to_result.cc
--- tests/accu/image/to_result.cc (revision 0)
+++ tests/accu/image/to_result.cc (revision 0)
@@ -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 tests/accu/image/to_result.cc
+///
+/// Tests on mln::accu::image::to_result.
+
+#include <mln/core/image/image2d.hh>
+#include <mln/accu/count.hh>
+#include <mln/accu/image/init.hh>
+#include <mln/accu/image/to_result.hh>
+#include <mln/debug/println.hh>
+
+
+int main()
+{
+ using namespace mln;
+
+ typedef accu::count<int> A;
+ image2d<A> ima(2, 2);
+
+ accu::image::init(ima);
+ image2d<unsigned> res = accu::image::to_result(ima);
+ debug::println(res);
+}
Property changes on: tests/accu/image/to_result.cc
___________________________________________________________________
Added: svn:mergeinfo
Index: tests/accu/image/init.cc
--- tests/accu/image/init.cc (revision 0)
+++ tests/accu/image/init.cc (revision 0)
@@ -0,0 +1,45 @@
+// 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 tests/accu/image/init.cc
+///
+/// Tests on mln::accu::image::init.
+
+#include <mln/core/image/image2d.hh>
+#include <mln/accu/count.hh>
+#include <mln/accu/image/init.hh>
+
+
+int main()
+{
+ using namespace mln;
+
+ typedef accu::count<int> A;
+ image2d<A> ima(2, 2);
+
+ accu::image::init(ima);
+}
Index: tests/accu/image/take.cc
--- tests/accu/image/take.cc (revision 0)
+++ tests/accu/image/take.cc (revision 0)
@@ -0,0 +1,58 @@
+// 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 tests/accu/image/take.cc
+///
+/// Tests on mln::accu::image::take.
+
+#include <mln/core/image/image2d.hh>
+#include <mln/data/fill.hh>
+#include <mln/accu/sum.hh>
+#include <mln/accu/image/init.hh>
+#include <mln/accu/image/take.hh>
+
+#include <mln/debug/println.hh>
+
+
+int main()
+{
+ using namespace mln;
+
+ typedef accu::sum<int> A;
+ image2d<A> ima(2, 2);
+ accu::image::init(ima);
+ debug::println(ima);
+
+ image2d<int> dta(2, 2);
+ data::fill(dta, 7);
+
+ accu::image::take(ima, dta);
+ debug::println(ima);
+
+ accu::image::take(ima, ima);
+ debug::println(ima);
+}
Index: tests/accu/image/Makefile.am
--- tests/accu/image/Makefile.am (revision 0)
+++ tests/accu/image/Makefile.am (revision 0)
@@ -0,0 +1,18 @@
+## Process this file through Automake to create Makefile.in -*- Makefile -*-
+
+include $(top_srcdir)/milena/tests/tests.mk
+
+check_PROGRAMS = \
+ init \
+ set_value \
+ take \
+ take_as_init \
+ to_result
+
+init_SOURCES = init.cc
+set_value_SOURCES = set_value.cc
+take_SOURCES = take.cc
+take_as_init_SOURCES = take_as_init.cc
+to_result_SOURCES = to_result.cc
+
+TESTS = $(check_PROGRAMS)
Index: tests/accu/image/set_value.cc
--- tests/accu/image/set_value.cc (revision 0)
+++ tests/accu/image/set_value.cc (revision 0)
@@ -0,0 +1,48 @@
+// 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 tests/accu/image/set_value.cc
+///
+/// Tests on mln::accu::image::set_value.
+
+#include <mln/core/image/image2d.hh>
+#include <mln/accu/count.hh>
+#include <mln/accu/image/set_value.hh>
+
+#include <mln/debug/println.hh>
+
+
+int main()
+{
+ using namespace mln;
+
+ typedef accu::count<int> A;
+ image2d<A> ima(2, 2);
+
+ accu::image::set_value(ima, 3);
+ debug::println(ima);
+}
Index: tests/accu/image/take_as_init.cc
--- tests/accu/image/take_as_init.cc (revision 0)
+++ tests/accu/image/take_as_init.cc (revision 0)
@@ -0,0 +1,48 @@
+// 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 tests/accu/image/take_as_init.cc
+///
+/// Tests on mln::accu::image::take_as_init.
+
+#include <mln/core/image/image2d.hh>
+#include <mln/accu/sum.hh>
+#include <mln/accu/image/take_as_init.hh>
+
+#include <mln/debug/println.hh>
+
+
+int main()
+{
+ using namespace mln;
+
+ typedef accu::sum<int> A;
+ image2d<A> ima(2, 2);
+
+ accu::image::take_as_init(ima, 3);
+ debug::println(ima);
+}
Property changes on: tests/accu/image/take_as_init.cc
___________________________________________________________________
Added: svn:mergeinfo
Index: tests/accu/Makefile.am
--- tests/accu/Makefile.am (revision 3531)
+++ tests/accu/Makefile.am (working copy)
@@ -2,6 +2,9 @@
include $(top_srcdir)/milena/tests/tests.mk
+SUBDIRS = \
+ image
+
check_PROGRAMS = \
all_accus \
bbox \
1
0
URL: https://svn.lrde.epita.fr/svn/oln/trunk/milena
ChangeLog:
2009-03-14 Edwin Carlinet <carlinet(a)lrde.epita.fr>
Disambiguate component tree iterators.
* mln/morpho/tree/data.hh:
Add children image to get instant access to child relationship.
Remove mln_fwd_piter, mln_bkd_piter and mln_piter definition
from tree structure.
Add mln_up_site_piter, mln_dn_site_piter, mln_up_node_piter,
mln_dn_node_piter iterator adaptator.
Add mln_preorder_piter, the preorder tree traversal
iterator.
Move inline code out of class definition.
* sandbox/edwin/tree/propagate_node.hh: Fix with new iterator,
but not yet optimized with new tree structure.
* sandbox/edwin/tree/propagate_value.hh: Fix with new
iterator, but not yet optimized with new tree structure.
* sandbox/edwin/tree/propagation.cc: Update test file.
---
mln/morpho/tree/data.hh | 462 +++++++++++++++++++++++++++-------
sandbox/edwin/tree/propagate_node.hh | 10
sandbox/edwin/tree/propagate_value.hh | 12
sandbox/edwin/tree/propagation.cc | 31 ++
4 files changed, 410 insertions(+), 105 deletions(-)
Index: trunk/milena/mln/morpho/tree/data.hh
===================================================================
--- trunk/milena/mln/morpho/tree/data.hh (revision 3530)
+++ trunk/milena/mln/morpho/tree/data.hh (revision 3531)
@@ -38,10 +38,27 @@
/// learn why we want the 1st pass to be in forward scan of s).
# include <mln/morpho/tree/compute_parent.hh>
-# include <mln/core/image/sub_image.hh>
+//# include <mln/core/image/sub_image.hh>
# include <mln/core/site_set/p_array.hh>
-# include <mln/core/site_set/p_set.hh>
-# include <mln/data/fill.hh>
+# include <mln/core/internal/site_set_iterator_base.hh>
+# include <mln/core/internal/piter_identity.hh>
+# include <deque>
+
+# define mln_up_site_piter(T) typename T::up_site_piter
+# define mln_dn_site_piter(T) typename T::dn_site_piter
+# define mln_up_node_piter(T) typename T::up_node_piter
+# define mln_dn_node_piter(T) typename T::dn_node_piter
+# define mln_preorder_piter(T) typename T::preorder_piter
+
+# define mln_up_site_piter_(T) T::up_site_piter
+# define mln_dn_site_piter_(T) T::dn_site_piter
+# define mln_up_node_piter_(T) T::up_node_piter
+# define mln_dn_node_piter_(T) T::dn_node_piter
+# define mln_preorder_piter_(T) T::preorder_piter
+
+// FIXME: rename these iterators.
+//# define mln_up_leaf_piter(T) typename T::up_leaf_piter;
+//# define mln_dn_leaf_piter(T) typename T::dn_leaf_piter;
namespace mln
{
@@ -52,144 +69,243 @@
namespace tree
{
+ // Forward declarations.
+
+ /// Iterate on tree's sites from leaves to roots.
+ template <typename T> struct up_site_piter;
+
+ /// Iterate on tree's sites from roots to leaves.
+ template <typename T> struct dn_site_piter;
+
+ /// Iterate on tree's nodes (component representants) from leaves to roots.
+ template <typename T> struct up_node_piter;
+
+ /// Iterate on tree's nodes (component representants) from leaves to roots.
+ template <typename T> struct dn_node_piter;
+
+ /// Preorder tree traversal iterator.
+ template <typename T> struct preorder_piter;
+
+ /// Postorder tree traversal iterator.
+ //template <typename T> struct postorder_piter;
+
// FIXME: Doc!
+
+
template <typename I, typename S>
class data
{
- public:
-
+ typedef data<I, S> self_;
+ public:
/// Associated type of the function f.
typedef I function;
+ /// Psite associated type.
+ typedef mln_psite(I) psite;
+ typedef mln_site(I) site;
+ /// Site set associated type.
+ typedef S sites_t;
+ /// Node list associated type.
+ typedef p_array<mln_psite(I)> nodes_t;
+ /// Parent image associated type.
+ typedef mln_ch_value(I, mln_psite(I)) parent_t;
- /// Ctor.
+ // Iterate on all sites.
+ typedef mln::morpho::tree::up_site_piter<self_> up_site_piter;
+ typedef mln::morpho::tree::dn_site_piter<self_> dn_site_piter;
+
+ // Iterate on nodes only.
+ typedef mln::morpho::tree::up_node_piter<self_> up_node_piter;
+ typedef mln::morpho::tree::dn_node_piter<self_> dn_node_piter;
+
+ typedef mln::morpho::tree::preorder_piter<self_> preorder_piter;
+
+// typedef mln_bkd_piter(S) piter;
+// typedef mln_bkd_piter(S) fwd_piter;
+// typedef mln_fwd_piter(S) bkd_piter;
+
+ /// Constructor.
template <typename N>
- data(const Image<I>& f, const Site_Set<S>& s, const Neighborhood<N>& nbh);
+ explicit data(const Image<I>& f, const Site_Set<S>& s, const Neighborhood<N>& nbh);
/// \{ Parent-related materials.
- typedef mln_ch_value(I, mln_psite(I)) parent_t;
+ const mln_psite(I)& parent(const mln_psite(I)& p) const;
+ const parent_t& parent_image() const;
+
+ /// \}
- const mln_psite(I)& parent(const mln_psite(I)& p) const
+ const p_array<mln_psite(I)>& children(const mln_psite(I)& p) const
{
- mln_precondition(is_valid());
- mln_precondition(parent_.domain().has(p));
- return parent_(p);
+ return children_(p);
}
- const parent_t& parent_image() const
+ const mln_ch_value(I, nodes_t)& children_image() const
{
- mln_precondition(is_valid());
- return parent_;
+ return children_;
}
- /// \}
+ /// \{ Tests.
+ bool is_valid() const;
+ bool is_root(const mln_psite(I)& p) const;
+ bool is_a_node(const mln_psite(I)& p) const;
+ bool is_a_non_root_node(const mln_psite(I)& p) const;
+ bool is_a_leaf(const mln_psite(I)& p) const;
- /// \{ Tests.
+ /// \}
- bool is_valid() const
- {
- return parent_.is_valid(); // FIXME: and... (?)
- }
- bool is_root(const mln_psite(I)& p) const
- {
- mln_precondition(is_valid());
- mln_precondition(parent_.domain().has(p));
- return parent_(p) == p;
- }
+ /// \{ Nodes-related materials.
- bool is_a_node(const mln_psite(I)& p) const
- {
- mln_precondition(is_valid());
- mln_precondition(parent_.domain().has(p));
- return parent_(p) == p || f_(parent_(p)) != f_(p);
- }
+ const p_array<mln_psite(I)>& nodes() const;
- bool is_a_non_root_node(const mln_psite(I)& p) const
- {
- mln_precondition(is_valid());
- mln_precondition(parent_.domain().has(p));
- return f_(parent_(p)) != f_(p);
- }
+ /// \}
- /// Return true iff p is a leaf (in log time).
- bool is_a_leaf(const mln_psite(I)& p) const
- {
- mln_precondition(is_valid());
- mln_precondition(parent_.domain().has(p));
- return leaves_.has(p);
- }
+ /// \{ Sites-related materials.
+
+ const S& domain() const;
/// \}
+ unsigned nroots() const;
- /// \{ Nodes-related materials.
- typedef p_array<mln_psite(I)> nodes_t;
+ const I& f() const;
- const p_array<mln_psite(I)>& nodes() const
- {
- mln_precondition(is_valid());
- return nodes_;
- }
- /// \}
+ mln_rvalue(I) f(const mln_psite(I)& p) const;
- /// \{ Nodes-related materials.
+ protected:
+ const function& f_;
+ const sites_t& s_;
+ mln_ch_value(I, mln_psite(I)) parent_; // Parent image.
+ mln_ch_value(I, nodes_t) children_; // Children image.
+ nodes_t nodes_;
+ unsigned nroots_;
+ };
+
- typedef p_set<mln_psite(I)> leaves_t;
+ template <typename T>
+ struct up_site_piter
+ : public mln::internal::piter_identity_< typename T::sites_t::bkd_piter, // Adaptee.
+ up_site_piter<T> > // Exact.
+ {
+ private:
+ typedef typename T::sites_t::bkd_piter Pi_;
+ typedef mln::internal::piter_identity_< Pi_, up_site_piter<T> > super_;
- const leaves_t& leaves() const
+ public:
+ up_site_piter(const T& t)
{
- mln_precondition(is_valid());
- return leaves_;
+ this->change_target(t.domain());
}
- /// \}
+ up_site_piter(const Pi_& pi)
+ : super_(pi)
+ {
+ }
+ };
- /// \{ How-to iterate on all sites.
+ template <typename T>
+ struct dn_site_piter
+ : public mln::internal::piter_identity_< typename T::sites_t::fwd_piter, // Adaptee.
+ dn_site_piter<T> > // Exact.
+ {
+ private:
+ typedef typename T::sites_t::fwd_piter Pi_;
+ typedef mln::internal::piter_identity_< Pi_, dn_site_piter<T> > super_;
- typedef mln_bkd_piter(S) piter;
- typedef mln_bkd_piter(S) fwd_piter;
- typedef mln_fwd_piter(S) bkd_piter;
+ public:
+ dn_site_piter(const T& t)
+ {
+ this->change_target(t.domain());
+ }
- const S& domain() const
+ dn_site_piter(const Pi_& pi)
+ : super_(pi)
{
- return s_;
}
+ };
- /// \}
+ template <typename T>
+ struct up_node_piter
+ : public mln::internal::piter_identity_< typename T::nodes_t::fwd_piter, // Adaptee.
+ up_node_piter<T> > // Exact.
+ {
+ private:
+ typedef typename T::sites_t::fwd_piter Pi_;
+ typedef mln::internal::piter_identity_< Pi_, up_node_piter<T> > super_;
- unsigned nroots() const
+ public:
+ up_node_piter(const T& t)
{
- return nroots_;
+ this->change_target(t.nodes());
}
- const I& f() const
+ up_node_piter(const Pi_& pi)
+ : super_(pi)
{
- return f_;
}
+ };
- mln_rvalue(I) f(const mln_psite(I)& p) const
+ template <typename T>
+ struct dn_node_piter
+ : public mln::internal::piter_identity_< typename T::nodes_t::bkd_piter, // Adaptee.
+ dn_node_piter<T> > // Exact.
+ {
+ private:
+ typedef typename T::sites_t::bkd_piter Pi_;
+ typedef mln::internal::piter_identity_< Pi_, dn_node_piter<T> > super_;
+
+ public:
+ dn_node_piter(const T& t)
{
- return f_(p);
+ this->change_target(t.nodes());
}
- protected:
+ dn_node_piter(const Pi_& pi)
+ : super_(pi)
+ {
+ }
+ };
- const I& f_;
- const S& s_;
- mln_ch_value(I, mln_psite(I)) parent_;
- leaves_t leaves_;
- p_array<mln_psite(I)> nodes_;
- unsigned nroots_;
+ template <typename T>
+ class preorder_piter
+ : public mln::internal::site_set_iterator_base< T, preorder_piter<T> >
+ {
+ typedef preorder_piter<T> self_;
+ typedef mln::internal::site_set_iterator_base<T, self_> super_;
+
+ public:
+
+ /// Constructor with no argument.
+ preorder_piter();
+
+ /// Constructor.
+ preorder_piter(const T& t);
+
+ /// Test if the iterator is valid.
+ bool is_valid_() const;
+
+ /// Invalidate the iterator.
+ void invalidate_();
+
+ /// Start an iteration.
+ void start_();
+
+ /// Go to the next point.
+ void next_();
+
+ protected:
+ using super_::p_;
+ using super_::s_;
+ std::deque<mln_psite(T)> stack_; // FIXME: implement p_stack.
};
@@ -208,6 +324,7 @@
// Compute parent image.
parent_ = morpho::tree::compute_parent(f_, nbh_, s_);
+ initialize(children_, f);
// Store tree nodes.
nroots_ = 0;
@@ -217,6 +334,7 @@
if (f_(parent_(p)) != f_(p))
{
nodes_.insert(p);
+ children_(parent_(p)).insert(p);
}
else
if (parent_(p) == p)
@@ -225,21 +343,183 @@
++nroots_;
}
}
+ }
+
+ template <typename I, typename S>
+ inline
+ const mln_psite(I)&
+ data<I,S>::parent(const mln_psite(I)& p) const
+ {
+ mln_precondition(is_valid());
+ mln_precondition(parent_.domain().has(p));
+ return parent_(p);
+ }
+
+ template <typename I, typename S>
+ inline
+ const mln_ch_value(I, mln_psite(I))&
+ data<I,S>::parent_image() const
+ {
+ mln_precondition(is_valid());
+ return parent_;
+ }
+
+ template <typename I, typename S>
+ inline
+ bool
+ data<I,S>::is_valid() const
+ {
+ return parent_.is_valid(); // FIXME: and... (?)
+ }
+
+ template <typename I, typename S>
+ inline
+ bool
+ data<I,S>::is_root(const mln_psite(I)& p) const
+ {
+ mln_precondition(is_valid());
+ mln_precondition(parent_.domain().has(p));
+ return parent_(p) == p;
+ }
+
+
+ template <typename I, typename S>
+ inline
+ bool
+ data<I,S>::is_a_node(const mln_psite(I)& p) const
+ {
+ mln_precondition(is_valid());
+ mln_precondition(parent_.domain().has(p));
+ return parent_(p) == p || f_(parent_(p)) != f_(p);
+ }
+
+ template <typename I, typename S>
+ inline
+ bool
+ data<I,S>::is_a_non_root_node(const mln_psite(I)& p) const
+ {
+ mln_precondition(is_valid());
+ mln_precondition(parent_.domain().has(p));
+ return f_(parent_(p)) != f_(p);
+ }
+
+
+ template <typename I, typename S>
+ inline
+ bool
+ data<I,S>::is_a_leaf(const mln_psite(I)& p) const
+ {
+ mln_precondition(is_valid());
+ mln_precondition(children_.domain().has(p));
+ return children_(p).nsites() == 0;
+ }
+
+ template <typename I, typename S>
+ inline
+ const p_array<mln_psite(I)>&
+ data<I,S>::nodes() const
+ {
+ mln_precondition(is_valid());
+ return nodes_;
+ }
+
+ template <typename I, typename S>
+ inline
+ const S&
+ data<I,S>::domain() const
+ {
+ return s_;
+ }
+
+ template <typename I, typename S>
+ inline
+ unsigned
+ data<I,S>::nroots() const
+ {
+ return nroots_;
+ }
+
+ template <typename I, typename S>
+ inline
+ const I&
+ data<I,S>::f() const
+ {
+ return f_;
+ }
+
+ template <typename I, typename S>
+ inline
+ mln_rvalue(I)
+ data<I,S>::f(const mln_psite(I)& p) const
+ {
+ return f_(p);
+ }
+
+
+
+ // Iterators.
+
+
+ template <typename T>
+ inline
+ preorder_piter<T>::preorder_piter()
+ {
+ }
+
+ template <typename T>
+ inline
+ preorder_piter<T>::preorder_piter(const T& t)
+ {
+ this->change_target(t);
+ }
- // Store leaves.
- mln_ch_value(I, bool) deja_vu;
- initialize(deja_vu, f);
- mln::data::fill(deja_vu, false);
-
- mln_fwd_piter(nodes_t) n(nodes_);
- for_all(n)
- {
- deja_vu(parent_(n)) = true;
- if (!deja_vu(n))
- leaves_.insert(n);
+ template <typename T>
+ inline
+ bool
+ preorder_piter<T>::is_valid_() const
+ {
+ return !stack_.empty();
}
+
+ template <typename T>
+ inline
+ void
+ preorder_piter<T>::invalidate_()
+ {
+ stack_.clear();
}
+ template <typename T>
+ inline
+ void
+ preorder_piter<T>::start_()
+ {
+ this->invalidate();
+ mln_dn_node_piter(T) n(s_->nodes());
+ int roots = 0;
+ for (n.start(); n.is_valid() && roots < s_->nroots(); n.next())
+ if (s_->is_root(n))
+ {
+ stack_.push_back(n);
+ roots++;
+ }
+
+ this->next();
+ }
+
+ template <typename T>
+ inline
+ void
+ preorder_piter<T>::next_()
+ {
+ p_ = stack_.back();
+ stack_.pop_back();
+ mln_fwd_piter(T::nodes_t) child(s_->children(p_));
+ for_all(child)
+ stack_.push_back(child);
+ }
+
+
# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln::morpho::tree
Index: trunk/milena/sandbox/edwin/tree/propagate_node.hh
===================================================================
--- trunk/milena/sandbox/edwin/tree/propagate_node.hh (revision 3530)
+++ trunk/milena/sandbox/edwin/tree/propagate_node.hh (revision 3531)
@@ -51,7 +51,7 @@
*/
template <typename T, typename A>
void
- propagate_node_to_descendants(mln_bkd_piter(T::nodes_t)& n,
+ propagate_node_to_descendants(mln_dn_node_piter(T)& n,
const T& t,
Image<A>& a_,
mln_value(A) v);
@@ -65,7 +65,7 @@
*/
template <typename T, typename A>
void
- propagate_node_to_descendants(mln_bkd_piter(T::nodes_t)& n,
+ propagate_node_to_descendants(mln_dn_node_piter(T)& n,
const T& t,
Image<A>& a_);
@@ -135,7 +135,7 @@
template <typename T, typename A>
void
- propagate_node_to_descendants(mln_bkd_piter(T::nodes_t)& n,
+ propagate_node_to_descendants(mln_dn_node_piter(T)& n,
const T& t,
Image<A>& a_,
mln_value(A) v)
@@ -151,7 +151,7 @@
data::fill(ancestors, false);
ancestors(n) = true;
- mln_bkd_piter(T::nodes_t) it(n);
+ mln_dn_node_piter(T) it(n);
for (it.next(); it.is_valid(); it.next())
{
if (ancestors(t.parent(it)))
@@ -189,7 +189,7 @@
if (!t.is_a_node(n)) // Get the representant.
n = t.parent(n);
- mln_bkd_piter(T::nodes_t) it = find_bkd(t.nodes(), n);
+ mln_dn_node_piter(T) it(find_bkd(t.nodes(), n));
propagate_node_to_descendants(it, t, a, v);
}
Index: trunk/milena/sandbox/edwin/tree/propagation.cc
===================================================================
--- trunk/milena/sandbox/edwin/tree/propagation.cc (revision 3530)
+++ trunk/milena/sandbox/edwin/tree/propagation.cc (revision 3531)
@@ -32,6 +32,20 @@
<< "*********************" << std::endl;
}
+template <typename I>
+void print(I& img, mln_psite(I) p)
+{
+ using namespace mln;
+
+ std::cout << p << " -> ";
+ mln_fwd_piter(p_array<mln_psite(I)>) it(img(p));
+// for_all(it)
+// std::cout << it << " ";
+// std::cout << std::endl;
+ for_all(it)
+ print(img, it);
+}
+
int main(int argc, char* argv[])
{
using namespace mln;
@@ -109,9 +123,20 @@
dsp("Propagate value to descendants : (it_max, tree, dup, 69)");
display_tree_attributes(tree, dup);
-
-
-
+ mln_dn_node_piter_(tree_t) n(tree);
+ n.start();
+ print(tree.children_image(), n);
+
+ std::cout << "\n";
+ mln_preorder_piter_(tree_t) pit(tree);
+ mln_psite_(I) parent;
+ for_all(pit)
+ {
+ if (parent != tree.parent(pit))
+ std::cout << std::endl;
+ std::cout << pit << " -> ";
+ parent = pit;
+ }
}
Index: trunk/milena/sandbox/edwin/tree/propagate_value.hh
===================================================================
--- trunk/milena/sandbox/edwin/tree/propagate_value.hh (revision 3530)
+++ trunk/milena/sandbox/edwin/tree/propagate_value.hh (revision 3531)
@@ -83,7 +83,7 @@
template <typename T, typename A>
bool check_propagate_ancestors(const T& t, const A& a, mln_value(A) v)
{
- mln_fwd_piter(T::nodes_t) n(t.nodes());
+ mln_up_node_piter(T) n(t.nodes());
for_all(n)
if (a(n) == v && a(t.parent(n)) != v)
return false;
@@ -93,7 +93,7 @@
template <typename T, typename A>
bool check_propagate_descendants(const T& t, const A& a, mln_value(A) v)
{
- mln_fwd_piter(T::nodes_t) n(t.nodes());
+ mln_up_node_piter(T) n(t.nodes());
for_all(n)
if (a(n) != v && a(t.parent(n)) == v)
return false;
@@ -123,7 +123,7 @@
initialize(deja_vu, a);
data::fill(deja_vu, false);
- mln_fwd_piter(T::nodes_t) n(t.nodes());
+ mln_up_node_piter(T) n(t.nodes());
for_all(n)
{
if (a(n) == v || deja_vu(n))
@@ -148,7 +148,7 @@
mln_precondition(a.is_valid());
mln_precondition(a.domain() == t.f().domain());
- mln_fwd_piter(T::nodes_t) n(t.nodes());
+ mln_up_node_piter(T) n(t.nodes());
for_all(n)
{
if (a(n) == v)
@@ -183,7 +183,7 @@
initialize(deja_vu, a);
data::fill(deja_vu, false);
- mln_bkd_piter(T::nodes_t) n(t.nodes());
+ mln_dn_node_piter(T) n(t.nodes());
for_all(n)
{
if (a(n) == v)
@@ -211,7 +211,7 @@
mln_precondition(a.is_valid());
mln_precondition(a.domain() == t.f().domain());
- mln_bkd_piter(T::nodes_t) n(t.nodes());
+ mln_dn_node_piter(T) n(t.nodes());
for_all(n)
{
if (a(t.parent(n)) == v)
1
0
13 Mar '09
URL: https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox
ChangeLog:
2009-03-13 Etienne FOLIO <folio(a)lrde.epita.fr>
Classification of 2D images with their respective RGB histograms.
* sandbox/folio/mln/histo/classify_with_histo_rgb.hh: New
algorithm that classifies an image 2d with its rgb histogram.
* sandbox/folio/mln/histo/compute_histo_rgb.hh: Use component of
value's trait.
* sandbox/folio/test/histo/classify_with_histo_rgb.cc: New test
for the classification of 2d images with their respective RGB
histograms.
* sandbox/folio/test/histo/compute_histo_rgb.cc: Correct an include.
* sandbox/folio/test/histo/compute_histo_rgb_from_ppm.cc: New test
for building an histogram with a ppm image.
---
mln/histo/classify_with_histo_rgb.hh | 40 +++++++++++++
mln/histo/compute_histo_rgb.hh | 11 ++-
test/histo/classify_with_histo_rgb.cc | 89 +++++++++++++++++++++++++++++++
test/histo/compute_histo_rgb.cc | 2
test/histo/compute_histo_rgb_from_ppm.cc | 30 ++++++++++
5 files changed, 166 insertions(+), 6 deletions(-)
Index: trunk/milena/sandbox/folio/test/histo/compute_histo_rgb_from_ppm.cc
===================================================================
--- trunk/milena/sandbox/folio/test/histo/compute_histo_rgb_from_ppm.cc (revision 0)
+++ trunk/milena/sandbox/folio/test/histo/compute_histo_rgb_from_ppm.cc (revision 3530)
@@ -0,0 +1,30 @@
+/*!
+ * \file compute_histo_rgb_from_ppm.cc
+ * \author etiennefolio <ornthalas(a)gmail.com>
+ */
+
+#include <iostream>
+#include <mln/debug/println.hh>
+
+#include <mln/io/ppm/load.hh>
+#include <mln/io/ppm/save.hh>
+#include <mln/level/stretch.hh>
+
+#include "../../mln/histo/compute_histo_rgb.hh"
+
+int main()
+{
+ using namespace mln;
+
+ // build test image
+ image2d<value::rgb8> ima;
+ io::ppm::load(ima, "../../../../img/lena.ppm");
+
+ // let's run !
+ image3d<value::int_u8> out = histo::compute_histo_rgb<value::int_u8>(ima);
+
+ // output ?
+ // FIXME: need projection to visualize.
+
+ return 0;
+}
Index: trunk/milena/sandbox/folio/test/histo/compute_histo_rgb.cc
===================================================================
--- trunk/milena/sandbox/folio/test/histo/compute_histo_rgb.cc (revision 3529)
+++ trunk/milena/sandbox/folio/test/histo/compute_histo_rgb.cc (revision 3530)
@@ -7,7 +7,7 @@
#include <mln/debug/println.hh>
#include <mln/literal/all.hh>
-#include "../../histo/compute_histo_rgb.hh"
+#include "../../mln/histo/compute_histo_rgb.hh"
int main()
{
Index: trunk/milena/sandbox/folio/test/histo/classify_with_histo_rgb.cc
===================================================================
--- trunk/milena/sandbox/folio/test/histo/classify_with_histo_rgb.cc (revision 0)
+++ trunk/milena/sandbox/folio/test/histo/classify_with_histo_rgb.cc (revision 3530)
@@ -0,0 +1,89 @@
+/*!
+ * \file classify_with_histo_rgb.cc
+ * \author etiennefolio <ornthalas(a)gmail.com>
+ */
+
+#include <iostream>
+#include <mln/debug/println.hh>
+#include <mln/debug/slices_2d.hh>
+
+#include <mln/io/ppm/load.hh>
+#include <mln/io/ppm/save.hh>
+#include <mln/io/pgm/save.hh>
+#include <mln/data/fill.hh>
+#include <mln/literal/all.hh>
+
+#include <mln/arith/revert.hh>
+#include <mln/core/alias/neighb3d.hh>
+#include <mln/morpho/closing/volume.hh>
+#include <mln/value/label_8.hh>
+#include <mln/morpho/watershed/flooding.hh>
+
+#include "../../mln/histo/compute_histo_rgb.hh"
+#include "../../mln/histo/classify_with_histo_rgb.hh"
+
+#include <mln/level/transform.hh>
+
+namespace mln
+{
+ struct rgb8to6 : Function_v2v< rgb8to6 >
+ {
+ typedef value::rgb<6> result;
+ value::rgb<6> operator()(const value::rgb<8>& c) const
+ {
+ value::rgb<6> res(c.red() / 4, c.green() / 4, c.blue() / 4);
+ return res;
+ }
+ };
+}
+
+int main(int argc, char** argv)
+{
+ using namespace mln;
+
+ // check arguments
+ if (argc < 3)
+ {
+ std::cerr << "Usage:" << std::endl
+ << " ./a.out ../../../../lena.ppm 51" << std::endl
+ << std::endl
+ << "BTW, the number is the closure's lambda." << std::endl;
+ exit(1);
+ }
+
+ typedef value::rgb<6> rgb6;
+ typedef value::int_u<6> int_u6;
+
+ // build test image
+ std::cout << " => loading " << argv[1] << "..." << std::endl;
+ image2d<value::rgb8> lena;
+ io::ppm::load(lena, argv[1]);
+ image2d<rgb6> ima = level::transform(lena, rgb8to6());
+
+ // let's run !
+ std::cout << " => computing histogram..." << std::endl;
+ image3d<unsigned> histo = histo::compute_histo_rgb<unsigned>(ima);
+
+ std::cout << " => computing reverted histogram..." << std::endl;
+ image3d<unsigned> reverted = arith::revert(histo);
+
+// std::cout << " => dump it to reverted.pgm..." << std::endl;
+// image2d<int_u6> d1 = debug::slices_2d(reverted, 1.f, 0);
+// io::pgm::save(d1, "reverted.pgm");
+
+ std::cout << " => computing closure..." << std::endl;
+ image3d<unsigned> closed = morpho::closing::volume(reverted, c6(), atoi(argv[2]));
+
+ std::cout << " => computing watershed..." << std::endl;
+ value::label_8 nbasin;
+ image3d<value::label_8> labels = morpho::watershed::flooding(closed, c6(), nbasin);
+ std::cout << "found " << nbasin << " labels" << std::endl;
+
+ std::cout << " => computing output labelized image..." << std::endl;
+ image2d<value::label_8> out = histo::classify_with_histo_rgb(ima, labels);
+
+ std::cout << " => saving out.ppm..." << std::endl;
+ io::pgm::save(out, "out.ppm");
+
+ return 0;
+}
Index: trunk/milena/sandbox/folio/mln/histo/classify_with_histo_rgb.hh
===================================================================
--- trunk/milena/sandbox/folio/mln/histo/classify_with_histo_rgb.hh (revision 0)
+++ trunk/milena/sandbox/folio/mln/histo/classify_with_histo_rgb.hh (revision 3530)
@@ -0,0 +1,40 @@
+/*!
+ * \file classify_with_histo.hh
+ * \author etiennefolio <ornthalas(a)gmail.com>
+ */
+
+
+#ifndef CLASSIFY_WITH_HISTO_HH_
+# define CLASSIFY_WITH_HISTO_HH_
+
+namespace mln
+{
+
+ namespace histo
+ {
+
+ template <typename T, typename C>
+ image2d<C>
+ classify_with_histo_rgb(image2d<T>& ref,
+ image3d<C>& regions)
+ {
+ image2d<C> out;
+ initialize(out, ref);
+
+ mln_fwd_piter(image2d<T>) p(ref.domain());
+ for_all(p)
+ {
+ // get 3d point in regions image.
+ point3d p3 = point3d(ref(p).red(), ref(p).green(), ref(p).blue());
+
+ out(p) = regions(p3); // copy the label in out's pixel.
+ }
+
+ return out;
+ }
+
+ } // end of namespace mln::histo
+
+} // end of namespace mln
+
+#endif /* !CLASSIFY_WITH_HISTO_HH_ */
Index: trunk/milena/sandbox/folio/mln/histo/compute_histo_rgb.hh
===================================================================
--- trunk/milena/sandbox/folio/mln/histo/compute_histo_rgb.hh (revision 3529)
+++ trunk/milena/sandbox/folio/mln/histo/compute_histo_rgb.hh (revision 3530)
@@ -8,6 +8,7 @@
#include <mln/value/int_u8.hh>
#include <mln/value/rgb8.hh>
#include <iostream>
+
namespace mln
{
namespace histo
@@ -17,11 +18,11 @@
image3d<C> compute_histo_rgb(image2d<T> ima)
{
// out
- typedef value::int_u8::enc enc;
- image3d<C> out(mln_max(enc) + abs(mln_min(enc)) + 1,
- mln_max(enc) + abs(mln_min(enc)) + 1,
- mln_max(enc) + abs(mln_min(enc)) + 1);
- data::fill(out, mln_min(C));
+ typedef typename trait::value_<T>::comp enc;
+ image3d<C> out(mln_max(enc) + abs(mln_min(enc) + 1),
+ mln_max(enc) + abs(mln_min(enc) + 1),
+ mln_max(enc) + abs(mln_min(enc) + 1));
+ data::fill(out, 0);
// count
mln_fwd_piter(image2d<T>) p(ima.domain());
1
0
13 Mar '09
URL: https://svn.lrde.epita.fr/svn/oln/trunk/milena
ChangeLog:
2009-03-13 Etienne FOLIO <folio(a)lrde.epita.fr>
Add dimendions and components types in values' traits.
Everything in the title, same for each file.
* mln/trait/value_.hh: .
* mln/value/float01.hh: .
* mln/value/float01_.hh: .
* mln/value/float01_f.hh: .
* mln/value/graylevel.hh: .
* mln/value/graylevel_f.hh: .
* mln/value/hsl.hh: .
* mln/value/int_s.hh: .
* mln/value/int_u.hh: .
* mln/value/int_u_sat.hh: .
* mln/value/label.hh: .
* mln/value/rgb.hh: .
* mln/value/sign.hh: .
---
trait/value_.hh | 8 ++++++++
value/float01.hh | 1 -
value/float01_.hh | 3 +++
value/float01_f.hh | 3 +++
value/graylevel.hh | 3 +++
value/graylevel_f.hh | 3 +++
value/hsl.hh | 5 +++++
value/int_s.hh | 3 +++
value/int_u.hh | 3 +++
value/int_u_sat.hh | 10 ++++++++--
value/label.hh | 2 ++
value/rgb.hh | 12 ++++++++----
value/sign.hh | 9 ++++-----
13 files changed, 53 insertions(+), 12 deletions(-)
Index: trunk/milena/mln/trait/value_.hh
===================================================================
--- trunk/milena/mln/trait/value_.hh (revision 3528)
+++ trunk/milena/mln/trait/value_.hh (revision 3529)
@@ -107,6 +107,7 @@
/*
* enum {
+ * dim = ?
* nbits = ?,
* card = ?
* };
@@ -124,6 +125,7 @@
struct default_value_ : undefined_value_
{
enum {
+ dim = 0,
nbits = 0,
card = 0
};
@@ -131,6 +133,12 @@
typedef trait::value::nature::unknown nature;
typedef trait::value::kind::data kind;
typedef trait::value::quant::high quant;
+
+ /*
+ * typedef ? comp_0;
+ * typedef ? comp_1;
+ * ...
+ */
};
Index: trunk/milena/mln/value/hsl.hh
===================================================================
--- trunk/milena/mln/value/hsl.hh (revision 3528)
+++ trunk/milena/mln/value/hsl.hh (revision 3529)
@@ -130,6 +130,7 @@
struct value_< mln::value::hsl_<H,S,L> >
{
enum {
+ dim = 3,
nbits = (sizeof (H) + sizeof (S) + sizeof (L)) * 8,
card = mln_value_card_from_(nbits)
};
@@ -138,6 +139,10 @@
typedef trait::value::kind::color kind;
typedef mln_value_quant_from_(card) quant;
+ typedef H comp_0;
+ typedef S comp_1;
+ typedef L comp_2;
+
// typedef algebra::vec<3, float> sum;
typedef mln::value::hsl_<H,S,L> sum;
};
Index: trunk/milena/mln/value/graylevel.hh
===================================================================
--- trunk/milena/mln/value/graylevel.hh (revision 3528)
+++ trunk/milena/mln/value/graylevel.hh (revision 3529)
@@ -162,6 +162,7 @@
public:
enum {
+ dim = 1,
nbits = n,
card = mln_value_card_from_(n)
};
@@ -174,6 +175,8 @@
static const self_ max() { return card - 1; }
static const self_ epsilon() { return 0; }
+ typedef mln::value::int_u<n> comp;
+
typedef float sum;
};
Index: trunk/milena/mln/value/graylevel_f.hh
===================================================================
--- trunk/milena/mln/value/graylevel_f.hh (revision 3528)
+++ trunk/milena/mln/value/graylevel_f.hh (revision 3529)
@@ -168,6 +168,7 @@
public:
enum {
+ dim = 1,
nbits = mln_nbits(equiv_),
card = 0
};
@@ -180,6 +181,8 @@
static const equiv_ max() { return 1; }
static const equiv_ epsilon() { return mln_epsilon(equiv_); }
+ typedef float comp;
+
typedef float sum;
};
Index: trunk/milena/mln/value/sign.hh
===================================================================
--- trunk/milena/mln/value/sign.hh (revision 3528)
+++ trunk/milena/mln/value/sign.hh (revision 3529)
@@ -40,10 +40,9 @@
namespace mln
{
+
namespace value
{
-
-
/*!
** \brief The sign class represents the value type
** composed by the set (-1, 0, 1)
@@ -201,7 +200,6 @@
} // end of namespace value
-
namespace trait
{
@@ -210,6 +208,7 @@
{
enum {
+ dim = 1,
nbits = 2,
card = 3
};
@@ -222,13 +221,13 @@
static mln::value::sign max() { return 1; }
static mln::value::sign epsilon() { return 0; }
+ typedef int comp;
+
typedef int sum;
};
-
} // end of namespace trait
-
} // end of namespace mln
Index: trunk/milena/mln/value/float01_.hh
===================================================================
--- trunk/milena/mln/value/float01_.hh (revision 3528)
+++ trunk/milena/mln/value/float01_.hh (revision 3529)
@@ -64,6 +64,7 @@
struct value_< mln::value::float01_<n> >
{
enum constants_ {
+ dim = 1,
nbits = n,
card = mln_value_card_from_(nbits)
};
@@ -76,6 +77,8 @@
static float max() { return 1.f; }
static float epsilon() { return 0.f; }
+ typedef float comp;
+
typedef float sum;
};
Index: trunk/milena/mln/value/int_s.hh
===================================================================
--- trunk/milena/mln/value/int_s.hh (revision 3528)
+++ trunk/milena/mln/value/int_s.hh (revision 3529)
@@ -76,6 +76,7 @@
public:
enum constants_ {
+ dim = 1,
nbits = n,
card = mln_value_card_from_(n) - 1
};
@@ -88,6 +89,8 @@
static const self_ min() { return - max(); }
static const self_ epsilon() { return 0; }
+ typedef mln::value::int_s<n> comp;
+
typedef float sum;
static const char* name()
Index: trunk/milena/mln/value/int_u.hh
===================================================================
--- trunk/milena/mln/value/int_u.hh (revision 3528)
+++ trunk/milena/mln/value/int_u.hh (revision 3529)
@@ -82,6 +82,7 @@
public:
enum constants_ {
+ dim = 1,
nbits = n,
card = mln_value_card_from_(n)
};
@@ -94,6 +95,8 @@
static const self_ max() { return mlc_pow_int(2, n) - 1; }
static const self_ epsilon() { return 0; }
+ typedef unsigned comp;
+
typedef float sum;
static const char* name()
Index: trunk/milena/mln/value/int_u_sat.hh
===================================================================
--- trunk/milena/mln/value/int_u_sat.hh (revision 3528)
+++ trunk/milena/mln/value/int_u_sat.hh (revision 3529)
@@ -58,17 +58,23 @@
template <unsigned n>
struct value_< mln::value::int_u_sat<n> >
{
+ enum {
+ dim = 1,
+ card = metal::math::pow_int<2, n>::value,
+ nbits = n;
+ };
+
// FIXME: Overhaul these traits (see other value traits).
- static const std::size_t card = metal::math::pow_int<2, n>::value;
static const mln::value::int_u_sat<n> min() { return 0; }
static const mln::value::int_u_sat<n> max() { return card - 1; }
- static const unsigned nbits = n;
typedef trait::value::nature::integer nature;
typedef trait::value::kind::data kind;
// FIXME: Is that right?
typedef mln_value_quant_from_(card) quant;
+ typedef unsigned comp;
+
typedef float sum;
};
Index: trunk/milena/mln/value/float01.hh
===================================================================
--- trunk/milena/mln/value/float01.hh (revision 3528)
+++ trunk/milena/mln/value/float01.hh (revision 3529)
@@ -40,7 +40,6 @@
# include <mln/value/concept/floating.hh>
# include <mln/trait/value_.hh>
# include <mln/trait/all.hh> // FIXME!
-# include <mln/trait/value_.hh>
Index: trunk/milena/mln/value/rgb.hh
===================================================================
--- trunk/milena/mln/value/rgb.hh (revision 3528)
+++ trunk/milena/mln/value/rgb.hh (revision 3529)
@@ -105,9 +105,7 @@
// Forward declaration.
namespace value
{
- template <unsigned n> struct rgb;
template <typename H, typename S, typename L> class hsl_;
- template <unsigned n> struct int_u;
}
@@ -208,7 +206,8 @@
struct value_< mln::value::rgb<n> >
{
enum {
- nbits = 3 * n,
+ dim = 3,
+ nbits = dim * n,
card = mln_value_card_from_(nbits)
};
@@ -216,7 +215,9 @@
typedef trait::value::kind::color kind;
typedef mln_value_quant_from_(card) quant;
- typedef algebra::vec<3, float> sum;
+ typedef mln::value::int_u<n> comp;
+
+ typedef algebra::vec<dim, float> sum;
static const char* name()
{
@@ -260,6 +261,9 @@
int_u<n> blue() const { return this->v_[2]; }
int_u<n>& blue() { return this->v_[2]; }
+
+ int_u<n> comp(unsigned k) const { return this->v_[k]; }
+ int_u<n>& comp(unsigned k) { return this->v_[k]; }
/// \}
/// Constructor without argument.
Index: trunk/milena/mln/value/float01_f.hh
===================================================================
--- trunk/milena/mln/value/float01_f.hh (revision 3528)
+++ trunk/milena/mln/value/float01_f.hh (revision 3529)
@@ -62,6 +62,7 @@
typedef trait::value::quant::high quant;
enum {
+ dim = 1,
nbits = 8 * sizeof(float),
card = 0
};
@@ -70,6 +71,8 @@
static float max() { return 1; }
static float epsilon() { return mln_epsilon(float); }
+ typedef float comp;
+
typedef float sum;
};
Index: trunk/milena/mln/value/label.hh
===================================================================
--- trunk/milena/mln/value/label.hh (revision 3528)
+++ trunk/milena/mln/value/label.hh (revision 3529)
@@ -68,6 +68,7 @@
public:
enum {
+ dim = 1,
nbits = n,
card = mln_value_card_from_(n)
};
@@ -85,6 +86,7 @@
return s.c_str();
}
+ typedef unsigned comp;
};
} // end of namespace trait
1
0
URL: https://svn.lrde.epita.fr/svn/oln/trunk/milena
ChangeLog:
2009-03-13 Etienne FOLIO <folio(a)lrde.epita.fr>
Orthograph correction in error message.
* mln/canvas/labeling.hh: Orthograph.
* mln/labeling/blobs.hh: Orthograph.
---
canvas/labeling.hh | 6 +++---
labeling/blobs.hh | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
Index: trunk/milena/mln/canvas/labeling.hh
===================================================================
--- trunk/milena/mln/canvas/labeling.hh (revision 3527)
+++ trunk/milena/mln/canvas/labeling.hh (revision 3528)
@@ -197,7 +197,7 @@
if (nlabels == mln_max(L))
{
status = false;
- trace::warning("labeling aborted! Too much labels \
+ trace::warning("labeling aborted! Too many labels \
for this label type: nlabels > \
max(label_type).");
@@ -324,7 +324,7 @@
if (nlabels == mln_max(L))
{
status = false;
- trace::warning("labeling aborted! Too much labels for \
+ trace::warning("labeling aborted! Too many labels for \
this label type: nlabels > \
max(label_type).");
return output;
@@ -442,7 +442,7 @@
if (nlabels == mln_max(L))
{
status = false;
- trace::warning("labeling aborted! Too much labels \
+ trace::warning("labeling aborted! Too many labels \
for this label type: nlabels > \
max(label_type).");
return output;
Index: trunk/milena/mln/labeling/blobs.hh
===================================================================
--- trunk/milena/mln/labeling/blobs.hh (revision 3527)
+++ trunk/milena/mln/labeling/blobs.hh (revision 3528)
@@ -101,7 +101,7 @@
// Label this point component.
if (nlabels == mln_max(L))
{
- trace::warning("labeling aborted! Too much labels \
+ trace::warning("labeling aborted! Too many labels \
for this label type: nlabels > \
max(label_type).");
1
0
* milena/doc/tutorial/tutorial.tex: Fix syntax errors.
---
milena/ChangeLog | 6 ++++
milena/doc/tutorial/tutorial.tex | 55 ++++++++++++++++++--------------------
2 files changed, 32 insertions(+), 29 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 991185f..3e5daca 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,9 @@
+2009-03-13 Guillaume Lazzara <lazzara(a)lrde.epita.fr>
+
+ Fix tutorial compilation.
+
+ * milena/doc/tutorial/tutorial.tex: Fix syntax errors.
+
2009-03-13 Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Fix missing trace in mln::test routines.
diff --git a/milena/doc/tutorial/tutorial.tex b/milena/doc/tutorial/tutorial.tex
index 903ac14..a36a365 100644
--- a/milena/doc/tutorial/tutorial.tex
+++ b/milena/doc/tutorial/tutorial.tex
@@ -305,10 +305,6 @@ $$
\end{latexonly}
}
-\newcommand{\path}[1]{
-\textit{#1}
-}
-
\newcommand{\dir}[1]{
\textbf{\textit{#1}}
}
@@ -387,16 +383,16 @@ It is a more detailed explanations of the library's features.
\textit{end users} and \textit{designers} may be also interested by all the
examples provided with the documentation and the tutorial. The source code is
-available in \path{milena/doc/examples} (FIXME: ref) and is usually pointed
+available in \hpath{milena/doc/examples} (FIXME: ref) and is usually pointed
out and commented by the documentation.
Taking a look at the test suite is also a good idea. The tests usually focus on
a single functionality and handle several use cases which may overlap your needs.
-The test suite is located at \path{milena/tests} (FIXME: ref?).
+The test suite is located at \hpath{milena/tests} (FIXME: ref?).
Still not enough information? More information about all the functions is
available in the User HTML documentation (FIXME:ref).
-It mainly targets \textit{designers} and \texit{providers}.
+It mainly targets \textit{designers} and \textit{providers}.
The latter may also be interested by the Developer HTML documentation
(FIXME:ref).
@@ -437,7 +433,7 @@ We strongly advise you to not use it for production use.
%download page.
%--------------------------
-\subdoxysection{tuto1downloadingsvn}{Downloading from SVN}
+\doxysubsection{tuto1downloadingsvn}{Downloading from SVN}
First, be sure that SVN is already installed on your system.
Open a terminal and type:
@@ -486,17 +482,17 @@ and/or use the other documentations ressources (\ref{tuto1ressources}).
%--------------------------
-\subdoxysection{tuto1downloadingpackages}{Downloading packaged releases}
+\doxysubsection{tuto1downloadingpackages}{Downloading packaged releases}
%details.
Milena's packages can be downloaded from:
-\begin{centerize}
+\begin{center}
\begin{verbatim}
http://www.lrde.epita.fr/Olena/Download
\end{verbatim}
-\end{centerize}
+\end{center}
On this page you will find the latest and past releases.
Currently, we provide only '.tar.gz' and 'tar.bz2' archives.
@@ -568,33 +564,33 @@ you finding what you need, you will find a description of all these
subdirectories.
-List of \path{milena}'s subdirectories:
+List of \hpath{milena}'s subdirectories:
\begin{itemize}
-\dir{apps} --- A full example of a 3D mesh visualization tool. It
+\item \dir{apps} --- A full example of a 3D mesh visualization tool. It
uses milena.
-\dir{doc} --- THE directory you must know. Contains all the
+\item \dir{doc} --- THE directory you must know. Contains all the
documentation material.
-\dir{img} --- A set of common test images. They are used in the
+\item \dir{img} --- A set of common test images. They are used in the
test suite. Feel free to use it in your programs.
-\dir{mesh} --- A set of 3D meshes. They can be used with the full
- example located in \path{milena/apps}.
+\item \dir{mesh} --- A set of 3D meshes. They can be used with the full
+ example located in \hpath{milena/apps}.
-\dir{mln} --- The core of the libray. Contains all the library headers.
+\item \dir{mln} --- The core of the libray. Contains all the library headers.
-\dir{tests} --- The test suite. Is it subdivided in sub directories.
- The directory hierarchy respects \path{milena/mln}'s.
+\item \dir{tests} --- The test suite. Is it subdivided in sub directories.
+ The directory hierarchy respects \hpath{milena/mln}'s.
-\dir{tools} --- Small tools written with milena. They can be used as examples.
+\item \dir{tools} --- Small tools written with milena. They can be used as examples.
\end{itemize}
-List of \path{mln}'s subdirectories:
+List of \hpath{mln}'s subdirectories:
\begin{itemize}
\item \dir{accu} --- Set of Accumulators.
\item \dir{algebra} --- Algebraic structures like vectors or matrices.
@@ -645,12 +641,12 @@ List of \path{mln}'s subdirectories:
\item \dir{util} --- Various utilitarian classes.
\item \dir{value} --- Set of value types which can be used in an image.
\item \dir{win} --- Set of various window kinds.
-\end{itemize}}
+\end{itemize}
-The source code and the material of the documentation is available in \path{
+The source code and the material of the documentation is available in \hpath{
milena/doc}.
-List of \path{doc}'s subdirectories:
+List of \hpath{doc}'s subdirectories:
\begin{itemize}
\item \dir{examples} --- All the source code of the documentation examples.
\item \dir{benchmark} --- Some benchmarks.
@@ -746,6 +742,7 @@ The buildfarm can show you whether it is safe to update your svn copy of Milena
--- Through this page, you can see exactly which tests do not compile or pass.
This page is updated every night.
+\end{itemize}
%**************************
@@ -910,7 +907,7 @@ $ cd /my/path/to/olena-1.0/build
\end{verbatim}
If you did not change the default install path prefix, set to
-\path{/usr/local}, you will need to have administrator privileges to
+\hpath{/usr/local}, you will need to have administrator privileges to
perform the installation. Then, you may type:
\begin{verbatim}
$ sudo make install
@@ -943,7 +940,7 @@ compiled if you want to use them.
\doxysubsection{tuto2examples}{Examples}
Examples are part of the documentation. The sources are located in
-\path{milena/doc/examples}.
+\hpath{milena/doc/examples}.
To compile the examples simply run:
\begin{verbatim}
@@ -959,7 +956,7 @@ $ make examples
\end{verbatim}
Text and image outputs will be respectively stored in
-\path{build/milena/doc/outputs} and \path{build/milena/doc/figures}.
+\hpath{build/milena/doc/outputs} and \hpath{build/milena/doc/figures}.
@@ -973,7 +970,7 @@ Currently two tools are available:
area\_flooding.cc & FIXME:description \\
\hline
seed2tiling.cc & FIXME:description \\
-\end{itemize}
+\end{tabular}
To build these tools, run:
\begin{verbatim}
--
1.5.6.5
1
0
URL: https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox
ChangeLog:
2009-03-13 Fabien Freling <fabien.freling(a)lrde.epita.fr>
Find threshold value thanks to watershed.
* fabien/bin/dumpi12_to_pgm.cc: New tool.
* fabien/igr/Makefile: Update.
* fabien/igr/check.sh: Update.
* fabien/igr/graph.cc: Update.
* fabien/igr/med.cc: Find median region value.
* fabien/igr/thres.cc: Threshold image.
---
TODO | 8 +++-
bin/dumpi12_to_pgm.cc | 55 +++++++++++++++++++++++++++++++
igr/Makefile | 6 +++
igr/check.sh | 37 +++++++++++++--------
igr/graph.cc | 13 ++++++-
igr/med.cc | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++
igr/thres.cc | 67 ++++++++++++++++++++++++++++++++++++++
7 files changed, 256 insertions(+), 17 deletions(-)
Index: trunk/milena/sandbox/fabien/igr/graph.cc
===================================================================
--- trunk/milena/sandbox/fabien/igr/graph.cc (revision 3525)
+++ trunk/milena/sandbox/fabien/igr/graph.cc (revision 3526)
@@ -11,11 +11,13 @@
#include <mln/io/dump/all.hh>
#include <mln/io/dicom/load.hh>
#include <mln/io/pgm/save.hh>
+#include <mln/io/ppm/save.hh>
#include <mln/value/int_u8.hh>
#include <mln/value/int_u12.hh>
#include <mln/value/label_16.hh>
#include <mln/value/label_32.hh>
+#include <mln/value/rgb8.hh>
#include <mln/morpho/watershed/flooding.hh>
@@ -53,6 +55,8 @@
#include <mln/extract/all.hh>
#include <mln/make/region_adjacency_graph.hh>
+#include <mln/debug/colorize.hh>
+
@@ -241,6 +245,7 @@
using value::int_u12;
using value::label_16;
using value::label_32;
+ using value::rgb8;
typedef label_32 L;
if (argc != 6)
@@ -315,8 +320,12 @@
mln_VAR(wsd2_, morpho::elementary::dilation(extend(wsd2 | (pw::value(wsd2) == 0u), wsd2), c8()));
data::fill((wsd2 | (pw::value(wsd2) == 0u)).rw(), wsd2_);
- io::pgm::save(level::stretch(int_u8(), labeling::mean_values(dcm, wshed, nbasins)), "wsd_original.pgm");
- io::pgm::save(level::stretch(int_u8(), labeling::mean_values(dcm, wsd2, nbasins2)), "wsd_mean_colors.pgm");
+ mln_VAR(original, level::stretch(int_u8(), labeling::mean_values(dcm, wshed, nbasins)));
+ mln_VAR(mean, level::stretch(int_u8(), labeling::mean_values(dcm, wsd2, nbasins2)));
+ io::pgm::save(original, "wsd_original.pgm");
+ io::pgm::save(mean, "wsd_mean_colors.pgm");
+ io::ppm::save(debug::colorize(rgb8(), wshed, nbasins), "wsd_colorize_01.ppm");
+ io::ppm::save(debug::colorize(rgb8(), wsd2, nbasins2), "wsd_colorize_02.ppm");
}
else
{
Index: trunk/milena/sandbox/fabien/igr/check.sh
===================================================================
--- trunk/milena/sandbox/fabien/igr/check.sh (revision 3525)
+++ trunk/milena/sandbox/fabien/igr/check.sh (revision 3526)
@@ -4,22 +4,33 @@
{
echo "Processing $3..."
dist_max=10
+ input=$1
+ dim=$2
- ./grad $1 $2
- for lambda_closing in 10 50 100 500 1000 5000 10000 50000; do
+ ./grad $input $dim
+ for lambda_closing in 50 100 500 1000 5000 10000 50000; do
echo " for lambda_closing = ${lambda_closing}";
- ./clo_vol grad.dump $2 ${lambda_closing}
- nbasins=`./wst clo_vol.dump $2`
- ../bin/dumpl32_to_colorize wst.dump $2 $nbasins results/colorize_${3}_${lambda_closing}.ppm
+ ./clo_vol grad.dump $dim ${lambda_closing}
+ nbasins=`./wst clo_vol.dump $dim`
+ ../bin/dumpl32_to_colorize wst.dump $dim $nbasins results/colorize_${3}_${lambda_closing}.ppm
+ median=`./med wst.dump $dim $input $nbasins`
+ ../bin/dumpi12_to_pgm med.dump $dim results/median_${3}_${lambda_closing}.pgm
+ ./thres med.dump $dim $median
+ mv bin_result.pbm results/result_${3}_${lambda_closing}.pbm
- if [ ${lambda_closing} -eq 100 ]; then
- for lambda_dist in 10 50 100; do
- nbasins_after=`./graph wst.dump $2 $1 $lambda_dist $nbasins`
- mv wsd_original.pgm results/graph_${3}_${lambda_closing}_${lambda_dist}_01.pgm
- mv wsd_mean_colors.pgm results/graph_${3}_${lambda_closing}_${lambda_dist}_02.pgm
- echo "nbasins was" $nbasins "and now is" $nbasins_after "( diff =" $(($nbasins - $nbasins_after)) ")"
- done
- fi
+#if [ $2 -eq 2 ]; then
+# if [ ${lambda_closing} -eq 100 ]; then
+# for lambda_dist in 50 100 120 130 140 150; do
+# nbasins_after=`./graph wst.dump $2 $1 $lambda_dist $nbasins`
+# mv wsd_original.pgm results/graph_${3}_${lambda_closing}_${lambda_dist}_01.pgm
+# mv wsd_mean_colors.pgm results/graph_${3}_${lambda_closing}_${lambda_dist}_02.pgm
+# mv wsd_colorize_01.ppm results/graph_${3}_${lambda_closing}_${lambda_dist}_03.ppm
+# mv wsd_colorize_02.ppm results/graph_${3}_${lambda_closing}_${lambda_dist}_04.ppm
+# diff=$(($nbasins - $nbasins_after))
+# echo " dist = $lambda_dist | $nbasins -> $nbasins_after (diff = $diff ) $(($diff * 100 / $nbasins))%"
+# done
+# fi
+# fi
done
# rm *.dump
}
Index: trunk/milena/sandbox/fabien/igr/med.cc
===================================================================
--- trunk/milena/sandbox/fabien/igr/med.cc (revision 0)
+++ trunk/milena/sandbox/fabien/igr/med.cc (revision 3526)
@@ -0,0 +1,87 @@
+#include <iostream>
+#include <mln/core/image/image2d.hh>
+#include <mln/core/image/image3d.hh>
+#include <mln/core/image/image_if.hh>
+
+#include <mln/core/alias/neighb2d.hh>
+#include <mln/core/alias/window2d.hh>
+#include <mln/core/alias/neighb3d.hh>
+#include <mln/core/alias/window3d.hh>
+
+#include <mln/io/dump/all.hh>
+#include <mln/io/dicom/load.hh>
+
+#include <mln/value/int_u8.hh>
+#include <mln/value/int_u12.hh>
+#include <mln/value/label_16.hh>
+#include <mln/value/label_32.hh>
+
+#include <mln/core/var.hh>
+#include <mln/core/routine/extend.hh>
+#include <mln/accu/mean.hh>
+#include <mln/accu/median_h.hh>
+#include <mln/morpho/elementary/dilation.hh>
+#include <mln/labeling/mean_values.hh>
+#include <mln/level/compute.hh>
+#include <mln/pw/all.hh>
+#include <mln/util/array.hh>
+
+
+
+///////////////////
+// //
+// Main Function //
+// //
+///////////////////
+
+
+int main(int argc, char *argv[])
+{
+ using namespace mln;
+ using value::int_u8;
+ using value::int_u12;
+ using value::label_16;
+ using value::label_32;
+ typedef label_32 L;
+
+ if (argc != 5)
+ {
+ std::cout << "Usage: " << argv[0] << " <ima.dump> <dimensions> <ima.dcm> <nbasins>"
+ << std::endl;
+ return 1;
+ }
+
+ unsigned dim = atoi(argv[2]);
+ L nbasins = atoi(argv[4]);
+ if (dim != 2 && dim != 3)
+ {
+ std::cout << "<dimensions> invalid" << std::endl;
+ return 1;
+ }
+
+ if (dim == 2)
+ {
+ image2d<L> labels;
+ io::dump::load(labels, argv[1]);
+ image2d<int_u12> dcm;
+ io::dicom::load(dcm, argv[3]);
+
+ mln_VAR(wst_dilate, morpho::elementary::dilation(extend(labels | (pw::value(labels) == 0u), labels), c8()));
+ data::fill((labels | (pw::value(labels) == 0u)).rw(), wst_dilate);
+ mln_VAR(wst_mean, labeling::mean_values(dcm, labels, nbasins));
+
+ accu::mean<float> accu_mean;
+ util::array<float> means = level::compute(accu_mean, wst_mean);
+
+ // FIXME: Take median value of means
+
+ io::dump::save(wst_mean, "med.dump");
+ std::cout << median << std::endl;
+ }
+ else
+ {
+ // FIXME
+ }
+
+ return 0;
+}
Index: trunk/milena/sandbox/fabien/igr/thres.cc
===================================================================
--- trunk/milena/sandbox/fabien/igr/thres.cc (revision 0)
+++ trunk/milena/sandbox/fabien/igr/thres.cc (revision 3526)
@@ -0,0 +1,67 @@
+#include <iostream>
+#include <mln/core/image/image2d.hh>
+#include <mln/core/image/image3d.hh>
+#include <mln/core/image/image_if.hh>
+
+#include <mln/core/alias/neighb2d.hh>
+#include <mln/core/alias/window2d.hh>
+#include <mln/core/alias/neighb3d.hh>
+#include <mln/core/alias/window3d.hh>
+
+#include <mln/io/dump/all.hh>
+#include <mln/io/pbm/save.hh>
+
+#include <mln/value/int_u8.hh>
+#include <mln/value/int_u12.hh>
+#include <mln/value/label_16.hh>
+#include <mln/value/label_32.hh>
+
+#include <mln/binarization/threshold.hh>
+
+
+
+///////////////////
+// //
+// Main Function //
+// //
+///////////////////
+
+
+int main(int argc, char *argv[])
+{
+ using namespace mln;
+ using value::int_u8;
+ using value::int_u12;
+ using value::label_16;
+ using value::label_32;
+ typedef label_32 L;
+
+ if (argc != 4)
+ {
+ std::cout << "Usage: " << argv[0] << " <ima.dump> <dimensions> <threshold>"
+ << std::endl;
+ return 1;
+ }
+
+ unsigned dim = atoi(argv[2]);
+ unsigned threshold = atoi(argv[3]);
+ if (dim != 2 && dim != 3)
+ {
+ std::cout << "<dimensions> invalid" << std::endl;
+ return 1;
+ }
+
+ if (dim == 2)
+ {
+ image2d<int_u12> input;
+ io::dump::load(input, argv[1]);
+ image2d<bool> bin_result = binarization::threshold(input, threshold);
+ io::pbm::save(bin_result, "result.pbm");
+ }
+ else
+ {
+ // FIXME
+ }
+
+ return 0;
+}
Index: trunk/milena/sandbox/fabien/igr/Makefile
===================================================================
--- trunk/milena/sandbox/fabien/igr/Makefile (revision 3525)
+++ trunk/milena/sandbox/fabien/igr/Makefile (revision 3526)
@@ -42,5 +42,11 @@
graph: graph.cc
g++ -I../../../ ${DICOM_INC} ${DICOM_LIBS} ${CXXFLAGS} $^ -o graph
+med: med.cc
+ g++ -I../../../ ${DICOM_INC} ${DICOM_LIBS} ${CXXFLAGS} $^ -o med
+
+thres: thres.cc
+ g++ -I../../../ ${CXXFLAGS} $^ -o thres
+
clean:
rm -rf *.dump *.p?m *.plot *.log *.csv
Index: trunk/milena/sandbox/fabien/TODO
===================================================================
--- trunk/milena/sandbox/fabien/TODO (revision 3525)
+++ trunk/milena/sandbox/fabien/TODO (revision 3526)
@@ -28,5 +28,9 @@
[X] Batch process watershed with 2D, 3D and any combination of parameters
[X] Cut into small tools
[X] Test 3D workflow on 2D images
-[ ] Create colorized colors for graph
-[ ] Diff with %
+[X] Create colorized colors for graph
+[X] Diff with %
+[ ] Find biggest dark regions (threshold value or median accu - median / 2 - )
+ [ ] Learn regions value
+ [ ] Threshold
+[ ] Profile for performance
Index: trunk/milena/sandbox/fabien/bin/dumpi12_to_pgm.cc
===================================================================
--- trunk/milena/sandbox/fabien/bin/dumpi12_to_pgm.cc (revision 0)
+++ trunk/milena/sandbox/fabien/bin/dumpi12_to_pgm.cc (revision 3526)
@@ -0,0 +1,55 @@
+#include <mln/core/image/image2d.hh>
+#include <mln/make/image3d.hh>
+#include <mln/debug/slices_2d.hh>
+
+#include <mln/value/int_u8.hh>
+#include <mln/value/int_u12.hh>
+#include <mln/value/label_32.hh>
+
+#include <mln/io/dump/load.hh>
+#include <mln/io/pgm/save.hh>
+
+#include <mln/level/stretch.hh>
+
+
+int usage(char* argv[])
+{
+ std::cerr << "usage: " << argv[0] << " input.dump dim output.pgm" << std::endl;
+ return 1;
+}
+
+
+
+int main(int argc, char* argv[])
+{
+ using namespace mln;
+ using value::int_u8;
+ using value::int_u12;
+ using value::label_32;
+ using value::rgb8;
+
+ if (argc != 4)
+ return usage(argv);
+
+ unsigned dim = atoi(argv[2]);
+ unsigned nbasins = atoi(argv[3]);
+ if (dim != 2 && dim != 3)
+ {
+ std::cout << "<dimensions> invalid" << std::endl;
+ return 1;
+ }
+
+ if (dim == 2)
+ {
+ image2d<int_u12> ima2d;
+ io::dump::load(ima2d, argv[1]);
+ image2d<int_u8> ima_pgm = level::stretch(int_u8(), ima2d);
+ io::pgm::save(ima_pgm, argv[3]);
+ }
+ else
+ {
+ // FIXME
+ }
+
+ return 0;
+}
1
0