3533: Add an ''un-projection'' image morpher.

https://svn.lrde.epita.fr/svn/oln/trunk/milena Index: ChangeLog from Thierry Geraud <thierry.geraud@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)
participants (1)
-
Thierry Geraud