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 2004
- 6 participants
- 39 discussions
Index: olena/ChangeLog
from Giovanni Palma <giovanni(a)lrde.epita.fr>
* oln/convert/stretch.hh: Add header inclusion.
* oln/topo/tarjan/tarjan.hh: Add file.
* oln/topo/tarjan/tarjan_with_attr.hh: Add file.
* oln/morpho/attributes.hh: Add new attribute.
Index: olena/oln/convert/stretch.hh
--- olena/oln/convert/stretch.hh Sun, 14 Mar 2004 19:03:34 +0100 van-vl_n (oln/f/51_stretch.hh 1.17 600)
+++ olena/oln/convert/stretch.hh Tue, 30 Mar 2004 12:00:36 +0200 palma_g (oln/f/51_stretch.hh 1.17 640)
@@ -30,6 +30,8 @@
# include <mlc/type.hh>
+# include <oln/basics.hh>
+
# include <ntg/basics.hh>
# include <oln/convert/abstract/conversion.hh>
Index: olena/oln/morpho/attributes.hh
--- olena/oln/morpho/attributes.hh Sat, 27 Mar 2004 15:56:32 +0100 van-vl_n (oln/j/45_attributes 1.11 600)
+++ olena/oln/morpho/attributes.hh Tue, 30 Mar 2004 13:55:31 +0200 palma_g (oln/j/45_attributes 1.11 644)
@@ -138,6 +138,17 @@
};
/*!
+ ** \brief "<" operator
+ **
+ ** This is a static dispatcher for the "<" operator.
+ ** This method is abstract.
+ */
+ bool operator<(const exact_type &x) const
+ {
+ mlc_dispatch(less2)(x);
+ };
+
+ /*!
** \brief != operator
**
** This is a static dispatcher for the != operator.
@@ -149,6 +160,16 @@
};
/*!
+ ** \brief conversion to lambda type.
+ **
+ ** \warning Virtual method.
+ */
+ const lambda_type &toLambda() const
+ {
+ mlc_dispatch(toLambda)();
+ };
+
+ /*!
** \brief >= operator implementation.
**
** This is an implementation of the >= operator. Override this
@@ -160,6 +181,20 @@
return !(*this < lambda);
};
+ /*!
+ ** \brief "<" operator implementation.
+ **
+ ** This is an implementation of the < operator. Override this
+ ** method to provide a new implementation of this operator.
+ ** \warning This method SHOULDN'T be called.
+ */
+ bool less2_impl(const exact_type &x) const
+ {
+ return *this < x.toLambda();
+ };
+
+
+
protected:
attribute() {};
@@ -249,14 +284,70 @@
return lambda != value_;
};
+ /*!
+ ** \brief conversion to lambda type implementation.
+ **
+ ** This is an implementation of the toLambda() method.
+ ** Override this method to provide a new implementation.
+ ** \warning This method SHOULDN'T be called .
+ */
+ const lambda_type &toLambda_impl() const
+ {
+ return value_;
+ };
+
protected:
value_type value_; /*!< Value used inside the class. */
};
+ /*-------------------------------*
+ | card with info on other image |
+ *------------------------------*/
+ template <class I, class T = unsigned, class Exact = mlc::final>
+ class card_full_type: public card_type<T,
+ typename mlc::exact_vt<card_full_type<I,
+ T,
+ Exact>,
+ Exact>::ret>
+ {
+ public:
+ typedef card_full_type<I, T, Exact> self_type; /*!< Self type of the class. */
+ attr_type_decl(self_type);
+ typedef card_type<T, exact_type> super_type; ///< Parent class type.
+
+ /*!
+ ** \brief Basic Ctor.
+ **
+ ** \warning After this call, the object is only instantiated
+ ** (not initialized).
+ */
+ card_full_type(): super_type()
+ {
+ };
+
+ /*!
+ ** \brief Ctor from a lambda_type value.
+ */
+ card_full_type(const lambda_type &lambda): super_type(lambda)
+ {
+ };
- /*-----------*
+ /*!
+ ** \brief Ctor from a point and an image.
+ **
+ ** Every parameters are useless.
+ */
+ template <class I2>
+ card_full_type(const abstract::image<I2> &im,
+ const oln_point_type(I2) &p,
+ const env_type &env): super_type(im, p, env)
+ {
+ };
+ };
+
+ /*--------------*
| integral |
- *-----------*/
+ *------------*/
/*!
** \brief Integral attribute.
@@ -1701,6 +1792,17 @@
};
/*!
+ ** \brief Trait specialization for card_full attribute.
+ */
+ template <class I, class T, class Exact>
+ struct attr_traits<card_full_type<I, T, Exact> >
+ {
+ typedef T value_type; ///< Type of data.
+ typedef value_type lambda_type; ///< Type of lambda.
+ typedef env::OtherImageEnv<I> env_type; ///< Type of environment.
+ };
+
+ /*!
** \brief Trait specialization for the maxvalue attribute.
*/
template <class T, class Exact>
Index: olena/oln/topo/tarjan/tarjan_with_attr.hh
--- olena/oln/topo/tarjan/tarjan_with_attr.hh Wed, 31 Mar 2004 19:11:06 +0200 palma_g ()
+++ olena/oln/topo/tarjan/tarjan_with_attr.hh Wed, 31 Mar 2004 18:50:19 +0200 palma_g (oln/m/46_tarjan_wit 644)
@@ -0,0 +1,295 @@
+// Copyright (C) 2001, 2002, 2003, 2004 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 59 Temple Place - Suite 330, 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 OLENA_TOPO_TARJAN_TARJAN_WITH_ATTR_HH
+# define OLENA_TOPO_TARJAN_TARJAN_WITH_ATTR_HH
+
+# include <oln/topo/tarjan/tarjan.hh>
+# include <oln/morpho/attributes.hh>
+# include <ntg/basics.hh>
+# include <oln/level/fill.hh>
+# include <oln/utils/histogram.hh>
+
+# include <vector>
+# include <map>
+
+namespace oln {
+
+ namespace topo {
+ /// \brief Implementation of tarjan set.
+ namespace tarjan {
+ /// Abstract classes for tarjan based algorithms.
+ namespace abstract {
+
+ template<class Exact>
+ struct tarjan_with_attr: public tarjan<mlc_exact_vt_type(tarjan_with_attr<Exact>, Exact) >
+ {
+ typedef oln_tarjan_input_type(Exact) input_type;
+ typedef oln_point_type(input_type) point_type;
+ typedef oln_value_type(input_type) data_type;
+
+ typedef oln_concrete_type(input_type) image_type;
+ typedef oln_tarjan_output_type(Exact) image_out_type;
+ typedef oln_tarjan_attr_type(Exact) attr_type;
+ typedef attr_env_type(attr_type) env_type;
+ typedef oln_value_type(image_out_type) comp_type;
+
+ tarjan_with_attr(const image_type &ima,
+ const env_type &env):
+ capacity_chunk((ima.npoints() < 100) ? ima.npoints() : (ima.npoints() / 100)),
+ capacity(capacity_chunk),
+ input_(ima),
+ parent_(),
+ to_comp_(ima.size()),
+ comp_value_(),
+ env_(env)
+ {
+ parent_.reserve(capacity);
+ comp_value_.reserve(capacity);
+ data_.reserve(capacity);
+ }
+
+ // abstract methods
+ std::vector<point_type> get_processing_order()
+ {
+ mlc_dispatch(get_processing_order)();
+ }
+
+ void
+ mark_set(const point_type &x)
+ {
+ mlc_dispatch(mark_set)(x);
+ }
+
+ void
+ uni(const point_type& n, const point_type& p)
+ {
+ mlc_dispatch(uni)(n, p);
+ }
+
+ // tells if a point has been proceded
+ bool is_proc(const point_type &p) const
+ {
+ return to_comp_[p] != ntg_sup_val(comp_type);
+ };
+
+ comp_type
+ find_root(const comp_type& x) const
+ {
+ if (parent_[x] != x)
+ return parent_[x] = find_root(parent_[x]);
+ return x;
+ }
+
+ // bool closing = true -> a closing is performed,
+ // an opening otherwise.
+ template<class N>
+ image_out_type
+ get_compute(const oln::abstract::neighborhood<N> &Ng)
+ {
+ std::vector<point_type> I(get_processing_order());
+
+ level::fill(to_comp_, ntg_sup_val(comp_type));
+ to_comp_.border_adapt_assign(Ng.delta(), ntg_sup_val(comp_type));
+ ncomps_ = 0;
+ parent_.push_back(0);
+ comp_value_.push_back(0);
+ data_.push_back(attr_type());
+
+ // We are ready to perform stuff
+ for (unsigned int p = 0; p < I.size(); ++p)
+ {
+ point_type p_p = I[p];
+ mark_set(p_p);
+
+ oln_neighb_type(N) Q_prime(Ng, p_p);
+ for_all (Q_prime)
+ if (is_proc(Q_prime))
+ uni(Q_prime.cur(), p_p);
+ if (to_comp_[p_p] == (ncomps_ + 1)) // new component
+ ++ncomps_;
+ else
+ {
+ comp_value_.pop_back();
+ parent_.pop_back();
+ data_.pop_back();
+ }
+ }
+
+ // Resolving phase
+ std::map<comp_type, comp_type> cmps;
+ comp_type nc = 0;
+ ncomps_ = 0;
+ // unsigned i = 0;
+ for (int p = I.size() - 1; p >= 0; --p)
+ {
+ point_type p_p = I[p];
+ if (cmps.find(comp_value_[find_root(to_comp_[p_p])]) == cmps.end())
+ {
+ ++ncomps_;
+ // ++i;
+ // std::cout << "new component\n";
+ cmps[comp_value_[find_root(to_comp_[p_p])]] = nc;
+ comp_value_[find_root(to_comp_[p_p])] = nc++;
+ }
+ }
+ // std::cout << i << " components\n";
+ image_out_type output(input_.size());
+ for (int p = I.size() - 1; p >= 0; --p)
+ {
+ point_type p_p = I[p];
+ output[p_p] = comp_value_[find_root(to_comp_[p_p])];
+ }
+ return output;
+ }
+
+ // access to attributes
+ // i index of component
+ const attr_type &get_attr(const comp_type &i) const
+ {
+ return data_[find_root(i)];
+ }
+
+ comp_type ncomps() const
+ {
+ return ncomps_;
+ }
+
+ protected:
+
+ unsigned capacity_chunk;
+ unsigned capacity;
+ const image_type &input_;
+ mutable std::vector<comp_type> parent_;
+ typename oln::mute<input_type, comp_type>::ret to_comp_;// comp number from a point
+ comp_type ncomps_;
+ std::vector<oln_value_type(image_out_type)> comp_value_;
+ std::vector<attr_type> data_;
+ env_type env_;
+ };
+ } // !abstract
+
+
+
+ template<class T, class DestType, class A, class Exact = mlc::final>
+ struct cc:
+ public abstract::tarjan_with_attr<typename mlc::exact_vt<cc<T, DestType, A, Exact>,
+ Exact>::ret>
+ {
+
+ typedef oln_point_type(T) point_type;
+ typedef oln_value_type(T) data_type;
+ // typedef abstract::image<T> image_type;
+ typedef oln_concrete_type(T) image_type;
+
+ typedef unsigned comp_type;
+
+ typedef cc<T, DestType, A, Exact> self_type; /*< Self type of the class.*/
+ typedef mlc_exact_vt_type(self_type, Exact) exact_type;
+ typedef abstract::tarjan_with_attr<exact_type> super_type;
+
+ cc(const image_type &ima,
+ const attr_env_type(A) &env): super_type(ima, env)
+ {
+ }
+
+ std::vector<point_type> get_processing_order_impl()
+ {
+ std::vector<point_type> res;
+ oln_iter_type(image_type) it(input_);
+
+ res.reserve(input_.npoints());
+ for_all(it)
+ res.push_back(it);
+ return res;
+ }
+
+ void
+ mark_set_impl(const point_type &x)
+ {
+ if (parent_.size() == parent_.capacity())
+ {
+ capacity = parent_.capacity() + capacity_chunk;
+ parent_.reserve(capacity);
+ comp_value_.reserve(capacity);
+ }
+ to_comp_[x] = ncomps_ + 1;
+ data_.push_back(A(input_, x, env_));
+ parent_.push_back(ncomps_ + 1);
+ //comp_value_.push_back(input_[x]);
+ comp_value_.push_back(ncomps_ + 1);
+ }
+
+ void
+ uni_impl(const point_type& n, const point_type& p)
+ {
+ comp_type r = find_root(to_comp_[n]);
+ precondition(to_comp_[n] <= ncomps_);
+ precondition(to_comp_[p] <= (ncomps_ + 1));
+ if (r != to_comp_[p])
+ if (input_[n] == input_[p])
+ {
+ if (to_comp_[p] == (ncomps_ + 1)) // first merge of p component
+ {
+ precondition(r < comp_value_.capacity());
+ //comp_value_[r] = input_[p];
+ // comp_value_[to_comp_[p]] = comp_value_[r];
+ data_[r] += data_[to_comp_[p]];
+ precondition(r <= ncomps_);
+ to_comp_[p] = r;
+ }
+ else
+ {
+ precondition(r < parent_.capacity());
+ data_[parent_[to_comp_[p]]] += data_[parent_[r]];
+ // comp_value_[parent_[to_comp_[p]]] = ntg::min(comp_value_[parent_[r]],
+ // comp_value_[parent_[to_comp_[p]]]);
+ parent_[r] = parent_[to_comp_[p]];
+
+ }
+ }
+ // precondition(comp_value_[parent_[r]] <= 255);
+ }
+ };
+
+ // traits specialization
+ template <typename T, typename DestType, typename A, typename Exact>
+ struct tarjan_traits<cc<T, DestType, A, Exact> >
+ {
+ typedef T input_type;
+ typedef typename mute<T, DestType>::ret output_type;
+ typedef A attr_type;
+ };
+
+
+ } // end of namespace tarjan
+
+ } // end of namespace topo
+
+} // end of namespace oln
+
+#endif // ! OLENA_TOPO_TARJAN_TARJAN_WITH_ATTR_HH
Index: olena/oln/topo/tarjan/tarjan.hh
--- olena/oln/topo/tarjan/tarjan.hh Wed, 31 Mar 2004 19:11:06 +0200 palma_g ()
+++ olena/oln/topo/tarjan/tarjan.hh Wed, 31 Mar 2004 18:42:56 +0200 palma_g (oln/m/47_tarjan.hh 644)
@@ -0,0 +1,153 @@
+// Copyright (C) 2001, 2002, 2003, 2004 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 59 Temple Place - Suite 330, 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 OLENA_TOPO_TARJAN_TARJAN_HH
+# define OLENA_TOPO_TARJAN_TARJAN_HH
+# include <oln/basics.hh>
+
+// Macros for extract information on tarjan algorithms.
+# define oln_tarjan_input_type(T) typename oln::topo::tarjan::tarjan_traits<T>::input_type
+# define oln_tarjan_output_type(T) typename oln::topo::tarjan::tarjan_traits<T>::output_type
+# define oln_tarjan_attr_type(T) typename oln::topo::tarjan::tarjan_traits<T>::attr_type
+
+
+// # define oln_tarjan_input_type(T) typename oln::topo::tarjan::tarjan_traits<mlc_exact_type(T)>::input_type
+// # define oln_tarjan_output_type(T) typename oln::topo::tarjan::tarjan_traits<mlc_exact_type(T)>::output_type
+// # define oln_tarjan_attr_type(T) typename oln::topo::tarjan::tarjan_traits<mlc_exact_type(T)>::attr_type
+
+
+namespace oln {
+
+ namespace topo {
+ /// \brief Implementation of tarjan set.
+ namespace tarjan {
+ /// Forward declaration for tarjan traits.
+ template <typename Exact>
+ struct tarjan_traits;
+
+ /// Abstract classes for tarjan based algorithms.
+ namespace abstract {
+ /*!
+ ** \brief Top of tarjan hierarchy.
+ **
+ ** \param I Type of image to process.
+ ** \param D Type of data of the wanted image.
+ ** \param Exact Exact type of the class.
+ */
+ template <typename Exact>
+ struct tarjan: public mlc_hierarchy::any<Exact>
+ {
+ typedef oln_tarjan_input_type(Exact) input_type;
+ typedef oln_tarjan_output_type(Exact) image_out_type;
+ typedef oln_value_type(image_out_type) comp_type;
+ typedef oln_point_type(input_type) point_type;
+
+ /*!
+ ** \brief Run the algorithm.
+ **
+ **
+ ** \warning Implement get_compute_impl to be able to use
+ ** this method.
+ */
+ template<class N>
+ image_out_type
+ get_compute(const oln::abstract::neighborhood<N> &Ng)
+ {
+ mlc_dispatch(get_compute)(Ng);
+ }
+
+ /*!
+ ** \brief Give the number of component found.
+ **
+ ** \warning Implement ncomps_impl to be able to use
+ ** this method.
+ */
+ comp_type ncomps() const
+ {
+ mlc_dispatch(ncomps)();
+ }
+
+ protected:
+ /*!
+ ** \brief Abstract method to get the processing order.
+ **
+ ** \warning Implement get_processing_order_impl to be able
+ ** to use this method.
+ */
+ std::vector<point_type>
+ get_processing_order()
+ {
+ mlc_dispatch(get_processing_order)();
+ }
+
+ /*!
+ ** \brief Mark a point as a new component.
+ **
+ ** \warning Implement mark_set_impl to be able to use this
+ ** method.
+ */
+ void
+ mark_set(const point_type &x)
+ {
+ mlc_dispatch(mark_set)(x);
+ }
+
+ /*!
+ ** \brief Perform an union between two components.
+ **
+ ** \warning Implement uni_impl to be able to use this
+ ** method.
+ */
+ void
+ uni(const point_type& n, const point_type& p)
+ {
+ mlc_dispatch(uni)(n, p);
+ }
+
+ /*!
+ ** \brief tell if a point has already been processed.
+ **
+ **
+ ** \warning Implement is_proc_impl to be able to use this
+ ** method.
+ */
+ bool is_proc(const point_type &p) const
+ {
+ mlc_dispatch(is_proc)(p);
+ };
+
+ /*!
+ ** \brief Make the class abstract.
+ */
+ tarjan() {}
+ };
+ } // end of namespace abstract
+ } // end of namespace tarjan
+ } // end of namespace topo
+} // end of namespace oln
+
+#endif // ! OLENA_TOPO_TARJAN_TARJAN_HH
--
Giovanni Palma
EPITA - promo 2005 - membre d'EpX - LRDE
Mob. : +33 (0)6 60 97 31 74
2
3
Index: olena/ChangeLog
from Damien Thivolle <damien(a)lrde.epita.fr>
* olena/oln/Makefile.am: Add files from oln/morpher/
* olena/oln/morpher/generic_morpher.hh: Correct comments and code.
* olena/oln/morpher/subq_morpher.hh: Likewise.
* olena/oln/morpher/color_morpher.hh: Likewise.
* olena/tests/morpher/tests/compose_morph: New file, contains
morpher composition tests.
* olena/tests/morpher/tests/sq_morph: New file, contains sub quantifying
morpher tests.
* olena/tests/morpher/tests/color_morph: New file, contains color morpher
tests.
* olena/tests/morpher/tests/sq_morph_8: Remove file.
* olena/tests/morpher/tests/sq_morph_7: Likewise.
* olena/tests/morpher/tests/sq_morph_6: Likewise.
* olena/tests/morpher/tests/sq_morph_5: Likewise.
* olena/tests/morpher/tests/sq_morph_4: Likewise.
* olena/tests/morpher/tests/sq_morph_3: Likewise.
* olena/tests/morpher/tests/sq_morph_2: Likewise.
* olena/tests/morpher/tests/sq_morph_1: Likewise.
* olena/tests/morpher/tests/rmorph: Likewise.
* olena/tests/morpher/tests/gmorph: Likewise.
* olena/tests/morpher/tests/color_sq_morph: Likewise.
* olena/tests/morpher/tests/bmorph: Likewise.
Index: olena/oln/Makefile.am
--- olena/oln/Makefile.am Fri, 19 Mar 2004 17:28:35 +0100 palma_g (oln/q/47_Makefile.a 1.3.1.1.1.6.1.7.1.3 640)
+++ olena/oln/Makefile.am Tue, 30 Mar 2004 19:28:29 +0200 thivol_d (oln/q/47_Makefile.a 1.3.1.1.1.6.1.7.1.3 640)
@@ -146,6 +146,9 @@
level/set_level.hh \
level/threshold.hh \
math/macros.hh \
+ morpher/color_morpher.hh \
+ morpher/generic_morpher.hh \
+ morpher/subq_morpher.hh \
morpho/attribute_closing_opening.hh \
morpho/attribute_closing_opening_map.hxx \
morpho/attribute_closing_opening_map.hh \
Index: olena/oln/morpher/generic_morpher.hh
--- olena/oln/morpher/generic_morpher.hh Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/18_generic_mo 1.3 600)
+++ olena/oln/morpher/generic_morpher.hh Tue, 30 Mar 2004 19:21:21 +0200 thivol_d (oln/m/18_generic_mo 1.3 600)
@@ -27,8 +27,8 @@
-#ifndef GENERIC_MORPHER_HH
-# define GENERIC_MORPHER_HH
+#ifndef OLENA_MORPHER_GENERIC_MORPHER_HH
+# define OLENA_MORPHER_GENERIC_MORPHER_HH
# include <string>
@@ -38,17 +38,11 @@
namespace oln {
- /*! \namespace oln::morpher
- **
- ** Contain all the morpher relative declarations and functions.
- */
+ /// Contain all the morpher relative declarations and functions.
namespace morpher {
- /*! \namespace oln::morpher::abstract
- **
- ** Implementation of oln::abstract::generic_morpher.
- */
+ /// Implementation of oln::abstract::generic_morpher.
namespace abstract {
@@ -115,33 +109,52 @@
public:
+ /// The self type.
typedef generic_morpher<DestType, SrcType, Exact> self_type;
+
+ /// The exact type of the morpher.
typedef Exact exact_type;
+ /// The morpher point type.
typedef oln_point_type(DestType) point_type;
+ /// The morpher dpoint type.
typedef oln_dpoint_type(DestType) dpoint_type;
+ /// The morpher iterator type.
typedef oln_iter_type(DestType) iter_type;
+ /// The morpher forward iterator type.
typedef oln_fwd_iter_type(DestType) fwd_iter_type;
+ /// The morpher backward iterator type.
typedef oln_bkd_iter_type(DestType) bkd_iter_type;
+ /// The morpher value type.
typedef oln_value_type(DestType) value_type;
+ /// The morpher size type.
typedef oln_size_type(DestType) size_type;
+ /// The morpher underlying implementation.
typedef oln_impl_type(DestType) impl_type;
/// Type of the decorated image.
typedef SrcType src_self_type;
+ /// The decorated image point type.
typedef oln_point_type(SrcType) src_point_type;
+ /// The decorated image dpoint type.
typedef oln_dpoint_type(SrcType) src_dpoint_type;
+ /// The decorated image iterator type.
typedef oln_iter_type(SrcType) src_iter_type;
+ /// The decorated image forward iterator type.
typedef oln_fwd_iter_type(SrcType) src_fwd_iter_type;
+ /// The decorated image backward iterator type.
typedef oln_bkd_iter_type(SrcType) src_bkd_iter_type;
+ /// The decorated image value type.
typedef oln_value_type(SrcType) src_value_type;
+ /// The decorated image size type.
typedef oln_size_type(SrcType) src_size_type;
- /// Underlying implementation of the decorated image.
+ /// The decorated image underlying implementation.
typedef oln_impl_type(SrcType) src_impl_type;
/// Exact type of the decorated image.
typedef oln_exact_type(SrcType) src_exact_type;
+ /// The upper class.
typedef typename gm_inherit<DestType, Exact>::ret super_type;
/// Return the decorated image.
@@ -151,9 +164,24 @@
return ima_;
}
+ /// Instantiate and return the image that the morpher simulates.
+ DestType*
+ unmorph() const
+ {
+ DestType* im = new DestType(to_exact(*this).size());
+ oln_iter_type(DestType) it(*im);
+
+ for_all(it)
+ (*im)[it] = to_exact(*this).operator[](it);
+ return im;
+ }
+
/*! Default implementation of at.
**
** Return the value stored at \a p in the decorated image.
+ **
+ ** \warning This method should not be called directly.
+ ** Prefer operator[].
*/
const src_value_type
at(const src_point_type& p) const
@@ -164,6 +192,9 @@
/*! Default implementation of at.
**
** Return a reference to the value stored at \a p in the decorated image.
+ **
+ ** \warning This method should not be called directly.
+ ** Prefer operator[].
*/
src_value_type&
at(const src_point_type& p)
@@ -209,8 +240,8 @@
**
** Assign \a rhs to the decorated image.
*/
- src_self_type&
- assign(src_self_type& rhs)
+ src_exact_type&
+ assign(src_exact_type& rhs)
{
return to_exact(ima_).assign(rhs);
}
@@ -227,7 +258,12 @@
return to_exact(ima_).border_set_width(min_border, copy_border);
}
- self_type& operator=(self_type& rhs)
+ /*! Default implementation of the = operator.
+ **
+ ** Assign the decorated image to 'a r.
+ */
+ self_type&
+ operator=(self_type& rhs)
{
return to_exact(*this).assign(rhs.exact());
}
@@ -247,4 +283,4 @@
} // end of namespace oln
-#endif // !GENERIC_MORPHER_HH
+#endif // !OLENA_MORPHER_GENERIC_MORPHER_HH
Index: olena/oln/morpher/subq_morpher.hh
--- olena/oln/morpher/subq_morpher.hh Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/25_subq_morph 1.1 600)
+++ olena/oln/morpher/subq_morpher.hh Tue, 30 Mar 2004 17:36:55 +0200 thivol_d (oln/m/25_subq_morph 1.1 600)
@@ -27,8 +27,8 @@
-#ifndef SUBQ_MORPHER_HH
-# define SUBQ_MORPHER_HH
+#ifndef OLENA_MORPHER_SUBQ_MORPHER_HH
+# define OLENA_MORPHER_SUBQ_MORPHER_HH
# include "generic_morpher.hh"
@@ -40,18 +40,35 @@
struct subq_morpher;
} // end of namespace morpher
- /// Retrieve types and dimension of the subq_morpher.
+ /*! Retrieve types and dimension of the subq_morpher.
+ **
+ ** \param SrcType Input type decorated.
+ **
+ ** \param N The new number of bits by component.
+ **
+ ** \param Exact The exact type of the morpher.
+ */
template <class SrcType, unsigned N, class Exact>
struct image_id<oln::morpher::subq_morpher<SrcType, N, Exact> >
{
enum {dim = SrcType::dim};
+ /*! <The image dimension. */
typedef oln_impl_type(SrcType) impl_type;
+ /*! <The underlying implementation.*/
typedef typename ntg::color<3, N, ntg::rgb_traits> value_type;
+ /*! <The modified value type.*/
typedef typename mlc::exact_vt<oln::morpher::subq_morpher<SrcType, N, Exact>,
Exact>::ret exact_type;
};
- /// Specialized version for subq_morpher.
+ /*! Specialized version for subq_morpher.
+ **
+ ** \param SrcType Input type decorated.
+ **
+ ** \param N The new number of bits by components.
+ **
+ ** \param Exact The exact type of the morpher.
+ */
template <class SrcType, unsigned N, class Exact>
struct image_traits <oln::morpher::subq_morpher<SrcType, N, Exact> > :
public image_traits<abstract::image_with_impl<oln_impl_type(SrcType),
@@ -67,6 +84,11 @@
** For Example, calling color_mute with
** color<3, 8, rgb_traits>, 5 will give
** the type : color<3, 5, rgb_traits>.
+ **
+ ** \param T The data type of the image.
+ **
+ ** \param N The new number of bits by component.
+ **
*/
template <class T, unsigned N>
@@ -82,8 +104,9 @@
struct color_mute<ntg::color<nbcomps_, nbits_, color_system>, N>
{
typedef ntg::color<nbcomps_, N, color_system> ret;
+ /*! <The new value type.*/
enum { nbcomps = nbcomps_ };
- enum { nbits = nbits_ };
+ /*! <The number of components */
};
@@ -94,6 +117,12 @@
** as an image with a lower color depth.
** subq_morpher<image2d<rgb_8>, 5> is
** the same as image2d<rgb_5>.
+ **
+ ** \param SrcType The input type decorated.
+ **
+ ** \param N The new numbers of bits by component.
+ **
+ ** \param Exact The exact type of the morpher.
*/
template <class SrcType, unsigned N, class Exact>
struct subq_morpher:
@@ -102,16 +131,16 @@
typename color_mute<oln_value_type(SrcType),
N>::ret>::ret ,
SrcType,
- subq_morpher<SrcType, N, Exact> >
+ typename oln::image_id<subq_morpher<SrcType, N, Exact> >::exact_type>
{
- // super_type
+ /// The upper class.
typedef abstract::generic_morpher<
typename oln::mute<SrcType,
typename color_mute<oln_value_type(SrcType),
N>::ret>::ret,
SrcType,
- subq_morpher<SrcType, N, Exact> > super_type;
+ typename oln::image_id<subq_morpher<SrcType, N, Exact> >::exact_type> super_type;
/// The exact type of \a this. This class can be derived.
typedef typename oln::image_id<subq_morpher<SrcType, N, Exact> >::exact_type exact_type;
@@ -126,20 +155,18 @@
/// The value point of the resulting image.
typedef typename color_mute<oln_value_type(SrcType), N>::ret value_type;
typedef oln_point_type(SrcType) point_type;
- typedef oln_fwd_iter_type(SrcType) fwd_iter_type;
- typedef oln_bkd_iter_type(SrcType) bkd_iter_type;
- typedef oln_iter_type(SrcType) iter_type;
- typedef oln_size_type(SrcType) size_type;
typedef oln_impl_type(SrcType) impl_type;
enum { nbcomps = color_mute<oln_value_type(SrcType), N>::nbcomps };
/// Construct the morpher with an image.
subq_morpher(const SrcType &ima)
- : super_type(ima) {}
+ : super_type(ima)
+ {}
/// Construct the morpher with another morpher.
subq_morpher(const subq_morpher<SrcType, N>& r)
- : super_type(r.get_ima()) {}
+ : super_type(r.get_ima())
+ {}
/*! Empty constructor.
**
@@ -148,7 +175,8 @@
subq_morpher() {}
/// Return the value stored at \a p in the resulting image.
- const value_type at(const point_type& p) const
+ const value_type
+ at(const point_type& p) const
{
value_type tmp;
unsigned int i;
@@ -168,7 +196,8 @@
return ima_.impl();
}
- static std::string name()
+ static std::string
+ name()
{
return "subq_morpher<" + SrcType::name() + ">";
}
@@ -197,6 +226,7 @@
** \image html oln_morpher_subq_morpher.png
** \image latex oln_morpher_subq_morpher.png
*/
+
template <unsigned S, class I>
const subq_morpher<I, S> sqmorph(I &ima)
{
@@ -210,5 +240,5 @@
-#endif // !SUBQ_MORPHER_HH
+#endif // !OLENA_MORPHER_SUBQ_MORPHER_HH
Index: olena/oln/morpher/color_morpher.hh
--- olena/oln/morpher/color_morpher.hh Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/26_color_morp 1.1 600)
+++ olena/oln/morpher/color_morpher.hh Tue, 30 Mar 2004 19:08:32 +0200 thivol_d (oln/m/26_color_morp 1.1 600)
@@ -26,8 +26,8 @@
// Public License.
-#ifndef COLOR_MORPHER_HH
-# define COLOR_MORPHER_HH
+#ifndef OLENA_MORPHER_COLOR_MORPHER_HH
+# define OLENA_MORPHER_COLOR_MORPHER_HH
# include <oln/morpher/generic_morpher.hh>
@@ -41,28 +41,55 @@
} // end of namespace morpher
- /// Retrieve types and dimension of the color_morpher.
+ /*! \brief Retrieve types and dimension of the color_morpher.
+ **
+ ** \param I The type of the decorated image.
+ **
+ ** \param Exact The exact type of the object.
+ */
template <class I, class Exact>
struct image_id<morpher::color_morpher<I, Exact> >
{
enum {dim = I::dim};
+ /*! <The Image dimension.*/
typedef oln_impl_type(I) impl_type;
+ /*! <Underlying implementation.*/
typedef ntg_comp_type(oln_value_type(I)) value_type;
+ /*! <The value type of the decorated image. Here the
+ ** component type of the source image value_type is
+ ** retrieved.
+ */
typedef typename mlc::exact_vt<morpher::color_morpher<I, Exact>,
Exact>::ret exact_type;
+ /*! <Retrieve the exact type of the image. It depends on
+ ** the value of Exact.
+ */
};
- /// Specialized version for color_morpher.
- template <class I>
- struct image_traits <morpher::color_morpher<I> > :
+ /*! \brief Specialized version for color_morpher.
+ **
+ ** \param I The type of the decorated image.
+ **
+ ** \param Exact The exact type of the object.
+ */
+ template <class I, class Exact>
+ struct image_traits <morpher::color_morpher<I, Exact> > :
public image_traits<abstract::image_with_impl<oln_impl_type(I),
- morpher::color_morpher<I> > >
+ morpher::color_morpher<I, Exact> > >
{
};
namespace morpher {
- /// Abstract color_morpher class used for code factorization.
+ /*! \brief Abstract color_morpher class used for
+ ** code factorization.
+ **
+ ** \param DestType Output type of the morpher.
+ **
+ ** \param SrcType Input type decorated.
+ **
+ ** \param Exact Exact type
+ */
template <class DestType, class SrcType, class Exact>
class super_color_morpher : public abstract::generic_morpher<DestType, SrcType, Exact>
{
@@ -134,6 +161,10 @@
** Using this class, an rgb image can be viewed
** according to one of its component.
**
+ ** \param SrcType Input Type decorated.
+ **
+ ** \param Exact Exact type.
+ **
** \see oln::morpher::abstract::generic_morpher
*/
template <class SrcType, class Exact>
@@ -141,7 +172,7 @@
public super_color_morpher<typename oln::mute<oln_exact_type(SrcType),
ntg_comp_type(oln_value_type(SrcType))>::ret,
SrcType,
- color_morpher<SrcType, Exact> >
+ typename image_id<color_morpher<SrcType, Exact> >::exact_type >
{
/// The type of the object instantiated. color_morpher can be derived.
typedef typename image_id<color_morpher<SrcType, Exact> >::exact_type exact_type;
@@ -152,15 +183,16 @@
typedef color_morpher<SrcType, Exact> self_type;
typedef oln_iter_type(SrcType) iter_type;
+ /*! <Type of the class iterator.*/
typedef oln_point_type(SrcType) point_type;
- typedef oln_fwd_iter_type(SrcType) fwd_iter_type;
- typedef oln_size_type(SrcType) size_type;
+ /*! <Type of the class point.*/
typedef ntg_comp_type(oln_value_type(SrcType)) value_type;
- typedef oln_impl_type(SrcType) impl_type;
+ /*! <The value type of the decorated image.*/
typedef super_color_morpher<typename oln::mute<oln_exact_type(SrcType),
ntg_comp_type(oln_value_type(SrcType))>::ret,
SrcType,
- color_morpher<SrcType, Exact> > super_type;
+ typename image_id<color_morpher<SrcType, Exact> >::exact_type > super_type;
+ /*! <The upper class. */
/// Construct the color_morpher with an image \a ima and a component \a n.
color_morpher(const SrcType &ima, unsigned n) : super_type(ima, n)
@@ -179,6 +211,9 @@
/*! Return a reference to the \a n_th component of the
** rgb value stored at \a p.
+ **
+ ** \warning This method should not be used directly.
+ ** Prefer operator[].
*/
value_type&
at(const point_type& p)
@@ -186,7 +221,11 @@
return const_cast<SrcType &>(this->ima_)[p][this->n_];
}
- /// Return the \a n_th component of the rgb value stored at \a p.
+ /*! Return the \a n_th component of the rgb value stored at \a p.
+ **
+ ** \warning This method should not be used directly.
+ ** Prefer operator[].
+ */
const value_type
at(const point_type& p) const
{
@@ -207,59 +246,44 @@
return this->exact();
}
- /*! Perform a shallow from \a rhs to the current decorated
- ** image. The points will be shared by the two images.
- */
- self_type&
- assign(DestType& rhs)
- {
- oln_iter_type(SrcType) it(rhs);
-
- for_all(it)
- this->at(it) = rhs[it];
- return this->exact();
- }
-
- /*! This operator= assigns rhs to the current image.
- **
- ** \todo FIXME: This operator= doesn't work if declared in
- ** the generic_morpher.
- */
- self_type&
- operator=(DestType& rhs)
- {
- return this->exact().assign(rhs);
- }
-
static std::string
name()
{
- return "color_morpher<" + SrcType::name() + ">";
+ return "color_morpher<" + SrcType::name() + "," + Exact::name() + ">";
}
};
- /// The specialized version for `const' declared images.
+ /*! \brief The specialized version for `const' declared images.
+ **
+ ** \param SrcType Input type decorated.
+ **
+ ** \param Exact Exact Type.
+ **
+ ** \see oln::morpher::abstract::generic_morpher
+ */
template <class SrcType, class Exact>
struct color_morpher<const SrcType, Exact> :
public super_color_morpher<typename oln::mute<oln_exact_type(SrcType),
ntg_comp_type(oln_value_type(SrcType))>::ret,
SrcType,
- color_morpher<const SrcType, Exact> >
+ typename image_id<color_morpher<const SrcType, Exact> >::exact_type>
{
/// The type of the object instantiated. color_morpher can be derived.
typedef typename image_id<color_morpher<SrcType, Exact> >::exact_type exact_type;
typedef oln_point_type(SrcType) point_type;
- typedef oln_fwd_iter_type(SrcType) fwd_iter_type;
- typedef oln_size_type(SrcType) size_type;
+ /*! <The type of the class point.*/
+ typedef oln_iter_type(SrcType) iter_type;
+ /*! <The type of the class iterator.*/
typedef ntg_comp_type(oln_value_type(SrcType)) value_type;
- typedef oln_impl_type(SrcType) impl_type;
+ /*! <The value of the decorated image.*/
typedef super_color_morpher<typename oln::mute<oln_exact_type(SrcType),
ntg_comp_type(oln_value_type(SrcType))>::ret,
SrcType,
- color_morpher<const SrcType, Exact> > super_type;
+ typename image_id<color_morpher<const SrcType, Exact> >::exact_type> super_type;
+ /*! <The upper class.*/
/// Construct the color_morpher with an image \a ima and a component \a n.
color_morpher(const SrcType &ima, unsigned n) : super_type(ima, n)
@@ -277,7 +301,11 @@
color_morpher()
{}
- /// Return the \a n_th component of the rgb value stored at \a p.
+ /*! Return the \a n_th component of the rgb value stored at \a p.
+ **
+ ** \warning This method should not be used directly.
+ ** Prefer operator[].
+ */
const value_type
at(const point_type& p) const
{
@@ -381,4 +409,4 @@
} // end of namespace oln
-#endif // !COLOR_MORPHER_HH
+#endif // !OLENA_MORPHER_COLOR_MORPHER_HH
Index: olena/tests/morpher/tests/compose_morph
--- olena/tests/morpher/tests/compose_morph Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
+++ olena/tests/morpher/tests/compose_morph Sun, 28 Mar 2004 20:57:30 +0200 thivol_d (oln/m/43_compose_mo 644)
@@ -0,0 +1,30 @@
+// -*- c++ -*-
+#include <oln/morpher/color_morpher.hh>
+#include <oln/morpher/subq_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c[16]
+ = {0x18, 0x25, 0x3a, 0xc8, 0x64, 0xbd, 0x38, 0xa8,
+ 0x57, 0x24, 0x7d, 0x0, 0x62, 0xa9, 0xd1, 0x8d};
+
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+
+ fail = fail | (oln::utils::md5(oln::morpher::rmorph(oln::morpher::sqmorph<7>(imc))) != oln::utils::key(data_key_c));
+
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
+
Index: olena/tests/morpher/tests/sq_morph
--- olena/tests/morpher/tests/sq_morph Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
+++ olena/tests/morpher/tests/sq_morph Tue, 30 Mar 2004 19:14:40 +0200 thivol_d (oln/m/44_sq_morph 644)
@@ -0,0 +1,67 @@
+// -*- c++ -*-
+#include <oln/morpher/subq_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c_1[16]
+ = {0xae, 0xb0, 0x65, 0x65, 0xdd, 0x28, 0x5a, 0xc6,
+ 0x8a, 0x17, 0x7e, 0xd, 0xe5, 0xe6, 0x4f, 0x1d};
+
+ oln::utils::key::value_type data_key_c_2[16]
+ = {0x4, 0x58, 0x8b, 0x60, 0x31, 0x5b, 0x33, 0x4e,
+ 0xac, 0xad, 0x85, 0x18, 0x6, 0x25, 0xb6, 0x36};
+
+ oln::utils::key::value_type data_key_c_3[16]
+ = {0xd1, 0xcc, 0xe6, 0x1f, 0xec, 0x26, 0x2b, 0xfd,
+ 0x2b, 0x9c, 0xea, 0x59, 0x35, 0x76, 0x64, 0x8};
+
+ oln::utils::key::value_type data_key_c_4[16]
+ = {0xcf, 0x42, 0xc, 0x2f, 0xcb, 0x8e, 0x2a, 0x36,
+ 0xb9, 0x53, 0xcc, 0x42, 0xfc, 0x54, 0x27, 0x82};
+
+ oln::utils::key::value_type data_key_c_5[16]
+ = {0x90, 0xe5, 0x71, 0x6b, 0x7e, 0x15, 0x51, 0x16,
+ 0x43, 0x43, 0xa6, 0x81, 0x9e, 0x48, 0x88, 0xea};
+
+ oln::utils::key::value_type data_key_c_6[16]
+ = {0xc3, 0x7e, 0x14, 0xc7, 0x5d, 0xfc, 0xa7, 0xd9,
+ 0xc, 0xd7, 0x29, 0xa5, 0x84, 0x41, 0xfd, 0x12};
+
+ oln::utils::key::value_type data_key_c_7[16]
+ = {0x62, 0xa7, 0x2a, 0x3e, 0xe, 0x39, 0xda, 0x93,
+ 0x62, 0x59, 0x15, 0xe6, 0x60, 0x12, 0x8a, 0xc2};
+
+ oln::utils::key::value_type data_key_c_8[16]
+ = {0x47, 0xa5, 0xb6, 0xa2, 0xc8, 0xf1, 0x4d, 0xb8,
+ 0x90, 0x67, 0xaa, 0x19, 0x3d, 0x43, 0xb6, 0xe0};
+
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+ const oln::image2d<ntg::rgb_8> imc_const = oln::load(rdata("lena.ppm"));
+
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<1>(imc)) != oln::utils::key(data_key_c_1));
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<2>(imc)) != oln::utils::key(data_key_c_2));
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<3>(imc)) != oln::utils::key(data_key_c_3));
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<4>(imc)) != oln::utils::key(data_key_c_4));
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<5>(imc)) != oln::utils::key(data_key_c_5));
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<6>(imc)) != oln::utils::key(data_key_c_6));
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<7>(imc)) != oln::utils::key(data_key_c_7));
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<8>(imc)) != oln::utils::key(data_key_c_8));
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<1>(imc_const)) != oln::utils::key(data_key_c_1));
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<3>(oln::morpher::sqmorph<5>(imc))) !=
+ oln::utils::md5(oln::morpher::sqmorph<3>(imc)));
+
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
Index: olena/tests/morpher/tests/color_morph
--- olena/tests/morpher/tests/color_morph Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
+++ olena/tests/morpher/tests/color_morph Tue, 30 Mar 2004 19:54:21 +0200 thivol_d (oln/m/45_color_morp 644)
@@ -0,0 +1,50 @@
+// -*- c++ -*-
+#include <oln/morpher/color_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c_r[16]
+ = {0xe1, 0x5, 0x51, 0x40, 0xea, 0xa, 0x13, 0x96,
+ 0xc7, 0xa6, 0x62, 0x2c, 0xfa, 0xe4, 0x53, 0x8e};
+
+ oln::utils::key::value_type data_key_c_b[16]
+ = {0x7, 0x8e, 0x3, 0xaa, 0x45, 0xce, 0x38, 0x62,
+ 0xf9, 0x1d, 0xb7, 0x9f, 0x56, 0x1c, 0x52, 0x2d};
+
+ oln::utils::key::value_type data_key_c_g[16]
+ = {0x50, 0x36, 0xf3, 0xb3, 0x56, 0x66, 0x18, 0xbc,
+ 0x7a, 0x12, 0x36, 0x75, 0xc, 0x7f, 0xc6, 0xf4};
+
+
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+ const oln::image2d<ntg::rgb_8> imc_const = oln::load(rdata("lena.ppm"));
+ oln::image2d<ntg::rgb_8> imd(imc.size());
+ oln::morpher::color_morpher<oln::image2d<ntg::rgb_8> > mimc(imc, 0);
+ oln::morpher::color_morpher<oln::image2d<ntg::rgb_8> > mimd(imd, 0);
+
+ mimd = mimc;
+
+ fail = fail | (oln::utils::md5(oln::morpher::rmorph(imc)) != oln::utils::md5(mimd));
+ fail = fail | (oln::utils::md5(oln::morpher::rmorph(imc)) != oln::utils::key(data_key_c_r));
+ fail = fail | (oln::utils::md5(oln::morpher::gmorph(imc)) != oln::utils::key(data_key_c_g));
+ fail = fail | (oln::utils::md5(oln::morpher::bmorph(imc)) != oln::utils::key(data_key_c_b));
+ fail = fail | (oln::utils::md5(oln::morpher::rmorph(imc_const)) != oln::utils::key(data_key_c_r));
+ fail = fail | (oln::utils::md5(*(oln::morpher::rmorph(imc).unmorph())) != oln::utils::key(data_key_c_r));
+
+
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
+
Index: olena/tests/morpher/tests/sq_morph_8
--- olena/tests/morpher/tests/sq_morph_8 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/28_sq_morph_8 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_8 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-// -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
- bool fail (false);
- oln::utils::key::value_type data_key_c[16]
- = {0x47, 0xa5, 0xb6, 0xa2, 0xc8, 0xf1, 0x4d, 0xb8,
- 0x90, 0x67, 0xaa, 0x19, 0x3d, 0x43, 0xb6, 0xe0};
-
- oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
- fail = fail | (oln::utils::md5(oln::morpher::sqmorph<8>(imc)) != oln::utils::key(data_key_c));
-
- if (!fail)
- std::cout << "OK" << std::endl;
- else
- {
- std::cout << "FAIL" << std::endl;
- return true;
- }
-}
-
Index: olena/tests/morpher/tests/sq_morph_7
--- olena/tests/morpher/tests/sq_morph_7 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/29_sq_morph_7 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_7 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-// -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
- bool fail (false);
- oln::utils::key::value_type data_key_c[16]
- = {0x62, 0xa7, 0x2a, 0x3e, 0xe, 0x39, 0xda, 0x93,
- 0x62, 0x59, 0x15, 0xe6, 0x60, 0x12, 0x8a, 0xc2};
-
- oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
- fail = fail | (oln::utils::md5(oln::morpher::sqmorph<7>(imc)) != oln::utils::key(data_key_c));
-
- if (!fail)
- std::cout << "OK" << std::endl;
- else
- {
- std::cout << "FAIL" << std::endl;
- return true;
- }
-}
-
Index: olena/tests/morpher/tests/sq_morph_6
--- olena/tests/morpher/tests/sq_morph_6 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/30_sq_morph_6 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_6 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-// -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
- bool fail (false);
- oln::utils::key::value_type data_key_c[16]
- = {0xc3, 0x7e, 0x14, 0xc7, 0x5d, 0xfc, 0xa7, 0xd9,
- 0xc, 0xd7, 0x29, 0xa5, 0x84, 0x41, 0xfd, 0x12};
-
- oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
- fail = fail | (oln::utils::md5(oln::morpher::sqmorph<6>(imc)) != oln::utils::key(data_key_c));
-
- if (!fail)
- std::cout << "OK" << std::endl;
- else
- {
- std::cout << "FAIL" << std::endl;
- return true;
- }
-}
-
Index: olena/tests/morpher/tests/sq_morph_5
--- olena/tests/morpher/tests/sq_morph_5 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/31_sq_morph_5 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_5 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-// -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
- bool fail (false);
- oln::utils::key::value_type data_key_c[16]
- = {0x90, 0xe5, 0x71, 0x6b, 0x7e, 0x15, 0x51, 0x16,
- 0x43, 0x43, 0xa6, 0x81, 0x9e, 0x48, 0x88, 0xea};
-
- oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
- fail = fail | (oln::utils::md5(oln::morpher::sqmorph<5>(imc)) != oln::utils::key(data_key_c));
-
- if (!fail)
- std::cout << "OK" << std::endl;
- else
- {
- std::cout << "FAIL" << std::endl;
- return true;
- }
-}
-
Index: olena/tests/morpher/tests/sq_morph_4
--- olena/tests/morpher/tests/sq_morph_4 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/32_sq_morph_4 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_4 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-// -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
- bool fail (false);
- oln::utils::key::value_type data_key_c[16]
- = {0xcf, 0x42, 0xc, 0x2f, 0xcb, 0x8e, 0x2a, 0x36,
- 0xb9, 0x53, 0xcc, 0x42, 0xfc, 0x54, 0x27, 0x82};
-
- oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
- fail = fail | (oln::utils::md5(oln::morpher::sqmorph<4>(imc)) != oln::utils::key(data_key_c));
-
- if (!fail)
- std::cout << "OK" << std::endl;
- else
- {
- std::cout << "FAIL" << std::endl;
- return true;
- }
-}
-
Index: olena/tests/morpher/tests/sq_morph_3
--- olena/tests/morpher/tests/sq_morph_3 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/33_sq_morph_3 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_3 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-// -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
- bool fail (false);
- oln::utils::key::value_type data_key_c[16]
- = {0xd1, 0xcc, 0xe6, 0x1f, 0xec, 0x26, 0x2b, 0xfd,
- 0x2b, 0x9c, 0xea, 0x59, 0x35, 0x76, 0x64, 0x8};
-
- oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
- fail = fail | (oln::utils::md5(oln::morpher::sqmorph<3>(imc)) != oln::utils::key(data_key_c));
-
- if (!fail)
- std::cout << "OK" << std::endl;
- else
- {
- std::cout << "FAIL" << std::endl;
- return true;
- }
-}
-
Index: olena/tests/morpher/tests/sq_morph_2
--- olena/tests/morpher/tests/sq_morph_2 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/34_sq_morph_2 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_2 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-// -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
- bool fail (false);
- oln::utils::key::value_type data_key_c[16]
- = {0x4, 0x58, 0x8b, 0x60, 0x31, 0x5b, 0x33, 0x4e,
- 0xac, 0xad, 0x85, 0x18, 0x6, 0x25, 0xb6, 0x36};
-
- oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
- fail = fail | (oln::utils::md5(oln::morpher::sqmorph<2>(imc)) != oln::utils::key(data_key_c));
-
- if (!fail)
- std::cout << "OK" << std::endl;
- else
- {
- std::cout << "FAIL" << std::endl;
- return true;
- }
-}
-
Index: olena/tests/morpher/tests/sq_morph_1
--- olena/tests/morpher/tests/sq_morph_1 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/35_sq_morph_1 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_1 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-// -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
- bool fail (false);
- oln::utils::key::value_type data_key_c[16]
- = {0xae, 0xb0, 0x65, 0x65, 0xdd, 0x28, 0x5a, 0xc6,
- 0x8a, 0x17, 0x7e, 0xd, 0xe5, 0xe6, 0x4f, 0x1d};
-
- oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
- fail = fail | (oln::utils::md5(oln::morpher::sqmorph<1>(imc)) != oln::utils::key(data_key_c));
-
- if (!fail)
- std::cout << "OK" << std::endl;
- else
- {
- std::cout << "FAIL" << std::endl;
- return true;
- }
-}
-
Index: olena/tests/morpher/tests/rmorph
--- olena/tests/morpher/tests/rmorph Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/36_rmorph 1.1 600)
+++ olena/tests/morpher/tests/rmorph Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,28 +0,0 @@
-// -*- c++ -*-
-#include <oln/morpher/color_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
- bool fail (false);
- oln::utils::key::value_type data_key_c[16]
- = {0xe1, 0x5, 0x51, 0x40, 0xea, 0xa, 0x13, 0x96,
- 0xc7, 0xa6, 0x62, 0x2c, 0xfa, 0xe4, 0x53, 0x8e};
- oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
- fail = fail | (oln::utils::md5(oln::morpher::rmorph(imc)) != oln::utils::key(data_key_c));
-
- if (!fail)
- std::cout << "OK" << std::endl;
- else
- {
- std::cout << "FAIL" << std::endl;
- return true;
- }
-}
-
Index: olena/tests/morpher/tests/gmorph
--- olena/tests/morpher/tests/gmorph Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/37_gmorph 1.1 600)
+++ olena/tests/morpher/tests/gmorph Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-// -*- c++ -*-
-#include <oln/morpher/color_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
- bool fail (false);
- oln::utils::key::value_type data_key_c[16]
- = {0x50, 0x36, 0xf3, 0xb3, 0x56, 0x66, 0x18, 0xbc,
- 0x7a, 0x12, 0x36, 0x75, 0xc, 0x7f, 0xc6, 0xf4};
-
- oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
- fail = fail | (oln::utils::md5(oln::morpher::gmorph(imc)) != oln::utils::key(data_key_c));
-
- if (!fail)
- std::cout << "OK" << std::endl;
- else
- {
- std::cout << "FAIL" << std::endl;
- return true;
- }
-}
-
Index: olena/tests/morpher/tests/color_sq_morph
--- olena/tests/morpher/tests/color_sq_morph Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/38_color_sq_m 1.1 600)
+++ olena/tests/morpher/tests/color_sq_morph Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,30 +0,0 @@
-// -*- c++ -*-
-#include <oln/morpher/color_morpher.hh>
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
- bool fail (false);
- oln::utils::key::value_type data_key_c[16]
- = {0x18, 0x25, 0x3a, 0xc8, 0x64, 0xbd, 0x38, 0xa8,
- 0x57, 0x24, 0x7d, 0x0, 0x62, 0xa9, 0xd1, 0x8d};
-
- oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
- fail = fail | (oln::utils::md5(oln::morpher::rmorph(oln::morpher::sqmorph<7>(imc))) != oln::utils::key(data_key_c));
-
- if (!fail)
- std::cout << "OK" << std::endl;
- else
- {
- std::cout << "FAIL" << std::endl;
- return true;
- }
-}
-
Index: olena/tests/morpher/tests/bmorph
--- olena/tests/morpher/tests/bmorph Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/39_bmorph 1.1 600)
+++ olena/tests/morpher/tests/bmorph Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-// -*- c++ -*-
-#include <oln/morpher/color_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
- bool fail (false);
- oln::utils::key::value_type data_key_c[16]
- = {0x7, 0x8e, 0x3, 0xaa, 0x45, 0xce, 0x38, 0x62,
- 0xf9, 0x1d, 0xb7, 0x9f, 0x56, 0x1c, 0x52, 0x2d};
-
- oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
- fail = fail | (oln::utils::md5(oln::morpher::bmorph(imc)) != oln::utils::key(data_key_c));
-
- if (!fail)
- std::cout << "OK" << std::endl;
- else
- {
- std::cout << "FAIL" << std::endl;
- return true;
- }
-}
-
--
Damien Thivolle
damien.thivolle(a)lrde.epita.fr
2
1
Index: integre/ChangeLog
from Niels Van Vliet <niels(a)lrde.epita.fr>
* integre/ntg/core/pred_succ.hh: Add default_less.
* integre/ntg/color/color.hh: Add default_less specialization.
Index: integre/ntg/color/color.hh
--- integre/ntg/color/color.hh Thu, 22 Jan 2004 21:46:17 +0100 palma_g
(oln/t/20_color.hh 1.6 640)
+++ integre/ntg/color/color.hh Tue, 30 Mar 2004 12:38:04 +0200 van-vl_n
(oln/t/20_color.hh 1.6 640)
@@ -1,4 +1,4 @@
-// Copyright (C) 2001, 2002, 2003 EPITA Research and Development
Laboratory
+// Copyright (C) 2001, 2002, 2003, 2004 EPITA Research and Development
Laboratory
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
@@ -35,6 +35,7 @@
# include <ntg/basics.hh>
# include <ntg/int.hh>
# include <ntg/vect/vec.hh>
+# include <ntg/core/pred_succ.hh>
# include <mlc/cmp.hh>
@@ -268,6 +269,38 @@
}
};
+
+ template <typename T> struct default_less;
+
+ /*! The specialized version of default_less for colors.
+ **
+ ** \warning This class is only provided to build classes
+ ** that need a less class, it does not correspond to
+ ** the reality. \n
+ ** Example of a std::set of RGB colors:
+ ** \verbatim
+ ** std::set<ntg:rgb_8,
+ ** ntg::internal::default_less<ntg::rgb8> > s;
+ ** s.insert(ntg::rgb_8(10, 16, 64));
+ ** \endverbatim
+ */
+ template <unsigned ncomps,
+ unsigned qbits,
+ template <unsigned> class color_system>
+ struct default_less< ntg::color<ncomps, qbits, color_system> >
+ {
+ typedef ntg::color<ncomps, qbits, color_system> arg_type;
+ bool operator()(const arg_type& l,
+ const arg_type& r) const
+ {
+ for (unsigned i = 0; i < ntg_nb_comp(arg_type); ++i)
+ if (l[i] < r[i])
+ return true;
+ else if (l[i] > r[i])
+ return false;
+ return false;
+ }
+ };
} // end of internal.
} // end of ntg.
Index: integre/ntg/core/pred_succ.hh
--- integre/ntg/core/pred_succ.hh Fri, 19 Mar 2004 11:53:50 +0100
van-vl_n (oln/k/8_pred_succ. 1.1 644)
+++ integre/ntg/core/pred_succ.hh Tue, 30 Mar 2004 12:24:42 +0200
van-vl_n (oln/k/8_pred_succ. 1.1 644)
@@ -28,8 +28,10 @@
#ifndef NTG_CORE_PRED_SUCC_HH
# define NTG_CORE_PRED_SUCC_HH
-#include <ntg/all.hh>
+
#include <mlc/is_a.hh>
+#include <ntg/real/int_u.hh>
+#include <ntg/core/macros.hh>
namespace ntg {
@@ -70,6 +72,24 @@
{
return T(internal::with_arith<T>::ret(t) - 1);
}
+
+ namespace internal {
+ /*! Default less.
+ **
+ ** Specialization of this class provides a less functor even for
+ ** types that do not support the operator "<".
+ */
+ template <typename T>
+ struct default_less
+ {
+ typedef T arg_type;
+ bool operator()(const T& l,
+ const T& r) const
+ {
+ return l < r;
+ }
+ };
+ }
}
#endif
1
0
Index: integre/ChangeLog
from Niels Van Vliet <niels(a)lrde.epita.fr>
* integre/ntg/core/macros.hh: Add macros ntg_if_vectorial_nb_comp and
ntg_compare_nb_comp.
* integre/tests/types/tests/ntg_compare_nb_comp: Add file.
Index: olena/ChangeLog
from Niels Van Vliet <niels(a)lrde.epita.fr>
* olena/oln/math/macros.hh: Add dot_product.
* olena/oln/utils/se_stat.hh: Add file. Mean and variance using a
structuring element.
* olena/oln/utils/se_stat.hxx: Add file.
* olena/oln/convol/nagao.hh: Add file. Nagao filter.
* olena/oln/convol/nagao.hxx: Add file.
* olena/tests/convol/tests/nagao : Add file.
Index: olena/oln/math/macros.hh
--- olena/oln/math/macros.hh Mon, 15 Mar 2004 17:40:54 +0100 van-vl_n
(oln/b/21_macros.hh 1.6.1.14 600)
+++ olena/oln/math/macros.hh Fri, 26 Mar 2004 19:15:36 +0100 van-vl_n
(oln/b/21_macros.hh 1.6.1.14 600)
@@ -85,6 +85,68 @@
return f(val);
}
+ /// Internal purpose only.
+ namespace internal {
+ /// Dot product for non-vectorial types.
+ template<typename DestValue, typename I, typename J>
+ struct f_dot_product_nv
+ {
+ typedef typename ntg_is_a(I, ntg::non_vectorial)::ensure_type t;
+
+ static DestValue
+ product(const I &i, const J &j)
+ {
+ return i * j;
+ }
+ };
+
+ /// Dot product for vectorial types.
+ template<typename DestValue, typename I, typename J>
+ struct f_dot_product_v
+ {
+ typedef typename ntg_is_a(I, ntg::vectorial)::ensure_type t;
+ //typedef typename mlc::eq<ntg_nb_comp(I), ntg_nb_comp(J)>::ensure_type t;
+
+ static DestValue
+ product(const I &i, const J &j)
+ {
+ DestValue d(ntg_zero_val(DestValue));
+
+ for (unsigned k = 0; k < ntg_nb_comp(I); ++k)
+ d += i[k] * j[k];
+ return d;
+ }
+ };
+ }
+
+ /*! \brief Dot product.
+ **
+ ** \code
+ ** #include <oln/math/macros.hh>
+ ** #include <ntg/all.hh>
+ ** int main()
+ ** {
+ ** ntg::int_u8 i(3), j(4);
+ ** // Print "12"
+ ** std::cout << oln::math::dot_product<ntg::float_s>(i, j) <<
std::endl;
+ **
+ ** ntg::rgb_8 blue(0, 0, 200), yellow(0, 30, 10);
+ ** // Print "2000"
+ ** std::cout << oln::math::dot_product<ntg::float_s>(blue, yellow)
+ ** << std::endl;
+ ** }
+ ** \endcode
+ */
+ template<typename DestValue, typename I, typename J>
+ DestValue
+ dot_product(const I &i, const J &j)
+ {
+ typedef typename mlc::if_<ntg_is_a(I, ntg::vectorial)::ret,
+ internal::f_dot_product_v<DestValue, I, J>,
+ internal::f_dot_product_nv<DestValue, I, J> >::ret fctor;
+ return fctor::product(i, j);
+ }
+
} // end of math
} // end of oln
Index: integre/ntg/core/macros.hh
--- integre/ntg/core/macros.hh Fri, 19 Mar 2004 15:52:57 +0100 palma_g
(oln/s/19_macros.hh 1.10 600)
+++ integre/ntg/core/macros.hh Fri, 26 Mar 2004 20:01:55 +0100 van-vl_n
(oln/s/19_macros.hh 1.10 600)
@@ -160,4 +160,49 @@
`-----*/
#define ntg_nbits(T) ntg::internal::typetraits<T>::size
+
+/*! Return the number of components of T if T is vectorial.
+**
+** If T is non vectorial, the value returned should not be considered.
+*/
+#define ntg_if_vectorial_nb_comp(T) \
+ ntg::type_traits<typename mlc::if_<ntg_is_a(T, ntg::vectorial)::ret, \
+ T, \
+ ntg::vec<42, bool> >::ret>::nb_comp
+
+/*! Same as \a ntg_if_vectorial_nb_comp but without 'typename'
+**
+** \see ntg_if_vectorial_nb_comp
+*/
+#define ntg_if_vectorial_nb_comp_(T) \
+ ntg::type_traits<mlc::if_<ntg_is_a_(T, ntg::vectorial)::ret, \
+ T, \
+ ntg::vec<42, bool> >::ret>::nb_comp
+
+/*! Compare the number of components.
+**
+** - If \a A and \a B are non_vectorial, then
+** \a {ntg_compare_nb_comp(A, B)::ret = true}
+** - If \a A and \a B are vectorial, then
+** \a {ntg_compare_nb_comp(A, B)::ret = (ntg_nb_comp(A) =
ntg_nb_comp(B))}
+** - Otherwise, it returns false
+*/
+#define ntg_compare_nb_comp(A, B) \
+ mlc::if_< \
+ ntg_is_a(A, ntg::non_vectorial)::ret, \
+ ntg_is_a(B, ntg::non_vectorial), \
+ mlc::eq<ntg_if_vectorial_nb_comp(A), \
+ ntg_if_vectorial_nb_comp(B)> >::ret
+
+/*! Same as \a ntg_compare_nb_comp but without 'typename'
+**
+** \see ntg_compare_nb_comp
+*/
+#define ntg_compare_nb_comp_(A, B) \
+ mlc::if_< \
+ ntg_is_a_(A, ntg::non_vectorial)::ret, \
+ ntg_is_a_(B, ntg::non_vectorial), \
+ mlc::eq<ntg_if_vectorial_nb_comp_(A), \
+ ntg_if_vectorial_nb_comp_(B)> >::ret
+
#endif // !NTG_CORE_MACROS_HH
Index: olena/tests/convol/tests/nagao
--- olena/tests/convol/tests/nagao Fri, 26 Mar 2004 20:54:04 +0100
van-vl_n ()
+++ olena/tests/convol/tests/nagao Fri, 26 Mar 2004 20:26:49 +0100
van-vl_n (oln/m/19_nagao 644)
@@ -0,0 +1,37 @@
+// -*-
c++ -*-
+#include <oln/convol/nagao.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c[16]
+ = {0x69, 0xa7, 0xce, 0xf0, 0x4b, 0x88, 0x9e, 0xd4, 0x77, 0x63, 0x40,
+ 0xd6, 0x79, 0x42, 0x6a, 0x48};
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+ oln::image2d<ntg::rgb_8> nc = oln::convol::nagao(imc);
+
+ std::cout << oln::utils::md5(nc) << std::endl;
+ fail = fail | (oln::utils::md5(nc) != oln::utils::key(data_key_c));
+
+ oln::utils::key::value_type data_key_g[16]
+ = {0x27, 0xbc, 0xab, 0x48, 0x45, 0x2f, 0xe9, 0xc5, 0x6e, 0x2e, 0x57,
+ 0x27, 0xf, 0x80, 0xfe, 0xaa};
+
+ oln::image2d<ntg::int_u8> im = oln::load(rdata("lena256.pgm"));
+ oln::image2d<ntg::int_u8> ng = oln::convol::nagao(im);
+
+ fail = fail | (oln::utils::md5(ng) != oln::utils::key(data_key_g));
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
+
Index: integre/tests/types/tests/ntg_compare_nb_comp
--- integre/tests/types/tests/ntg_compare_nb_comp Fri, 26 Mar 2004
20:54:04 +0100 van-vl_n ()
+++ integre/tests/types/tests/ntg_compare_nb_comp Fri, 26 Mar 2004
20:49:31 +0100 van-vl_n (oln/m/20_ntg_compar 644)
@@ -0,0 +1,14 @@
+bool should_just_compile;
+should_just_compile = ntg_if_vectorial_nb_comp_(int);
+
+bool fail = false;
+fail = fail || ntg_if_vectorial_nb_comp_(ntg::rgb_8) != 3;
+typedef ntg::vec<3, bool> vec3;
+typedef ntg::vec<4, bool> vec4;
+fail = fail || ntg_if_vectorial_nb_comp_(vec3) != 3;
+fail = fail || ntg_if_vectorial_nb_comp_(vec4) != 4;
+fail = fail || ntg_compare_nb_comp_(int, ntg::rgb_8)::ret != 0;
+fail = fail || ntg_compare_nb_comp_(int, float)::ret != 1;
+fail = fail || ntg_compare_nb_comp_(vec3, ntg::rgb_8)::ret != 1;
+fail = fail || ntg_compare_nb_comp_(vec4, ntg::rgb_8)::ret != 0;
+return fail;
Index: olena/oln/convol/nagao.hxx
--- olena/oln/convol/nagao.hxx Fri, 26 Mar 2004 20:54:04 +0100 van-vl_n ()
+++ olena/oln/convol/nagao.hxx Fri, 26 Mar 2004 20:29:16 +0100 van-vl_n
(oln/m/21_nagao.hxx 644)
@@ -0,0 +1,205 @@
+// Copyright (C) 2004 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 59 Temple Place - Suite 330, 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 OLN_CONVOL_NAGAO_HXX
+# define OLN_CONVOL_NAGAO_HXX
+# include <oln/core/window2d.hh>
+
+namespace oln {
+ namespace convol {
+ namespace internal {
+
+ template<class I, class SE, unsigned Size, typename Sum>
+ inline Sum
+ mean_of_smaller_variance(const oln::abstract::image<I> &im,
+ const oln_point_type(I) &p,
+ const internal::se_array<Size, SE> &w)
+ {
+ ntg_compare_nb_comp(Sum, oln_value_type(I))::ensure();
+
+ precondition(Size > 0);
+ precondition(im.border() >= w.delta());
+
+ typedef typename oln::utils::se_stat<Sum, ntg::float_s> se_stat_type;
+ typedef typename se_stat_type::sum_type sum_type;
+ typedef typename se_stat_type::variance_type variance_type;
+
+ se_stat_type s(im, p, w[0]);
+ variance_type min_variance = s.variance();
+ sum_type mean = s.mean();
+ for (unsigned i = 1; i < Size; ++i)
+ {
+ variance_type tmp = s.compute(im, p, w[i]).variance();
+ if (tmp < min_variance)
+ {
+ min_variance = tmp;
+ mean = s.mean();
+ }
+ }
+ return mean;
+ }
+
+ /*! \brief build 9 windows corresponding to the standard
+ ** 5x5 Nagao filter.
+ */
+ static
+ se_array<9, window2d>
+ mk_nagao_windows_5x5()
+ {
+ se_array<9, window2d> out;
+ //center //.....
+ out[0].add(-1, -1).add(-1, 0).add(-1, 1)//.XXX.
+ .add(0, -1).add(0, 0).add(0, 1) //.XCX.
+ .add(1, -1).add(1, 0).add(1, 1); //.XXX.
+ //.....
+
+ // upper //.XXX.
+ out[1].add(-2, -1).add(-2, 0).add(-2, 1)//.XXX.
+ .add(-1, -1).add(-1, 0).add(-1, 1) //..C..
+ .add(0, 0); //.....
+ //.....
+
+ // right //.....
+ out[2].add(-1, 1).add(-1, 2) //...XX
+ .add(0, 0).add(0, 1).add(0, 2) //..CXX
+ .add(1, 1).add(1, 2); //...XX
+ //.....
+ // bottom //.....
+ out[3].add(2, -1).add(2, 0).add(2, 1) //.....
+ .add(1, -1).add(1, 0).add(1, 1) //..C..
+ .add(0, 0); //.XXX.
+ //.XXX.
+
+ // left //.....
+ out[4].add(-1, -1).add(-1, -2) //XX...
+ .add(0, 0).add(0, -1).add(0, -2) //XXC..
+ .add(1, -1).add(1, -2); //XX...
+ //.....
+
+ // upper-left //XX...
+ out[5].add(-2, -2).add(-2, -1) //XXX..
+ .add(-1, -2).add(-1, -1).add(-1, 0) //.XC..
+ .add(0, -1).add(0, 0); //.....
+ //.....
+
+ // upper-right //...XX
+ out[6].add(-2, 2).add(-2, 1) //..XXX
+ .add(-1, 2).add(-1, 1).add(-1, 0) //..CX.
+ .add(0, 1).add(0, 0); //.....
+ //.....
+
+ // bottom-right //.....
+ out[7].add(2, 2).add(2, 1) //.....
+ .add(1, 2).add(1, 1).add(1, 0) //..CX.
+ .add(0, 1).add(0, 0); //..XXX
+ //...XX
+
+ // bottom-left //.....
+ out[8].add(2, -2).add(2, -1) //.....
+ .add(1, -2).add(1, -1).add(1, 0) //.XC..
+ .add(0, -1).add(0, 0); //XXX..
+ //XX...
+ return out;
+ }
+ } // ! end namespace internal
+
+
+ template <class I, unsigned Size, typename SE, typename Sum>
+ inline oln_concrete_type(I)
+ nagao_generalized(const oln::abstract::image<I>& in,
+ const internal::se_array<Size, SE> &sa)
+ {
+ ntg_compare_nb_comp(Sum, oln_value_type(I))::ensure();
+ in.border_adapt_width(sa.delta());
+ oln_concrete_type(I) out(in.size());
+ oln_iter_type(I) it(out);
+ for_all(it)
+ out[it] = internal::mean_of_smaller_variance<I, SE, Size, Sum>
+ (in, it, sa);
+ return out;
+ }
+
+ /*! Standard Nagao filter 5x5.
+ **
+ ** Apply the 5*5 nagao filter on a non vectorial image.
+ ** \code
+ ** #include <oln/convol/nagao.hh>
+ ** #include <oln/basics2d.hh>
+ ** #include <ntg/all.hh>
+ ** int main()
+ ** {
+ ** oln::image2d<ntg::int_u8> imc = oln::load(IMG_IN "lena256.pgm");
+ ** oln::save(oln::convol::nagao(imc),
+ ** IMG_OUT "oln_convol_nagao_256.pgm");
+ ** }
+ ** \endcode
+ ** \image html lena256_pgm.png
+ ** \image latex lena256_pgm.png
+ ** =>
+ ** \image html oln_convol_nagao_256.png
+ ** \image latex oln_convol_nagao_256.png
+ */
+ template <class I>
+ inline oln_concrete_type(I)
+ nagao(const oln::abstract::non_vectorial_image_with_dim<2, I>& in)
+ {
+ return nagao_generalized<I, 9, window2d, ntg::float_s>
+ (in, internal::mk_nagao_windows_5x5());
+ }
+
+ /*! Standard Nagao filter 5x5.
+ **
+ ** Apply the 5*5 nagao filter on a vectorial image.
+ **
+ ** \code
+ ** #include <oln/convol/nagao.hh>
+ ** #include <oln/basics2d.hh>
+ ** #include <ntg/all.hh>
+ ** int main()
+ ** {
+ ** oln::image2d<ntg::rgb_8> imc = oln::load(IMG_IN "lena.ppm");
+ ** oln::save(oln::convol::nagao(imc), IMG_OUT
"oln_convol_nagao.ppm");
+ ** }
+ ** \endcode
+ ** \image html lena_ppm.png
+ ** \image latex lena_ppm.png
+ ** =>
+ ** \image html oln_convol_nagao.png
+ ** \image latex oln_convol_nagao.png
+ */
+ template <class I>
+ inline oln_concrete_type(I)
+ nagao(const oln::abstract::vectorial_image_with_dim<2, I>& in)
+ {
+ typedef ntg::rgb_8::float_vec_type float_vec_type;
+ return nagao_generalized<I, 9, window2d, float_vec_type>
+ (in, internal::mk_nagao_windows_5x5());
+ }
+ } //! namespace convol
+} //! namespace oln
+
+#endif
Index: olena/oln/convol/nagao.hh
--- olena/oln/convol/nagao.hh Fri, 26 Mar 2004 20:54:04 +0100 van-vl_n ()
+++ olena/oln/convol/nagao.hh Fri, 26 Mar 2004 19:54:47 +0100 van-vl_n
(oln/m/22_nagao.hh 644)
@@ -0,0 +1,157 @@
+// Copyright (C) 2004 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 59 Temple Place - Suite 330, 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 OLN_CONVOL_NAGAO_HH
+# define OLN_CONVOL_NAGAO_HH
+
+# include <oln/utils/se_stat.hh>
+# include <oln/core/abstract/struct_elt.hh>
+# include <oln/core/abstract/image.hh>
+# include <oln/core/image.hh>
+# include <oln/core/abstract/image_with_type_with_dim.hh>
+# include <mlc/array/1d.hh>
+# include <mlc/cmp.hh>
+
+
+namespace oln {
+ namespace convol{
+ namespace internal {
+ /*! array of structuring elements.
+ **
+ ** \param Size Number of structuring elements.
+ ** \param S structuring element type.
+ */
+ template <unsigned Size, class S>
+ struct se_array
+ {
+ /// Type of the struturing elements.
+ typedef mlc_exact_type(oln::abstract::struct_elt<S>) struct_elt_type;
+
+ /// Type of the array.
+ typedef typename mlc::array1d<typename mlc::array1d_info<Size>,
+ struct_elt_type > array_type;
+
+ /// Number of structuring elements.
+ enum {size = Size};
+
+ se_array():delta_(0){}
+
+ /// nth struturing element.
+ struct_elt_type&
+ operator[](int i)
+ {
+ delta_ = -1;
+ precondition(0 <= i < Size);
+ return tab[i];
+ }
+
+ /// nth struturing element.
+ struct_elt_type
+ operator[](int i) const
+ {
+ precondition(0 <= i < Size);
+ return tab[i];
+ }
+
+ /// Maximum of the delta of the structuring elements.
+ coord
+ delta() const
+ {
+ // if not updated, compute the maximum.
+ if (delta_ <= 0)
+ {
+ for (unsigned i = 0; i < Size; ++i)
+ if (tab[i].delta() > delta_)
+ delta_ = tab[i].delta();
+ }
+ postcondition (delta_ >= 0);
+ return delta_;
+ }
+ protected:
+ /// Array of structuring elements.
+ array_type tab;
+ /*! \brief Maximum delta.
+ **
+ ** \note delta_ < 0 means that it must be updated before
+ ** a read access.
+ */
+ mutable coord delta_;
+ };
+
+ /*! Return the mean of the windows that has the smallest variance.
+ **
+ ** \arg im Input image.
+ ** \arg p Origin of the structuring elements.
+ ** \arg w array of structuring elements.
+ **
+ ** \param I Input image type.
+ ** \param SE Structuring element type.
+ ** \param Size Number of windows in the array.
+ ** \param Sum Type use to add values of the input image.
+ **
+ ** \note \a Sum might be a float_s if the image is an image
+ ** of integer, and might be an rgb_8::float_vec_type if I is
+ ** an image of rgb_8.
+ */
+ template<class I, class SE, unsigned Size, typename Sum>
+ inline Sum
+ mean_of_smaller_variance(const oln::abstract::image<I> &im,
+ const oln_point_type(I) &p,
+ const internal::se_array<Size, SE> &w);
+ } // end namespace internal
+
+ /*! A Nagao filter generalized.
+ **
+ ** Each point in the input correspond to the mean of the
+ ** window in which has the smallest variance.
+ **
+ ** \paran in Input image.
+ ** \param sa array of structuring elements.
+ **
+ ** \see oln::convol::nagao
+ */
+ template <class I, unsigned Size, typename SE, typename Sum>
+ inline oln_concrete_type(I)
+ nagao_generalized(const oln::abstract::image<I>& in,
+ const internal::se_array<Size, SE> &sa);
+
+ template <class I>
+ inline oln_concrete_type(I)
+ nagao(const oln::abstract::non_vectorial_image_with_dim<2, I>& in);
+
+
+ template <class I>
+ inline oln_concrete_type(I)
+ nagao(const oln::abstract::vectorial_image_with_dim<2, I>& in);
+ } // end namespace convol
+
+} // end namespace oln
+
+#include "nagao.hxx"
+
+#endif // OLENA_CONVOL_NAGAO_HH
Index: olena/oln/utils/se_stat.hh
--- olena/oln/utils/se_stat.hh Fri, 26 Mar 2004 20:54:04 +0100 van-vl_n ()
+++ olena/oln/utils/se_stat.hh Fri, 26 Mar 2004 19:33:56 +0100 van-vl_n
(oln/m/23_se_stat.hh 644)
@@ -0,0 +1,172 @@
+// Copyright (C) 2004 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 59 Temple Place - Suite 330, 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 OLN_UTILS_SE_STAT_HH
+# define OLN_UTILS_SE_STAT_HH
+
+# include <oln/core/abstract/point.hh>
+# include <oln/core/abstract/image.hh>
+# include <oln/core/abstract/struct_elt.hh>
+
+# include <ntg/core/abstract_hierarchy.hh>
+# include <ntg/all.hh>
+# include <ntg/core/macros.hh>
+# include <oln/math/macros.hh>
+
+namespace oln {
+ namespace utils {
+ namespace internal {
+ /*! This class is used to transform a type to a floating type
equivalent.
+ **
+ ** \todo FIXME: There should be a way to use the standard conversion,
+ ** but I failed to find a good one. The problem is that a color<...>
+ ** derived of vec<..> but the conversion between color and vec
should be
+ ** done through c.to_float(). \n
+ ** Example:
+ ** \verbatim
+ ** rgb_u8::float_vec_type v = rgb_u8(127, 0, 255);
+ ** // v contains 127., 0., 255 but should contain 0.5, 0,1.
+ ** rgb_u8 c = v;
+ ** // c = (255., 255., 255). Error.
+ **
+ ** rgb_u8::float_vec_type v2 = f_to_float_<rgb_u8::float_vec_type>
+ ** rgb_u8(127, 0, 255);
+ ** rgb_u8 c2 = v2;
+ ** // c2 = (127, 0, 255). Ok.
+ ** \endverbatim
+ */
+ template <typename DestT,
+ typename SrcT>
+ struct f_to_float_
+ {
+ static
+ DestT
+ doit(const SrcT& s)
+ {
+ return s;
+ }
+ };
+
+ /// Specialization of the \a f_to_float struct for the colors.
+ template <unsigned ncomps,
+ unsigned qbits,
+ template <unsigned> class color_system>
+ struct f_to_float_<typename ntg::color<ncomps,
+ qbits,
+ color_system>::float_vec_type,
+ ntg::color<ncomps, qbits, color_system> >
+ {
+ static
+ typename ntg::color<ncomps, qbits, color_system>::float_vec_type
+ doit(const ntg::color<ncomps, qbits, color_system>& s)
+ {
+ return s.to_float();
+ }
+ };
+ } // end namespace internal
+
+
+ /*! \brief Compute the variance and the mean within a window.
+ **
+ ** \param Sum type used to compute the sum and the average.
+ ** \param Var type used to compute the variance.
+ **
+ ** \note There is two parameters because for vectorial types the sum
+ ** is usually a vector, and the variance a non vectorial type.
+ */
+ template <typename Sum = ntg::float_s, typename Var = ntg::float_s>
+ class se_stat
+ {
+ public:
+ /// type of used to sum the value (usually floating point values)
+ typedef Sum sum_type;
+ /// type of used for the variance (usually floating point values)
+ typedef Var variance_type;
+
+ /*! Build a se stat.
+ ** \arg im Input image.
+ ** \arg p Origin of the structuring element.
+ ** \arg s Window.
+ */
+ template <class I, class S>
+ se_stat(const oln::abstract::image<I> &im,
+ const oln_point_type(I) &p,
+ const oln::abstract::struct_elt<S> &s)
+ {
+ compute(im, p, s);
+ }
+
+ /// Computes the mean and the variance.
+ template <class I, class S>
+ se_stat &
+ compute(const oln::abstract::image<I> &im,
+ const oln_point_type(I) &p,
+ const oln::abstract::struct_elt<S> &s);
+
+ /// Mean.
+ inline Sum
+ mean() const
+ {
+ return mean_;
+ }
+
+ /// Variance.
+ inline Var
+ variance() const
+ {
+ return variance_;
+ }
+
+ /// Sum.
+ inline Sum
+ sum() const
+ {
+ return sum_;
+ }
+
+ /// Cardinal of the structuring element.
+ inline unsigned
+ card() const
+ {
+ return card_;
+ }
+
+ protected:
+ Var variance_; ///< Variance.
+ Sum mean_; ///< Mean.
+ Sum sum_; ///< Sum.
+ int card_; ///< Card of the input structuring element.
+ };
+
+ } // end namespace utils
+
+} // end namespace oln
+
+#include "se_stat.hxx"
+
+#endif //! OLN_UTILS_SE_STAT_HH
Index: olena/oln/utils/se_stat.hxx
--- olena/oln/utils/se_stat.hxx Fri, 26 Mar 2004 20:54:04 +0100 van-vl_n ()
+++ olena/oln/utils/se_stat.hxx Fri, 26 Mar 2004 19:59:59 +0100 van-vl_n
(oln/m/24_se_stat.hx 644)
@@ -0,0 +1,70 @@
+// Copyright (C) 2004 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 59 Temple Place - Suite 330, 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 OLN_UTILS_SE_STAT_HXX
+# define OLN_UTILS_SE_STAT_HXX
+
+namespace oln {
+ namespace utils {
+
+ /// Computes the mean and the variance.
+ template <typename Sum, typename Var>
+ template <class I, class S>
+ inline se_stat<Sum, Var> &
+ se_stat<Sum, Var>::compute(const oln::abstract::image<I> &im,
+ const oln_point_type(I) &p,
+ const oln::abstract::struct_elt<S> &s)
+ {
+ sum_ = ntg_zero_val(Sum);
+ card_ = s.card();
+ // Compute the mean
+ oln_iter_type(S) it(s);
+ {
+ for_all(it)
+ sum_ += internal::f_to_float_<Sum,
+ oln_value_type(I)>::doit(im[p + it]);
+ mean_ = sum_ / card_;
+ }
+ // Compute the variance
+ {
+ Var sum_2(ntg_zero_val(Var));
+ for_all(it)
+ {
+ Sum tmp = mean_;
+ tmp -= im[p + it];
+ sum_2 += oln::math::dot_product<Var>(tmp, tmp);
+ }
+ variance_ = sum_2 / card_;
+ }
+ return *this;
+ }
+ } // end namespace utils
+
+} // end namespace oln
+
+#endif //! OLN_UTILS_SE_STAT_HXX
4
6
Index: olena/ChangeLog
from Giovanni Palma <giovanni(a)lrde.epita.fr>
* oln/convol/fast_gaussian.hh: Add reference.
* oln/convol/fast_gaussian.hxx: Correct algorithm for tiny sigma.
+2004-03-29 Giovanni Palma <giovanni(a)lrde.epita.fr>
+
* tests/convol/tests/md5_convol_fast_gaussian_hh5: Correct test.
* tests/convol/tests/md5_convol_fast_gaussian_hh4: Likewise.
* tests/convol/tests/md5_convol_fast_gaussian_hh3: Likewise.
Index: olena/oln/convol/fast_gaussian.hh
--- olena/oln/convol/fast_gaussian.hh Mon, 29 Mar 2004 15:45:23 +0200 palma_g (oln/26_fast_gauss 1.6.1.6.1.8 640)
+++ olena/oln/convol/fast_gaussian.hh Mon, 29 Mar 2004 16:36:57 +0200 palma_g (oln/26_fast_gauss 1.6.1.6.1.8 640)
@@ -55,7 +55,8 @@
** \brief Gaussian filter.
**
** Gaussian filter implementation from "Recursively implementing
- ** the gaussian and its derivatives" Deriche 93 INRIA REPORT.
+ ** the gaussian and its derivatives" Deriche 93 INRIA REPORT
+ ** (num RR-1893).
**
** \param C Exact type of the conversion object.
** \param B Base type of the conversion object.
@@ -80,7 +81,8 @@
** \brief Derivative gaussian filter.
**
** Gaussian filter implementation from "Recursively implementing
- ** the gaussian and its derivatives" Deriche 93 INRIA REPORT.
+ ** the gaussian and its derivatives" Deriche 93 INRIA REPORT
+ ** (num RR-1893).
**
** \param C Exact type of the conversion object.
** \param B Base type of the conversion object.
@@ -106,7 +108,8 @@
** \brief Second derivative gaussian filter.
**
** Gaussian filter implementation from "Recursively implementing
- ** the gaussian and its derivatives" Deriche 93 INRIA REPORT.
+ ** the gaussian and its derivatives" Deriche 93 INRIA REPORT
+ ** (num RR-1893).
**
** \param C Exact type of the conversion object.
** \param B Base type of the conversion object.
@@ -135,7 +138,8 @@
** \brief Gaussian filter with a default conversion.
**
** Gaussian filter implementation from "Recursively implementing
- ** the gaussian and its derivatives" Deriche 93 INRIA REPORT.
+ ** the gaussian and its derivatives" Deriche 93 INRIA REPORT
+ ** (num RR-1893).
**
** \param I Exact type of the image.
** \param BE Exact type of the behavior.
@@ -182,7 +186,8 @@
** \brief Derivative gaussian filter with a default conversion.
**
** Gaussian filter implementation from "Recursively implementing
- ** the gaussian and its derivatives" Deriche 93 INRIA REPORT.
+ ** the gaussian and its derivatives" Deriche 93 INRIA REPORT
+ ** (num RR-1893).
**
** \param I Exact type of the image.
** \param BE Exact type of the behavior.
@@ -228,7 +233,8 @@
** \brief Second derivative gaussian filter with a default conversion.
**
** Gaussian filter implementation from "Recursively implementing
- ** the gaussian and its derivatives" Deriche 93 INRIA REPORT.
+ ** the gaussian and its derivatives" Deriche 93 INRIA REPORT
+ ** (num RR-1893).
**
** \param I Exact type of the image.
** \param BE Exact type of the behavior.
@@ -278,7 +284,8 @@
** default behavior.
**
** Gaussian filter implementation from "Recursively implementing
- ** the gaussian and its derivatives" Deriche 93 INRIA REPORT.\n
+ ** the gaussian and its derivatives" Deriche 93 INRIA REPORT
+ ** (num RR-1893).\n
**
** \warning The content of the border is the mirror of the
** image.
@@ -325,7 +332,8 @@
** and a default behavior.
**
** Gaussian filter implementation from "Recursively implementing
- ** the gaussian and its derivatives" Deriche 93 INRIA REPORT.
+ ** the gaussian and its derivatives" Deriche 93 INRIA REPORT
+ ** (num RR-1893).
**
** \warning The content of the border is the mirror of the
** image.
@@ -374,7 +382,8 @@
** conversion and a default behavior.
**
** Gaussian filter implementation from "Recursively implementing
- ** the gaussian and its derivatives" Deriche 93 INRIA REPORT.
+ ** the gaussian and its derivatives" Deriche 93 INRIA REPORT
+ ** (num RR-1893).
**
** \warning The content of the border is the mirror of the
** image.
Index: olena/oln/convol/fast_gaussian.hxx
--- olena/oln/convol/fast_gaussian.hxx Mon, 29 Mar 2004 15:45:23 +0200 palma_g (oln/25_fast_gauss 1.7.1.8.1.10 640)
+++ olena/oln/convol/fast_gaussian.hxx Mon, 29 Mar 2004 16:33:41 +0200 palma_g (oln/25_fast_gauss 1.7.1.8.1.10 640)
@@ -306,6 +306,10 @@
for_all(it)
work_img[it] = ntg::cast::force<ntg::float_s>(in[it]);
+ // On tiny sigma, Derich algorithm doesn't work.
+ // It is the same thing that to convolve with a Dirac.
+ if (sigma > 0.006)
+ {
/* FIXME: relation between sigma and the border shouldn't
be linear, so when sigma is big enougth, the signal may
be parasitized by the non signal values.
@@ -313,7 +317,7 @@
behavior.adapt_border(work_img, ntg::cast::round<coord>(5 * sigma));
gaussian_<I::dim>::doit(work_img, coef);
-
+ }
/* Convert the result image to the user-requested datatype.
FIXME: We are making an unnecessary copy in case the
user expects a ntg::float_s image. */
--
Giovanni Palma
EPITA - promo 2005 - membre d'EpX - LRDE
Mob. : +33 (0)6 60 97 31 74
2
2
Index: olena/ChangeLog
from Giovanni Palma <giovanni(a)lrde.epita.fr>
* tests/convol/tests/md5_convol_fast_gaussian_hh5: Correct test.
* tests/convol/tests/md5_convol_fast_gaussian_hh4: Likewise.
* tests/convol/tests/md5_convol_fast_gaussian_hh3: Likewise.
* tests/convol/tests/md5_convol_fast_gaussian_hh2: Likewise.
* tests/convol/tests/md5_convol_fast_gaussian_hh1: Likewise.
* tests/convol/tests/md5_convol_fast_gaussian_hh0: Likewise.
* oln/convol/fast_gaussian.hh: Add comments.
* oln/convol/fast_gaussian.hxx: Likewise.
Index: olena/oln/convol/fast_gaussian.hh
--- olena/oln/convol/fast_gaussian.hh Fri, 19 Mar 2004 14:01:37 +0100 palma_g (oln/26_fast_gauss 1.6.1.6.1.7 600)
+++ olena/oln/convol/fast_gaussian.hh Mon, 29 Mar 2004 15:22:05 +0200 palma_g (oln/26_fast_gauss 1.6.1.6.1.7 640)
@@ -67,6 +67,8 @@
** \arg sigma Value of sigma when computing the gaussian.
** \arg behavior Object to know how to work on borders.
**
+ ** \warning If sigma is big enough, the result may differ a
+ ** little bit with the -O3 flag of g++.
*/
template <class C, class B, class I, class BE>
typename mute<I, typename convoutput<C, B, oln_value_type(I)>::ret>::ret
@@ -90,6 +92,9 @@
** \arg sigma Value of sigma when computing the gaussian.
** \arg behavior Object to know how to work on borders.
**
+ ** \warning If sigma is big enough, the result may differ a
+ ** little bit with the -O3 flag of g++.
+ **
*/
template <class C, class B, class I, class BE>
typename mute<I, typename convoutput<C, B, oln_value_type(I)>::ret>::ret
@@ -113,6 +118,9 @@
** \arg sigma Value of sigma when computing the gaussian.
** \arg behavior Object to know how to work on borders.
**
+ ** \warning If sigma is big enough, the result may differ a
+ ** little bit with the -O3 flag of g++.
+ **
*/
template <class C, class B, class I, class BE>
typename mute<I, typename convoutput<C, B, oln_value_type(I)>::ret>::ret
@@ -159,6 +167,9 @@
** =>
** \image html oln_convol_fast_gaussian.png
** \image latex oln_convol_fast_gaussian.png
+ **
+ ** \warning If sigma is big enough, the result may differ a
+ ** little bit with the -O3 flag of g++.
*/
template <class I, class BE> inline
oln_concrete_type(I)
@@ -191,7 +202,7 @@
**
** im_type im1(oln::load(IMG_IN "lena256.pgm"));
**
- ** oln::save(oln::convol::fast::gaussian(im1, 2,
+ ** oln::save(oln::convol::fast::gaussian_derivative(im1, 2,
** oln::value_behavior<oln_value_type_(im_type)>(0)),
** IMG_OUT "oln_convol_fast_gaussian_derivative.pbm");
** return 0;
@@ -204,7 +215,8 @@
** \image html oln_convol_fast_gaussian_derivative.png
** \image latex oln_convol_fast_gaussian_derivative.png
**
- ** \todo FIXME: Make the example use the good function.
+ ** \warning If sigma is big enough, the result may differ a
+ ** little bit with the -O3 flag of g++.
*/
template <class I, class BE> inline
oln_concrete_type(I)
@@ -236,7 +248,7 @@
**
** im_type im1(oln::load(IMG_IN "lena256.pgm"));
**
- ** oln::save(oln::convol::fast::gaussian(im1, 2,
+ ** oln::save(oln::convol::fast::gaussian_second_derivative(im1, 2,
** oln::value_behavior<oln_value_type_(im_type)>(0)),
** IMG_OUT "oln_convol_fast_gaussian_second_derivative.pbm");
** return 0;
@@ -249,7 +261,8 @@
** \image html oln_convol_fast_gaussian_second_derivative.png
** \image latex oln_convol_fast_gaussian_second_derivative.png
**
- ** \todo FIXME: Make the example use the good function.
+ ** \warning If sigma is big enough, the result may differ a
+ ** little bit with the -O3 flag of g++.
*/
template <class I, class BE> inline
oln_concrete_type(I)
@@ -297,6 +310,9 @@
** =>
** \image html oln_convol_fast_gaussian_default.png
** \image latex oln_convol_fast_gaussian_default.png
+ **
+ ** \warning If sigma is big enough, the result may differ a
+ ** little bit with the -O3 flag of g++.
*/
template <class I> inline
oln_concrete_type(I)
@@ -332,7 +348,7 @@
**
** im_type im1(oln::load(IMG_IN "lena256.pgm"));
**
- ** oln::save(oln::convol::fast::gaussian(im1, 2),
+ ** oln::save(oln::convol::fast::gaussian_derivative(im1, 2),
** IMG_OUT "oln_convol_fast_gaussian_derivative_default.pbm");
** return 0;
** }
@@ -344,7 +360,8 @@
** \image html oln_convol_fast_gaussian_derivative_default.png
** \image latex oln_convol_fast_gaussian_derivative_default.png
**
- ** \todo FIXME: Make the example use the good function.
+ ** \warning If sigma is big enough, the result may differ a
+ ** little bit with the -O3 flag of g++.
*/
template <class I> inline
oln_concrete_type(I)
@@ -380,7 +397,7 @@
**
** im_type im1(oln::load(IMG_IN "lena256.pgm"));
**
- ** oln::save(oln::convol::fast::gaussian(im1, 2),
+ ** oln::save(oln::convol::fast::gaussian_second_derivative(im1, 2),
** IMG_OUT "oln_convol_fast_gaussian_second_derivative_default.pbm");
** return 0;
** }
@@ -392,7 +409,8 @@
** \image html oln_convol_fast_gaussian_second_derivative_default.png
** \image latex oln_convol_fast_gaussian_second_derivative_default.png
**
- ** \todo FIXME: Make the example use the good function.
+ ** \warning If sigma is big enough, the result may differ a
+ ** little bit with the -O3 flag of g++.
*/
template <class I> inline
oln_concrete_type(I)
Index: olena/oln/convol/fast_gaussian.hxx
--- olena/oln/convol/fast_gaussian.hxx Mon, 15 Mar 2004 17:40:54 +0100 van-vl_n (oln/25_fast_gauss 1.7.1.8.1.9 600)
+++ olena/oln/convol/fast_gaussian.hxx Mon, 29 Mar 2004 15:26:31 +0200 palma_g (oln/25_fast_gauss 1.7.1.8.1.9 640)
@@ -104,7 +104,6 @@
- c.d[1]*tmp1[2] - c.d[2]*tmp1[1]
- c.d[3]*tmp1[0];
-
oln_point_type(I) current(start + d + d + d + d);
for (coord i = 4; i < len; ++i)
{
@@ -170,7 +169,16 @@
struct gaussian_ {};
- // Gaussian filter for 1D images
+ /*! Gaussian filter for 1D images
+ **
+ ** gaussian_ specialization for 1D images.
+ **
+ ** \param I Exact type of the image.
+ ** \param F Type of coefficients.
+ **
+ ** \arg img Image to process.
+ ** \arg coef Coefficients to use.
+ */
template<>
struct gaussian_<1>
{
@@ -189,7 +197,16 @@
};
- // Gaussian filter for 2D images
+ /*! Gaussian filter for 2D images
+ **
+ ** gaussian_ specialization for 2D images.
+ **
+ ** \param I Exact type of the image.
+ ** \param F Type of coefficients.
+ **
+ ** \arg img Image to process.
+ ** \arg coef Coefficients to use.
+ */
template<>
struct gaussian_<2>
{
@@ -215,7 +232,16 @@
}
};
- // Gaussian filter for 3D images
+ /*! Gaussian filter for 3D images
+ **
+ ** gaussian_ specialization for 3D images.
+ **
+ ** \param I Exact type of the image.
+ ** \param F Type of coefficients.
+ **
+ ** \arg img Image to process.
+ ** \arg coef Coefficients to use.
+ */
template<>
struct gaussian_<3>
{
Index: olena/tests/convol/tests/md5_convol_fast_gaussian_hh5
--- olena/tests/convol/tests/md5_convol_fast_gaussian_hh5 Tue, 23 Mar 2004 14:27:20 +0100 palma_g (oln/k/23_md5_convol 1.1 600)
+++ olena/tests/convol/tests/md5_convol_fast_gaussian_hh5 Mon, 29 Mar 2004 15:33:06 +0200 palma_g (oln/k/23_md5_convol 1.1 644)
@@ -10,17 +10,17 @@
int main()
{
- oln::utils::key::value_type data_key[16] = {0x70, 0x53, 0xa8, 0x84, 0x81,
- 0x4, 0xbc, 0x30, 0x71, 0x23,
- 0x78, 0xba, 0xed, 0x6, 0xc6,
- 0x9e};
+ oln::utils::key::value_type data_key[16] = {0xfc, 0xd6, 0xbc, 0xb5, 0x6c,
+ 0x16, 0x89, 0xfc, 0xef, 0x28,
+ 0xb5, 0x7c, 0x22, 0x47, 0x5b,
+ 0xad};
oln::utils::key key(data_key);
typedef oln::image2d<ntg::int_u8> im_type;
im_type im1(oln::load(rdata("lena256.pgm")));
- if (oln::utils::md5(oln::convol::fast::gaussian(im1, 2)) == key)
+ if (oln::utils::md5(oln::convol::fast::gaussian_second_derivative(im1, 0.5)) == key)
std::cout << "OK" << std::endl;
else
{
Index: olena/tests/convol/tests/md5_convol_fast_gaussian_hh4
--- olena/tests/convol/tests/md5_convol_fast_gaussian_hh4 Tue, 23 Mar 2004 14:27:20 +0100 palma_g (oln/k/24_md5_convol 1.1 600)
+++ olena/tests/convol/tests/md5_convol_fast_gaussian_hh4 Mon, 29 Mar 2004 15:32:39 +0200 palma_g (oln/k/24_md5_convol 1.1 644)
@@ -10,14 +10,17 @@
int main()
{
-oln::utils::key::value_type data_key[16] = {0x56, 0x10, 0x9f, 0xa9, 0xec, 0x89, 0x99, 0x14, 0x42, 0x4a, 0xcf, 0x42, 0xa9, 0xa2, 0xe3, 0xf4};
+ oln::utils::key::value_type data_key[16] = {0x4d, 0xbc, 0xd, 0x2, 0x73,
+ 0x93, 0xf4, 0x6, 0xbc, 0x5c,
+ 0x55, 0xac, 0x6, 0xb, 0x67,
+ 0x9};
oln::utils::key key(data_key);
- typedef oln::image2d<ntg::
-int_u8> im_type;
+ typedef oln::image2d<ntg::int_u8> im_type;
im_type im1(oln::load(rdata("lena256.pgm")));
- if (oln::utils::md5(oln::convol::fast::gaussian(im1, 2)) == key)
+
+ if (oln::utils::md5(oln::convol::fast::gaussian_derivative(im1, 0.5)) == key)
std::cout << "OK" << std::endl;
else
{
Index: olena/tests/convol/tests/md5_convol_fast_gaussian_hh3
--- olena/tests/convol/tests/md5_convol_fast_gaussian_hh3 Tue, 23 Mar 2004 14:27:20 +0100 palma_g (oln/k/25_md5_convol 1.1 600)
+++ olena/tests/convol/tests/md5_convol_fast_gaussian_hh3 Mon, 29 Mar 2004 15:32:05 +0200 palma_g (oln/k/25_md5_convol 1.1 644)
@@ -10,14 +10,16 @@
int main()
{
-oln::utils::key::value_type data_key[16] = {0x56, 0x10, 0x9f, 0xa9, 0xec, 0x89, 0x99, 0x14, 0x42, 0x4a, 0xcf, 0x42, 0xa9, 0xa2, 0xe3, 0xf4};
-
+ oln::utils::key::value_type data_key[16] = {0xf5, 0x37, 0xe0, 0xad, 0x5f,
+ 0xcc, 0x7f, 0x44, 0x32, 0x53,
+ 0x2a, 0x37, 0x80, 0x38, 0x3f,
+ 0xbb};
oln::utils::key key(data_key);
- typedef oln::image2d<ntg::
-int_u8> im_type;
+ typedef oln::image2d<ntg::int_u8> im_type;
im_type im1(oln::load(rdata("lena256.pgm")));
- if (oln::utils::md5(oln::convol::fast::gaussian(im1, 2)) == key)
+
+ if (oln::utils::md5(oln::convol::fast::gaussian(im1, 0.5)) == key)
std::cout << "OK" << std::endl;
else
{
Index: olena/tests/convol/tests/md5_convol_fast_gaussian_hh2
--- olena/tests/convol/tests/md5_convol_fast_gaussian_hh2 Tue, 23 Mar 2004 14:27:20 +0100 palma_g (oln/k/26_md5_convol 1.1 600)
+++ olena/tests/convol/tests/md5_convol_fast_gaussian_hh2 Mon, 29 Mar 2004 15:31:37 +0200 palma_g (oln/k/26_md5_convol 1.1 644)
@@ -10,14 +10,20 @@
int main()
{
-oln::utils::key::value_type data_key[16] = {0xc, 0xec, 0xc0, 0x4c, 0xf4, 0xd1, 0xab, 0xef, 0x1c, 0xd3, 0x9c, 0xa7, 0x4d, 0xd7, 0x28, 0x92};
+ oln::utils::key::value_type data_key[16] = {0xfc, 0xd6, 0xbc, 0xb5, 0x6c,
+ 0x16, 0x89, 0xfc, 0xef, 0x28,
+ 0xb5, 0x7c, 0x22, 0x47, 0x5b,
+ 0xad};
oln::utils::key key(data_key);
- typedef oln::image2d<ntg::
-int_u8> im_type;
+ typedef oln::image2d<ntg::int_u8> im_type;
im_type im1(oln::load(rdata("lena256.pgm")));
- if (oln::utils::md5(oln::convol::fast::gaussian(im1, 2, oln::value_behavior<oln_value_type_(im_type)>(0))) == key)
+
+ if (oln::utils::md5(oln::convol::fast::gaussian_second_derivative(im1,
+ 0.5,
+ oln::value_behavior<oln_value_type_(im_type)>(0)))
+ == key)
std::cout << "OK" << std::endl;
else
{
Index: olena/tests/convol/tests/md5_convol_fast_gaussian_hh1
--- olena/tests/convol/tests/md5_convol_fast_gaussian_hh1 Tue, 23 Mar 2004 14:27:20 +0100 palma_g (oln/k/27_md5_convol 1.1 600)
+++ olena/tests/convol/tests/md5_convol_fast_gaussian_hh1 Mon, 29 Mar 2004 15:31:03 +0200 palma_g (oln/k/27_md5_convol 1.1 644)
@@ -10,19 +10,26 @@
int main()
{
-oln::utils::key::value_type data_key[16] = {0xc, 0xec, 0xc0, 0x4c, 0xf4, 0xd1, 0xab, 0xef, 0x1c, 0xd3, 0x9c, 0xa7, 0x4d, 0xd7, 0x28, 0x92};
+ oln::utils::key::value_type data_key[16] = {0x0, 0x8f, 0x63, 0xff, 0xca,
+ 0xae, 0xb5, 0xdb, 0x32, 0xf5,
+ 0x38, 0xfd, 0x13, 0x11, 0x67,
+ 0x9c};
oln::utils::key key(data_key);
- typedef oln::image2d<ntg::
-int_u8> im_type;
+ typedef oln::image2d<ntg::int_u8> im_type;
im_type im1(oln::load(rdata("lena256.pgm")));
- if (oln::utils::md5(oln::convol::fast::gaussian(im1, 2, oln::value_behavior<oln_value_type_(im_type)>(0))) == key)
+
+ if (oln::utils::md5(oln::convol::fast::gaussian_derivative(im1,
+ 0.5,
+ oln::value_behavior<oln_value_type_(im_type)>(0)))
+ == key)
std::cout << "OK" << std::endl;
else
{
std::cout << "FAIL" << std::endl;
return true;
}
+
return 0;
}
Index: olena/tests/convol/tests/md5_convol_fast_gaussian_hh0
--- olena/tests/convol/tests/md5_convol_fast_gaussian_hh0 Tue, 23 Mar 2004 14:27:20 +0100 palma_g (oln/k/28_md5_convol 1.1 600)
+++ olena/tests/convol/tests/md5_convol_fast_gaussian_hh0 Mon, 29 Mar 2004 15:33:16 +0200 palma_g (oln/k/28_md5_convol 1.1 644)
@@ -10,14 +10,20 @@
int main()
{
-oln::utils::key::value_type data_key[16] = {0xc, 0xec, 0xc0, 0x4c, 0xf4, 0xd1, 0xab, 0xef, 0x1c, 0xd3, 0x9c, 0xa7, 0x4d, 0xd7, 0x28, 0x92};
+ oln::utils::key::value_type data_key[16] = {0xcd, 0x87, 0xa8, 0x95, 0xa3,
+ 0x44, 0x2f, 0x0, 0xc4, 0x39,
+ 0x30, 0x77, 0x67, 0xa8, 0xb7,
+ 0x36};
oln::utils::key key(data_key);
- typedef oln::image2d<ntg::
-int_u8> im_type;
+ typedef oln::image2d<ntg::int_u8> im_type;
im_type im1(oln::load(rdata("lena256.pgm")));
- if (oln::utils::md5(oln::convol::fast::gaussian(im1, 2, oln::value_behavior<oln_value_type_(im_type)>(0))) == key)
+
+ if (oln::utils::md5(oln::convol::fast::gaussian(im1,
+ 0.5,
+ oln::value_behavior<oln_value_type_(im_type)>(0)))
+ == key)
std::cout << "OK" << std::endl;
else
{
--
Giovanni Palma
EPITA - promo 2005 - membre d'EpX - LRDE
Mob. : +33 (0)6 60 97 31 74
3
3
Index: olena/ChangeLog
from Simon Odou <simon(a)lrde.epita.fr>
* oln/morpher/slicing_morpher.hh: To have a slice of an image.
Index: olena/oln/morpher/slicing_morpher.hh
--- olena/oln/morpher/slicing_morpher.hh Mon, 29 Mar 2004 09:33:32 +0200 odou_s ()
+++ olena/oln/morpher/slicing_morpher.hh Mon, 29 Mar 2004 09:14:33 +0200 odou_s (oln/m/42_slicing_mo 644)
@@ -0,0 +1,354 @@
+// Copyright (C) 2004 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 59 Temple Place - Suite 330, 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 SLICING_MORPHER_HH
+# define SLICING_MORPHER_HH
+
+# include <oln/morpher/generic_morpher.hh>
+
+namespace oln {
+
+ namespace morpher {
+
+ template <class I, class Exact = mlc::final>
+ struct slicing_morpher;
+
+ } // end of namespace morpher
+
+
+ template <class Image>
+ struct DecDimensionImage
+ {};
+ template <class Type>
+ struct DecDimensionImage< oln::image2d<Type> >
+ {
+ typedef oln::image1d<Type> ret;
+ };
+ template <class Type>
+ struct DecDimensionImage< oln::image3d<Type> >
+ {
+ typedef oln::image2d<Type> ret;
+ };
+
+ /// Inherits identification's informations about the slicing morpher.
+ template <class I, class Exact>
+ struct image_id< morpher::slicing_morpher<I, Exact> >
+ : public image_id<typename DecDimensionImage<I>::ret>
+ {};
+
+ /// Inherits identification's informations about the const slicing morpher.
+ template <class I, class Exact>
+ struct image_id< morpher::slicing_morpher<const I, Exact> >
+ : public image_id<typename DecDimensionImage<I>::ret>
+ {};
+
+ /// Specialized version for slicing morpher.
+ template <class I>
+ struct image_traits< morpher::slicing_morpher<I> > :
+ public image_traits<abstract::image_with_impl<typename DecDimensionImage<I>::ret::impl_type,
+ morpher::slicing_morpher<I> > >
+ {};
+
+ /// Specialized version for slicing morpher.
+ template <class I>
+ struct image_traits< morpher::slicing_morpher<const I> > :
+ public image_traits<abstract::image_with_impl<typename DecDimensionImage<I>::ret::impl_type,
+ morpher::slicing_morpher<const I> > >
+ {};
+
+ namespace morpher {
+
+ /// Return a size of N-1 dimension.
+ oln::image1d_size* image_size_dec(const oln::image2d_size& image_size)
+ {
+ return new oln::image1d_size(image_size.ncols(), image_size.border());
+ }
+
+ /// Return a size of N-1 dimension.
+ oln::image2d_size* image_size_dec(const oln::image3d_size& image_size)
+ {
+ return new oln::image2d_size(image_size.nrows(), image_size.ncols(), image_size.border());
+ }
+
+ /// Abstract piece morpher class used for code factorization.
+ template <class DestType, class SrcType, class Exact>
+ class super_slicing_morpher : public abstract::generic_morpher<DestType, SrcType, Exact>
+ {
+ public:
+
+ typedef oln_size_type(DestType) size_type;
+ typedef oln_impl_type(DestType) impl_type;
+ typedef abstract::generic_morpher<DestType, SrcType, Exact> super_type;
+
+ /// Override the size method.
+ const size_type&
+ size() const
+ {
+ return *size_;
+ }
+
+ /// Override the impl method.
+ const impl_type*
+ impl() const
+ {
+ return impl_;
+ }
+
+ /// Override the impl method.
+ impl_type*
+ impl()
+ {
+ return impl_;
+ }
+
+ ///< Return the last coordinate' value.
+ coord get_slice() const
+ {
+ return slice_;
+ }
+
+ /// Useful to debug.
+ static std::string name()
+ {
+ return "super_slicing_morpher<" + super_type::name() + ">";
+ }
+
+ protected:
+
+ /*!
+ ** \brief Default constructor.
+ ** \arg ima will be the image.
+ ** \arg slice The last coordinate.
+ **
+ ** One can not use this constructor to instantiate this class
+ ** since it is protected.
+ */
+ super_slicing_morpher(const SrcType &ima, const coord slice)
+ : super_type(ima), impl_(0), size_(0), slice_(slice)
+ {
+ size_ = image_size_dec(ima_.size());
+ impl_ = new impl_type(*size_);
+ }
+
+ /// Destructor
+ ~super_slicing_morpher()
+ {
+ delete size_;
+ }
+
+ /*!
+ ** \brief Empty constructor.
+ **
+ ** Needed by mlc_hierarchy::any_with_diamond.
+ */
+ super_slicing_morpher() : impl_(0), size_(0), slice_(0)
+ {}
+
+ impl_type *impl_;
+ size_type *size_; ///< The size of the N-1 dimension image.
+ coord slice_; ///< The last coordinate.
+
+ };
+
+ /*!
+ ** \brief The default piece morpher class.
+ **
+ ** Using this class, a piece of picture is a picture.
+ **
+ ** \see oln::morpher::abstract::generic_morpher
+ ** \see oln::morpher::piece_morph
+ */
+ template <class SrcType, class Exact>
+ struct slicing_morpher
+ : public super_slicing_morpher< typename DecDimensionImage<SrcType>::ret, SrcType, slicing_morpher<SrcType, Exact> >
+ {
+ typedef typename image_id< slicing_morpher<SrcType, Exact> >::exact_type exact_type;
+ typedef slicing_morpher<SrcType, Exact> self_type;
+ typedef typename DecDimensionImage<SrcType>::ret DestType;
+ typedef super_slicing_morpher<DestType, SrcType, slicing_morpher<SrcType, Exact> > super_type;
+
+ typedef oln_value_type(DestType) value_type;
+ typedef oln_point_type(DestType) point_type;
+
+ /*!
+ ** \brief Construct a piece morpher.
+ ** \arg ima The image.
+ ** \arg slice The slice value.
+ */
+ slicing_morpher(const SrcType &ima, coord slice)
+ : super_type(ima, slice) {}
+
+ /// Construct a piece morpher from another one.
+ slicing_morpher(const self_type& r)
+ : super_type(r.get_ima(), r.get_slice()) {}
+
+ /*!
+ ** \brief Empty constructor.
+ **
+ ** Needed by mlc_hierarchy::any_with_diamond.
+ */
+ slicing_morpher() {}
+
+ /*!
+ ** \brief Return the stored value at the point.
+ ** \arg p The point.
+ ** \return The stored value.
+ */
+ value_type& at(const point_type &p)
+ {
+ typename SrcType::point_type tmp_p(p, slice_);
+ return const_cast<value_type &>(this->ima_)[tmp_p];
+ }
+
+ const value_type at(const point_type& p) const
+ {
+ typename SrcType::point_type tmp_p(p, slice_);
+ return this->ima_[tmp_p];
+ }
+
+ /*!
+ ** \brief Perform a shallow copy from the decorated image of \a rhs
+ ** to the current decorated image. The points will be shared
+ ** by the two images.
+ */
+ self_type&
+ assign(self_type& rhs)
+ {
+ oln_iter_type(SrcType) it(rhs);
+
+ for_all(it)
+ this->at(it) = rhs[it];
+ return this->exact();
+ }
+
+ /*!
+ ** \brief This operator= assigns rhs to the current image.
+ */
+ self_type&
+ operator=(DestType& rhs)
+ {
+ return this->exact().assign(rhs);
+ }
+
+ /// Useful to debug.
+ static std::string name()
+ {
+ return "slicing_morpher<" + super_type::name() + ">";
+ }
+
+ };
+
+ /// The specialized version for `const' declared images.
+ template <class SrcType, class Exact>
+ struct slicing_morpher<const SrcType, Exact>
+ : public super_slicing_morpher<typename DecDimensionImage<SrcType>::ret, SrcType, slicing_morpher<const SrcType, Exact> >
+ {
+ /// The type of the object instantiated. piece morpher can be derived.
+ typedef typename image_id<slicing_morpher<const SrcType, Exact> >::exact_type exact_type;
+ typedef slicing_morpher<SrcType, Exact> self_type;
+ typedef typename DecDimensionImage<SrcType>::ret DestType;
+ typedef super_slicing_morpher<DestType, SrcType, slicing_morpher<const SrcType, Exact> > super_type;
+
+ typedef oln_value_type(DestType) value_type;
+ typedef oln_point_type(DestType) point_type;
+
+ /*!
+ ** \brief Construct a piece morpher.
+ ** \arg ima The image.
+ ** \arg slice The slice value.
+ */
+ slicing_morpher(const SrcType &ima, coord slice)
+ : super_type(ima, slice)
+ {}
+
+ /// Construct a piece morpher from another one.
+ slicing_morpher(const self_type& r)
+ : super_type(r.get_ima(), r.get_slice())
+ {}
+
+ /*!
+ ** \brief Empty constructor.
+ **
+ ** Needed by mlc_hierarchy::any_with_diamond.
+ */
+ slicing_morpher()
+ {}
+
+ /*!
+ ** \brief Return the stored value at the point.
+ ** \arg p The point.
+ ** \return The stored value.
+ */
+ const value_type at(const point_type &p) const
+ {
+ typename SrcType::point_type tmp_p(p, slice_);
+ return this->ima_[tmp_p];
+ }
+
+ /// Useful to debug.
+ static std::string name()
+ {
+ return "slicing_morpher<" + super_type::name() + ">";
+ }
+
+ };
+
+ /*!
+ ** \brief Instantiate a temporary read-only slicing morpher.
+ ** \arg ima The image.
+ ** \arg slice The slice.
+ **
+ ** A slice of the image will be viewed.
+ **
+ ** \code
+ ** #include <oln/morpher/slicing_morpher.hh>
+ ** #include <oln/basics2d.hh>
+ ** #include <ntg/all.hh>
+ ** int main()
+ ** {
+ ** oln::image2d<ntg::rgb_8> imc = oln::load(IMG_IN "lena.ppm");
+ ** oln::save(oln::morpher::slicing_morph(imc, 5),
+ ** IMG_OUT "oln_morpher_slicing_morpher.pgm");
+ ** }
+ ** \endcode
+ ** \image html lena_ppm.png
+ ** \image latex lena_ppm.png
+ ** =>
+ ** \image html oln_morpher_slicing_morpher.png
+ ** \image latex oln_morpher_slicing_morpher.png
+ */
+ template <class I>
+ const slicing_morpher<I> slicing_morph(I &ima, coord slice)
+ {
+ return slicing_morpher<I>(ima, slice);
+ }
+
+ } // end of morpher namespace
+
+} // end of oln namespace
+
+#endif // !SLICING_MORPHER
--
Simon Odou
simon(a)lrde.epita.fr
3
3
OUPS !!!!
Index: olena/ChangeLog
from Simon Odou <simon(a)lrde.epita.fr>
* oln/morpher/slicing_morpher.hh: Minor fix.
Index: olena/oln/morpher/slicing_morpher.hh
--- olena/oln/morpher/slicing_morpher.hh Mon, 29 Mar 2004 09:33:48 +0200 odou_s (oln/m/42_slicing_mo 1.1 600)
+++ olena/oln/morpher/slicing_morpher.hh Mon, 29 Mar 2004 11:21:41 +0200 odou_s (oln/m/42_slicing_mo 1.1 600)
@@ -85,12 +85,16 @@
/// Return a size of N-1 dimension.
oln::image1d_size* image_size_dec(const oln::image2d_size& image_size)
{
+ // We can't use typedef here because image2d_size and image3d_size don't have
+ // the same number of arguments.
return new oln::image1d_size(image_size.ncols(), image_size.border());
}
/// Return a size of N-1 dimension.
oln::image2d_size* image_size_dec(const oln::image3d_size& image_size)
{
+ // We can't use typedef here because image2d_size and image3d_size don't have
+ // the same number of arguments.
return new oln::image2d_size(image_size.nrows(), image_size.ncols(), image_size.border());
}
@@ -158,6 +162,7 @@
~super_slicing_morpher()
{
delete size_;
+ delete impl_;
}
/*!
--
Simon Odou
simon(a)lrde.epita.fr
3
2
Index: olena/ChangeLog
from Simon Odou <simon(a)lrde.epita.fr>
* olena/oln/core/bkd_iter1d.hh: Fix comments.
* olena/oln/core/bkd_iter2d.hh: Likewise.
* olena/oln/core/bkd_iter3d.hh: Likewise.
* olena/oln/core/fwd_iter1d.hh: Likewise.
* olena/oln/core/fwd_iter2d.hh: Likewise.
* olena/oln/core/fwd_iter3d.hh: Likewise.
* olena/oln/core/abstract/iter1d.hh: Likewise.
* olena/oln/core/abstract/iter2d.hh: Likewise.
* olena/oln/core/abstract/iter3d.hh: Likewise.
* olena/oln/core/abstract/iter.hh: Likewise.
* olena/oln/core/neighborhood1d.hh: Likewise.
* olena/oln/core/neighborhood2d.hh: Likewise.
* olena/oln/core/neighborhood3d.hh: Likewise.
* olena/oln/core/abstract/neighborhood.hh: Likewise.
* olena/oln/core/window1d.hh: Likewise.
* olena/oln/core/window2d.hh: Likewise.
* olena/oln/core/window3d.hh: Likewise.
* olena/oln/core/abstract/window.hh: Likewise.
* olena/oln/core/w_window1d.hh: Likewise.
* olena/oln/core/w_window2d.hh: Likewise.
* olena/oln/core/w_window3d.hh: Likewise.
* olena/oln/core/abstract/w_window.hh: Likewise.
* olena/oln/core/abstract/window_base.hh: Likewise.
* olena/oln/core/abstract/windownd.hh: Likewise.
* olena/oln/core/abstract/w_windownd.hh: Likewise.
* olena/oln/core/abstract/neighborhoodnd.hh: Likewise.
Index: olena/oln/core/bkd_iter1d.hh
--- olena/oln/core/bkd_iter1d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/d/38_bkd_iter1d 1.19 600)
+++ olena/oln/core/bkd_iter1d.hh Mon, 29 Mar 2004 09:42:41 +0200 odou_s (oln/d/38_bkd_iter1d 1.19 600)
@@ -99,7 +99,7 @@
return super_iter_type::operator=(u);
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/bkd_iter2d.hh
--- olena/oln/core/bkd_iter2d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/d/37_bkd_iter2d 1.19 600)
+++ olena/oln/core/bkd_iter2d.hh Mon, 29 Mar 2004 09:42:50 +0200 odou_s (oln/d/37_bkd_iter2d 1.19 600)
@@ -98,7 +98,7 @@
return super_iter_type::operator=(u);
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/bkd_iter3d.hh
--- olena/oln/core/bkd_iter3d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/d/36_bkd_iter3d 1.19 600)
+++ olena/oln/core/bkd_iter3d.hh Mon, 29 Mar 2004 09:42:54 +0200 odou_s (oln/d/36_bkd_iter3d 1.19 600)
@@ -95,7 +95,7 @@
return super_iter_type::operator=(u);
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string name()
{
return std::string("bkd_iter3d<") + Exact::name() + ">";
Index: olena/oln/core/fwd_iter1d.hh
--- olena/oln/core/fwd_iter1d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/d/21_fwd_iter1d 1.16 600)
+++ olena/oln/core/fwd_iter1d.hh Mon, 29 Mar 2004 09:43:10 +0200 odou_s (oln/d/21_fwd_iter1d 1.16 600)
@@ -97,7 +97,7 @@
return super_iter_type::operator=(u);
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/fwd_iter2d.hh
--- olena/oln/core/fwd_iter2d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/d/20_fwd_iter2d 1.16 600)
+++ olena/oln/core/fwd_iter2d.hh Mon, 29 Mar 2004 09:43:14 +0200 odou_s (oln/d/20_fwd_iter2d 1.16 600)
@@ -99,7 +99,7 @@
return super_iter_type::operator=(u);
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/fwd_iter3d.hh
--- olena/oln/core/fwd_iter3d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/d/19_fwd_iter3d 1.16 600)
+++ olena/oln/core/fwd_iter3d.hh Mon, 29 Mar 2004 09:43:19 +0200 odou_s (oln/d/19_fwd_iter3d 1.16 600)
@@ -96,7 +96,7 @@
return super_iter_type::operator=(u);
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/abstract/iter1d.hh
--- olena/oln/core/abstract/iter1d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/d/10_iter1d.hh 1.20 600)
+++ olena/oln/core/abstract/iter1d.hh Mon, 29 Mar 2004 09:38:20 +0200 odou_s (oln/d/10_iter1d.hh 1.20 600)
@@ -88,7 +88,7 @@
return this->p_.col();
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string name()
{
return std::string("_iter1d<") + Exact::name() + ">";
Index: olena/oln/core/abstract/iter2d.hh
--- olena/oln/core/abstract/iter2d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/d/9_iter2d.hh 1.20 600)
+++ olena/oln/core/abstract/iter2d.hh Mon, 29 Mar 2004 09:38:44 +0200 odou_s (oln/d/9_iter2d.hh 1.20 600)
@@ -101,7 +101,7 @@
return this->p_.col();
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string name()
{
return std::string("_iter2d<") + Exact::name() + ">";
Index: olena/oln/core/abstract/iter3d.hh
--- olena/oln/core/abstract/iter3d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/d/8_iter3d.hh 1.20 600)
+++ olena/oln/core/abstract/iter3d.hh Mon, 29 Mar 2004 09:38:42 +0200 odou_s (oln/d/8_iter3d.hh 1.20 600)
@@ -114,7 +114,7 @@
return this->p_.col();
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string name()
{
return std::string("_iter3d<") + Exact::name() + ">";
Index: olena/oln/core/abstract/iter.hh
--- olena/oln/core/abstract/iter.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/c/40_iter.hh 1.22 600)
+++ olena/oln/core/abstract/iter.hh Mon, 29 Mar 2004 09:41:47 +0200 odou_s (oln/c/40_iter.hh 1.22 600)
@@ -358,7 +358,7 @@
return ! this->operator==(e);
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/neighborhood1d.hh
--- olena/oln/core/neighborhood1d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/c/37_neighborho 1.18 600)
+++ olena/oln/core/neighborhood1d.hh Mon, 29 Mar 2004 09:43:37 +0200 odou_s (oln/c/37_neighborho 1.18 600)
@@ -139,7 +139,7 @@
add(dpoint_type(crd[i]));
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/neighborhood2d.hh
--- olena/oln/core/neighborhood2d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/c/36_neighborho 1.19 600)
+++ olena/oln/core/neighborhood2d.hh Mon, 29 Mar 2004 09:43:52 +0200 odou_s (oln/c/36_neighborho 1.19 600)
@@ -159,7 +159,7 @@
return r.assign(*this);
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/neighborhood3d.hh
--- olena/oln/core/neighborhood3d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/c/35_neighborho 1.18 600)
+++ olena/oln/core/neighborhood3d.hh Mon, 29 Mar 2004 09:43:57 +0200 odou_s (oln/c/35_neighborho 1.18 600)
@@ -140,7 +140,7 @@
add(dpoint_type(crd[i], crd[i+1], crd[i+2]));
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/abstract/neighborhood.hh
--- olena/oln/core/abstract/neighborhood.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/c/38_neighborho 1.22 600)
+++ olena/oln/core/abstract/neighborhood.hh Mon, 29 Mar 2004 09:41:46 +0200 odou_s (oln/c/38_neighborho 1.22 600)
@@ -92,7 +92,7 @@
enum { dim = struct_elt_traits<Exact>::dim };
///< Set the dim of the points of the neighborhood.
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/abstract/struct_elt.hh
--- olena/oln/core/abstract/struct_elt.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/c/25_structelt. 1.23 600)
+++ olena/oln/core/abstract/struct_elt.hh Mon, 29 Mar 2004 09:40:38 +0200 odou_s (oln/c/25_structelt. 1.23 600)
@@ -72,7 +72,7 @@
typedef typename struct_elt_traits<Exact>::abstract_type abstract_type;
///< Set the abstract type of hisself.
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/window1d.hh
--- olena/oln/core/window1d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/c/15_window1d.h 1.18 600)
+++ olena/oln/core/window1d.hh Mon, 29 Mar 2004 09:44:51 +0200 odou_s (oln/c/15_window1d.h 1.18 600)
@@ -139,7 +139,7 @@
add(dpoint_type(crd[i]));
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/window2d.hh
--- olena/oln/core/window2d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/c/14_window2d.h 1.20 600)
+++ olena/oln/core/window2d.hh Mon, 29 Mar 2004 09:45:15 +0200 odou_s (oln/c/14_window2d.h 1.20 600)
@@ -160,7 +160,7 @@
return r.assign(*this);
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/window3d.hh
--- olena/oln/core/window3d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/c/13_window3d.h 1.19 600)
+++ olena/oln/core/window3d.hh Mon, 29 Mar 2004 09:45:21 +0200 odou_s (oln/c/13_window3d.h 1.19 600)
@@ -139,7 +139,7 @@
add(dpoint_type(crd[i], crd[i+1], crd[i+2]));
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/abstract/window.hh
--- olena/oln/core/abstract/window.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/c/16_window.hh 1.20 600)
+++ olena/oln/core/abstract/window.hh Mon, 29 Mar 2004 09:40:55 +0200 odou_s (oln/c/16_window.hh 1.20 600)
@@ -73,7 +73,7 @@
friend class struct_elt<exact_type>;
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/w_window1d.hh
--- olena/oln/core/w_window1d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/c/19_w_window1d 1.19 600)
+++ olena/oln/core/w_window1d.hh Mon, 29 Mar 2004 09:44:29 +0200 odou_s (oln/c/19_w_window1d 1.19 600)
@@ -163,7 +163,7 @@
return set(dpoint_type(col), weight);
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/w_window2d.hh
--- olena/oln/core/w_window2d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/c/18_w_window2d 1.6.1.14 600)
+++ olena/oln/core/w_window2d.hh Mon, 29 Mar 2004 09:44:36 +0200 odou_s (oln/c/18_w_window2d 1.6.1.14 600)
@@ -182,7 +182,7 @@
return set(dpoint_type(row, col), weight);
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/w_window3d.hh
--- olena/oln/core/w_window3d.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/c/17_w_window3d 1.19 600)
+++ olena/oln/core/w_window3d.hh Mon, 29 Mar 2004 09:44:42 +0200 odou_s (oln/c/17_w_window3d 1.19 600)
@@ -169,7 +169,7 @@
return set(dpoint_type(slice, row, col), weight);
}
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/abstract/w_window.hh
--- olena/oln/core/abstract/w_window.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/c/20_w_window.h 1.17 600)
+++ olena/oln/core/abstract/w_window.hh Mon, 29 Mar 2004 09:41:12 +0200 odou_s (oln/c/20_w_window.h 1.17 600)
@@ -75,7 +75,7 @@
///< Set the type of weight.
friend class struct_elt<exact_type>;
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/abstract/window_base.hh
--- olena/oln/core/abstract/window_base.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/u/3_window_bas 1.12 600)
+++ olena/oln/core/abstract/window_base.hh Mon, 29 Mar 2004 09:41:45 +0200 odou_s (oln/u/3_window_bas 1.12 600)
@@ -134,7 +134,7 @@
friend class neighborhood<Exact>;
// friend class window_base_friend_traits<Sup>::ret;
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/abstract/windownd.hh
--- olena/oln/core/abstract/windownd.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/u/4_windownd.h 1.10 600)
+++ olena/oln/core/abstract/windownd.hh Mon, 29 Mar 2004 09:42:01 +0200 odou_s (oln/u/4_windownd.h 1.10 600)
@@ -72,7 +72,7 @@
friend class window<exact_type>;
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/abstract/w_windownd.hh
--- olena/oln/core/abstract/w_windownd.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/u/5_w_windownd 1.9 600)
+++ olena/oln/core/abstract/w_windownd.hh Mon, 29 Mar 2004 09:42:12 +0200 odou_s (oln/u/5_w_windownd 1.9 600)
@@ -74,7 +74,7 @@
friend class w_window<exact_type>;
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
Index: olena/oln/core/abstract/neighborhoodnd.hh
--- olena/oln/core/abstract/neighborhoodnd.hh Fri, 19 Mar 2004 18:50:43 +0100 odou_s (oln/u/6_neighborho 1.9 600)
+++ olena/oln/core/abstract/neighborhoodnd.hh Mon, 29 Mar 2004 09:42:28 +0200 odou_s (oln/u/6_neighborho 1.9 600)
@@ -76,7 +76,7 @@
friend class neighborhood<exact_type>;
- ///< Return the name of the type.
+ /// Return the name of the type.
static std::string
name()
{
--
Simon Odou
simon(a)lrde.epita.fr
3
2
Le make check se vautre sur 2 tests dans convol/.
Index: ChangeLog
from Damien Thivolle <damien(a)lrde.epita.fr>
* configure.ac: Add morphers test suite.
Index: olena/ChangeLog
from Damien Thivolle <damien(a)lrde.epita.fr>
* olena/oln/morpher/generic_morpher.hh: Correct code and comments.
* olena/oln/morpher/subq_morpher.hh: Add file. Sub quantify morpher implementation.
* olena/oln/morpher/color_morpher.hh: Add file. Color morpher implementation.
* olena/tests/morpher/Makefile.am: Add file. Morphers test suite.
* olena/tests/morpher/tests/sq_morph_8: Add file.
* olena/tests/morpher/tests/sq_morph_7: Likewise.
* olena/tests/morpher/tests/sq_morph_6: Likewise.
* olena/tests/morpher/tests/sq_morph_5: Likewise.
* olena/tests/morpher/tests/sq_morph_4: Likewise.
* olena/tests/morpher/tests/sq_morph_3: Likewise.
* olena/tests/morpher/tests/sq_morph_2: Likewise.
* olena/tests/morpher/tests/sq_morph_1: Likewise.
* olena/tests/morpher/tests/rmorph: Likewise.
* olena/tests/morpher/tests/gmorph: Likewise.
* olena/tests/morpher/tests/color_sq_morph: Likewise.
* olena/tests/morpher/tests/bmorph: Likewise.
Index: configure.ac
--- configure.ac Mon, 08 Mar 2004 08:12:15 +0100 palma_g (oln/3_configure. 1.47.1.1.1.1.1.4.1.15.1.15 640)
+++ configure.ac Sun, 28 Mar 2004 21:28:53 +0200 thivol_d (oln/3_configure. 1.47.1.1.1.1.1.4.1.15.1.15 640)
@@ -141,6 +141,7 @@
OLN_TESTS([topo])
OLN_TESTS([transforms])
OLN_TESTS([utils])
+ OLN_TESTS([morpher])
AC_SUBST([OLN_TESTS_SUBDIRS])
Index: olena/oln/morpher/generic_morpher.hh
--- olena/oln/morpher/generic_morpher.hh Fri, 26 Mar 2004 12:53:24 +0100 thivol_d (oln/m/18_generic_mo 1.2 600)
+++ olena/oln/morpher/generic_morpher.hh Sun, 28 Mar 2004 23:11:19 +0200 thivol_d (oln/m/18_generic_mo 1.2 600)
@@ -38,11 +38,17 @@
namespace oln {
- /// Contain all the morpher relative declarations and functions.
+ /*! \namespace oln::morpher
+ **
+ ** Contain all the morpher relative declarations and functions.
+ */
namespace morpher {
- ///Implementation of oln::abstract::generic_morpher.
+ /*! \namespace oln::morpher::abstract
+ **
+ ** Implementation of oln::abstract::generic_morpher.
+ */
namespace abstract {
@@ -109,21 +115,32 @@
public:
- /// Type of the decorated image.
- typedef SrcType deco_type;
- typedef oln_point_type(SrcType) point_type;
- typedef oln_dpoint_type(SrcType) dpoint_type;
- typedef oln_iter_type(SrcType) iter_type;
- typedef oln_fwd_iter_type(SrcType) fwd_iter_type;
- typedef oln_bkd_iter_type(SrcType) bkd_iter_type;
- typedef oln_value_type(SrcType) value_type;
- typedef oln_size_type(SrcType) size_type;
+ typedef generic_morpher<DestType, SrcType, Exact> self_type;
+ typedef Exact exact_type;
+ typedef oln_point_type(DestType) point_type;
+ typedef oln_dpoint_type(DestType) dpoint_type;
+ typedef oln_iter_type(DestType) iter_type;
+ typedef oln_fwd_iter_type(DestType) fwd_iter_type;
+ typedef oln_bkd_iter_type(DestType) bkd_iter_type;
+ typedef oln_value_type(DestType) value_type;
+ typedef oln_size_type(DestType) size_type;
+ typedef oln_impl_type(DestType) impl_type;
+
+ /// Type of the decorated image.
+ typedef SrcType src_self_type;
+ typedef oln_point_type(SrcType) src_point_type;
+ typedef oln_dpoint_type(SrcType) src_dpoint_type;
+ typedef oln_iter_type(SrcType) src_iter_type;
+ typedef oln_fwd_iter_type(SrcType) src_fwd_iter_type;
+ typedef oln_bkd_iter_type(SrcType) src_bkd_iter_type;
+ typedef oln_value_type(SrcType) src_value_type;
+ typedef oln_size_type(SrcType) src_size_type;
/// Underlying implementation of the decorated image.
- typedef oln_impl_type(SrcType) impl_type;
+ typedef oln_impl_type(SrcType) src_impl_type;
/// Exact type of the decorated image.
- typedef SrcType image_type;
+ typedef oln_exact_type(SrcType) src_exact_type;
typedef typename gm_inherit<DestType, Exact>::ret super_type;
@@ -138,31 +155,31 @@
**
** Return the value stored at \a p in the decorated image.
*/
- const value_type
- at(const point_type& p) const
+ const src_value_type
+ at(const src_point_type& p) const
{
return to_exact(ima_).at(p);
}
- /*! Defaults implementation of at.
+ /*! Default implementation of at.
**
** Return a reference to the value stored at \a p in the decorated image.
*/
- value_type&
- at(const point_type& p)
+ src_value_type&
+ at(const src_point_type& p)
{
return to_exact(ima_).at(p);
}
/// Default implementation of impl.
- const impl_type*
+ const src_impl_type*
impl() const
{
return to_exact(ima_).impl();
}
/// Default implementation of impl.
- impl_type*
+ src_impl_type*
impl()
{
return to_exact(ima_).impl();
@@ -172,7 +189,7 @@
**
** Return a copy of the decorated image.
*/
- image_type
+ src_self_type
clone_() const
{
return to_exact(ima_).clone_();
@@ -192,22 +209,12 @@
**
** Assign \a rhs to the decorated image.
*/
- image_type&
- assign(deco_type& rhs)
+ src_self_type&
+ assign(src_self_type& rhs)
{
return to_exact(ima_).assign(rhs);
}
- /*! Default implementation of operator=.
- **
- ** Assign the decorated image to \a r.
- */
- deco_type&
- operator=(const oln::io::internal::anything& r)
- {
- return r.assign(ima_);
- }
-
/*! Default implementation of border_set_width.
**
** Set the border width of the decorated image to
@@ -220,13 +227,17 @@
return to_exact(ima_).border_set_width(min_border, copy_border);
}
+ self_type& operator=(self_type& rhs)
+ {
+ return to_exact(*this).assign(rhs.exact());
+ }
+
static std::string
name()
{
return "generic_morpher<" + super_type::name() + ">";
}
-
};
} // end of namespace abstract
Index: olena/oln/morpher/subq_morpher.hh
--- olena/oln/morpher/subq_morpher.hh Mon, 29 Mar 2004 00:36:08 +0200 thivol_d ()
+++ olena/oln/morpher/subq_morpher.hh Sun, 28 Mar 2004 23:58:11 +0200 thivol_d (oln/m/25_subq_morph 644)
@@ -0,0 +1,214 @@
+// Copyright (C) 2004 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 59 Temple Place - Suite 330, 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 SUBQ_MORPHER_HH
+# define SUBQ_MORPHER_HH
+
+# include "generic_morpher.hh"
+
+namespace oln {
+
+ namespace morpher {
+
+ template <class SrcType, unsigned N, class Exact = mlc::final>
+ struct subq_morpher;
+ } // end of namespace morpher
+
+ /// Retrieve types and dimension of the subq_morpher.
+ template <class SrcType, unsigned N, class Exact>
+ struct image_id<oln::morpher::subq_morpher<SrcType, N, Exact> >
+ {
+ enum {dim = SrcType::dim};
+ typedef oln_impl_type(SrcType) impl_type;
+ typedef typename ntg::color<3, N, ntg::rgb_traits> value_type;
+ typedef typename mlc::exact_vt<oln::morpher::subq_morpher<SrcType, N, Exact>,
+ Exact>::ret exact_type;
+ };
+
+ /// Specialized version for subq_morpher.
+ template <class SrcType, unsigned N, class Exact>
+ struct image_traits <oln::morpher::subq_morpher<SrcType, N, Exact> > :
+ public image_traits<abstract::image_with_impl<oln_impl_type(SrcType),
+ oln::morpher::subq_morpher<SrcType, N, Exact> > >
+ {
+ };
+
+ namespace morpher {
+
+
+ /*! Change the color depth of \a T.
+ **
+ ** For Example, calling color_mute with
+ ** color<3, 8, rgb_traits>, 5 will give
+ ** the type : color<3, 5, rgb_traits>.
+ */
+
+ template <class T, unsigned N>
+ struct color_mute
+ {
+ };
+
+ /// Specialized version for ntg::color.
+ template <unsigned nbcomps_,
+ unsigned nbits_,
+ template <unsigned> class color_system,
+ unsigned N>
+ struct color_mute<ntg::color<nbcomps_, nbits_, color_system>, N>
+ {
+ typedef ntg::color<nbcomps_, N, color_system> ret;
+ enum { nbcomps = nbcomps_ };
+ enum { nbits = nbits_ };
+ };
+
+
+
+ /*! \brief Sub quantify an image.
+ **
+ ** By using this class, an image can be viewed
+ ** as an image with a lower color depth.
+ ** subq_morpher<image2d<rgb_8>, 5> is
+ ** the same as image2d<rgb_5>.
+ */
+ template <class SrcType, unsigned N, class Exact>
+ struct subq_morpher:
+ public abstract::generic_morpher<
+ typename oln::mute<SrcType,
+ typename color_mute<oln_value_type(SrcType),
+ N>::ret>::ret ,
+ SrcType,
+ subq_morpher<SrcType, N, Exact> >
+ {
+
+ // super_type
+ typedef abstract::generic_morpher<
+ typename oln::mute<SrcType,
+ typename color_mute<oln_value_type(SrcType),
+ N>::ret>::ret,
+ SrcType,
+ subq_morpher<SrcType, N, Exact> > super_type;
+
+ /// The exact type of \a this. This class can be derived.
+ typedef typename oln::image_id<subq_morpher<SrcType, N, Exact> >::exact_type exact_type;
+
+ /// The type of the resulting image.
+ typedef typename oln::mute<SrcType,
+ typename color_mute<oln_value_type(SrcType),
+ N>::ret>::ret DestType;
+
+ typedef subq_morpher<SrcType, N, Exact> self_type;
+
+ /// The value point of the resulting image.
+ typedef typename color_mute<oln_value_type(SrcType), N>::ret value_type;
+ typedef oln_point_type(SrcType) point_type;
+ typedef oln_fwd_iter_type(SrcType) fwd_iter_type;
+ typedef oln_bkd_iter_type(SrcType) bkd_iter_type;
+ typedef oln_iter_type(SrcType) iter_type;
+ typedef oln_size_type(SrcType) size_type;
+ typedef oln_impl_type(SrcType) impl_type;
+ enum { nbcomps = color_mute<oln_value_type(SrcType), N>::nbcomps };
+
+ /// Construct the morpher with an image.
+ subq_morpher(const SrcType &ima)
+ : super_type(ima) {}
+
+ /// Construct the morpher with another morpher.
+ subq_morpher(const subq_morpher<SrcType, N>& r)
+ : super_type(r.get_ima()) {}
+
+ /*! Empty constructor.
+ **
+ ** Needed by mlc_hierarchy::any_with_diamond.
+ */
+ subq_morpher() {}
+
+ /// Return the value stored at \a p in the resulting image.
+ const value_type at(const point_type& p) const
+ {
+ value_type tmp;
+ unsigned int i;
+
+ for (i = 0; i < nbcomps; i++)
+ {
+ tmp[i] = this->ima_[p][i] / ((ntg_max_val(ntg_comp_type(oln_value_type(SrcType))) + 1)
+ / (ntg_max_val(ntg_comp_type(value_type)) + 1));
+ }
+ return tmp;
+ }
+
+ /// Return the implementation.
+ const impl_type*
+ impl() const
+ {
+ return ima_.impl();
+ }
+
+ static std::string name()
+ {
+ return "subq_morpher<" + SrcType::name() + ">";
+ }
+
+ };
+
+ /*! \brief Instantiate a temporary read-only subq_morpher.
+ **
+ ** \param S Indicate the color depth of the resulting image.
+ ** It can't be higher than the color depth of \a ima.
+ **
+ ** \code
+ ** #include <oln/morpher/subq_morpher.hh>
+ ** #include <oln/basics2d.hh>
+ ** #include <ntg/all.hh>
+ ** int main()
+ ** {
+ ** oln::image2d<ntg::rgb_8> imc = oln::load(IMG_IN "lena.ppm");
+ ** oln::save(oln::morpher::sqmorph<3>(imc),
+ ** IMG_OUT "oln_morpher_subq_morpher.ppm");
+ ** }
+ ** \endcode
+ ** \image html lena_ppm.png
+ ** \image latex lena_ppm.png
+ ** =>
+ ** \image html oln_morpher_subq_morpher.png
+ ** \image latex oln_morpher_subq_morpher.png
+ */
+ template <unsigned S, class I>
+ const subq_morpher<I, S> sqmorph(I &ima)
+ {
+ return subq_morpher<I, S>(ima);
+ }
+
+ } // end of namespace morpher
+
+} // end of namespace morpher
+
+
+
+
+#endif // !SUBQ_MORPHER_HH
+
Index: olena/oln/morpher/color_morpher.hh
--- olena/oln/morpher/color_morpher.hh Mon, 29 Mar 2004 00:36:08 +0200 thivol_d ()
+++ olena/oln/morpher/color_morpher.hh Sun, 28 Mar 2004 23:58:37 +0200 thivol_d (oln/m/26_color_morp 644)
@@ -0,0 +1,384 @@
+// Copyright (C) 2004 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 59 Temple Place - Suite 330, 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 COLOR_MORPHER_HH
+# define COLOR_MORPHER_HH
+
+# include <oln/morpher/generic_morpher.hh>
+
+namespace oln {
+
+ namespace morpher {
+
+ template <class I, class Exact = mlc::final>
+ class color_morpher;
+
+ } // end of namespace morpher
+
+
+ /// Retrieve types and dimension of the color_morpher.
+ template <class I, class Exact>
+ struct image_id<morpher::color_morpher<I, Exact> >
+ {
+ enum {dim = I::dim};
+ typedef oln_impl_type(I) impl_type;
+ typedef ntg_comp_type(oln_value_type(I)) value_type;
+ typedef typename mlc::exact_vt<morpher::color_morpher<I, Exact>,
+ Exact>::ret exact_type;
+ };
+
+ /// Specialized version for color_morpher.
+ template <class I>
+ struct image_traits <morpher::color_morpher<I> > :
+ public image_traits<abstract::image_with_impl<oln_impl_type(I),
+ morpher::color_morpher<I> > >
+ {
+ };
+
+ namespace morpher {
+
+ /// Abstract color_morpher class used for code factorization.
+ template <class DestType, class SrcType, class Exact>
+ class super_color_morpher : public abstract::generic_morpher<DestType, SrcType, Exact>
+ {
+ protected:
+
+ /*! The component to return.
+ **
+ ** If \a n is equal to 0, the red component is returned.
+ ** If \a n is equal to 1, the green component is returned.
+ ** If \a n is equal to 2, the blue component is returned.
+ */
+ unsigned n_;
+
+ /*! Default constructor.
+ **
+ ** \a ima will be the decorated image.
+ ** One can not use this constructor to instantiate this class
+ ** since it is protected.
+ */
+ super_color_morpher(const SrcType &ima, unsigned n) : super_type(ima)
+ {
+ assert(n == ntg::rgb_R || n == ntg::rgb_G || n == ntg::rgb_B);
+ n_ = n;
+ }
+
+ /*! Empty constructor.
+ **
+ ** Needed by mlc_hierarchy::any_with_diamond.
+ */
+ super_color_morpher()
+ {}
+
+ public:
+ typedef abstract::generic_morpher<DestType, SrcType, Exact> super_type;
+ typedef oln_impl_type(SrcType) impl_type;
+
+ /// Return the number of the image component to retrieve.
+ unsigned
+ get_comp() const
+ {
+ return n_;
+ }
+
+ /// Return the image implementation.
+ impl_type*
+ impl()
+ {
+ return ima_.impl();
+ }
+
+ /// Return the image implementation.
+ const impl_type*
+ impl() const
+ {
+ return ima_.impl();
+ }
+
+ static std::string
+ name()
+ {
+ return "super_color_morpher<" + super_type::name() + ">";
+ }
+
+
+ };
+
+ /*! The default color_morpher class.
+ **
+ ** Using this class, an rgb image can be viewed
+ ** according to one of its component.
+ **
+ ** \see oln::morpher::abstract::generic_morpher
+ */
+ template <class SrcType, class Exact>
+ struct color_morpher :
+ public super_color_morpher<typename oln::mute<oln_exact_type(SrcType),
+ ntg_comp_type(oln_value_type(SrcType))>::ret,
+ SrcType,
+ color_morpher<SrcType, Exact> >
+ {
+ /// The type of the object instantiated. color_morpher can be derived.
+ typedef typename image_id<color_morpher<SrcType, Exact> >::exact_type exact_type;
+
+ /// The image will be viewed as a Destype image.
+ typedef typename oln::mute<oln_exact_type(SrcType),
+ ntg_comp_type(oln_value_type(SrcType))>::ret DestType;
+
+ typedef color_morpher<SrcType, Exact> self_type;
+ typedef oln_iter_type(SrcType) iter_type;
+ typedef oln_point_type(SrcType) point_type;
+ typedef oln_fwd_iter_type(SrcType) fwd_iter_type;
+ typedef oln_size_type(SrcType) size_type;
+ typedef ntg_comp_type(oln_value_type(SrcType)) value_type;
+ typedef oln_impl_type(SrcType) impl_type;
+ typedef super_color_morpher<typename oln::mute<oln_exact_type(SrcType),
+ ntg_comp_type(oln_value_type(SrcType))>::ret,
+ SrcType,
+ color_morpher<SrcType, Exact> > super_type;
+
+ /// Construct the color_morpher with an image \a ima and a component \a n.
+ color_morpher(const SrcType &ima, unsigned n) : super_type(ima, n)
+ {}
+
+ /// Construct the color_morpher with another color_morpher.
+ color_morpher(const color_morpher<SrcType, Exact>& r) : super_type(r.get_ima(), r.get_comp())
+ {}
+
+ /*! Empty constructor.
+ **
+ ** Needed by mlc_hierarchy::any_with_diamond.
+ */
+ color_morpher()
+ {}
+
+ /*! Return a reference to the \a n_th component of the
+ ** rgb value stored at \a p.
+ */
+ value_type&
+ at(const point_type& p)
+ {
+ return const_cast<SrcType &>(this->ima_)[p][this->n_];
+ }
+
+ /// Return the \a n_th component of the rgb value stored at \a p.
+ const value_type
+ at(const point_type& p) const
+ {
+ return this->ima_[p][this->n_];
+ }
+
+ /*! Perform a shallow copy from the decorated image of \a rhs
+ ** to the current decorated image. The points will be shared
+ ** by the two images.
+ */
+ self_type&
+ assign(self_type& rhs)
+ {
+ oln_iter_type(SrcType) it(rhs);
+
+ for_all(it)
+ this->at(it) = rhs[it];
+ return this->exact();
+ }
+
+ /*! Perform a shallow from \a rhs to the current decorated
+ ** image. The points will be shared by the two images.
+ */
+ self_type&
+ assign(DestType& rhs)
+ {
+ oln_iter_type(SrcType) it(rhs);
+
+ for_all(it)
+ this->at(it) = rhs[it];
+ return this->exact();
+ }
+
+ /*! This operator= assigns rhs to the current image.
+ **
+ ** \todo FIXME: This operator= doesn't work if declared in
+ ** the generic_morpher.
+ */
+ self_type&
+ operator=(DestType& rhs)
+ {
+ return this->exact().assign(rhs);
+ }
+
+ static std::string
+ name()
+ {
+ return "color_morpher<" + SrcType::name() + ">";
+ }
+
+ };
+
+ /// The specialized version for `const' declared images.
+ template <class SrcType, class Exact>
+ struct color_morpher<const SrcType, Exact> :
+ public super_color_morpher<typename oln::mute<oln_exact_type(SrcType),
+ ntg_comp_type(oln_value_type(SrcType))>::ret,
+ SrcType,
+ color_morpher<const SrcType, Exact> >
+ {
+ /// The type of the object instantiated. color_morpher can be derived.
+ typedef typename image_id<color_morpher<SrcType, Exact> >::exact_type exact_type;
+
+ typedef oln_point_type(SrcType) point_type;
+ typedef oln_fwd_iter_type(SrcType) fwd_iter_type;
+ typedef oln_size_type(SrcType) size_type;
+ typedef ntg_comp_type(oln_value_type(SrcType)) value_type;
+ typedef oln_impl_type(SrcType) impl_type;
+
+ typedef super_color_morpher<typename oln::mute<oln_exact_type(SrcType),
+ ntg_comp_type(oln_value_type(SrcType))>::ret,
+ SrcType,
+ color_morpher<const SrcType, Exact> > super_type;
+
+ /// Construct the color_morpher with an image \a ima and a component \a n.
+ color_morpher(const SrcType &ima, unsigned n) : super_type(ima, n)
+ {}
+
+ /// Construct the color_morpher with another color_morpher.
+ color_morpher(const color_morpher<const SrcType, Exact>& r) :
+ super_type(r.get_ima(), r.get_comp())
+ {}
+
+ /*! Empty constructor.
+ **
+ ** Needed by mlc_hierarchy::any_with_diamond.
+ */
+ color_morpher()
+ {}
+
+ /// Return the \a n_th component of the rgb value stored at \a p.
+ const value_type
+ at(const point_type& p) const
+ {
+ return this->ima_[p][this->n_];
+ }
+
+ static std::string
+ name()
+ {
+ return "color_morpher<" + SrcType::name() + ">";
+ }
+
+ };
+
+
+ /*! \brief Instantiate a temporary read-only
+ ** color_morpher.
+ **
+ ** The image will be viewed according to its red layer.
+ **
+ ** \code
+ ** #include <oln/morpher/color_morpher.hh>
+ ** #include <oln/basics2d.hh>
+ ** #include <ntg/all.hh>
+ ** int main()
+ ** {
+ ** oln::image2d<ntg::rgb_8> imc = oln::load(IMG_IN "lena.ppm");
+ ** oln::save(oln::morpher::rmorph(imc),
+ ** IMG_OUT "oln_morpher_red_morpher.pgm");
+ ** }
+ ** \endcode
+ ** \image html lena_ppm.png
+ ** \image latex lena_ppm.png
+ ** =>
+ ** \image html oln_morpher_red_morpher.png
+ ** \image latex oln_morpher_red_morpher.png
+ */
+ template <class I>
+ const color_morpher<I> rmorph(I &ima)
+ {
+ return color_morpher<I>(ima, ntg::rgb_R);
+ }
+
+ /*! \brief Instantiate a temporary read-only
+ ** color_morpher.
+ **
+ ** The image will be viewed according to its green layer.
+ **
+ ** \code
+ ** #include <oln/morpher/color_morpher.hh>
+ ** #include <oln/basics2d.hh>
+ ** #include <ntg/all.hh>
+ ** int main()
+ ** {
+ ** oln::image2d<ntg::rgb_8> imc = oln::load(IMG_IN "lena.ppm");
+ ** oln::save(oln::morpher::gmorph(imc),
+ ** IMG_OUT "oln_morpher_green_morpher.pgm");
+ ** }
+ ** \endcode
+ ** \image html lena_ppm.png
+ ** \image latex lena_ppm.png
+ ** =>
+ ** \image html oln_morpher_green_morpher.png
+ ** \image latex oln_morpher_green_morpher.png
+ */
+ template <class I>
+ const color_morpher<I> gmorph(I &ima)
+ {
+ return color_morpher<I>(ima, ntg::rgb_G);
+ }
+
+ /*! \brief Instantiate a temporary read-only
+ ** color_morpher.
+ **
+ ** The image will be viewed according to its blue layer.
+ **
+ ** \code
+ ** #include <oln/morpher/color_morpher.hh>
+ ** #include <oln/basics2d.hh>
+ ** #include <ntg/all.hh>
+ ** int main()
+ ** {
+ ** oln::image2d<ntg::rgb_8> imc = oln::load(IMG_IN "lena.ppm");
+ ** oln::save(oln::morpher::bmorph(imc),
+ ** IMG_OUT "oln_morpher_blue_morpher.pgm");
+ ** }
+ ** \endcode
+ ** \image html lena_ppm.png
+ ** \image latex lena_ppm.png
+ ** =>
+ ** \image html oln_morpher_blue_morpher.png
+ ** \image latex oln_morpher_blue_morpher.png
+ */
+ template <class I>
+ const color_morpher<I> bmorph(I &ima)
+ {
+ return color_morpher<I>(ima, ntg::rgb_B);
+ }
+
+ } // end of namespace morpher
+
+} // end of namespace oln
+
+#endif // !COLOR_MORPHER_HH
Index: olena/tests/morpher/Makefile.am
--- olena/tests/morpher/Makefile.am Mon, 29 Mar 2004 00:36:08 +0200 thivol_d ()
+++ olena/tests/morpher/Makefile.am Sun, 28 Mar 2004 19:31:40 +0200 thivol_d (oln/m/27_Makefile.a 644)
@@ -0,0 +1 @@
+include ../check/Makefile.runtests
Index: olena/tests/morpher/tests/sq_morph_8
--- olena/tests/morpher/tests/sq_morph_8 Mon, 29 Mar 2004 00:36:08 +0200 thivol_d ()
+++ olena/tests/morpher/tests/sq_morph_8 Sun, 28 Mar 2004 20:15:14 +0200 thivol_d (oln/m/28_sq_morph_8 644)
@@ -0,0 +1,29 @@
+// -*- c++ -*-
+#include <oln/morpher/subq_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c[16]
+ = {0x47, 0xa5, 0xb6, 0xa2, 0xc8, 0xf1, 0x4d, 0xb8,
+ 0x90, 0x67, 0xaa, 0x19, 0x3d, 0x43, 0xb6, 0xe0};
+
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<8>(imc)) != oln::utils::key(data_key_c));
+
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
+
Index: olena/tests/morpher/tests/sq_morph_7
--- olena/tests/morpher/tests/sq_morph_7 Mon, 29 Mar 2004 00:36:08 +0200 thivol_d ()
+++ olena/tests/morpher/tests/sq_morph_7 Sun, 28 Mar 2004 20:20:08 +0200 thivol_d (oln/m/29_sq_morph_7 644)
@@ -0,0 +1,29 @@
+// -*- c++ -*-
+#include <oln/morpher/subq_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c[16]
+ = {0x62, 0xa7, 0x2a, 0x3e, 0xe, 0x39, 0xda, 0x93,
+ 0x62, 0x59, 0x15, 0xe6, 0x60, 0x12, 0x8a, 0xc2};
+
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<7>(imc)) != oln::utils::key(data_key_c));
+
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
+
Index: olena/tests/morpher/tests/sq_morph_6
--- olena/tests/morpher/tests/sq_morph_6 Mon, 29 Mar 2004 00:36:08 +0200 thivol_d ()
+++ olena/tests/morpher/tests/sq_morph_6 Sun, 28 Mar 2004 20:21:51 +0200 thivol_d (oln/m/30_sq_morph_6 644)
@@ -0,0 +1,29 @@
+// -*- c++ -*-
+#include <oln/morpher/subq_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c[16]
+ = {0xc3, 0x7e, 0x14, 0xc7, 0x5d, 0xfc, 0xa7, 0xd9,
+ 0xc, 0xd7, 0x29, 0xa5, 0x84, 0x41, 0xfd, 0x12};
+
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<6>(imc)) != oln::utils::key(data_key_c));
+
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
+
Index: olena/tests/morpher/tests/sq_morph_5
--- olena/tests/morpher/tests/sq_morph_5 Mon, 29 Mar 2004 00:36:08 +0200 thivol_d ()
+++ olena/tests/morpher/tests/sq_morph_5 Sun, 28 Mar 2004 20:23:01 +0200 thivol_d (oln/m/31_sq_morph_5 644)
@@ -0,0 +1,29 @@
+// -*- c++ -*-
+#include <oln/morpher/subq_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c[16]
+ = {0x90, 0xe5, 0x71, 0x6b, 0x7e, 0x15, 0x51, 0x16,
+ 0x43, 0x43, 0xa6, 0x81, 0x9e, 0x48, 0x88, 0xea};
+
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<5>(imc)) != oln::utils::key(data_key_c));
+
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
+
Index: olena/tests/morpher/tests/sq_morph_4
--- olena/tests/morpher/tests/sq_morph_4 Mon, 29 Mar 2004 00:36:08 +0200 thivol_d ()
+++ olena/tests/morpher/tests/sq_morph_4 Sun, 28 Mar 2004 20:24:05 +0200 thivol_d (oln/m/32_sq_morph_4 644)
@@ -0,0 +1,29 @@
+// -*- c++ -*-
+#include <oln/morpher/subq_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c[16]
+ = {0xcf, 0x42, 0xc, 0x2f, 0xcb, 0x8e, 0x2a, 0x36,
+ 0xb9, 0x53, 0xcc, 0x42, 0xfc, 0x54, 0x27, 0x82};
+
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<4>(imc)) != oln::utils::key(data_key_c));
+
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
+
Index: olena/tests/morpher/tests/sq_morph_3
--- olena/tests/morpher/tests/sq_morph_3 Mon, 29 Mar 2004 00:36:08 +0200 thivol_d ()
+++ olena/tests/morpher/tests/sq_morph_3 Sun, 28 Mar 2004 20:46:05 +0200 thivol_d (oln/m/33_sq_morph_3 644)
@@ -0,0 +1,29 @@
+// -*- c++ -*-
+#include <oln/morpher/subq_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c[16]
+ = {0xd1, 0xcc, 0xe6, 0x1f, 0xec, 0x26, 0x2b, 0xfd,
+ 0x2b, 0x9c, 0xea, 0x59, 0x35, 0x76, 0x64, 0x8};
+
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<3>(imc)) != oln::utils::key(data_key_c));
+
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
+
Index: olena/tests/morpher/tests/sq_morph_2
--- olena/tests/morpher/tests/sq_morph_2 Mon, 29 Mar 2004 00:36:08 +0200 thivol_d ()
+++ olena/tests/morpher/tests/sq_morph_2 Sun, 28 Mar 2004 20:47:22 +0200 thivol_d (oln/m/34_sq_morph_2 644)
@@ -0,0 +1,29 @@
+// -*- c++ -*-
+#include <oln/morpher/subq_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c[16]
+ = {0x4, 0x58, 0x8b, 0x60, 0x31, 0x5b, 0x33, 0x4e,
+ 0xac, 0xad, 0x85, 0x18, 0x6, 0x25, 0xb6, 0x36};
+
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<2>(imc)) != oln::utils::key(data_key_c));
+
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
+
Index: olena/tests/morpher/tests/sq_morph_1
--- olena/tests/morpher/tests/sq_morph_1 Mon, 29 Mar 2004 00:36:08 +0200 thivol_d ()
+++ olena/tests/morpher/tests/sq_morph_1 Sun, 28 Mar 2004 20:49:46 +0200 thivol_d (oln/m/35_sq_morph_1 644)
@@ -0,0 +1,29 @@
+// -*- c++ -*-
+#include <oln/morpher/subq_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c[16]
+ = {0xae, 0xb0, 0x65, 0x65, 0xdd, 0x28, 0x5a, 0xc6,
+ 0x8a, 0x17, 0x7e, 0xd, 0xe5, 0xe6, 0x4f, 0x1d};
+
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+
+ fail = fail | (oln::utils::md5(oln::morpher::sqmorph<1>(imc)) != oln::utils::key(data_key_c));
+
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
+
Index: olena/tests/morpher/tests/rmorph
--- olena/tests/morpher/tests/rmorph Mon, 29 Mar 2004 00:36:08 +0200 thivol_d ()
+++ olena/tests/morpher/tests/rmorph Sun, 28 Mar 2004 19:57:25 +0200 thivol_d (oln/m/36_rmorph 644)
@@ -0,0 +1,28 @@
+// -*- c++ -*-
+#include <oln/morpher/color_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c[16]
+ = {0xe1, 0x5, 0x51, 0x40, 0xea, 0xa, 0x13, 0x96,
+ 0xc7, 0xa6, 0x62, 0x2c, 0xfa, 0xe4, 0x53, 0x8e};
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+
+ fail = fail | (oln::utils::md5(oln::morpher::rmorph(imc)) != oln::utils::key(data_key_c));
+
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
+
Index: olena/tests/morpher/tests/gmorph
--- olena/tests/morpher/tests/gmorph Mon, 29 Mar 2004 00:36:08 +0200 thivol_d ()
+++ olena/tests/morpher/tests/gmorph Sun, 28 Mar 2004 19:59:36 +0200 thivol_d (oln/m/37_gmorph 644)
@@ -0,0 +1,29 @@
+// -*- c++ -*-
+#include <oln/morpher/color_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c[16]
+ = {0x50, 0x36, 0xf3, 0xb3, 0x56, 0x66, 0x18, 0xbc,
+ 0x7a, 0x12, 0x36, 0x75, 0xc, 0x7f, 0xc6, 0xf4};
+
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+
+ fail = fail | (oln::utils::md5(oln::morpher::gmorph(imc)) != oln::utils::key(data_key_c));
+
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
+
Index: olena/tests/morpher/tests/color_sq_morph
--- olena/tests/morpher/tests/color_sq_morph Mon, 29 Mar 2004 00:36:08 +0200 thivol_d ()
+++ olena/tests/morpher/tests/color_sq_morph Sun, 28 Mar 2004 20:57:30 +0200 thivol_d (oln/m/38_color_sq_m 644)
@@ -0,0 +1,30 @@
+// -*- c++ -*-
+#include <oln/morpher/color_morpher.hh>
+#include <oln/morpher/subq_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c[16]
+ = {0x18, 0x25, 0x3a, 0xc8, 0x64, 0xbd, 0x38, 0xa8,
+ 0x57, 0x24, 0x7d, 0x0, 0x62, 0xa9, 0xd1, 0x8d};
+
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+
+ fail = fail | (oln::utils::md5(oln::morpher::rmorph(oln::morpher::sqmorph<7>(imc))) != oln::utils::key(data_key_c));
+
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
+
Index: olena/tests/morpher/tests/bmorph
--- olena/tests/morpher/tests/bmorph Mon, 29 Mar 2004 00:36:08 +0200 thivol_d ()
+++ olena/tests/morpher/tests/bmorph Sun, 28 Mar 2004 20:02:06 +0200 thivol_d (oln/m/39_bmorph 644)
@@ -0,0 +1,29 @@
+// -*- c++ -*-
+#include <oln/morpher/color_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+ bool fail (false);
+ oln::utils::key::value_type data_key_c[16]
+ = {0x7, 0x8e, 0x3, 0xaa, 0x45, 0xce, 0x38, 0x62,
+ 0xf9, 0x1d, 0xb7, 0x9f, 0x56, 0x1c, 0x52, 0x2d};
+
+ oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+
+ fail = fail | (oln::utils::md5(oln::morpher::bmorph(imc)) != oln::utils::key(data_key_c));
+
+ if (!fail)
+ std::cout << "OK" << std::endl;
+ else
+ {
+ std::cout << "FAIL" << std::endl;
+ return true;
+ }
+}
+
--
Damien Thivolle
damien.thivolle(a)lrde.epita.fr
3
2