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)