Olena-patches
  Threads by month 
                
            - ----- 2025 -----
- 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
June 2010
- 9 participants
- 276 discussions
 
                        
                    23 Jun '10
                    
                        	* mln/io/plot/save_image_sh.hh: New header file.
	Give an example of code.
	* use/io/plot/save_image_sh: New directory.
	* use/io/plot/save_image_sh/Makefile.am: New makefile.
	* use/io/plot/save_image_sh/save_image_sh.cc: New source file.
	Make some unitary tests on gnuplot shell export.
	* tests/io/plot/save_image_sh: New directory.
	* tests/io/plot/save_image_sh/Makefile.am: New makefile.
	* tests/io/plot/save_image_sh/save_image_sh.cc: New source file.
---
 scribo/sandbox/green/ChangeLog                     |   18 ++
 scribo/sandbox/green/README                        |   52 ++---
 scribo/sandbox/green/mln/io/plot/save_image_sh.hh  |   36 +++-
 .../green/tests/io/plot/save_image_sh/Makefile.am  |   13 +-
 .../tests/io/plot/save_image_sh/save_image_sh.cc   |  284 ++++++++++++++------
 .../histo1d => io/plot/save_image_sh}/Makefile.am  |    0 
 .../plot/save_image_sh/save_image_sh.cc}           |    4 +-
 7 files changed, 284 insertions(+), 123 deletions(-)
 copy scribo/sandbox/green/use/{accu/stat/histo1d => io/plot/save_image_sh}/Makefile.am (100%)
 copy scribo/sandbox/green/use/{accu/stat/histo1d/histo1d.cc => io/plot/save_image_sh/save_image_sh.cc} (91%)
diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog
index 58b5379..dc5284e 100644
--- a/scribo/sandbox/green/ChangeLog
+++ b/scribo/sandbox/green/ChangeLog
@@ -1,3 +1,21 @@
+2010-06-23  green  <jacquelet(a)lrde.epita.fr>
+
+	Define gnuplot shell export format.
+
+	* mln/io/plot/save_image_sh.hh: New header file.
+
+	Give an example of code.
+
+	* use/io/plot/save_image_sh: New directory.
+	* use/io/plot/save_image_sh/Makefile.am: New makefile.
+	* use/io/plot/save_image_sh/save_image_sh.cc: New source file.
+
+	Make some unitary tests on gnuplot shell export.
+
+	* tests/io/plot/save_image_sh: New directory.
+	* tests/io/plot/save_image_sh/Makefile.am: New makefile.
+	* tests/io/plot/save_image_sh/save_image_sh.cc: New source file.
+
 2010-06-21  Yann Jacquelet  <jacquelet(a)lrde.epita.fr>
 
 	Define accumulator which computes histogram view as image.
diff --git a/scribo/sandbox/green/README b/scribo/sandbox/green/README
index 4b6fb26..03106d3 100644
--- a/scribo/sandbox/green/README
+++ b/scribo/sandbox/green/README
@@ -153,8 +153,8 @@ d'exécution (chmod 755 gnuplot_shell_file.sh). Comme je trouve le format
 extrêmement pratique, il se retrouve preque partout dans mes sources.
 
 
-V HISTOGRAMMES
---------------
+VI HISTOGRAMMES
+---------------
 
 Un des travaux demandés par théo est la réalisation d'une librairie
 d'histogramme permettant de fournir un résultat sous forme d'image.
@@ -173,7 +173,7 @@ a) version 1d
 
 * mln/accu/stat/histo1d.hh: Accumulateur histogramme image1d.
 * use/accu/stat/histo1d: Code minimal utilisant un histogramme 1d.
-* tests/accu/stat/histo1d: Test unitaire sur l'histogramme 1d.
+* tests/accu/stat/histo1d: Tests unitaires sur l'histogramme 1d.
 
 
 b) version 2d
@@ -203,52 +203,42 @@ d) version 3d HSL
 
 * mln/accu/stat/histo3d_hsl.hh: Accumulateur histogramme image3d HSL.
 * use/accu/stat/histo3_hsl: Code minimal utilisant un histogramme 3d HSL.
-* tests/accu/stat/histo3d_hsl: Test unitaire sur l'histogramme HSL 3d.
+* tests/accu/stat/histo3d_hsl: Tests unitaires sur l'histogramme HSL 3d.
 
 Le code HSL ne compile plus car l'interface liant la transformation du
 domaine et la fonction fold a changée. Je n'ai pas le temps de
 regarder plus avant.
 
 
+VII SAUVEGARDE FORMAT GNUPLOT SHELL
+-----------------------------------
 
-V MLN
------
-
-a) La sauvegarde des images au format gnuplot shell
-
-* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
-
-to do ...
-
-
-
-b) Les histogrammes
-
-
-
-
-
-
-
+Ce travail est personnel. Ces développements m'ont été tellement
+utiles que je ne regrette pas l'investissement effectué. L'idée est de
+pouvoir avoir un format d'image en écriture lisible. J'ai pris celui
+de gnuplot, ce qui permet en plus de pouvoir "sucrer" la présentation
+des données à loisir. Les images sont plus lourdes car le codage est
+textuel et un peu plus "verbose" mais se compresse aisément par
+n'importe quel algorithme type huffman (tous les archiveurs en possède un).
 
+* mln/io/plot/save_image_sh.hh: Librairie de sauvegarde au format gnuplot shell.
+* use/io/plot/save_image_sh: Code simple d'utilisation de la sauvegarde.
+* tests/io/plot/save_image_sh: Tests unitaires sur l'export.
 
-* tests/accu/stat/histo1d
 
 
+VI MLN
+-----
 
+a) La sauvegarde des images au format gnuplot shell
 
-* tests/accu/stat/histo2d
+* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
 
+to do ...
 
 
-* use/accu/stat/histo3d_rgb
-* tests/accu/stat/histo3d_rgb
 
-* use/accu/stat/histo3d_hsl
-* tests/accu/stat/histo3d_hsl
 
-VI SAUVEGARDE FORMAT GNUPLOT SHELL
-----------------------------------
 
 
 VII VISUALISATION HISTOGRAMMES 3D
diff --git a/scribo/sandbox/green/mln/io/plot/save_image_sh.hh b/scribo/sandbox/green/mln/io/plot/save_image_sh.hh
index 137f78d..7e28f6f 100644
--- a/scribo/sandbox/green/mln/io/plot/save_image_sh.hh
+++ b/scribo/sandbox/green/mln/io/plot/save_image_sh.hh
@@ -38,6 +38,29 @@
 /// The script file call gnuplot in batch mode, the result window persists and
 /// that's all.
 ///
+/// The following sample is a typical use of the gnuplot shell export library.
+///
+/// #include <mln/accu/stat/histo1d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/core/image/image1d.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/pgm/load.hh>
+/// #include <mln/io/plot/save_image_sh.hh>
+/// #include <mln/value/int_u8.hh>
+///
+/// int main()
+/// {
+///   typedef mln::value::int_u8 t_int_u8;
+///   mln::image2d<t_int_u8>     img;
+///   mln::image1d<unsigned>     histo;
+///
+///   mln::io::pgm::load(img, OLENA_IMG_PATH"/lena.pgm");
+///   histo = mln::data::compute(mln::accu::meta::histo::histo1d(), img);
+///   mln::io::plot::save_image_sh(histo, "histo.sh");
+///
+///   return 0;
+/// }
 
 # include <fstream>
 # include <string>
@@ -92,7 +115,6 @@ namespace mln
       /// filename parameter as unix path. The script shell file must have the
       /// permission to execute (chmod 755). Launch the script shell to call
       /// gnuplot in batchmode with fine parameters.
-
       template <typename I>
       bool save_image_sh(const Image<I>& img, const std::string& filename);
 
@@ -112,6 +134,18 @@ namespace mln
       bool save_image_sh(const util::array< image1d<I> >& stack,
 			 const std::string& filename);
 
+      /// \brief Save a stack of stack of image.
+      ///
+      /// This is an experimental support.
+      ///
+      /// \param[in] stack    the stack of image to save.
+      /// \param[in] filename the name of the unix script shell.
+      /// \return             the status of the opening file operation.
+      ///
+      /// The result depends on the permission to save the file with
+      /// filename parameter as unix path. The script shell file must have the
+      /// permission to execute (chmod 755). Launch the script shell to call
+      /// gnuplot in batchmode with fine parameters.
       template <typename I>
       bool save_image_sh(const util::array< util::array< image1d<I> > >& stack,
 			 const std::string& filename);
diff --git a/scribo/sandbox/green/tests/io/plot/save_image_sh/Makefile.am b/scribo/sandbox/green/tests/io/plot/save_image_sh/Makefile.am
index d970989..77f9015 100644
--- a/scribo/sandbox/green/tests/io/plot/save_image_sh/Makefile.am
+++ b/scribo/sandbox/green/tests/io/plot/save_image_sh/Makefile.am
@@ -6,8 +6,13 @@
 # TOOLS #
 #########
 
-INCLUDES=       -I$(HOME)/svn/oln/trunk/milena/sandbox/green
+#LOADLIBES=      -lboost_filesystem
+INCLUDES1=       -I$(HOME)/git/olena/scribo/sandbox/green
+INCLUDES2=       -I$(HOME)/git/olena/milena
+INCLUDES=	$(INCLUDES1) $(INCLUDES2)
 CXXFLAGS=       -ggdb -O0 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+#CXXFLAGS=       -DNDEBUG -O1 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+#CXXFLAGS=       -DNDEBUG -O3 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
 ECHO=           echo
 RM=             rm
 MKDIR=          mkdir -p
@@ -20,10 +25,10 @@ BUILD__PATTERN= green/build/tests
 ifeq ($(findstring $(BUILD__PATTERN),$(PWD)), $(BUILD__PATTERN))
 # Case where make is done from build directory.
 SOURCE_DIR=     $(subst $(BUILD__PATTERN),$(SOURCE_PATTERN),$(PWD))
-BUILD__DIR=     $(PWD)
+BUILD__DIR=     $(PWD)/
 else
 # Case where make is done from source directory.
-SOURCE_DIR=     $(PWD)
+SOURCE_DIR=     $(PWD)/
 BUILD__DIR=     $(subst $(SOURCE_PATTERN),$(BUILD__PATTERN),$(PWD))
 endif
 
@@ -60,7 +65,7 @@ $(BUILD__DIR):
 
 # Copy, if nessary, all the files, except the Makefile.am
 $(BUILD__F_PATH): $(SOURCE_F_PATH)
-	$(CP) $(addprefix $(SOURCE_DIR)/,$(@F)) $@
+	$(CP) $(addprefix $(SOURCE_DIR),$(@F)) $@
 
 # Copy if nessary, the Makefile.am into Makefile
 $(BUILD__M_PATH): $(SOURCE_M_PATH)
diff --git a/scribo/sandbox/green/tests/io/plot/save_image_sh/save_image_sh.cc b/scribo/sandbox/green/tests/io/plot/save_image_sh/save_image_sh.cc
index c9c817b..c60533e 100644
--- a/scribo/sandbox/green/tests/io/plot/save_image_sh/save_image_sh.cc
+++ b/scribo/sandbox/green/tests/io/plot/save_image_sh/save_image_sh.cc
@@ -1,4 +1,36 @@
-/// TEST SAVE_IMAGE_SH.HH
+// Copyright (C) 2007,2008,2009,2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief This source manages unitary testing on gnuplot shell export library.
+///
+/// Tests are performed in various image format, such as image1d, image2d<bool>,
+/// image2d<int_u8>, image2d<int_u16>, image2d<int_s8>, image2d<int_s16>,
+/// image2d<float>, image2d<double>, image2d<rgb8>, image2d<rgb16>,
+/// image2d<hsl_f>, image2d<hsl_d>, image2d<hsi_f>, image2d<hsi_d>, image3d.
 
 #include <iostream>
 #include <limits.h>
@@ -32,9 +64,13 @@
 #include <mln/literal/colors.hh>
 #include <mln/debug/println.hh>
 
-//------------------------------------------------------------------------------
-// TEST TO SAVE UNSIGNED 8 BITS 1D GRAYSCALE IMAGE  
-//------------------------------------------------------------------------------
+
+/// image1d<int_u8>.
+/// \{
+/// \brief Test saving a grayscale image1d.
+///
+/// As working on the image1d interface is something extremely rare, we need
+/// to use the plot interface to first load some datas and then export them.
 
 mln::image1d<mln::value::int_u8>
 convert_array_to_image1d(const mln::util::array<mln::value::int_u8>& array)
@@ -64,7 +100,7 @@ void test_save_image_sh_1d()
 
   image1d img;
   array1d array;
-  
+
   mln::io::plot::load(array, OLENA_IMG_PATH"/fly.plot");
   img = convert_array_to_image1d(array);
 
@@ -73,16 +109,20 @@ void test_save_image_sh_1d()
 
   // Save it where we have the full permissions.
   bool ref_true = mln::io::plot::save_image_sh(img, "fly1d.sh");
-  
+
   mln_assertion(true  == ref_true);
   mln_assertion(false == ref_false);
   std::cout << "save image 1d : ok" << std::endl;
 }
 
-//------------------------------------------------------------------------------
-// Test to save image2d<bool>
-//------------------------------------------------------------------------------
+/// \}
 
+/// image2d<bool>.
+/// \{
+/// \brief Test saving an image2d<bool>.
+///
+/// Boolean image2d are extremly convenient for storing mask. We have a lots
+/// of example in milena.
 
 void test_save_image2d_bool()
 {
@@ -93,22 +133,26 @@ void test_save_image2d_bool()
   image2d_bool img_bool;
 
   mln::io::pbm::load(img_bool, OLENA_IMG_PATH"/lena.pbm");
-  
+
   // Save it were it is impossible to do it !!
   bool ref_false  = mln::io::plot::save_image_sh(img_bool, null_lena);
 
   // Save it where we have the full permissions.
   bool ref_true = mln::io::plot::save_image_sh(img_bool, lena);
-  
+
   mln_assertion(true  == ref_true);
   mln_assertion(false == ref_false);
   std::cout << "save image2d<bool>: ok" << std::endl;
 }
 
-//------------------------------------------------------------------------------
-// Test to save image2d<int_u8>
-//------------------------------------------------------------------------------
+/// \}
 
+/// image2d<int_u8>.
+/// \{
+/// \brief Test saving a grayscale image2d.
+///
+/// Grayscale image2d are very popular in image processing. It's the test we do
+/// not fail!
 
 void test_save_image2d_int_u8()
 {
@@ -120,27 +164,36 @@ void test_save_image2d_int_u8()
   image2d_int_u8 img_int_u8;
 
   mln::io::pgm::load(img_int_u8, OLENA_IMG_PATH"/lena.pgm");
-  
+
   // Save it were it is impossible to do it !!
   bool ref_false  = mln::io::plot::save_image_sh(img_int_u8, null_lena);
 
   // Save it where we have the full permissions.
   bool ref_true = mln::io::plot::save_image_sh(img_int_u8, lena);
-  
+
   mln_assertion(true  == ref_true);
   mln_assertion(false == ref_false);
   std::cout << "save image2d<int_u8>: ok" << std::endl;
 }
 
-//------------------------------------------------------------------------------
-// Test to save image2d<int_u16>
-//------------------------------------------------------------------------------
+/// \}
+
+/// image2d<int_u16>.
+/// \{
+/// \brief Test saving an extended grayscale image2d.
+///
+/// This kind of image are not so current. But for medical use, we can get now,
+/// some dicom in 12 bits and new generation bring us 16 bits. As 16 bits is a
+/// strange format for image processing people, there is not a common
+/// acceptation for the underline format. Xv or imageMagick doesn't agree for
+/// the representation of the file.
+
 
 struct int_u16_to_int_u8 : mln::Function_v2v< int_u16_to_int_u8 >
 {
   typedef mln::value::int_u16   argument;
   typedef mln::value::int_u8    result;
-  
+
   result operator()(const argument& c) const
   {
     result res(c / 256);
@@ -170,22 +223,28 @@ void test_save_image2d_int_u16()
 
   // Save it where we have the full permissions.
   bool ref_true = mln::io::plot::save_image_sh(img_int_u16, lena);
-  
+
   mln_assertion(true  == ref_true);
   mln_assertion(false == ref_false);
   std::cout << "save image2d<int_u16> : ok" << std::endl;
 }
 
+/// \}
+
+/// image2d<int_s8>.
+/// \{
+/// \brief Test saving an signed image2d.
+///
+/// This kind of image are very artificial. It is given for exhaustivity of
+/// testing. In fact, this kind of image traduces some step in a computing
+/// chain.
 
-//------------------------------------------------------------------------------
-// Test to save image2d<int_s8>
-//------------------------------------------------------------------------------
 
 struct int_u8_to_int_s8 : mln::Function_v2v< int_u8_to_int_s8 >
 {
   typedef mln::value::int_u8    argument;
   typedef mln::value::int_s8    result;
-  
+
   result operator()(const argument& c) const
   {
     argument tmp_int_u8;
@@ -197,7 +256,7 @@ struct int_u8_to_int_s8 : mln::Function_v2v< int_u8_to_int_s8 >
     {
       res = SCHAR_MAX;
     }
-    else if (SCHAR_MAX < c)
+    else if (static_cast<unsigned>(SCHAR_MAX) < c)
     {
       tmp_int_u8 = c - SCHAR_MAX;
       res        = static_cast<mln::value::int_s8>(tmp_int_u8);
@@ -226,28 +285,34 @@ void test_save_image2d_int_s8()
   image2d_int_u8 img_int_u8;
 
   mln::io::pgm::load(img_int_u8, OLENA_IMG_PATH"/lena.pgm");
-  img_int_s8 = mln::data::transform(img_int_u8, int_u8_to_int_s8());  
-  
+  img_int_s8 = mln::data::transform(img_int_u8, int_u8_to_int_s8());
+
   // Save it were it is impossible to do it !!
   bool ref_false  = mln::io::plot::save_image_sh(img_int_s8, null_lena);
 
   // Save it where we have the full permissions.
   bool ref_true = mln::io::plot::save_image_sh(img_int_s8, lena);
-  
+
   mln_assertion(true  == ref_true);
   mln_assertion(false == ref_false);
   std::cout << "save image2d<int_s8>: ok" << std::endl;
 }
 
-//------------------------------------------------------------------------------
-// Test to save image2d<int_s16>
-//------------------------------------------------------------------------------
+/// \}
+
+/// image2d<int_s16>.
+/// \{
+/// \brief Test saving an extended image2d.
+///
+/// This kind of image are very artificial. It is given for exhaustivity of
+/// testing. In fact, this kind of image traduces some step in a computing
+/// chain.
 
 struct int_u16_to_int_s16 : mln::Function_v2v< int_u16_to_int_s16 >
 {
   typedef mln::value::int_u16    argument;
   typedef mln::value::int_s16    result;
-  
+
   result operator()(const argument& c) const
   {
     argument tmp_int_u16;
@@ -258,7 +323,7 @@ struct int_u16_to_int_s16 : mln::Function_v2v< int_u16_to_int_s16 >
     {
       res = SHRT_MAX;
     }
-    else if (SHRT_MAX < c)
+    else if (static_cast<unsigned>(SHRT_MAX) < c)
     {
       tmp_int_u16 = c - SHRT_MAX;
       res        = static_cast<mln::value::int_s16>(tmp_int_u16);
@@ -286,29 +351,33 @@ void test_save_image2d_int_s16()
   image2d_int_u16 img_int_u16;
 
   mln::io::pgm::load(img_int_u16, OLENA_IMG_PATH"/lena_16_gnuplot.pgm");
-  img_int_s16 = mln::data::transform(img_int_u16, int_u16_to_int_s16());  
+  img_int_s16 = mln::data::transform(img_int_u16, int_u16_to_int_s16());
 
   // Save it were it is impossible to do it !!
   bool ref_false  = mln::io::plot::save_image_sh(img_int_s16, null_lena);
 
   // Save it where we have the full permissions.
   bool ref_true = mln::io::plot::save_image_sh(img_int_s16, lena);
-  
+
   mln_assertion(true  == ref_true);
   mln_assertion(false == ref_false);
   std::cout << "save image2d<int_s16> : ok" << std::endl;
 }
 
+/// \}
 
-//------------------------------------------------------------------------------
-// Test to save image2d<float>
-//------------------------------------------------------------------------------
+/// image2d<float>.
+/// \{
+/// \brief Test saving a float image2d.
+///
+/// This kind of image is a common way to save some attributes localized on
+/// pixels.
 
 struct int_u8_to_float : mln::Function_v2v< int_u8_to_float >
 {
   typedef mln::value::int_u8   argument;
   typedef float                result;
-  
+
   result operator()(const argument& c) const
   {
     result res = static_cast<float>(c)/3;
@@ -330,27 +399,32 @@ void test_save_image2d_float()
 
   mln::io::pgm::load(img_int_u8, OLENA_IMG_PATH"/lena.pgm");
   img_float = mln::data::transform(img_int_u8, int_u8_to_float());
-  
+
   // Save it were it is impossible to do it !!
   bool ref_false  = mln::io::plot::save_image_sh(img_float, null_lena);
 
   // Save it where we have the full permissions.
   bool ref_true = mln::io::plot::save_image_sh(img_float, lena);
-  
+
   mln_assertion(true  == ref_true);
   mln_assertion(false == ref_false);
   std::cout << "save image2d<float> : ok" << std::endl;
 }
 
-//------------------------------------------------------------------------------
-// Test to save image2d<double>
-//------------------------------------------------------------------------------
+/// \}
+
+/// image2d<double>.
+/// \{
+/// \brief Test saving a double image2d.
+///
+/// This kind of image is a common way to save some attributes localized on
+/// pixels.
 
 struct int_u16_to_double : mln::Function_v2v< int_u16_to_double >
 {
   typedef mln::value::int_u16  argument;
   typedef double               result;
-  
+
   result operator()(const argument& c) const
   {
     result res = static_cast<float>(c)/256;
@@ -372,23 +446,25 @@ void test_save_image2d_double()
 
   mln::io::pgm::load(img_int_u16, OLENA_IMG_PATH"/lena_16_gnuplot.pgm");
   img_double = mln::data::transform(img_int_u16, int_u16_to_double());
-  
+
   // Save it were it is impossible to do it !!
   bool ref_false  = mln::io::plot::save_image_sh(img_double, null_lena);
 
   // Save it where we have the full permissions.
   bool ref_true = mln::io::plot::save_image_sh(img_double, lena);
-  
+
   mln_assertion(true  == ref_true);
   mln_assertion(false == ref_false);
   std::cout << "save image2d<double> : ok" << std::endl;
 }
 
+/// \}
 
-
-//------------------------------------------------------------------------------
-// Test to save image2d<rgb8>
-//------------------------------------------------------------------------------
+/// image2d<rgb8>.
+/// \{
+/// \brief Test saving a RGB color image2d.
+///
+/// This kind of format is extremely popular in image, and in photography.
 
 void test_save_image2d_rgb8()
 {
@@ -400,28 +476,33 @@ void test_save_image2d_rgb8()
   image2d_rgb8 img_rgb8;
 
   mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
-  
+
   // Save it were it is impossible to do it !!
   bool ref_false  = mln::io::plot::save_image_sh(img_rgb8, null_lena);
 
   // Save it where we have the full permissions.
   bool ref_true = mln::io::plot::save_image_sh(img_rgb8, lena);
-  
+
   mln_assertion(true  == ref_true);
   mln_assertion(false == ref_false);
   std::cout << "save image2d<rgb8> : ok" << std::endl;
 }
 
-//------------------------------------------------------------------------------
-// Test to save image2d<rgb16>  
-//------------------------------------------------------------------------------
+/// \}
+
+/// image2d<rgb16>.
+/// \{
+/// \brief Test saving a 16 bits RGB color image2d.
+///
+/// As this kind of image is less popular, the library enable this export by
+/// the will of exhaustivity.
 
 struct rgb16_to_int_u16 : mln::Function_v2v< rgb16_to_int_u16 >
 {
   typedef mln::value::rgb16   argument;
   typedef mln::value::int_u16 result;
 
-  
+
   result operator()(const argument& c) const
   {
     result res((c.red() + c.green() + c.blue())/3);
@@ -447,23 +528,28 @@ void test_save_image2d_rgb16()
   mln::io::ppm::load(img_rgb16, OLENA_IMG_PATH"/lena_16.ppm");
   //img_int_u16 = mln::data::transform(img_rgb16, rgb16_to_int_u16());
   //mln::io::pgm::save(img_int_u16, "lena_16.pgm");
-  
+
   // Save it were it is impossible to do it !!
   bool ref_false=mln::io::plot::save_image_sh(img_rgb16, null_lena);
 
   // Save it where we have the full permissions.
   bool ref_true = mln::io::plot::save_image_sh(img_rgb16, lena);
   //  mln::io::plot::save_image_sh(img_int_u16, lena2);
-  
+
   mln_assertion(true  == ref_true);
   mln_assertion(false == ref_false);
   std::cout << "save image2d<rgb16> : ok" << std::endl;
 }
 
+/// \}
 
-//------------------------------------------------------------------------------
-// Test to save image2d<hsl_f>
-//------------------------------------------------------------------------------
+/// image2d<hsl_f>.
+/// \{
+/// \brief Test saving a HSL float color image2d.
+///
+/// This kind of image allow to show the power of gnuplot. Raw data
+/// are hsl, then hsl equations are integrated in the gnuplot shell
+/// file. So decoding needs more time.
 
 void test_save_image2d_hsl_f()
 {
@@ -484,21 +570,27 @@ void test_save_image2d_hsl_f()
   //mln::data::fill(img_rgb8, mln::literal::blue);
   img_hsl_f = mln::data::transform(img_rgb8, rgb_to_hsl());
 
-  
+
   // Save it were it is impossible to do it !!
   bool ref_false  = mln::io::plot::save_image_sh(img_hsl_f, null_lena);
 
   // Save it where we have the full permissions.
   bool ref_true = mln::io::plot::save_image_sh(img_hsl_f, lena);
-  
+
   mln_assertion(true  == ref_true);
   mln_assertion(false == ref_false);
   std::cout << "save image2d<hsl_f> : ok" << std::endl;
 }
 
-//------------------------------------------------------------------------------
-// Test to save image2d<hsl_d>
-//------------------------------------------------------------------------------
+/// \}
+
+/// image2d<hsl_d>.
+/// \{
+/// \brief Test saving a HSL double color image2d.
+///
+/// This kind of image allow to show the power of gnuplot. Raw data
+/// are hsl, then hsl equations are integrated in the gnuplot shell
+/// file. So decoding needs more time.
 
 void test_save_image2d_hsl_d()
 {
@@ -519,22 +611,27 @@ void test_save_image2d_hsl_d()
   //mln::data::fill(img_rgb16, mln::literal::blue);
   img_hsl_d = mln::data::transform(img_rgb16, rgb_to_hsl());
 
-  
+
   // Save it were it is impossible to do it !!
   bool ref_false  = mln::io::plot::save_image_sh(img_hsl_d, null_lena);
 
   // Save it where we have the full permissions.
   bool ref_true = mln::io::plot::save_image_sh(img_hsl_d, lena);
-  
+
   mln_assertion(true  == ref_true);
   mln_assertion(false == ref_false);
   std::cout << "save image2d<hsl_d> : ok" << std::endl;
 }
 
+/// \}
 
-//------------------------------------------------------------------------------
-// Test to save image2d<hsi_f>
-//------------------------------------------------------------------------------
+/// image2d<hsi_f>.
+/// \{
+/// \brief Test saving a HSI float color image2d.
+///
+/// This kind of image allow to show the power of gnuplot. Raw data
+/// are hsi, then hsi equations are integrated in the gnuplot shell
+/// file. So decoding needs more time.
 
 void test_save_image2d_hsi_f()
 {
@@ -555,21 +652,27 @@ void test_save_image2d_hsi_f()
   //mln::data::fill(img_rgb8, mln::literal::blue);
   img_hsi_f = mln::data::transform(img_rgb8, rgb_to_hsi());
 
-  
+
   // Save it were it is impossible to do it !!
   bool ref_false  = mln::io::plot::save_image_sh(img_hsi_f, null_lena);
 
   // Save it where we have the full permissions.
   bool ref_true = mln::io::plot::save_image_sh(img_hsi_f, lena);
-  
+
   mln_assertion(true  == ref_true);
   mln_assertion(false == ref_false);
   std::cout << "save image2d<hsi_f> : ok" << std::endl;
 }
 
-//------------------------------------------------------------------------------
-// Test to save image2d<hsi_d>
-//------------------------------------------------------------------------------
+/// \}
+
+/// image2d<hsi_d>.
+/// \{
+/// \brief Test saving a HSI double color image2d.
+///
+/// This kind of image allow to show the power of gnuplot. Raw data
+/// are hsi, then hsi equations are integrated in the gnuplot shell
+/// file. So decoding needs more time.
 
 void test_save_image2d_hsi_d()
 {
@@ -590,21 +693,28 @@ void test_save_image2d_hsi_d()
   //mln::data::fill(img_rgb16, mln::literal::blue);
   img_hsi_d = mln::data::transform(img_rgb16, rgb_to_hsi());
 
-  
+
   // Save it were it is impossible to do it !!
   bool ref_false  = mln::io::plot::save_image_sh(img_hsi_d, null_lena);
 
   // Save it where we have the full permissions.
   bool ref_true = mln::io::plot::save_image_sh(img_hsi_d, lena);
-  
+
   mln_assertion(true  == ref_true);
   mln_assertion(false == ref_false);
   std::cout << "save image2d<hsi_d> : ok" << std::endl;
 }
 
-//------------------------------------------------------------------------------
-// TEST TO SAVE 8 BITS 3D RGB IMAGE  
-//------------------------------------------------------------------------------
+/// \}
+
+/// image3d<int_8>.
+/// \{
+/// \brief Test saving a grayscale image3d.
+///
+/// It seems important to be able to export in 3d, but it's not so popular
+/// in the team. We try to simulate this functionnality.
+///
+/// \fixme The data visualization is very hard in 3d compact with gnuplot.
 
 void test_save_image_sh_3d()
 {
@@ -619,18 +729,20 @@ void test_save_image_sh_3d()
     array.append(OLENA_IMG_PATH"/fly.pgm");
 
   mln::io::pgms::load(img, array);
-  
+
   // Save it were it is impossible to do it !!
   bool ref_false  = mln::io::plot::save_image_sh(img, "/dev/null/fly3d.sh");
 
   // Save it where we have the full permissions.
   bool ref_true = mln::io::plot::save_image_sh(img, "fly3d.sh");
-  
+
   mln_assertion(true  == ref_true);
   mln_assertion(false == ref_false);
   std::cout << "save image 3d : ok" << std::endl;
 }
 
+/// \}
+
 
 int main()
 {
@@ -649,7 +761,7 @@ int main()
 
   test_save_image2d_rgb8();
   test_save_image2d_rgb16();
-  
+
   test_save_image2d_hsl_f();
   test_save_image2d_hsl_d();
 
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/io/plot/save_image_sh/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/io/plot/save_image_sh/Makefile.am
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/use/io/plot/save_image_sh/save_image_sh.cc
similarity index 91%
copy from scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
copy to scribo/sandbox/green/use/io/plot/save_image_sh/save_image_sh.cc
index af39d94..bd4b84f 100644
--- a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
+++ b/scribo/sandbox/green/use/io/plot/save_image_sh/save_image_sh.cc
@@ -25,7 +25,7 @@
 
 /// \file
 ///
-/// \brief Minimal code for building 1d image histogram version.
+/// \brief Example of code using the gnuplot shell export library.
 ///
 
 #include <mln/accu/stat/histo1d.hh>
@@ -34,6 +34,7 @@
 #include <mln/core/image/image2d.hh>
 #include <mln/img_path.hh>
 #include <mln/io/pgm/load.hh>
+#include <mln/io/plot/save_image_sh.hh>
 #include <mln/value/int_u8.hh>
 
 
@@ -46,6 +47,7 @@ int main()
 
   mln::io::pgm::load(img, OLENA_IMG_PATH"/lena.pgm");
   histo = mln::data::compute(mln::accu::meta::stat::histo1d(), img);
+  mln::io::plot::save_image_sh(histo, "histo.sh");
 
   return 0;
 }
-- 
1.5.6.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            last-svn-commit-166-g3591f2a Define accumulator	which computes histogram view as image.
                        
                        
by Yann Jacquelet 22 Jun '10
                    by Yann Jacquelet 22 Jun '10
22 Jun '10
                    
                        	* mln/img_path.hh: New header file.
	Define the 1d component version of the the library.
	* mln/accu/stat/histo1d.hh: New header file.
	Give an example of code.
	* use/accu/stat/histo1d: New directory.
	* use/accu/stat/histo1d/Makefile.am: New makefile.
	* use/accu/stat/histo1d/histo1d.cc: New source.
	Make some unitary tests on histo1d library.
	* tests/accu/stat/histo1d: New directory.
	* tests/accu/stat/histo1d/Makefile.am: New makefile.
	* tests/accu/stat/histo1d/histo1d.cc: New source.
	Define the 2d component version of the the library.
	* mln/accu/stat/histo2d.hh: New header file.
	* mln/value/rg.hh: New header file.
	* mln/fun/v2v/rgb_to_rg.hh: New header file.
	Give an example of code.
	* use/accu/stat/histo2d: New directory.
	* use/accu/stat/histo2d/Makefile.am: New makefile.
	* use/accu/stat/histo2d/histo2d.cc: New source.
	* use/value/rg: New directory.
	* use/value/rg/Makefile.am: New makefile.
	* use/value/rg/rg.cc: New source.
	* use/fun/v2v/rgb_to_rg: New directory.
	* use/fun/v2v/rgb_to_rg/Makefile.am: New makefile.
	* use/fun/v2v/rgb_to_rg/rgb_to_rg.cc: New source.
	Define the RGB 3d component version of the the library.
	* mln/accu/stat/histo3d_rgb.hh: New header file.
	* mln/fun/v2v/rgb8_to_rgbn.hh: New header file.
	Give an example of code.
	* use/accu/stat/histo3_rgb: New directory.
	* use/accu/stat/histo3d_rgb/Makefile.am: New makefile.
	* use/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
	* use/fun/v2v/rgb8_to_rgbn: New directory.
	* use/fun/v2v/rgb8_to_rgbn/Makefile.am: New makefile.
	* use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc: New source.
	Make some unitary tests on histo3d library.
	* tests/accu/stat/histo3d_rgb: New directory.
	* tests/accu/stat/histo3d_rgb/Makefile.am: New makefile.
	* tests/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
	Define the HSL 3d component version of the the library.
	* mln/accu/stat/histo3d_hsl.hh: New header file.
	Give an example of code.
	* use/accu/stat/histo3_hsl: New directory.
	* use/accu/stat/histo3d_hsl/Makefile.am: New makefile.
	* use/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
	Make some unitary tests on histo3d library.
	* tests/accu/stat/histo3d_hsl: New directory.
	* tests/accu/stat/histo3d_hsl/Makefile.am: New makefile.
	* tests/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
---
 scribo/sandbox/green/ChangeLog                     |   82 +++-
 scribo/sandbox/green/README                        |   73 +++-
 scribo/sandbox/green/mln/accu/stat/histo1d.hh      |   32 +-
 scribo/sandbox/green/mln/accu/stat/histo2d.hh      |   75 ++--
 scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh  |  249 +++++-----
 scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh  |  138 +++---
 scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh   |   49 ++-
 scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh      |    2 -
 .../green/tests/accu/stat/histo1d/histo1d.cc       |  502 +++++++++++++++++++-
 .../accu/stat/{histo1d => histo3d_hsl}/Makefile.am |    0 
 .../tests/accu/stat/histo3d_hsl/histo3d_hsl.cc     |  394 +++++++---------
 .../accu/stat/{histo1d => histo3d_rgb}/Makefile.am |    0 
 .../tests/accu/stat/histo3d_rgb/histo3d_rgb.cc     |  355 +++++++-------
 .../sandbox/green/use/accu/stat/histo1d/histo1d.cc |   27 +
 .../sandbox/green/use/accu/stat/histo2d/histo2d.cc |   25 +
 .../accu/stat/{histo1d => histo3d_hsl}/Makefile.am |    0 
 .../green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc |   56 ++--
 .../accu/stat/{histo1d => histo3d_rgb}/Makefile.am |    0 
 .../green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc |   45 +-
 .../histo1d => fun/v2v/rgb8_to_rgbn}/Makefile.am   |    0 
 .../green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc |   45 +-
 .../stat/histo1d => fun/v2v/rgb_to_rg}/Makefile.am |    0 
 .../green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc       |   51 +-
 .../{accu/stat/histo1d => value/rg}/Makefile.am    |    0 
 .../sandbox/green/use/value/rg/rg.cc               |   51 +-
 25 files changed, 1450 insertions(+), 801 deletions(-)
 copy scribo/sandbox/green/tests/accu/stat/{histo1d => histo3d_hsl}/Makefile.am (100%)
 copy {milena => scribo}/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc (73%)
 copy scribo/sandbox/green/tests/accu/stat/{histo1d => histo3d_rgb}/Makefile.am (100%)
 copy {milena => scribo}/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc (64%)
 copy scribo/sandbox/green/use/accu/stat/{histo1d => histo3d_hsl}/Makefile.am (100%)
 copy milena/tests/fun/v2v/rgb_to_hsl.cc => scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc (57%)
 copy scribo/sandbox/green/use/accu/stat/{histo1d => histo3d_rgb}/Makefile.am (100%)
 copy milena/tests/io/ppm/ppm.cc => scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc (63%)
 copy scribo/sandbox/green/use/{accu/stat/histo1d => fun/v2v/rgb8_to_rgbn}/Makefile.am (100%)
 copy milena/tests/io/ppm/ppm.cc => scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc (63%)
 copy scribo/sandbox/green/use/{accu/stat/histo1d => fun/v2v/rgb_to_rg}/Makefile.am (100%)
 copy milena/tests/fun/v2v/hsl_to_rgb.cc => scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc (59%)
 copy scribo/sandbox/green/use/{accu/stat/histo1d => value/rg}/Makefile.am (100%)
 copy milena/tests/fun/v2v/hsl_to_rgb.cc => scribo/sandbox/green/use/value/rg/rg.cc (60%)
diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog
index 6a3c8fa..8f5101b 100644
--- a/scribo/sandbox/green/ChangeLog
+++ b/scribo/sandbox/green/ChangeLog
@@ -38,12 +38,84 @@
 
 2010-06-21  Yann Jacquelet  <jacquelet(a)lrde.epita.fr>
 
-	Save histogram library.
+	Define accumulator which computes histogram view as image.
+
+	* mln/img_path.hh: New header file.
+
+	Define the 1d component version of the the library.
+
+	* mln/accu/stat/histo1d.hh: New header file.
+
+	Give an example of code.
+
+	* use/accu/stat/histo1d: New directory.
+	* use/accu/stat/histo1d/Makefile.am: New makefile.
+	* use/accu/stat/histo1d/histo1d.cc: New source.
+
+	Make some unitary tests on histo1d library.
+
+	* tests/accu/stat/histo1d: New directory.
+	* tests/accu/stat/histo1d/Makefile.am: New makefile.
+	* tests/accu/stat/histo1d/histo1d.cc: New source.
+
+	Define the 2d component version of the the library.
+
+	* mln/accu/stat/histo2d.hh: New header file.
+	* mln/value/rg.hh: New header file.
+	* mln/fun/v2v/rgb_to_rg.hh: New header file.
+
+	Give an example of code.
+
+	* use/accu/stat/histo2d: New directory.
+	* use/accu/stat/histo2d/Makefile.am: New makefile.
+	* use/accu/stat/histo2d/histo2d.cc: New source.
+
+	* use/value/rg: New directory.
+	* use/value/rg/Makefile.am: New makefile.
+	* use/value/rg/rg.cc: New source.
+
+	* use/fun/v2v/rgb_to_rg: New directory.
+	* use/fun/v2v/rgb_to_rg/Makefile.am: New makefile.
+	* use/fun/v2v/rgb_to_rg/rgb_to_rg.cc: New source.
+
+	Define the RGB 3d component version of the the library.
+
+	* mln/accu/stat/histo3d_rgb.hh: New header file.
+	* mln/fun/v2v/rgb8_to_rgbn.hh: New header file.
+
+	Give an example of code.
+
+	* use/accu/stat/histo3_rgb: New directory.
+	* use/accu/stat/histo3d_rgb/Makefile.am: New makefile.
+	* use/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
+
+	* use/fun/v2v/rgb8_to_rgbn: New directory.
+	* use/fun/v2v/rgb8_to_rgbn/Makefile.am: New makefile.
+	* use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc: New source.
+
+	Make some unitary tests on histo3d library.
+
+	* tests/accu/stat/histo3d_rgb: New directory.
+	* tests/accu/stat/histo3d_rgb/Makefile.am: New makefile.
+	* tests/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
+
+
+	Define the HSL 3d component version of the the library.
+
+	* mln/accu/stat/histo3d_hsl.hh: New header file.
+
+	Give an example of code.
+
+	* use/accu/stat/histo3_hsl: New directory.
+	* use/accu/stat/histo3d_hsl/Makefile.am: New makefile.
+	* use/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
+
+	Make some unitary tests on histo3d library.
+
+	* tests/accu/stat/histo3d_hsl: New directory.
+	* tests/accu/stat/histo3d_hsl/Makefile.am: New makefile.
+	* tests/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
 
-	* mln/accu/histo/histo1d.hh: New header file.
-	* mln/accu/histo/histo2d.hh: New header file.
-	* mln/accu/histo/histo3d_rgb.hh: New header file.
-	* mln/accu/histo/histo3d_hsl.hh: New header file.
 
 2010-06-21  Yann Jacquelet  <jacquelet(a)lrde.epita.fr>
 
diff --git a/scribo/sandbox/green/README b/scribo/sandbox/green/README
index 3efe50d..4b6fb26 100644
--- a/scribo/sandbox/green/README
+++ b/scribo/sandbox/green/README
@@ -153,18 +153,8 @@ d'exécution (chmod 755 gnuplot_shell_file.sh). Comme je trouve le format
 extrêmement pratique, il se retrouve preque partout dans mes sources.
 
 
-V MLN
------
-
-a) La sauvegarde des images au format gnuplot shell
-
-* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
-
-to do ...
-
-
-
-b) Les histogrammes
+V HISTOGRAMMES
+--------------
 
 Un des travaux demandés par théo est la réalisation d'une librairie
 d'histogramme permettant de fournir un résultat sous forme d'image.
@@ -178,20 +168,67 @@ de comptage puisqu'il est décrit sous la forme de triplets de float
 contient une séquence d'appels pour les routines permettant de
 considérer la dimension de la teinte comme circulaire.
 
+
+a) version 1d
+
 * mln/accu/stat/histo1d.hh: Accumulateur histogramme image1d.
 * use/accu/stat/histo1d: Code minimal utilisant un histogramme 1d.
+* tests/accu/stat/histo1d: Test unitaire sur l'histogramme 1d.
+
+
+b) version 2d
 
-* mln/accu/stat/histo2d.hh: Accumulateur histogramme image2d.
 * mln/value/rg.hh: Définition du type vectoriel 2d rouge/vert (RG).
+* use/value/rg: Exemple de code pour l'utilisation de rg.
+
 * mln/fun/v2v/rgb_to_rg.hh: Transformation de l'espace RGB vers l'espace RG.
+* use/fun/v2v/rgb_to_rg: Exemple de code pour l'utilisation de rgb_to_rg.
+
+* mln/accu/stat/histo2d.hh: Accumulateur histogramme image2d.
 * use/accu/stat/histo2d: Code minimal utilisant un histogramme 2d.
 
 
-* mln/accu/stat/histo3d_rgb.hh: Accumulateur histogramme image3d RGB.
-* mln/accu/stat/histo3d_hsl.hh: Accumulateur histogramme image3d HSL.
+c) version 3d RGB
+
+
+* mln/fun/v2v/rgb8_to_rgbn.hh: Diminution de la quantification (n < 8 bits).
+* use/fun/v2v/rgb8_to_rgbn: Exemple de code pour l'utilisation de rgb8_to_rgbn.
 
+* mln/accu/stat/histo3d_rgb.hh: Accumulateur histogramme image3d RGB.
 * use/accu/stat/histo3_rgb: Code minimal utilisant un histogramme 3d RGB.
+
+
+
+d) version 3d HSL
+
+* mln/accu/stat/histo3d_hsl.hh: Accumulateur histogramme image3d HSL.
 * use/accu/stat/histo3_hsl: Code minimal utilisant un histogramme 3d HSL.
+* tests/accu/stat/histo3d_hsl: Test unitaire sur l'histogramme HSL 3d.
+
+Le code HSL ne compile plus car l'interface liant la transformation du
+domaine et la fonction fold a changée. Je n'ai pas le temps de
+regarder plus avant.
+
+
+
+V MLN
+-----
+
+a) La sauvegarde des images au format gnuplot shell
+
+* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
+
+to do ...
+
+
+
+b) Les histogrammes
+
+
+
+
+
+
 
 
 
@@ -210,6 +247,12 @@ considérer la dimension de la teinte comme circulaire.
 * use/accu/stat/histo3d_hsl
 * tests/accu/stat/histo3d_hsl
 
+VI SAUVEGARDE FORMAT GNUPLOT SHELL
+----------------------------------
+
+
+VII VISUALISATION HISTOGRAMMES 3D
+---------------------------------
 
 c) La visualisation des histogrammes 3d
 
diff --git a/scribo/sandbox/green/mln/accu/stat/histo1d.hh b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
index d480cf0..fae94c8 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo1d.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
@@ -24,7 +24,7 @@
 // executable file might be covered by the GNU General Public License.
 
 #ifndef MLN_ACCU_STAT_HISTO1D_HH
-#define MLN_ACCU_STAT_HISTO1D_HH
+# define MLN_ACCU_STAT_HISTO1D_HH
 
 /// \file
 ///
@@ -64,24 +64,24 @@
 /// }
 
 
-#include <iostream>
+# include <iostream>
 
-#include <mln/accu/internal/base.hh>
+# include <mln/accu/internal/base.hh>
 
-#include <mln/arith/plus.hh>
+# include <mln/arith/plus.hh>
 
-#include <mln/core/concept/meta_accumulator.hh>
-#include <mln/core/image/image1d.hh>
-#include <mln/core/macros.hh>
+# include <mln/core/concept/meta_accumulator.hh>
+# include <mln/core/image/image1d.hh>
+# include <mln/core/macros.hh>
 
-#include <mln/literal/zero.hh>
+# include <mln/literal/zero.hh>
 
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
 
-#include <mln/trait/value/comp.hh>
+# include <mln/trait/value/comp.hh>
 
-#include <mln/value/ops.hh>
+# include <mln/value/ops.hh>
 
 namespace mln
 {
@@ -168,7 +168,7 @@ namespace mln
 	typedef image1d<unsigned> result;
 	typedef result            q_result;
 
-	/// Constructors
+	/// Constructors.
 	/// \{
 	/// \brief Infer the size of the resulting image1d domain.
 	///
@@ -201,7 +201,6 @@ namespace mln
 	///
 	/// The end user shouldn't call this method. This is part of
 	/// data compute interface mechanism.
-
 	void take(const histo1d<V>& other);
 	/// \}
 
@@ -231,11 +230,10 @@ namespace mln
       ///
       /// The operator compares all the bins from the two histograms.
       /// Nobody uses this method unless unitary tests.
-
       template <typename V>
       bool operator==(const histo1d<V>& histo1, const histo1d<V>& histo2);
 
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
 
       template <typename V>
       inline
@@ -328,7 +326,7 @@ namespace mln
 	return result;
       }
 
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
 
 
     } // end of namespace mln::accu::stat
diff --git a/scribo/sandbox/green/mln/accu/stat/histo2d.hh b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
index c28723c..11a1bb3 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo2d.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
@@ -73,14 +73,16 @@
 
 # include <mln/accu/internal/base.hh>
 
+# include <mln/arith/plus.hh>
+
 # include <mln/core/macros.hh>
 # include <mln/core/image/image2d.hh>
 # include <mln/core/alias/point2d.hh>
 # include <mln/core/alias/box2d.hh>
 
-# include <mln/trait/value/comp.hh>
+#include <mln/literal/zero.hh>
 
-# include <mln/arith/plus.hh>
+# include <mln/trait/value/comp.hh>
 
 # include <mln/trace/entering.hh>
 # include <mln/trace/exiting.hh>
@@ -152,13 +154,13 @@ namespace mln
     namespace stat
     {
 
-      /// \brief Define an histogram which returns an image3d .
+      /// \brief Define a histogram as accumulator which returns an image2d.
       ///
-      /// Param V defines the space in which we count the values.
-      /// For instance, this histogram works image2d<rgb<2>> or
-      /// image2d<rgb<7>>. The histogram count the occurrence of each value.
-      /// The number of bins depends of the grayscale values, for 8 bits there
-      /// is 256x3 bins. Note that over
+      /// Param V defines the type of the input image value. It is in
+      /// this space that we count the values. For instance, this
+      /// histogram works well for image2d< rgb<2> > or with image2d<
+      /// rgb<7> >. The number of bins depends directly the values V.
+      /// For 8 bits there is 256x3 bins. Note that less
       /// quantification works too.
       ///
       /// \ingroup modaccuvalues
@@ -171,16 +173,15 @@ namespace mln
 	typedef image2d<unsigned> result;
 	typedef result            q_result;
 
-	/// Constructors
+	/// Constructors.
 	/// \{
-	/// \brief Initialize the size of the resulting image1d.
+	/// \brief Infer the size of the resulting image2d domain.
 	///
-	/// Initialize the size the resulting image from the theorical dynamic
-	/// of the greylevel values (Use V to manage it).
+	/// By evaluating the minimum and the maximum of V, we define the domain
+	/// of the resulting image2d.
 	histo2d();
 	/// \}
 
-
 	/// Manipulators.
 	/// \{
 	/// \brief Initialize the histogram with zero value.
@@ -190,23 +191,24 @@ namespace mln
 	/// density.
 	void init();
 
-
-	/// \brief Update the histogram with the RGB pixel t.
-	/// \param[in] t a greylevel pixel of type V.
+	/// \brief Update the histogram with the RG pixel t.
+	/// \param[in] t a graylevel pixel of type V.
 	///
 	/// The end user shouldn't call this method. In place of it, he can
 	/// go through the data compute interface.
 	void take(const argument& t);
 
-
 	/// \brief Update the histogram with an other histogram.
 	/// \param[in] other the other histogram.
+	///
+	/// The end user shouldn't call this method. This is part of
+	/// data compute interface mechanism.
 	void take(const histo2d<V>& other);
 	/// \}
 
 	/// Accessors.
 	/// \{
-	/// \brief Return the histogram as an image1d.
+	/// \brief Return the histogram as an image2d.
 	///
 	/// This is the machinery to communicate with data compute interface.
 	/// The end user should'nt use it.
@@ -228,19 +230,19 @@ namespace mln
       /// \param[in] histo1 the first histogram to compare with.
       /// \param[in] histo2 the second histogram.
       ///
-      /// The operator compare all the bins from the two histogram.
-
+      /// The operator compares all the bins from the two histograms.
+      /// Nobody uses this method unless unitary tests.
       template <typename V>
       bool operator==(const histo2d<V>& histo1,
 		      const histo2d<V>& histo2);
 
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
 
       template <typename V>
       inline
       histo2d<V>::histo2d()
       {
-	trace::entering("mln::accu::stat::histo2d::histo2d");
+	trace::entering("mln::accu::stat::histo2d::cstor");
 	typedef mln_trait_value_comp(V,0) comp0;
 	typedef mln_trait_value_comp(V,1) comp1;
 
@@ -253,31 +255,24 @@ namespace mln
 			   point2d(mln_max(comp0),
 				   mln_max(comp1))));
 
-	trace::exiting("mln::accu::stat::histo2d::histo2d");
+	trace::exiting("mln::accu::stat::histo2d::cstor");
       }
 
       template <typename V>
       inline
       void histo2d<V>::init()
       {
-	trace::entering("mln::accu::stat::histo2d::init");
-
-	data::fill(count_, 0);
-	trace::exiting("mln::accu::stat::histo2d::init");
+	data::fill(count_, literal::zero);
       }
 
       template <typename V>
       inline
       void histo2d<V>::take(const argument& t)
       {
-	trace::entering("mln::accu::stat::histo2d::take");
-
 	// Just convert a greyscale value (int_u8 like) to a position for an
 	// iterator on the resulting image.
 	// Take care to the constructor : Point(slice, row, column)
 	++count_(point2d(t.red(), t.green()));
-
-	trace::exiting("mln::accu::stat::histo2d::take");
       }
 
 
@@ -285,20 +280,13 @@ namespace mln
       inline
       void histo2d<V>::take(const histo2d<V>& other)
       {
-	trace::entering("mln::accu::stat::histo2d::take");
-
 	count_ += other.count_;
-
-	trace::exiting("mln::accu::stat::histo2d::take");
       }
 
       template <typename V>
       inline
       typename histo2d<V>::result histo2d<V>::to_result() const
       {
-	trace::entering("mln::accu::stat::histo2d::to_result");
-
-	trace::exiting("mln::accu::stat::histo2d::to_result");
 	return count_;
       }
 
@@ -306,9 +294,6 @@ namespace mln
       inline
       histo2d<V>::operator result() const
       {
-	trace::entering("mln::accu::stat::histo2d::operator result");
-
-	trace::exiting("mln::accu::stat::histo2d::operator result");
 	return count_;
       }
 
@@ -316,10 +301,8 @@ namespace mln
       inline
       bool histo2d<V>::is_valid() const
       {
-	trace::entering("mln::accu::stat::histo2d::is_valid");
 	bool result = count_.is_valid();
 
-	trace::exiting("mln::accu::stat::histo2d::is_valid");
 	return result;
       }
 
@@ -327,7 +310,7 @@ namespace mln
       bool operator==(const histo2d<V>& histo1,
 		      const histo2d<V>& histo2)
       {
-	trace::entering("mln::accu::stat::operator==");
+	trace::entering("mln::accu::stat::histo2d::operator==");
 
 	bool  result                  = true;
 	const image2d<unsigned>& res1 = histo1.to_result();
@@ -342,11 +325,11 @@ namespace mln
 	for_all_2(p1, p2)
 	  result &= (res1(p1) == res2(p2));
 
-	trace::exiting("mln::accu::stat::operator==");
+	trace::exiting("mln::accu::stat::histo2d::operator==");
 	return result;
       }
 
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
 
 
     } // end of namespace mln::accu::stat
diff --git a/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
index c84aaa4..35d78e2 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
@@ -1,6 +1,4 @@
-// Copyright (C) 2007 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -26,82 +24,115 @@
 // executable file might be covered by the GNU General Public License.
 
 #ifndef MLN_ACCU_STAT_HISTO3D_HSL_HH
-#define MLN_ACCU_STAT_HISTO3D_HSL_HH
+# define MLN_ACCU_STAT_HISTO3D_HSL_HH
 
 /// \file
 ///
-/// \brief Define a histogram as an accumulator which returns an image1d .
+/// \brief Define a histogram as accumulator which returns an HSL image3d.
+///
+/// This source implements the discrete histogram version. It was
+/// created for images which the values are derived from integer
+/// type. The number of bins is given by the user via the q parameter.
+/// It works for HSL space.
 ///
-/// This source implements the discrete histogram version. The number of beans
-/// is infer from the number of greylevels. A typical int_u8 image has got
-/// 256 bins. An int_u16 image has got 65535 bins.
 /// The following sample is a typical use of the histogram.
 ///
-/// #include <mln/value/int_u8.hh>
-/// #include <mln/core/image/image1d.hh>
+/// #include <mln/accu/stat/histo3d_hsl.hh>
 /// #include <mln/core/image/image2d.hh>
-/// #include <mln/io/pgm/load.hh>
-/// #include <mln/accu/stat/histo1d.hh>
+/// #include <mln/core/image/image3d.hh>
 /// #include <mln/data/compute.hh>
-/// #include <mln/io/plot/save_histo_sh.hh>
-///
-/// #define  OLENA_LENA "/usr/local/share/olena/images/lena.pgm"
+/// #include <mln/data/transform.hh>
+/// #include <mln/fun/v2v/rgb_to_hsl.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/ppm/load.hh>
+/// #include <mln/value/hsl.hh>
+/// #include <mln/value/rgb8.hh>
 ///
-/// void test()
+/// int main()
 /// {
-///   typedef mln::value::int_u8 int_u8;
-///   mln::image2d<int_u8>       img_ref;
-///   mln::image1d<unsigned>     img_res;
+///   typedef mln::value::rgb8                    t_rgb;
+///   typedef mln::value::hsl_f                   t_hsl;
+///   typedef mln::fun::v2v::f_rgb_to_hsl_<t_hsl> t_rgb_to_hsl;
+///   mln::image2d<t_rgb>                         img_rgb;
+///   mln::image2d<t_hsl>                         img_hsl;
+///   mln::image3d<unsigned>                      histo;
+///
+///   mln::io::ppm::load(img_rgb, OLENA_IMG_PATH"/lena.ppm");
+///  img_hsl = mln::data::transform(img_rgb, t_rgb_to_hsl());
+///  histo=mln::data::compute(mln::accu::meta::stat::histo3d_hsl<7>(),img_hsl);
 ///
-///   mln::io::pgm::load(img_ref, OLENA_LENA);
-///   img_res = mln::data::compute(mln::accu::stat::histo1d<int_u8>(), img_ref);
+///  return 0;
 /// }
+///
+/// \fixme This implementation is very doubtfull ! Be carefull !!
+/// \fixme This code should be compile, but it doesn't!
+/// \fixme The fold interface has changed v2v -> p2p or the inverse.
+
 
+# include <iostream>
 
-#include <iostream>
+# include <mln/accu/internal/base.hh>
 
-#include <mln/accu/internal/base.hh>
+# include <mln/arith/plus.hh>
 
-#include <mln/core/macros.hh>
-#include <mln/core/image/image3d.hh>
-#include <mln/core/alias/point3d.hh>
-#include <mln/core/alias/box3d.hh>
+# include <mln/core/alias/point3d.hh>
+# include <mln/core/alias/box3d.hh>
+# include <mln/core/image/image3d.hh>
+# include <mln/core/image/dmorph/transformed_image.hh>
+# include <mln/core/macros.hh>
 
-#include <mln/value/int_u.hh>
-#include <mln/trait/value/comp.hh>
+# include <mln/fun/p2p/fold.hh>
 
-#include <mln/arith/plus.hh>
+# include <mln/literal/zero.hh>
 
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
 
-#include <mln/value/ops.hh>
+# include <mln/trait/value/comp.hh>
 
-// make hue cyclic
-#include <mln/fun/p2p/fold.hh>
-#include <mln/core/image/dmorph/transformed_image.hh>
+# include <mln/value/int_u.hh>
+# include <mln/value/ops.hh>
 
 namespace mln
 {
-  
+
   namespace accu
   {
-    
+
     namespace stat
     {
-   
+
       // Forward declaration
       template <unsigned q, typename V>
       struct histo3d_hsl;
 
     } // end of namespace mln::accu::stat
-  
-  } // end of namespace mln::accu
 
+    namespace meta
+    {
+
+      namespace stat
+      {
+
+	template <unsigned q>
+	struct histo3d_hsl : public Meta_Accumulator< histo3d_hsl<q> >
+	{
+	  template <typename V>
+	  struct with
+	  {
+	    typedef accu::stat::histo3d_hsl<q,V> ret;
+	  };
+	};
+
+      } // end of namespace mln::accu::meta::stat
+
+    } // end of namespace mln::accu::meta
+
+  } // end of namespace mln::accu
 
   namespace trait
   {
-    
+
     template <unsigned q, typename V>
     struct accumulator_< mln::accu::stat::histo3d_hsl<q,V> >
     {
@@ -112,65 +143,59 @@ namespace mln
     };
 
     template <unsigned q, typename V>
-    struct set_precise_binary_<op::eq, 
+    struct set_precise_binary_<op::eq,
 			       accu::stat::histo3d_hsl<q,V>,
 			       accu::stat::histo3d_hsl<q,V> >
     {
       typedef bool ret;
     };
-        
+
   } // end of namespace mln::trait
 
   namespace accu
   {
-    
+
     namespace stat
-    {      
+    {
 
-      /// \brief Define an histogram which returns an image1d .  
+
+      /// \brief Define a histogram as accumulator which returns an image3d.
       ///
-      /// Param V defines the space in which we count the values.
-      /// For instance, this histogram works image2d<int_u8> or 
-      /// image1d<int_u16>. The histogram count the occurrence of each value.
-      /// The number of bins depends of the greyscale values, for 8 bits there
-      /// is 256 bins, for 16 bits there is 65536 bins. Note that over 
-      /// quantification works too.
+      /// Param q defines the number of bins per axe.
+      /// Param V defines the type of the input image value. We assume that
+      /// V is a kind of hsl_<float,float,float>.
       ///
       /// \ingroup modaccuvalues
-
-      /// q is the number of bins per axe because quantification info are died.
-      /// we assume that V is a kind of hsl_<float,float,float>
-
       template <unsigned q, typename V>
-      struct histo3d_hsl : 
+      struct histo3d_hsl :
 	public mln::accu::internal::base<image3d<unsigned>, histo3d_hsl<q,V> >
       {
 	typedef V                 argument;
 	typedef image3d<unsigned> result;
 	typedef result            q_result;
 
-	/// Constructors
+	/// Constructors.
 	/// \{
-	/// \brief Initialize the size of the resulting image1d.
+	/// \brief Infer the size of the resulting image3d domain.
 	///
-	/// Initialize the size the resulting image from the theorical dynamic 
-	/// of the greylevel values (Use V to manage it).
+	/// By evaluating the minimum and the maximum of V, we define the domain
+	/// of the resulting image3d.
 	histo3d_hsl();
 	/// \}
 
-	
+
 	/// Manipulators.
 	/// \{
 	/// \brief Initialize the histogram with zero value.
 	///
-	/// This method must be called just before starting the use of the 
-	/// histogram. If it's not, resulting values won't converge to the 
+	/// This method must be called just before starting the use of the
+	/// histogram. If it's not, resulting values won't converge to the
 	/// density.
 	void init();
 
-	
+
 	/// \brief Update the histogram with the RGB pixel t.
-	/// \param[in] t a greylevel pixel of type V.
+	/// \param[in] t a graylevel pixel of type V.
 	///
 	/// The end user shouldn't call this method. In place of it, he can
 	/// go through the data compute interface.
@@ -179,12 +204,15 @@ namespace mln
 
 	/// \brief Update the histogram with an other histogram.
 	/// \param[in] other the other histogram.
+	///
+	/// The end user shouldn't call this method. This is part of
+	/// data compute interface mechanism.
 	void take(const histo3d_hsl<q,V>& other);
 	/// \}
 
 	/// Accessors.
 	/// \{
-	/// \brief Return the histogram as an image1d.
+	/// \brief Return the histogram as an HSL image3d.
 	///
 	/// This is the machinery to communicate with data compute interface.
 	/// The end user should'nt use it.
@@ -208,31 +236,31 @@ namespace mln
 	const float min_sat;
 	const float max_sat;
 	float       step_sat;
-	result  count_;
+	result      count_;
       };
 
       /// \brief Check wethever an histogram is equal to an other one.
       /// \param[in] histo1 the first histogram to compare with.
       /// \param[in] histo2 the second histogram.
       ///
-      /// The operator compare all the bins from the two histogram.
-
+      /// The operator compares all the bins from the two histograms.
+      /// Nobody uses this method unless unitary tests.
       template <unsigned q, typename V>
-      bool operator==(const histo3d_hsl<q,V>& histo1, 
+      bool operator==(const histo3d_hsl<q,V>& histo1,
 		      const histo3d_hsl<q,V>& histo2);
 
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
 
       template <unsigned q, typename V>
       inline
       histo3d_hsl<q,V>::histo3d_hsl() : min_hue(0.0), max_hue(360.0),
-				      min_lum(0.0), max_lum(1.0),
-				      min_sat(0.0), max_sat(1.0)
+				        min_lum(0.0), max_lum(1.0),
+				        min_sat(0.0), max_sat(1.0)
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::histo3d_hsl");
-	
-	// As there is no info about preceding color space
-	// we ask the end user to specify the quantification he's looking for.
+	trace::entering("mln::accu::stat::histo3d_hsl::cstor");
+
+	/// As there is no info about preceding color space
+	/// we ask the end user to specify the quantification he's looking for.
 
 	count_.init_(box3d(point3d(mln_min(value::int_u<q>),
 				   mln_min(value::int_u<q>),
@@ -241,7 +269,7 @@ namespace mln
 				   mln_max(value::int_u<q>),
 				   mln_max(value::int_u<q>))));
 
-	// Make the hue domain cyclic
+	/// Make the hue domain cyclic
 	fun::p2p::fold<point3d,1,0,0> fold_(count_.domain());
 	transform_domain(count_, fold_);
 
@@ -249,39 +277,34 @@ namespace mln
 	step_lum = (max_lum - min_lum)/q;
 	step_sat = (max_sat - min_sat)/q;
 
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::histo3d_hsl");
+	trace::exiting("mln::accu::stat::histo3d_hsl::cstor");
       }
 
       template <unsigned q, typename V>
       inline
       void histo3d_hsl<q,V>::init()
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::init");
-
-	data::fill(count_, 0);
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::init");
+	data::fill(count_, literal::zero);
       }
 
       template <unsigned q, typename V>
       inline
       void histo3d_hsl<q,V>::take(const argument& t)
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::take");
-
-	// Just convert a greyscale value (int_u8 like) to a position for an 
+	// Just convert a greyscale value (int_u8 like) to a position for an
 	// iterator on the resulting image.
 	//++count_(point3d(t.red(), t.green(), t.blue()));
-	
-	
+
+
 	// Technical way to access i° component without kwnowing the name
 	// mln::trait::value_<argument>::get_comp_0(t);
-	
+
 	// is def::coord1d the type of x, y, z ??
 	unsigned x = (t.hue() - min_hue)/step_hue;
-	unsigned y = (t.lum() - min_lum)/step_lum;
-	unsigned z = (t.sat() - min_sat)/step_sat;
+	unsigned y = (t.sat() - min_sat)/step_sat;
+	unsigned z = (t.lum() - min_lum)/step_lum;
 	/*
-	
+
 	std::cout << "H : " << t.hue() << std::endl;
 	std::cout << "L : " << t.lum() << std::endl;
 	std::cout << "S : " << t.sat() << std::endl;
@@ -295,66 +318,50 @@ namespace mln
 	std::cout << "Z : " << z << std::endl;
 	*/
 
-	// faire attention avec les histoires de points et leurs coordonnées
 	++count_(point3d(z, x, y));
-	//++count_(point3d(t.hue(), t.sat(), t.lum()));
-
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::take");
       }
 
-      
+
       template <unsigned q, typename V>
       inline
       void histo3d_hsl<q,V>::take(const histo3d_hsl<q,V>& other)
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::take");
-
 	count_ += other.count_;
-
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::take");
       }
-      
+
       template <unsigned q, typename V>
       inline
       typename histo3d_hsl<q,V>::result histo3d_hsl<q,V>::to_result() const
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::to_result");
-
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::to_result");
 	return count_;
       }
-      
+
       template <unsigned q, typename V>
       inline
       histo3d_hsl<q,V>::operator result() const
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<q,V>::operator result");
-
-	trace::exiting("mln::accu::stat::histo3d_rgb<q,V>::operator result");
 	return count_;
-      }      
+      }
 
       template <unsigned q, typename V>
       inline
       bool histo3d_hsl<q,V>::is_valid() const
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::is_valid");
 	bool result = count_.is_valid();
-	
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::is_valid");
+
 	return result;
       }
 
       template <unsigned q, typename V>
-      bool operator==(const histo3d_hsl<q,V>& histo1, 
+      bool operator==(const histo3d_hsl<q,V>& histo1,
 		      const histo3d_hsl<q,V>& histo2)
       {
-	trace::entering("mln::accu::stat::operator==");
+	trace::entering("mln::accu::stat::histo3d_hsl::operator==");
 
 	bool  result                  = true;
 	const image3d<unsigned>& res1 = histo1.to_result();
 	const image3d<unsigned>& res2 = histo2.to_result();
-	
+
 	mln_precondition(res1.is_valid());
 	mln_precondition(res2.is_valid());
 
@@ -364,11 +371,11 @@ namespace mln
 	for_all_2(p1, p2)
 	  result &= (res1(p1) == res2(p2));
 
-	trace::exiting("mln::accu::stat::operator==");
+	trace::exiting("mln::accu::stat::histo3d_hsl::operator==");
 	return result;
       }
 
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
 
 
     } // end of namespace mln::accu::stat
@@ -377,4 +384,4 @@ namespace mln
 
 } // end of namespace mln
 
-#endif // ! MLN_ACCU_STAT_HISTO3D_RGB_HH
+#endif // ! MLN_ACCU_STAT_HISTO3D_HSL_HH
diff --git a/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
index 48c49da..6a48024 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
@@ -1,6 +1,4 @@
-// Copyright (C) 2007 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -26,54 +24,67 @@
 // executable file might be covered by the GNU General Public License.
 
 #ifndef MLN_ACCU_STAT_HISTO3D_RGB_HH
-#define MLN_ACCU_STAT_HISTO3D_RGB_HH
+# define MLN_ACCU_STAT_HISTO3D_RGB_HH
 
 /// \file
 ///
-/// \brief Define a histogram as an accumulator which returns an image1d .
+/// \brief Define a histogram as accumulator which returns an image3d.
+///
+/// This source implements the discrete histogram version. It was
+/// created for images which the values are derived from integer
+/// type. The number of bins is directly infered from the cardinality
+/// of the image value. It works for RGB space. See histo1d.hh for limitations
+/// of such implementation. 8 bits quantification is very
+/// expensive, it produces image3d with [0..255,0..255,0..255] as domain.
 ///
-/// This source implements the discrete histogram version. The number of beans
-/// is infer from the number of greylevels. A typical rgb8 image has got
-/// 256x3 bins. Working with a 8 bit quantification in rgb is very costly.
 /// The following sample is a typical use of the histogram.
 ///
-/// #include <mln/value/rgb.hh>
-/// #include <mln/core/image/image1d.hh>
-/// #include <mln/core/image/image3d.hh>
-/// #include <mln/io/ppm/load.hh>
 /// #include <mln/accu/stat/histo3d_rgb.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/core/image/image3d.hh>
 /// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.hh>
+/// #include <mln/fun/v2v/rgb8_to_rgbn.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/ppm/load.hh>
+/// #include <mln/value/rgb.hh>
+/// #include <mln/value/rgb8.hh>
 ///
-/// #define  OLENA_LENA ""/usr/local/share/olena/images/lena.ppm"
-///
-/// void test()
+/// int main()
 /// {
-///   typedef mln::value::rgb<7> rgb7;
-///   mln::image2d<rgb7>         img_ref;
-///   mln::image3d<unsigned>     img_res;
+///   typedef mln::value::rgb8   t_rgb8;
+///   typedef mln::value::rgb<7> t_rgb7;
+///   mln::image2d<t_rgb8>       img_rgb8;
+///   mln::image2d<t_rgb7>       img_rgb7;
+///   mln::image3d<unsigned>     histo;
 ///
-///   mln::io::ppm::load(img_ref, OLENA_LENA);
-///   img_res=mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_ref);
+///   mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+///   img_rgb7 =mln::data::transform(img_rgb8,mln::fun::v2v::rgb8_to_rgbn<7>());
+///   histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_rgb7);
+///
+///   return 0;
 /// }
 
 
-#include <iostream>
+# include <iostream>
+
+# include <mln/accu/internal/base.hh>
 
-#include <mln/accu/internal/base.hh>
+# include <mln/arith/plus.hh>
 
-#include <mln/core/macros.hh>
-#include <mln/core/image/image3d.hh>
-#include <mln/core/alias/point3d.hh>
-#include <mln/core/alias/box3d.hh>
+# include <mln/core/macros.hh>
+# include <mln/core/image/image3d.hh>
+# include <mln/core/alias/point3d.hh>
+# include <mln/core/alias/box3d.hh>
 
-#include <mln/trait/value/comp.hh>
+# include <mln/literal/zero.hh>
 
-#include <mln/arith/plus.hh>
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
 
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
+# include <mln/trait/value/comp.hh>
 
-#include <mln/value/ops.hh>
+# include <mln/value/ops.hh>
 
 namespace mln
 {
@@ -140,13 +151,13 @@ namespace mln
     namespace stat
     {
 
-      /// \brief Define an histogram which returns an image3d .
+      /// \brief Define a histogram as accumulator which returns an image3d.
       ///
-      /// Param V defines the space in which we count the values.
-      /// For instance, this histogram works image2d<rgb<2>> or
-      /// image2d<rgb<7>>. The histogram count the occurrence of each value.
-      /// The number of bins depends of the grayscale values, for 8 bits there
-      /// is 256x3 bins. Note that over
+      /// Param V defines the type of the input image value. It is in
+      /// this space that we count the values. For instance, this
+      /// histogram works well for image2d< rgb<2> > or with image2d<
+      /// rgb<7> >. The number of bins depends directly the values V.
+      /// For 8 bits there is 256x3 bins. Note that less
       /// quantification works too.
       ///
       /// \ingroup modaccuvalues
@@ -159,16 +170,15 @@ namespace mln
 	typedef image3d<unsigned> result;
 	typedef result            q_result;
 
-	/// Constructors
+	/// Constructors.
 	/// \{
-	/// \brief Initialize the size of the resulting image1d.
+	/// \brief Infer the size of the resulting image3d domain.
 	///
-	/// Initialize the size the resulting image from the theorical dynamic
-	/// of the greylevel values (Use V to manage it).
+	/// By evaluating the minimum and the maximum of V, we define the domain
+	/// of the resulting image3d.
 	histo3d_rgb();
 	/// \}
 
-
 	/// Manipulators.
 	/// \{
 	/// \brief Initialize the histogram with zero value.
@@ -180,7 +190,7 @@ namespace mln
 
 
 	/// \brief Update the histogram with the RGB pixel t.
-	/// \param[in] t a greylevel pixel of type V.
+	/// \param[in] t a graylevel pixel of type V.
 	///
 	/// The end user shouldn't call this method. In place of it, he can
 	/// go through the data compute interface.
@@ -189,12 +199,15 @@ namespace mln
 
 	/// \brief Update the histogram with an other histogram.
 	/// \param[in] other the other histogram.
+	///
+	/// The end user shouldn't call this method. This is part of
+	/// data compute interface mechanism.
 	void take(const histo3d_rgb<V>& other);
 	/// \}
 
 	/// Accessors.
 	/// \{
-	/// \brief Return the histogram as an image1d.
+	/// \brief Return the histogram as an RGB image3d.
 	///
 	/// This is the machinery to communicate with data compute interface.
 	/// The end user should'nt use it.
@@ -216,19 +229,19 @@ namespace mln
       /// \param[in] histo1 the first histogram to compare with.
       /// \param[in] histo2 the second histogram.
       ///
-      /// The operator compare all the bins from the two histogram.
-
+      /// The operator compares all the bins from the two histograms.
+      /// Nobody uses this method unless unitary tests.
       template <typename V>
       bool operator==(const histo3d_rgb<V>& histo1,
 		      const histo3d_rgb<V>& histo2);
 
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
 
       template <typename V>
       inline
       histo3d_rgb<V>::histo3d_rgb()
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::histo3d_rgb");
+	trace::entering("mln::accu::stat::histo3d_rgb::cstor");
 	typedef mln_trait_value_comp(V,0) comp0;
 	typedef mln_trait_value_comp(V,1) comp1;
 	typedef mln_trait_value_comp(V,2) comp2;
@@ -244,31 +257,24 @@ namespace mln
 				   mln_max(comp1),
 				   mln_max(comp2))));
 
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::histo3d_rgb");
+	trace::exiting("mln::accu::stat::histo3d_rgb::cstor");
       }
 
       template <typename V>
       inline
       void histo3d_rgb<V>::init()
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::init");
-
-	data::fill(count_, 0);
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::init");
+	data::fill(count_, literal::zero);
       }
 
       template <typename V>
       inline
       void histo3d_rgb<V>::take(const argument& t)
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::take");
-
 	// Just convert a greyscale value (int_u8 like) to a position for an
 	// iterator on the resulting image.
 	// Take care to the constructor : Point(slice, row, column)
 	++count_(point3d(t.blue(), t.red(), t.green()));
-
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::take");
       }
 
 
@@ -276,20 +282,13 @@ namespace mln
       inline
       void histo3d_rgb<V>::take(const histo3d_rgb<V>& other)
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::take");
-
 	count_ += other.count_;
-
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::take");
       }
 
       template <typename V>
       inline
       typename histo3d_rgb<V>::result histo3d_rgb<V>::to_result() const
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::to_result");
-
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::to_result");
 	return count_;
       }
 
@@ -297,9 +296,6 @@ namespace mln
       inline
       histo3d_rgb<V>::operator result() const
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::operator result");
-
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::operator result");
 	return count_;
       }
 
@@ -307,10 +303,8 @@ namespace mln
       inline
       bool histo3d_rgb<V>::is_valid() const
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::is_valid");
 	bool result = count_.is_valid();
 
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::is_valid");
 	return result;
       }
 
@@ -318,7 +312,7 @@ namespace mln
       bool operator==(const histo3d_rgb<V>& histo1,
 		      const histo3d_rgb<V>& histo2)
       {
-	trace::entering("mln::accu::stat::operator==");
+	trace::entering("mln::accu::stat::histo3d_rgb::operator==");
 
 	bool  result                  = true;
 	const image3d<unsigned>& res1 = histo1.to_result();
@@ -333,11 +327,11 @@ namespace mln
 	for_all_2(p1, p2)
 	  result &= (res1(p1) == res2(p2));
 
-	trace::exiting("mln::accu::stat::operator==");
+	trace::exiting("mln::accu::stat::histo3d_rgb::operator==");
 	return result;
       }
 
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
 
 
     } // end of namespace mln::accu::stat
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh b/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
index 2918b1a..acf1b5e 100644
--- a/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
@@ -1,6 +1,4 @@
-// Copyright (C) 2007 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -35,6 +33,37 @@
 /// \file
 ///
 /// \brief Convert rgb8 value to rgbn, n < 8.
+///
+/// The source implements the reduction of quantification for any size less 8.
+///
+/// The following sample is a typical use of the histogram.
+///
+/// #include <mln/accu/stat/histo3d_rgb.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/core/image/image3d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.hh>
+/// #include <mln/fun/v2v/rgb8_to_rgbn.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/ppm/load.hh>
+/// #include <mln/value/rgb.hh>
+/// #include <mln/value/rgb8.hh>
+///
+/// int main()
+/// {
+///   typedef mln::value::rgb8   t_rgb8;
+///   typedef mln::value::rgb<7> t_rgb7;
+///   mln::image2d<t_rgb8>       img_rgb8;
+///   mln::image2d<t_rgb7>       img_rgb7;
+///   mln::image3d<unsigned>     histo;
+///
+///   mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+///   img_rgb7 =mln::data::transform(img_rgb8,mln::fun::v2v::rgb8_to_rgbn<7>());
+///   histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_rgb7);
+///
+///   return 0;
+/// }
+
 
 namespace mln
 {
@@ -45,16 +74,24 @@ namespace mln
     namespace v2v
     {
 
-      /// \brief Convert rgb8 value to rgbn, n < 8.
+      /// \brief Convert a rgb8 value to a rgn, n < 8.
+      ///
+      /// Param n defines the output quantification used for the transformation.
       ///
       /// \ingroup modfunv2v
-
       template <unsigned n>
       struct rgb8_to_rgbn : Function_v2v< rgb8_to_rgbn<n> >
       {
 	typedef value::rgb8   argument;
 	typedef value::rgb<n> result;
 
+	/// \brief Convert a rgb8 value to a rgn, n < 8.
+	///
+	/// \param[in] v the rgb8 value to convert.
+	///
+	/// Conversion is done by computing the size by which we
+	/// divide each rgb component.
+
 	result operator()(const argument& c) const
 	{
 	  mln_precondition(8 > n);
@@ -65,7 +102,7 @@ namespace mln
 	  std::cout << "red  : " << c.red() << std::endl;
 	  std::cout << "size : " << size << std::endl;
 	  std::cout << "res  : " << (c.red() / size) << std::endl;
-	  std::cout << "max  : " << (mln_max(mln::value::int_u<n>)) << std::endl;
+	  std::cout << "max  : " << (mln_max(mln::value::int_u<n>))<< std::endl;
 	  */
 	  result   res(c.red() / size, c.green() / size, c.blue() / size);
 
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
index d4c1e46..e9450e1 100644
--- a/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
@@ -81,7 +81,6 @@ namespace mln
       /// Param n defines the quantification used for rgb space and rg space.
       ///
       /// \ingroup modfunv2v
-
       template <unsigned n>
       struct rgb_to_rg : Function_v2v< rgb_to_rg<n> >
       {
@@ -95,7 +94,6 @@ namespace mln
 	/// Conversion is done by calling the rg constructor. There is
 	/// no modification of values. The red/green fields from rgb the value
 	/// are preserved. Blue value is dropped.
-
 	result operator()(const argument& v) const
 	{
 	  return value::rg<n>(v);
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
index 5a5c4c4..2fdc7dd 100644
--- a/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
+++ b/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
@@ -1,21 +1,507 @@
-/// TEST HISTO1D
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
 
+/// \file
+///
+/// \brief This source manages unitary testing on image1d histogram component.
+///
+/// Tests are performed in 8 bits and also in 14 bits quantification. The goal
+/// is to go through each programmatic flow to verify the conformity of the
+/// code. It sounds like a theoritic model of unitary testing for milena.
+/// The last test enables statistic computations on that component.
+
+#include <mln/accu/math/count.hh>
+#include <mln/accu/math/sum.hh>
 #include <mln/accu/stat/histo1d.hh>
+#include <mln/accu/stat/mean.hh>
+#include <mln/accu/stat/variance.hh>
+
+#include <mln/core/alias/box1d.hh>
+#include <mln/core/alias/point1d.hh>
+#include <mln/core/contract.hh>
+#include <mln/core/grids.hh>
+#include <mln/core/routine/initialize.hh>
+
 #include <mln/data/compute.hh>
-#include <mln/core/image/image1d.hh>
-#include <mln/core/image/image2d.hh>
+#include <mln/data/fill.hh>
+#include <mln/data/transform.hh>
+
+#include <mln/fun/v2v/int_u16_to_int_u14.hh>
+
 #include <mln/img_path.hh>
+
 #include <mln/io/pgm/load.hh>
+
+#include <mln/math/sqr.hh>
+#include <mln/math/abs.hh>
+
 #include <mln/value/int_u8.hh>
+#include <mln/value/int_u16.hh>
+
+
+/// Specific histogram accumulators.
+/// \{
+/// \brief Define statistical accumulator for histogram.
+///
+/// Here, some histogram accumulators are defined, the sum of the frequencies,
+/// the average, the variance.
+
+double count_histo(const mln::image1d<unsigned> img)
+{
+  mln_precondition(img.is_valid());
+
+  double                             result = 0.0;
+  double                             value  = 0.0;
+  mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value  = img(p);
+    result += value;
+  }
+
+  return result;
+}
+
+double mean_histo(mln::image1d<unsigned> img)
+{
+  mln_precondition(img.is_valid());
+
+  double                             value  = 0.0;
+  double                             site   = 0.0;
+  double                             count  = 0.0;
+  double                             sum    = 0.0;
+  double                             result = 0.0;
+  mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value =  img(p);
+    site  =  p.ind();
+    count += value;
+    sum   += site * value;
+  }
+
+  result = sum / count;
+
+  return result;
+}
+
+
+/// \fixme there is a conversion type problem with the interface of iterator p.
+
+double var_histo(const mln::image1d<unsigned> img)
+{
+  mln_precondition(img.is_valid());
+
+  double                             value  = 0.0;
+  double                             site   = 0.0;
+  // FIXME: such variables value and site are necessary to obtain the
+  // well computation of the variance.
+
+  double                             count  = 0.0;
+  double                             sum    = 0.0;
+  double                             sum2   = 0.0;
+  double                             result = 0.0;
+  mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value  = img(p);
+    site   = p.ind();
+    count += value;
+    sum   += site * value;
+    sum2  += mln::math::sqr(site) * value;
+  }
+
+  result = sum2 / count - (sum / count) * (sum / count);
+
+  return result;
+}
+
+
+/// \fixme there is a conversion type problem with the interface of iterator p.
+
+double var_histo2(const mln::image1d<unsigned> img)
+{
+  mln_precondition(img.is_valid());
+
+  double                             value  = 0.0;
+  double                             site   = 0.0;
+  // FIXME: such variables value and site are necessary to obtain the
+  // well computation of the variance.
+
+  double                             count  = count_histo(img);
+  double                             mean   = mean_histo(img);
+  double                             result = 0.0;
+  mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value  = img(p);
+    site   = p.ind();
+    result += value * mln::math::sqr(site - mean);
+  }
+
+  result /= count;
+
+  return result;
+}
+
+/// \}
+
+
+/// 8-bits testing
+/// \{
+/// \brief This part of the code manages the 8-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
+
+void test_8bits_operator_equal()
+{
+  using namespace mln::accu::stat;
+
+  typedef mln::value::int_u8       int_u8;
+  mln::accu::stat::histo1d<int_u8> histo1;
+  mln::accu::stat::histo1d<int_u8> histo2;
+  int_u8                           val = 3;
+
+  histo1.init();
+  histo2.init();
+
+  mln_assertion(histo1 == histo2);
+
+  histo1.take(val);
+
+  mln_assertion(!(histo1 == histo2));
+  // mln_assertion(histo1 != histo2);
+  // FIXME: DOESN'T WORK !!
+
+  histo2.take(val);
+
+  mln_assertion(histo1 == histo2);
+
+  std::cout << "(08 bits) histo == histo       : ok" << std::endl;
+}
+
+void test_8bits_instantiation_without_argument()
+{
+  typedef mln::value::int_u8               int_u8;
+  const   mln::accu::stat::histo1d<int_u8> histo;
+  const   mln::image1d<unsigned>&          res = histo.to_result();
+  const   mln::point1d&                    min = mln::point1d(mln_min(int_u8));
+  const   mln::point1d&                    max = mln::point1d(mln_max(int_u8));
+  const   mln::box1d&                      ref = mln::box1d(min, max);
+
+  mln_assertion(ref == res.domain());
+  mln_assertion(res.is_valid());
+
+  std::cout << "(08 bits) histo<T> histo       : ok" << std::endl;
+}
+
+
+void test_8bits_initialization()
+{
+  typedef mln::value::int_u8       int_u8;
+  mln::accu::stat::histo1d<int_u8> histo;
+  mln::image1d<unsigned>           img_res = histo.to_result();
+  mln::image1d<unsigned>           img_ref;
+
+  mln::initialize(img_ref, img_res);
+  mln::data::fill(img_ref, 0);
+  histo.init();
+
+  unsigned res = mln::data::compute(mln::accu::math::sum<int_u8>(), img_res);
+  unsigned ref = mln::data::compute(mln::accu::math::sum<int_u8>(), img_ref);
+
+  mln_assertion(ref == res);
+
+  std::cout << "(08 bits) histo.init()         : ok" << std::endl;
+}
+
+
+void test_8bits_take_argument()
+{
+  typedef mln::value::int_u8       int_u8;
+  mln::accu::stat::histo1d<int_u8> histo1;
+  mln::accu::stat::histo1d<int_u8> histo2;
+  int_u8                           val = 3;
+
+  histo1.init();
+  histo2.init();
+  histo1.take(val);
+
+  const mln::image1d<unsigned>     img1 = histo1.to_result();
+  const mln::image1d<unsigned>     img2 = histo2.to_result();
+
+  const unsigned res = mln::data::compute(mln::accu::math::sum<int_u8>(), img1);
+  const unsigned ref = mln::data::compute(mln::accu::math::sum<int_u8>(), img2);
+
+  mln_assertion(ref == res-1);
+  mln_assertion(1 == img1(mln::point1d(val)));
+
+  std::cout << "(08 bits) histo.take(argument) : ok" << std::endl;
+}
+
+
+void test_8bits_take_other()
+{
+  typedef mln::value::int_u8       int_u8;
+  mln::accu::stat::histo1d<int_u8> histo1;
+  mln::accu::stat::histo1d<int_u8> histo2;
+  mln::accu::stat::histo1d<int_u8> histo3;
+  int_u8                           val = 3;
+
+  histo1.init();
+  histo2.init();
+  histo3.init();
+
+  histo1.take(val);
+  histo1.take(val);
+  histo3.take(val);
+  histo2.take(val);
+  histo2.take(histo3);
+
+  mln_assertion(histo1 == histo2);
+
+  std::cout << "(08 bits) histo.take(other)    : ok" << std::endl;
+}
+
+void test_8bits_integration()
+{
+  typedef mln::value::int_u8                int_u8;
+  typedef mln::accu::math::count<double>    count;
+  typedef mln::accu::math::sum<double>      sum;
+  typedef mln::accu::stat::mean<double>     mean;
+  typedef mln::accu::stat::variance<double> variance;
+
+  mln::image2d<int_u8>       img_ref;
+  mln::image1d<unsigned>     img_res;
+
+  mln::io::pgm::load(img_ref, OLENA_IMG_PATH"/lena.pgm");
+
+  const double count_ref = mln::data::compute(count(),    img_ref);
+  const double mean_ref  = mln::data::compute(mean(),     img_ref);
+  const double var_ref   = mln::data::compute(variance(), img_ref);
+
+  img_res = mln::data::compute(mln::accu::meta::stat::histo1d(), img_ref);
+
+  const double count_res = count_histo(img_res);
+  const double mean_res  = mean_histo(img_res);
+  const double var_res   = var_histo(img_res);
+
+  mln_assertion(count_ref == count_res);
+  mln_assertion( mean_ref == mean_res );
+
+  // std::cout << "var_ref : " << var_ref << std::endl;
+  // std::cout << "var_res : " << var_res << std::endl;
+
+  mln_assertion(0.0001 > mln::math::abs(var_ref - var_res));
+
+  std::cout << "(08 bits) test integration     : ok" << std::endl;
+}
+
+/// \}
+
+/// 14-bits testing
+/// \{
+/// \brief This part of the code manages the 14-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
+
+void test_14bits_operator_equal()
+{
+  using namespace mln::accu::stat;
+
+  typedef mln::value::int_u<14>     int_u14;
+  mln::accu::stat::histo1d<int_u14> histo1;
+  mln::accu::stat::histo1d<int_u14> histo2;
+  int_u14                           val = 3;
+
+  histo1.init();
+  histo2.init();
+
+  mln_assertion(histo1 == histo2);
+
+  histo1.take(val);
+
+  /// FIXME: mln_assertion(histo1 != histo2); doesn't work!!
+  mln_assertion(!(histo1 == histo2));
+
+  histo2.take(val);
+
+  mln_assertion(histo1 == histo2);
+
+  std::cout << "(14 bits) histo == histo       : ok" << std::endl;
+}
+
+void test_14bits_instantiation_without_argument()
+{
+  typedef mln::value::int_u<14>             int_u14;
+  const   mln::accu::stat::histo1d<int_u14> histo;
+  const   mln::image1d<unsigned>&           res = histo.to_result();
+  const   mln::point1d&                     min =mln::point1d(mln_min(int_u14));
+  const   mln::point1d&                     max =mln::point1d(mln_max(int_u14));
+  const   mln::box1d&                       ref = mln::box1d(min, max);
+
+  mln_assertion(ref == res.domain());
+  mln_assertion(res.is_valid());
+
+  std::cout << "(14 bits) histo<T> histo       : ok" << std::endl;
+}
+
+
+void test_14bits_initialization()
+{
+  typedef mln::value::int_u<14>     int_u14;
+  mln::accu::stat::histo1d<int_u14> histo;
+  mln::image1d<unsigned>            img_res = histo.to_result();
+  mln::image1d<unsigned>            img_ref;
+
+  mln::initialize(img_ref, img_res);
+  mln::data::fill(img_ref, 0);
+  histo.init();
+
+  unsigned res = mln::data::compute(mln::accu::math::sum<int_u14>(), img_res);
+  unsigned ref = mln::data::compute(mln::accu::math::sum<int_u14>(), img_ref);
+
+  mln_assertion(ref == res);
+
+  std::cout << "(14 bits) histo.init()         : ok" << std::endl;
+}
+
+
+void test_14bits_take_argument()
+{
+  typedef mln::value::int_u<14>     int_u14;
+  mln::accu::stat::histo1d<int_u14> histo1;
+  mln::accu::stat::histo1d<int_u14> histo2;
+  int_u14                           val = 3;
+
+  histo1.init();
+  histo2.init();
+  histo1.take(val);
+
+  const mln::image1d<unsigned>     img1 = histo1.to_result();
+  const mln::image1d<unsigned>     img2 = histo2.to_result();
+
+  const unsigned res = mln::data::compute(mln::accu::math::sum<int_u14>(),img1);
+  const unsigned ref = mln::data::compute(mln::accu::math::sum<int_u14>(),img2);
+
+  mln_assertion(ref == res-1);
+  mln_assertion(1 == img1(mln::point1d(val)));
+
+  std::cout << "(14 bits) histo.take(argument) : ok" << std::endl;
+}
+
+
+void test_14bits_take_other()
+{
+  typedef mln::value::int_u<14>     int_u14;
+  mln::accu::stat::histo1d<int_u14> histo1;
+  mln::accu::stat::histo1d<int_u14> histo2;
+  mln::accu::stat::histo1d<int_u14> histo3;
+  int_u14                           val = 3;
+
+  histo1.init();
+  histo2.init();
+  histo3.init();
+
+  histo1.take(val);
+  histo1.take(val);
+  histo3.take(val);
+  histo2.take(val);
+  histo2.take(histo3);
+
+  mln_assertion(histo1 == histo2);
+
+  std::cout << "(14 bits) histo.take(other)    : ok" << std::endl;
+}
+
+void test_14bits_integration()
+{
+  typedef mln::value::int_u16               int_u16;
+  typedef mln::value::int_u<14>             int_u14;
+  typedef mln::accu::math::count<double>    count;
+  typedef mln::accu::math::sum<double>      sum;
+  typedef mln::accu::stat::mean<double>     mean;
+  typedef mln::accu::stat::variance<double> variance;
+
+  mln::image2d<int_u16>      img_fst;
+  mln::image2d<int_u14>      img_ref;
+  mln::image1d<unsigned>     img_res;
+
+  mln::io::pgm::load(img_fst, OLENA_IMG_PATH"/lena_16_imageMagick.pgm");
+  img_ref = mln::data::transform(img_fst, mln::fun::v2v::int_u16_to_int_u14());
+
+  const double count_ref = mln::data::compute(count(),    img_ref);
+  const double mean_ref  = mln::data::compute(mean(),     img_ref);
+  const double var_ref   = mln::data::compute(variance(), img_ref);
+
+  img_res = mln::data::compute(mln::accu::stat::histo1d<int_u14>(), img_ref);
+
+  const double count_res = count_histo(img_res);
+  const double mean_res  = mean_histo(img_res);
+  const double var_res   = var_histo2(img_res);
+
+  //std::cout << "var_res : " << var_res << std::endl;
+  //std::cout << "var_ref : " << var_ref << std::endl;
+
+  mln_assertion(count_ref == count_res);
+  mln_assertion( mean_ref == mean_res );
+  mln_assertion(0.0001 > abs(var_ref - var_res));
+
+  std::cout << "(14 bits) test integration     : ok" << std::endl;
+}
+
+/// \}
 
 int main()
 {
-  typedef mln::value::int_u8 t_int_u8;
-  mln::image2d<t_int_u8>     img;
-  mln::image1d<unsigned>     histo;
+  test_8bits_operator_equal();
+  test_8bits_instantiation_without_argument();
+  test_8bits_initialization();
+  test_8bits_take_argument();
+  test_8bits_take_other();
+  test_8bits_operator_equal();
+  test_8bits_integration();
 
-  mln::io::pgm::load(img, OLENA_IMG_PATH"/lena.pgm");
-  histo = mln::data::compute(mln::accu::meta::stat::histo1d(), img);
+  test_14bits_instantiation_without_argument();
+  test_14bits_initialization();
+  test_14bits_take_argument();
+  test_14bits_take_other();
+  test_14bits_operator_equal();
+  test_14bits_integration();
 
   return 0;
 }
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/tests/accu/stat/histo3d_hsl/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/tests/accu/stat/histo3d_hsl/Makefile.am
diff --git a/milena/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc b/scribo/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
similarity index 73%
copy from milena/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
copy to scribo/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
index 0a12706..eed377c 100644
--- a/milena/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
+++ b/scribo/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
@@ -1,66 +1,189 @@
-/// TEST HISTO3D_HSL
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief This source manages unitary testing on rgb image3d histogram.
+///
+/// Tests are performed from 2 bits up to 8 bits quantification. The goal
+/// is to go through each programmatic flow to verify the conformity of the
+/// code. It sounds like a theoritic model of unitary testing for milena.
+/// The last test enables statistic computations on that component.
 
-#include <mln/img_path.hh>
-
-#include <mln/io/plot/save_histo_sh.hh>
+#include <mln/accu/math/sum.hh>
+#include <mln/accu/math/count.hh>
 #include <mln/accu/stat/histo3d_hsl.hh>
-#include <mln/fun/v2v/rgb8_to_rgbn.hh>
-#include <mln/fun/v2v/rgb_to_hsl.hh>
+#include <mln/accu/stat/mean.hh>
+#include <mln/accu/stat/variance.hh>
+#include <mln/accu/stat/var.hh>
 
-#include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-#include <mln/io/pfm/save.hh>
-#include <mln/io/plot/save.hh>
+#include <mln/core/alias/box3d.hh>
+#include <mln/core/alias/point3d.hh>
+#include <mln/core/contract.hh>
+#include <mln/core/grids.hh>
+#include <mln/core/routine/initialize.hh>
 
 #include <mln/data/compute.hh>
-#include <mln/data/transform.hh>
 #include <mln/data/fill.hh>
+#include <mln/data/transform.hh>
+
+#include <mln/fun/v2v/rgb_to_hsl.hh>
+
+#include <mln/img_path.hh>
+
+#include <mln/io/ppm/load.hh>
+
+#include <mln/literal/zero.hh>
+
+#include <mln/math/sqr.hh>
+#include <mln/math/abs.hh>
 
-#include <mln/value/label_8.hh>
 #include <mln/value/rgb8.hh>
 #include <mln/value/hsl.hh>
-#include <mln/value/rgb.hh>
-#include <mln/value/int_u.hh>
 
-#include <mln/core/alias/neighb3d.hh>
-#include <mln/core/alias/box3d.hh>
-#include <mln/core/alias/point3d.hh>
+/// Specific histogram accumulators.
+/// \{
+/// \brief Define statistical accumulator for histogram.
+///
+/// Here, some histogram accumulators are defined, the sum of the frequencies,
+/// the average, the variance.
 
-#include <mln/core/routine/initialize.hh>
-#include <mln/core/contract.hh>
-#include <mln/core/grids.hh>
+double count_histo(const mln::image3d<unsigned>& img)
+{
+  mln_precondition(img.is_valid());
 
-#include <mln/accu/math/sum.hh>
-#include <mln/accu/math/count.hh>
-#include <mln/accu/stat/mean.hh>
-#include <mln/accu/stat/variance.hh>
-#include <mln/accu/stat/var.hh>
+  double                             result = 0.0;
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
 
-#include <mln/morpho/watershed/flooding.hh>
-#include <mln/morpho/elementary/dilation.hh>
-#include <mln/morpho/elementary/closing.hh>
+  for_all(p)
+    result += img(p);
 
-#include <mln/literal/zero.hh>
-#include <mln/linear/convolve.hh>
-#include <mln/linear/gaussian.hh>
-#include <mln/labeling/regional_maxima.hh>
-#include <mln/labeling/colorize.hh>
-#include <mln/labeling/mean_values.hh>
+  return result;
+}
 
-#include <mln/make/w_window3d.hh>
+mln::algebra::vec<3,float> conv(const mln::algebra::vec<3,float>& vec,
+				const unsigned                    q)
+{
+  mln::algebra::vec<3,float> result;
 
-#include <mln/math/sqr.hh>
-#include <mln/math/pi.hh>
-#include <mln/math/abs.hh>
+  /*
+  result[0] = vec[2] * (360.0/q);
+  result[1] = vec[0] * (1.0/q);
+  result[2] = vec[1] * (1.0/q);
+  */
+
+  result[0] = (vec[0]+0.5) * (360.0/q);
+  result[1] = (vec[1]+0.5) * (1.0/q);
+  result[2] = (vec[2]+0.5) * (1.0/q);
+
+  return result;
+}
+
+mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img,
+				      const unsigned                  q)
+{
+  mln_precondition(img.is_valid());
+  typedef mln::algebra::vec<3,float> vec3f;
+  double                             count  = 0.0;
+  vec3f                              sum    = mln::literal::zero;
+  vec3f                              result;
+
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    count += img(p);
+    sum   += conv((vec3f)p, q) * img(p);
+  }
+
+  result = sum / count;
+
+  return result;
+}
+
+mln::algebra::mat<3,3,float> var_histo(const mln::image3d<unsigned>& img,
+				       const unsigned                q)
+{
+  mln_precondition(img.is_valid());
+  typedef mln::algebra::vec<3,float>   vec3f;
+  typedef mln::algebra::mat<3,3,float> mat3f;
+
+  double                             count  = count_histo(img);
+  vec3f                              mean   = mean_histo(img,q);
+  vec3f                              point;
+  mat3f                              result = mln::literal::zero;
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    point  = conv((vec3f)p, q) - mean;
+    result += img(p) * (point * point.t());
+  }
 
-#include <mln/core/image/dmorph/image_if.hh>
-#include <mln/pw/value.hh>
+  result /= count;
+
+  return result;
+}
 
-#include <mln/trait/image/print.hh>
-#include <mln/trait/value_.hh>
-#include <mln/core/concept/function.hh>
+/// \}
+
+struct hslf_2_vec3f : public mln::Function_v2v< hslf_2_vec3f >
+{
+  typedef mln::algebra::vec<3,float> result;
+  result operator()(const mln::value::hsl_f& hsl) const;
+};
+
+mln::algebra::vec<3,float>
+hslf_2_vec3f::operator()(const mln::value::hsl_f& hsl) const
+{
+  return mln::make::vec(hsl.hue(), hsl.lum(), hsl.sat());
+}
+
+struct hslf_2_h : public mln::Function_v2v< hslf_2_h >
+{
+  typedef float result;
+  result operator()(const mln::value::hsl_f& hsl) const;
+};
+
+float
+hslf_2_h::operator()(const mln::value::hsl_f& hsl) const
+{
+  return hsl.hue();
+}
 
 
+/// n-bits testing
+/// \{
+/// \brief This part of the code manages the n-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
+
 template <unsigned n>
 void test_operator_equal()
 {
@@ -129,7 +252,7 @@ void test_initialization()
 
   unsigned res = mln::data::compute(mln::accu::math::sum<int_un>(), img_res);
   unsigned ref = mln::data::compute(mln::accu::math::sum<int_un>(), img_ref);
-  
+
   mln_assertion(ref == res);
 
   std::cout << "(" << n << " bits) histo.init()         : ok" << std::endl;
@@ -184,131 +307,6 @@ void test_take_other()
   std::cout << "(" << n << " bits) histo.take(other)    : ok" << std::endl;
 }
 
-double count_histo(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  
-  double                             result = 0.0;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-    result += img(p);
-
-  return result;
-}
-
-mln::algebra::vec<3,float> conv(const mln::algebra::vec<3,float>& vec,
-				const unsigned                    q)
-{
-  mln::algebra::vec<3,float> result;
-
-  /*
-  result[0] = vec[2] * (360.0/q);
-  result[1] = vec[0] * (1.0/q);
-  result[2] = vec[1] * (1.0/q);
-  */
-
-  result[0] = (vec[0]+0.5) * (360.0/q);
-  result[1] = (vec[1]+0.5) * (1.0/q);
-  result[2] = (vec[2]+0.5) * (1.0/q);
-
-  return result;
-}
-
-mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img,
-				      const unsigned                  q)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float> vec3f;
-  double                             count  = 0.0;
-  vec3f                              sum    = mln::literal::zero;
-  vec3f                              result;
-
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    count += img(p);
-    sum   += conv((vec3f)p, q) * img(p);
-  }
-
-  result = sum / count;
-
-  return result;
-}
-
-
-double var_histo(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float>   vec3f;
-  typedef mln::algebra::mat<3,3,float> mat3f;
-  double                               count  = 0.0;
-  double                               sum    = 0.0;
-  double                               sum2   = 0.0;
-  double                               result = 0.0;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    count += img(p);
-    sum   += p[0] * img(p);
-    sum2  += p[0] * p[0] * img(p);
-  }
-
-  result = sum2 / count - (sum / count) * (sum / count);
-
-  return result;
-}
-
-mln::algebra::mat<3,3,float> var_histo2(const mln::image3d<unsigned>& img,
-					const unsigned                q)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float>   vec3f;
-  typedef mln::algebra::mat<3,3,float> mat3f;
-  
-  double                             count  = count_histo(img);
-  vec3f                              mean   = mean_histo(img,q);
-  vec3f                              point;
-  mat3f                              result = mln::literal::zero;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    point  = conv((vec3f)p, q) - mean;
-    result += img(p) * (point * point.t());
-  }
-
-  result /= count;
-
-  return result;
-}
-
-struct hslf_2_vec3f : public mln::Function_v2v< hslf_2_vec3f >
-{
-  typedef mln::algebra::vec<3,float> result;
-  result operator()(const mln::value::hsl_f& hsl) const;
-};
-
-mln::algebra::vec<3,float>
-hslf_2_vec3f::operator()(const mln::value::hsl_f& hsl) const
-{
-  return mln::make::vec(hsl.hue(), hsl.lum(), hsl.sat());
-}
-
-struct hslf_2_h : public mln::Function_v2v< hslf_2_h >
-{
-  typedef float result;
-  result operator()(const mln::value::hsl_f& hsl) const;
-};
-
-float
-hslf_2_h::operator()(const mln::value::hsl_f& hsl) const
-{
-  return hsl.hue();
-}
-
 template <unsigned n, unsigned q>
 void test_integration()
 {
@@ -331,37 +329,27 @@ void test_integration()
   mln::image2d<float>        img_sav;
 
   mln::io::ppm::load(img_fst, OLENA_IMG_PATH"/lena.ppm");
-    //mln::io::ppm::load(img_fst, OLENA_IMG_PATH"/fly.ppm");
-  //img_sec = mln::data::transform(img_fst, mln::fun::v2v::rgb8_to_rgbn<n>());
   img_thd = mln::data::transform(img_fst,mln::fun::v2v::f_rgb_to_hsl_<hsl_f>());
-
-  //img_sav = mln::data::transform(img_thd, hslf_2_h());
-  //mln::io::plot::save_histo_sh(img_sav, "lena2.sh");
-
   img_ref = mln::data::transform(img_thd, hslf_2_vec3f());
 
   const double count_ref = mln::data::compute(count(), img_ref);
-  //  const vec3f  sum_ref   = mln::data::compute(sum(),   img_ref);
-  const vec3f  mean_ref  = mln::data::compute(mean(),  img_ref);  
+  const vec3f  mean_ref  = mln::data::compute(mean(),  img_ref);
   const mat3f  var_ref   = mln::data::compute(var(),   img_ref);
 
-  img_res = mln::data::compute(mln::accu::stat::histo3d_hsl<q,hsl_f>(),img_thd);
-  
-  mln::io::plot::save_histo_sh(img_res, "histo_hsl.sh");
+  img_res = mln::data::compute(mln::accu::meta::stat::histo3d_hsl<q>(),img_thd);
 
   const double count_res = count_histo(img_res);
   const vec3f  mean_res  = mean_histo(img_res, q);
   const mat3f  var_res   = var_histo2(img_res, q);
- 
-  std::cout << "count_ref : " << count_ref << std::endl;
-  std::cout << "mean_ref  : " << mean_ref  << std::endl;
-  std::cout << "var_ref   : " << var_ref   << std::endl;
 
-  std::cout << "count_res : " << count_res << std::endl;
-  std::cout << "mean_res  : " << mean_res  << std::endl;
-  std::cout << "var_res   : " << var_res   << std::endl;
+  // std::cout << "count_ref : " << count_ref << std::endl;
+  // std::cout << "mean_ref  : " << mean_ref  << std::endl;
+  // std::cout << "var_ref   : " << var_ref   << std::endl;
+
+  // std::cout << "count_res : " << count_res << std::endl;
+  // std::cout << "mean_res  : " << mean_res  << std::endl;
+  // std::cout << "var_res   : " << var_res   << std::endl;
 
-  
   mln_assertion(count_ref == count_res);
 
   /*
@@ -385,39 +373,19 @@ void test_integration()
   std::cout << "(" << n << " bits) test integration     : ok" << std::endl;
 }
 
-void test()
-{
-  typedef mln::value::rgb8                    rgb8;
-  typedef mln::value::hsl_f                   hsl_f;
-  typedef mln::fun::v2v::f_rgb_to_hsl_<hsl_f> rgb_to_hsl_f;
-  mln::image2d<rgb8>                          img_fst;
-  mln::image2d<hsl_f>                         img_ref;
-  rgb_to_hsl_f                                instance;
-  rgb8                                        rgb(255,127,0);
-  hsl_f                                       hsl = instance(rgb);
-
-  std::cout << hsl.hue() << std::endl;
-  std::cout << hsl.lum() << std::endl;
-  std::cout << hsl.sat() << std::endl;
-
+/// \}
 
-  mln::io::ppm::load(img_fst, OLENA_IMG_PATH"/lena.ppm");
-  img_ref = mln::data::transform(img_fst, rgb_to_hsl_f());
-
-  //mln::accu::stat::histo3d_hsl<hsl_f>();
-
-}
+/// \fixme Should compile but doesn't. Fold problem in histo_hsl.hh.
 
 int main()
 {
-  /*
+
   test_operator_equal<3>();
   test_instantiation_without_argument<3>();
   test_initialization<3>();
-  test_take_argument<3>(); 
+  test_take_argument<3>();
   test_take_other<3>();
-  */
   test_integration<7,6>();
-  
+
   return 0;
 }
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/tests/accu/stat/histo3d_rgb/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/tests/accu/stat/histo3d_rgb/Makefile.am
diff --git a/milena/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc b/scribo/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
similarity index 64%
copy from milena/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
copy to scribo/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
index cbf273b..3f87c4d 100644
--- a/milena/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
+++ b/scribo/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
@@ -1,58 +1,152 @@
-/// TEST HISTO3D_RGB
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief This source manages unitary testing on rgb image3d histogram.
+///
+/// Tests are performed from 2 bits up to 8 bits quantification. The goal
+/// is to go through each programmatic flow to verify the conformity of the
+/// code. It sounds like a theoritic model of unitary testing for milena.
+/// The last test enables statistic computations on that component.
 
-#include <mln/img_path.hh>
-
-#include <mln/io/plot/save_histo_sh.hh>
+#include <mln/accu/math/sum.hh>
+#include <mln/accu/math/count.hh>
 #include <mln/accu/stat/histo3d_rgb.hh>
-#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+#include <mln/accu/stat/mean.hh>
+#include <mln/accu/stat/variance.hh>
+#include <mln/accu/stat/var.hh>
 
-#include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-#include <mln/io/plot/save.hh>
-#include <mln/io/plot/save_histo_sh.hh>
+#include <mln/core/alias/box3d.hh>
+#include <mln/core/alias/point3d.hh>
+#include <mln/core/contract.hh>
+#include <mln/core/grids.hh>
+#include <mln/core/routine/initialize.hh>
 
 #include <mln/data/compute.hh>
-#include <mln/data/transform.hh>
 #include <mln/data/fill.hh>
+#include <mln/data/transform.hh>
+
+#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+
+#include <mln/img_path.hh>
+
+#include <mln/io/ppm/load.hh>
+
+#include <mln/literal/zero.hh>
+
+#include <mln/math/sqr.hh>
+#include <mln/math/abs.hh>
 
-#include <mln/value/label_8.hh>
 #include <mln/value/rgb8.hh>
 #include <mln/value/rgb.hh>
-#include <mln/value/int_u.hh>
 
-#include <mln/core/alias/neighb3d.hh>
-#include <mln/core/alias/box3d.hh>
-#include <mln/core/alias/point3d.hh>
+/// Specific histogram accumulators.
+/// \{
+/// \brief Define statistical accumulator for histogram.
+///
+/// Here, some histogram accumulators are defined, the sum of the frequencies,
+/// the average, the variance.
 
-#include <mln/core/routine/initialize.hh>
-#include <mln/core/contract.hh>
-#include <mln/core/grids.hh>
+double count_histo(const mln::image3d<unsigned>& img)
+{
+  mln_precondition(img.is_valid());
 
-#include <mln/accu/math/sum.hh>
-#include <mln/accu/math/count.hh>
-#include <mln/accu/stat/mean.hh>
-#include <mln/accu/stat/variance.hh>
-#include <mln/accu/stat/var.hh>
+  double                             value  = 0.0;
+  double                             result = 0.0;
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value   = img(p);
+    result += value;
+  }
 
-#include <mln/morpho/watershed/flooding.hh>
-#include <mln/morpho/elementary/dilation.hh>
-#include <mln/morpho/elementary/closing.hh>
+  return result;
+}
 
-#include <mln/literal/zero.hh>
-#include <mln/linear/convolve.hh>
-#include <mln/linear/gaussian.hh>
-#include <mln/labeling/regional_maxima.hh>
-#include <mln/labeling/colorize.hh>
-#include <mln/labeling/mean_values.hh>
+mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img)
+{
+  mln_precondition(img.is_valid());
+  typedef mln::algebra::vec<3,float> vec3f;
+  double                             value  = 0.0;
+  double                             count  = 0.0;
+  vec3f                              sum    = mln::literal::zero;
+  vec3f                              result;
 
-#include <mln/make/w_window3d.hh>
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
 
-#include <mln/math/sqr.hh>
-#include <mln/math/pi.hh>
-#include <mln/math/abs.hh>
+  for_all(p)
+  {
+    value  = img(p);
+    count += value;
+    sum   += p.to_vec() * value;
+  }
 
-#include <mln/core/image/dmorph/image_if.hh>
-#include <mln/pw/value.hh>
+  result = sum / count;
+
+  return result;
+}
+
+
+mln::algebra::mat<3,3,float> var_histo (const mln::image3d<unsigned>& img)
+{
+  mln_precondition(img.is_valid());
+  typedef mln::algebra::vec<3,float>   vec3f;
+  typedef mln::algebra::mat<3,3,float> mat3f;
+
+  double                             value  = 0.0;
+  double                             count  = count_histo(img);
+  vec3f                              mean   = mean_histo(img);
+  vec3f                              point;
+  mat3f                              result = mln::literal::zero;
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value   = img(p);
+    point   = p.to_vec() - mean;
+    result += value * (point * point.t());
+  }
+
+  result /= count;
+
+  return result;
+}
+
+/// \}
+
+/// n-bits testing
+/// \{
+/// \brief This part of the code manages the n-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
 
 
 template <unsigned n>
@@ -72,8 +166,10 @@ void test_operator_equal()
 
   histo1.take(val);
 
-  /// FIXME mln_assertion(histo1 != histo2); doesn't work!!
   mln_assertion(!(histo1 == histo2));
+  // mln_assertion(histo1 != histo2);
+  // FIXME: DOESN'T WORK !!
+
 
   histo2.take(val);
 
@@ -118,7 +214,7 @@ void test_initialization()
 
   unsigned res = mln::data::compute(mln::accu::math::sum<int_un>(), img_res);
   unsigned ref = mln::data::compute(mln::accu::math::sum<int_un>(), img_ref);
-  
+
   mln_assertion(ref == res);
 
   std::cout << "(" << n << " bits) histo.init()         : ok" << std::endl;
@@ -173,86 +269,7 @@ void test_take_other()
   std::cout << "(" << n << " bits) histo.take(other)    : ok" << std::endl;
 }
 
-double count_histo(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  
-  double                             result = 0.0;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-    result += img(p);
-
-  return result;
-}
-
-mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float> vec3f;
-  double                             count  = 0.0;
-  vec3f                              sum    = mln::literal::zero;
-  vec3f                              result;
-
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    count += img(p);
-    sum   += p.to_vec() * img(p);
-  }
-
-  result = sum / count;
-
-  return result;
-}
-
-
-double var_histo(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float>   vec3f;
-  typedef mln::algebra::mat<3,3,float> mat3f;
-  double                               count  = 0.0;
-  double                               sum    = 0.0;
-  double                               sum2   = 0.0;
-  double                               result = 0.0;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    count += img(p);
-    sum   += p[0] * img(p);
-    sum2  += p[0] * p[0] * img(p);
-  }
-
-  result = sum2 / count - (sum / count) * (sum / count);
-
-  return result;
-}
-
-mln::algebra::mat<3,3,float> var_histo2(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float>   vec3f;
-  typedef mln::algebra::mat<3,3,float> mat3f;
-  
-  double                             count  = count_histo(img);
-  vec3f                              mean   = mean_histo(img);
-  vec3f                              point;
-  mat3f                              result = mln::literal::zero;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    point   = p.to_vec() - mean;
-    result += img(p) * (point * point.t());
-  }
-
-  result /= count;
-
-  return result;
-}
+/// \fixme When the quantification grows, the computation error grows.
 
 template <unsigned n>
 void test_integration()
@@ -277,77 +294,65 @@ void test_integration()
   const vec3f  sum_ref   = mln::data::compute(sum(),   img_ref);
   const vec3f  mean_ref  = mln::data::compute(mean(),  img_ref);
   const mat3f  var_ref   = mln::data::compute(var(),   img_ref);
-  
-  img_res = mln::data::compute(mln::accu::stat::histo3d_rgb<rgbn>(), img_ref);
 
-  mln::io::plot::save_histo_sh(img_res, "histo_rgb.sh");
+  img_res = mln::data::compute(mln::accu::stat::histo3d_rgb<rgbn>(), img_ref);
 
   const double count_res = count_histo(img_res);
   const vec3f  mean_res  = mean_histo(img_res);
-  const mat3f  var_res   = var_histo2(img_res);
- 
-  std::cout << "count_ref : " << count_ref << std::endl;
-  std::cout << "mean_ref  : " << mean_ref  << std::endl;
-  std::cout << "var_ref   : " << var_ref   << std::endl;
+  const mat3f  var_res   = var_histo(img_res);
+
+  // std::cout << "count_ref : " << count_ref << std::endl;
+  // std::cout << "mean_ref  : " << mean_ref  << std::endl;
+  // std::cout << "var_ref   : " << var_ref   << std::endl;
+
+  // std::cout << "count_res : " << count_res << std::endl;
+  // std::cout << "mean_res  : " << mean_res  << std::endl;
+  // std::cout << "var_res   : " << var_res   << std::endl;
 
-  std::cout << "count_res : " << count_res << std::endl;
-  std::cout << "mean_res  : " << mean_res  << std::endl;
-  std::cout << "var_res   : " << var_res   << std::endl;
 
-  
   mln_assertion(count_ref == count_res);
- 
-  mln_assertion(0.0001 > abs(mean_ref[0] - mean_res[0]));
-  mln_assertion(0.0001 > abs(mean_ref[1] - mean_res[1]));
-  mln_assertion(0.0001 > abs(mean_ref[2] - mean_res[2]));
 
-  mln_assertion(0.0001 > abs(var_ref(0,0) - var_res(0,0)));
-  mln_assertion(0.0001 > abs(var_ref(0,1) - var_res(0,1)));
-  mln_assertion(0.0001 > abs(var_ref(1,0) - var_res(1,0)));
+  /// FIXME: The error acceptance seems to high !!
+  mln_assertion(3 > mln::math::abs(mean_ref[0] - mean_res[0]));
+  mln_assertion(3 > mln::math::abs(mean_ref[1] - mean_res[1]));
+  mln_assertion(3 > mln::math::abs(mean_ref[2] - mean_res[2]));
+
+  mln_assertion(3 > mln::math::abs(var_ref(0,0) - var_res(0,0)));
+  mln_assertion(3 > mln::math::abs(var_ref(0,1) - var_res(0,1)));
+  mln_assertion(3 > mln::math::abs(var_ref(1,0) - var_res(1,0)));
 
-  mln_assertion(0.0001 > abs(var_ref(1,1) - var_res(1,1)));
-  mln_assertion(0.0001 > abs(var_ref(0,2) - var_res(0,2)));
-  mln_assertion(0.0001 > abs(var_ref(2,0) - var_res(2,0)));
+  mln_assertion(3 > mln::math::abs(var_ref(1,1) - var_res(1,1)));
+  mln_assertion(3 > mln::math::abs(var_ref(0,2) - var_res(0,2)));
+  mln_assertion(3 > mln::math::abs(var_ref(2,0) - var_res(2,0)));
 
+  mln_assertion(3 > mln::math::abs(var_ref(2,2) - var_res(2,2)));
+  mln_assertion(3 > mln::math::abs(var_ref(2,1) - var_res(2,1)));
+  mln_assertion(3 > mln::math::abs(var_ref(1,2) - var_res(1,2)));
 
-  mln_assertion(0.0001 > abs(var_ref(2,2) - var_res(2,2)));
-  mln_assertion(0.0001 > abs(var_ref(2,1) - var_res(2,1)));
-  mln_assertion(0.0001 > abs(var_ref(1,2) - var_res(1,2)));
-  
   std::cout << "(" << n << " bits) test integration     : ok" << std::endl;
 }
 
+/// \}
+
+/// \fixme Doesn't work with 1 bit, compilation problem.
+
 int main()
 {
-  //
-  // Doesn't work with 1 bit, compilation problem
-  //
 
-  /*
-  test_operator_equal<1>();
-  test_instantiation_without_argument<1>();
-  test_initialization<1>();
-  test_take_argument<1>();
-  test_take_other<1>();
-  test_integration<1>();
-  */
-  /*
   test_operator_equal<2>();
   test_instantiation_without_argument<2>();
   test_initialization<2>();
   test_take_argument<2>();
   test_take_other<2>();
   test_integration<2>();
-  */
-  /*
+
+
   test_operator_equal<3>();
   test_instantiation_without_argument<3>();
   test_initialization<3>();
   test_take_argument<3>();
   test_take_other<3>();
   test_integration<3>();
-  
-  
 
   test_operator_equal<4>();
   test_instantiation_without_argument<4>();
@@ -355,44 +360,38 @@ int main()
   test_take_argument<4>();
   test_take_other<4>();
   test_integration<4>();
-  
-  
+
   test_operator_equal<5>();
   test_instantiation_without_argument<5>();
   test_initialization<5>();
   test_take_argument<5>();
   test_take_other<5>();
   test_integration<5>();
-  */
+
   test_operator_equal<6>();
   test_instantiation_without_argument<6>();
   test_initialization<6>();
   test_take_argument<6>();
   test_take_other<6>();
   test_integration<6>();
-  
-  /*
+
   test_operator_equal<7>();
   test_instantiation_without_argument<7>();
   test_initialization<7>();
   test_take_argument<7>();
   test_take_other<7>();
   test_integration<7>();
-  */
-    
+
   //
   // Do not execute it, unless you have the time :)
   //
 
-  /*
-  test_operator_equal<8>();
-  test_instantiation_without_argument<8>();
-  test_initialization<8>();
-  test_take_argument<8>();
-  test_take_other<8>();
-  test_integration<8>();
-  */
- 
+  // test_operator_equal<8>();
+  // test_instantiation_without_argument<8>();
+  // test_initialization<8>();
+  // test_take_argument<8>();
+  // test_take_other<8>();
+  // test_integration<8>();
 
   return 0;
 }
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
index 1c6176b..af39d94 100644
--- a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
@@ -1,3 +1,28 @@
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
 /// \file
 ///
 /// \brief Minimal code for building 1d image histogram version.
@@ -11,6 +36,8 @@
 #include <mln/io/pgm/load.hh>
 #include <mln/value/int_u8.hh>
 
+
+
 int main()
 {
   typedef mln::value::int_u8 t_int_u8;
diff --git a/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc b/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
index 6369b5a..2e36867 100644
--- a/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
@@ -1,3 +1,28 @@
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
 /// \file
 ///
 /// \brief Minimal code for building 2d image histogram version.
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/accu/stat/histo3d_hsl/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/accu/stat/histo3d_hsl/Makefile.am
diff --git a/milena/tests/fun/v2v/rgb_to_hsl.cc b/scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc
similarity index 57%
copy from milena/tests/fun/v2v/rgb_to_hsl.cc
copy to scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc
index 6fd9a17..17b12cc 100644
--- a/milena/tests/fun/v2v/rgb_to_hsl.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -23,37 +23,37 @@
 // exception does not however invalidate any other reasons why the
 // executable file might be covered by the GNU General Public License.
 
-#include <mln/core/image/image2d.hh>
+/// \file
+///
+/// \brief Minimal code for building HSL 3d image histogram version.
+//
+/// \fixme This code should compile but it doesn't.
+///
 
+#include <mln/accu/stat/histo3d_hsl.hh>
+#include <mln/core/image/image2d.hh>
+#include <mln/core/image/image3d.hh>
+#include <mln/data/compute.hh>
+#include <mln/data/transform.hh>
+#include <mln/fun/v2v/rgb_to_hsl.hh>
+#include <mln/img_path.hh>
+#include <mln/io/ppm/load.hh>
 #include <mln/value/hsl.hh>
 #include <mln/value/rgb8.hh>
 
-#include <mln/fun/v2v/rgb_to_hsl.hh>
-
-#include <mln/data/compare.hh>
-#include <mln/data/transform.hh>
-
-#include <mln/make/image.hh>
-
-#include <mln/debug/println.hh>
-
-using mln::value::rgb8;
-using mln::value::hsl_f;
-
-rgb8 dat[][2] = { { rgb8(0,0,0), rgb8(255,255,255) },
-		  { rgb8(128,128,128), rgb8(90,90, 90) } };
-
-hsl_f ref[][2] = { { hsl_f(0,0,0), hsl_f(0,0,1.0) },
-		   { hsl_f(0,0,128.0 / 255.0), hsl_f(0,0,90.0 / 255.0) } };
-
 int main()
 {
-  using namespace mln;
-
-  image2d<value::rgb8> ima = make::image(dat);
-  image2d<hsl_f> ref_ima = make::image(ref);
-  image2d<hsl_f> ima_hsl = data::transform(ima,
-					    fun::v2v::f_rgb_to_hsl_f);
-
-  mln_assertion(ima_hsl == ref_ima);
+  typedef mln::value::rgb8                    t_rgb;
+  typedef mln::value::hsl_f                   t_hsl;
+  typedef mln::fun::v2v::f_rgb_to_hsl_<t_hsl> t_rgb_to_hsl;
+  mln::image2d<t_rgb>                         img_rgb;
+  mln::image2d<t_hsl>                         img_hsl;
+  mln::image3d<unsigned>                      histo;
+
+  mln::io::ppm::load(img_rgb, OLENA_IMG_PATH"/lena.ppm");
+  img_hsl = mln::data::transform(img_rgb, t_rgb_to_hsl());
+  //histo =mln::data::compute(mln::accu::meta::stat::histo3d_hsl<7>(), img_hsl);
+  //histo =mln::data::compute(mln::accu::stat::histo3d_hsl<7,t_hsl>(), img_hsl);
+  mln::accu::stat::histo3d_hsl<7,t_hsl>();
+  return 0;
 }
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/accu/stat/histo3d_rgb/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/accu/stat/histo3d_rgb/Makefile.am
diff --git a/milena/tests/io/ppm/ppm.cc b/scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc
similarity index 63%
copy from milena/tests/io/ppm/ppm.cc
copy to scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc
index c2dac07..20267a0 100644
--- a/milena/tests/io/ppm/ppm.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -23,32 +23,35 @@
 // exception does not however invalidate any other reasons why the
 // executable file might be covered by the GNU General Public License.
 
+/// \file
+///
+/// \brief Minimal code for building 3d image histogram version.
+///
+
+
+#include <mln/accu/stat/histo3d_rgb.hh>
 #include <mln/core/image/image2d.hh>
 #include <mln/core/image/image3d.hh>
-#include <mln/core/image/dmorph/slice_image.hh>
-#include <mln/value/rgb8.hh>
-
+#include <mln/data/compute.hh>
+#include <mln/data/transform.hh>
+#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+#include <mln/img_path.hh>
 #include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-
-#include <mln/data/compare.hh>
-
-#include <mln/util/array.hh>
-
-#include <mln/literal/colors.hh>
-
-#include "tests/data.hh"
-
+#include <mln/value/rgb.hh>
+#include <mln/value/rgb8.hh>
 
 int main()
 {
-  using namespace mln;
-  using value::rgb8;
+  typedef mln::value::rgb8   t_rgb8;
+  typedef mln::value::rgb<7> t_rgb7;
+  mln::image2d<t_rgb8>       img_rgb8;
+  mln::image2d<t_rgb7>       img_rgb7;
+  mln::image3d<unsigned>     histo;
+
+  mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+  img_rgb7 = mln::data::transform(img_rgb8, mln::fun::v2v::rgb8_to_rgbn<7>());
 
-  image2d<rgb8> lena = io::ppm::load<rgb8>(MLN_IMG_DIR "/lena.ppm");
-  io::ppm::save(lena, "out.ppm");
+  histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(), img_rgb7);
 
-  image2d<rgb8> lena2;
-  io::ppm::load(lena2, "out.ppm");
-  mln_assertion(lena2 == lena);
+  return 0;
 }
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/Makefile.am
diff --git a/milena/tests/io/ppm/ppm.cc b/scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc
similarity index 63%
copy from milena/tests/io/ppm/ppm.cc
copy to scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc
index c2dac07..cec04e7 100644
--- a/milena/tests/io/ppm/ppm.cc
+++ b/scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -23,32 +23,35 @@
 // exception does not however invalidate any other reasons why the
 // executable file might be covered by the GNU General Public License.
 
+/// \file
+///
+/// \brief Example of using rgb8_t_rgbn transformation to compute 3d histogram.
+///
+
+
+#include <mln/accu/stat/histo3d_rgb.hh>
 #include <mln/core/image/image2d.hh>
 #include <mln/core/image/image3d.hh>
-#include <mln/core/image/dmorph/slice_image.hh>
-#include <mln/value/rgb8.hh>
-
+#include <mln/data/compute.hh>
+#include <mln/data/transform.hh>
+#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+#include <mln/img_path.hh>
 #include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-
-#include <mln/data/compare.hh>
-
-#include <mln/util/array.hh>
-
-#include <mln/literal/colors.hh>
-
-#include "tests/data.hh"
-
+#include <mln/value/rgb.hh>
+#include <mln/value/rgb8.hh>
 
 int main()
 {
-  using namespace mln;
-  using value::rgb8;
+  typedef mln::value::rgb8   t_rgb8;
+  typedef mln::value::rgb<7> t_rgb7;
+  mln::image2d<t_rgb8>       img_rgb8;
+  mln::image2d<t_rgb7>       img_rgb7;
+  mln::image3d<unsigned>     histo;
+
+  mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+  img_rgb7 = mln::data::transform(img_rgb8, mln::fun::v2v::rgb8_to_rgbn<7>());
 
-  image2d<rgb8> lena = io::ppm::load<rgb8>(MLN_IMG_DIR "/lena.ppm");
-  io::ppm::save(lena, "out.ppm");
+  histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(), img_rgb7);
 
-  image2d<rgb8> lena2;
-  io::ppm::load(lena2, "out.ppm");
-  mln_assertion(lena2 == lena);
+  return 0;
 }
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/fun/v2v/rgb_to_rg/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/fun/v2v/rgb_to_rg/Makefile.am
diff --git a/milena/tests/fun/v2v/hsl_to_rgb.cc b/scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc
similarity index 59%
copy from milena/tests/fun/v2v/hsl_to_rgb.cc
copy to scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc
index 237e605..8e612b2 100644
--- a/milena/tests/fun/v2v/hsl_to_rgb.cc
+++ b/scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -23,33 +23,36 @@
 // exception does not however invalidate any other reasons why the
 // executable file might be covered by the GNU General Public License.
 
+/// \file
+///
+/// \brief Example of using rgb_t_rg transformation to compute 2d histogram.
+///
+
+#include <mln/accu/stat/histo2d.hh>
 #include <mln/core/image/image2d.hh>
-#include <mln/fun/v2v/hsl_to_rgb.hh>
-#include <mln/data/compare.hh>
+#include <mln/data/compute.hh>
 #include <mln/data/transform.hh>
-#include <mln/value/hsl.hh>
+#include <mln/fun/v2v/rgb_to_rg.hh>
+#include <mln/img_path.hh>
+#include <mln/io/ppm/load.hh>
+#include <mln/value/rg.hh>
 #include <mln/value/rgb8.hh>
 
-
 int main()
 {
-  using namespace mln;
-
-  using mln::value::rgb8;
-  using mln::value::hsl_f;
-
-  rgb8 ref[][2] = { { rgb8(0,0,0), rgb8(255,255,255) },
-		    { rgb8(128,128,128), rgb8(90,90, 90) } };
-
-  hsl_f dat[][2] = { { hsl_f(0,0,0), hsl_f(0,0,1.0) },
-		     { hsl_f(0,0,128.0 / 255.0), hsl_f(0,0,90.0 / 255.0) } };
-
-  image2d<rgb8> ref_ima = make::image(ref);
-  image2d<hsl_f> ima = make::image(dat);
-
-  image2d<value::rgb8> ima_rgb = data::transform(ima,
-						 fun::v2v::f_hsl_to_rgb_3x8);
-
-  // mln_assertion(ima_rgb == ref_ima);
-  (void) ima_rgb;
+  typedef mln::value::rg<8>		t_rg8;
+  typedef mln::value::rgb8		t_rgb8;
+  typedef mln::fun::v2v::rgb_to_rg<8>	t_rgb_to_rg;
+  typedef mln::image2d<t_rg8>		t_image2d_rg8;
+  typedef mln::image2d<t_rgb8>		t_image2d_rgb8;
+  typedef mln::image2d<unsigned>	t_histo;
+  t_image2d_rgb8			img_rgb8;
+  t_image2d_rg8				img_rg8;
+  t_histo				histo;
+
+  mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+  img_rg8 = mln::data::transform(img_rgb8, t_rgb_to_rg());
+  histo   = mln::data::compute(mln::accu::meta::stat::histo2d(), img_rg8);
+
+  return 0;
 }
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/value/rg/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/value/rg/Makefile.am
diff --git a/milena/tests/fun/v2v/hsl_to_rgb.cc b/scribo/sandbox/green/use/value/rg/rg.cc
similarity index 60%
copy from milena/tests/fun/v2v/hsl_to_rgb.cc
copy to scribo/sandbox/green/use/value/rg/rg.cc
index 237e605..b5ea15f 100644
--- a/milena/tests/fun/v2v/hsl_to_rgb.cc
+++ b/scribo/sandbox/green/use/value/rg/rg.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -23,33 +23,36 @@
 // exception does not however invalidate any other reasons why the
 // executable file might be covered by the GNU General Public License.
 
+/// \file
+///
+/// \brief Example of using rg to compute an 2d histogram.
+///
+
+#include <mln/accu/stat/histo2d.hh>
 #include <mln/core/image/image2d.hh>
-#include <mln/fun/v2v/hsl_to_rgb.hh>
-#include <mln/data/compare.hh>
+#include <mln/data/compute.hh>
 #include <mln/data/transform.hh>
-#include <mln/value/hsl.hh>
+#include <mln/fun/v2v/rgb_to_rg.hh>
+#include <mln/img_path.hh>
+#include <mln/io/ppm/load.hh>
+#include <mln/value/rg.hh>
 #include <mln/value/rgb8.hh>
 
-
 int main()
 {
-  using namespace mln;
-
-  using mln::value::rgb8;
-  using mln::value::hsl_f;
-
-  rgb8 ref[][2] = { { rgb8(0,0,0), rgb8(255,255,255) },
-		    { rgb8(128,128,128), rgb8(90,90, 90) } };
-
-  hsl_f dat[][2] = { { hsl_f(0,0,0), hsl_f(0,0,1.0) },
-		     { hsl_f(0,0,128.0 / 255.0), hsl_f(0,0,90.0 / 255.0) } };
-
-  image2d<rgb8> ref_ima = make::image(ref);
-  image2d<hsl_f> ima = make::image(dat);
-
-  image2d<value::rgb8> ima_rgb = data::transform(ima,
-						 fun::v2v::f_hsl_to_rgb_3x8);
-
-  // mln_assertion(ima_rgb == ref_ima);
-  (void) ima_rgb;
+  typedef mln::value::rg<8>		t_rg8;
+  typedef mln::value::rgb8		t_rgb8;
+  typedef mln::fun::v2v::rgb_to_rg<8>	t_rgb_to_rg;
+  typedef mln::image2d<t_rg8>		t_image2d_rg8;
+  typedef mln::image2d<t_rgb8>		t_image2d_rgb8;
+  typedef mln::image2d<unsigned>	t_histo;
+  t_image2d_rgb8			img_rgb8;
+  t_image2d_rg8				img_rg8;
+  t_histo				histo;
+
+  mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+  img_rg8 = mln::data::transform(img_rgb8, t_rgb_to_rg());
+  histo   = mln::data::compute(mln::accu::meta::stat::histo2d(), img_rg8);
+
+  return 0;
 }
-- 
1.5.6.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            last-svn-commit-43-g0da8c63 Define accumulator	which computes histogram view as image.
                        
                        
by Yann Jacquelet 22 Jun '10
                    by Yann Jacquelet 22 Jun '10
22 Jun '10
                    
                        	* mln/img_path.hh: New header file.
	Define the 1d component version of the the library.
	* mln/accu/stat/histo1d.hh: New header file.
	Give an example of code.
	* use/accu/stat/histo1d: New directory.
	* use/accu/stat/histo1d/Makefile.am: New makefile.
	* use/accu/stat/histo1d/histo1d.cc: New source.
	Make some unitary tests on histo1d library.
	* tests/accu/stat/histo1d: New directory.
	* tests/accu/stat/histo1d/Makefile.am: New makefile.
	* tests/accu/stat/histo1d/histo1d.cc: New source.
	Define the 2d component version of the the library.
	* mln/accu/stat/histo2d.hh: New header file.
	* mln/value/rg.hh: New header file.
	* mln/fun/v2v/rgb_to_rg.hh: New header file.
	Give an example of code.
	* use/accu/stat/histo2d: New directory.
	* use/accu/stat/histo2d/Makefile.am: New makefile.
	* use/accu/stat/histo2d/histo2d.cc: New source.
	* use/value/rg: New directory.
	* use/value/rg/Makefile.am: New makefile.
	* use/value/rg/rg.cc: New source.
	* use/fun/v2v/rgb_to_rg: New directory.
	* use/fun/v2v/rgb_to_rg/Makefile.am: New makefile.
	* use/fun/v2v/rgb_to_rg/rgb_to_rg.cc: New source.
	Define the RGB 3d component version of the the library.
	* mln/accu/stat/histo3d_rgb.hh: New header file.
	* mln/fun/v2v/rgb8_to_rgbn.hh: New header file.
	Give an example of code.
	* use/accu/stat/histo3_rgb: New directory.
	* use/accu/stat/histo3d_rgb/Makefile.am: New makefile.
	* use/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
	* use/fun/v2v/rgb8_to_rgbn: New directory.
	* use/fun/v2v/rgb8_to_rgbn/Makefile.am: New makefile.
	* use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc: New source.
	Make some unitary tests on histo3d library.
	* tests/accu/stat/histo3d_rgb: New directory.
	* tests/accu/stat/histo3d_rgb/Makefile.am: New makefile.
	* tests/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
	Define the HSL 3d component version of the the library.
	* mln/accu/stat/histo3d_hsl.hh: New header file.
	Give an example of code.
	* use/accu/stat/histo3_hsl: New directory.
	* use/accu/stat/histo3d_hsl/Makefile.am: New makefile.
	* use/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
	Make some unitary tests on histo3d library.
	* tests/accu/stat/histo3d_hsl: New directory.
	* tests/accu/stat/histo3d_hsl/Makefile.am: New makefile.
	* tests/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
---
 scribo/sandbox/green/ChangeLog                     |   82 +++-
 scribo/sandbox/green/README                        |   73 +++-
 scribo/sandbox/green/mln/accu/stat/histo1d.hh      |   32 +-
 scribo/sandbox/green/mln/accu/stat/histo2d.hh      |   75 ++--
 scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh  |  249 +++++-----
 scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh  |  138 +++---
 scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh   |   49 ++-
 scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh      |    2 -
 .../green/tests/accu/stat/histo1d/histo1d.cc       |  502 +++++++++++++++++++-
 .../accu/stat/{histo1d => histo3d_hsl}/Makefile.am |    0 
 .../tests/accu/stat/histo3d_hsl/histo3d_hsl.cc     |  394 +++++++---------
 .../accu/stat/{histo1d => histo3d_rgb}/Makefile.am |    0 
 .../tests/accu/stat/histo3d_rgb/histo3d_rgb.cc     |  355 +++++++-------
 .../sandbox/green/use/accu/stat/histo1d/histo1d.cc |   27 +
 .../sandbox/green/use/accu/stat/histo2d/histo2d.cc |   25 +
 .../accu/stat/{histo1d => histo3d_hsl}/Makefile.am |    0 
 .../green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc |   56 ++--
 .../accu/stat/{histo1d => histo3d_rgb}/Makefile.am |    0 
 .../green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc |   45 +-
 .../histo1d => fun/v2v/rgb8_to_rgbn}/Makefile.am   |    0 
 .../green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc |   45 +-
 .../stat/histo1d => fun/v2v/rgb_to_rg}/Makefile.am |    0 
 .../green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc       |   51 +-
 .../{accu/stat/histo1d => value/rg}/Makefile.am    |    0 
 .../sandbox/green/use/value/rg/rg.cc               |   51 +-
 25 files changed, 1450 insertions(+), 801 deletions(-)
 copy scribo/sandbox/green/tests/accu/stat/{histo1d => histo3d_hsl}/Makefile.am (100%)
 copy {milena => scribo}/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc (73%)
 copy scribo/sandbox/green/tests/accu/stat/{histo1d => histo3d_rgb}/Makefile.am (100%)
 copy {milena => scribo}/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc (64%)
 copy scribo/sandbox/green/use/accu/stat/{histo1d => histo3d_hsl}/Makefile.am (100%)
 copy milena/tests/fun/v2v/rgb_to_hsl.cc => scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc (57%)
 copy scribo/sandbox/green/use/accu/stat/{histo1d => histo3d_rgb}/Makefile.am (100%)
 copy milena/tests/io/ppm/ppm.cc => scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc (63%)
 copy scribo/sandbox/green/use/{accu/stat/histo1d => fun/v2v/rgb8_to_rgbn}/Makefile.am (100%)
 copy milena/tests/io/ppm/ppm.cc => scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc (63%)
 copy scribo/sandbox/green/use/{accu/stat/histo1d => fun/v2v/rgb_to_rg}/Makefile.am (100%)
 copy milena/tests/fun/v2v/hsl_to_rgb.cc => scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc (59%)
 copy scribo/sandbox/green/use/{accu/stat/histo1d => value/rg}/Makefile.am (100%)
 copy milena/tests/fun/v2v/hsl_to_rgb.cc => scribo/sandbox/green/use/value/rg/rg.cc (60%)
diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog
index 6a3c8fa..8f5101b 100644
--- a/scribo/sandbox/green/ChangeLog
+++ b/scribo/sandbox/green/ChangeLog
@@ -38,12 +38,84 @@
 
 2010-06-21  Yann Jacquelet  <jacquelet(a)lrde.epita.fr>
 
-	Save histogram library.
+	Define accumulator which computes histogram view as image.
+
+	* mln/img_path.hh: New header file.
+
+	Define the 1d component version of the the library.
+
+	* mln/accu/stat/histo1d.hh: New header file.
+
+	Give an example of code.
+
+	* use/accu/stat/histo1d: New directory.
+	* use/accu/stat/histo1d/Makefile.am: New makefile.
+	* use/accu/stat/histo1d/histo1d.cc: New source.
+
+	Make some unitary tests on histo1d library.
+
+	* tests/accu/stat/histo1d: New directory.
+	* tests/accu/stat/histo1d/Makefile.am: New makefile.
+	* tests/accu/stat/histo1d/histo1d.cc: New source.
+
+	Define the 2d component version of the the library.
+
+	* mln/accu/stat/histo2d.hh: New header file.
+	* mln/value/rg.hh: New header file.
+	* mln/fun/v2v/rgb_to_rg.hh: New header file.
+
+	Give an example of code.
+
+	* use/accu/stat/histo2d: New directory.
+	* use/accu/stat/histo2d/Makefile.am: New makefile.
+	* use/accu/stat/histo2d/histo2d.cc: New source.
+
+	* use/value/rg: New directory.
+	* use/value/rg/Makefile.am: New makefile.
+	* use/value/rg/rg.cc: New source.
+
+	* use/fun/v2v/rgb_to_rg: New directory.
+	* use/fun/v2v/rgb_to_rg/Makefile.am: New makefile.
+	* use/fun/v2v/rgb_to_rg/rgb_to_rg.cc: New source.
+
+	Define the RGB 3d component version of the the library.
+
+	* mln/accu/stat/histo3d_rgb.hh: New header file.
+	* mln/fun/v2v/rgb8_to_rgbn.hh: New header file.
+
+	Give an example of code.
+
+	* use/accu/stat/histo3_rgb: New directory.
+	* use/accu/stat/histo3d_rgb/Makefile.am: New makefile.
+	* use/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
+
+	* use/fun/v2v/rgb8_to_rgbn: New directory.
+	* use/fun/v2v/rgb8_to_rgbn/Makefile.am: New makefile.
+	* use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc: New source.
+
+	Make some unitary tests on histo3d library.
+
+	* tests/accu/stat/histo3d_rgb: New directory.
+	* tests/accu/stat/histo3d_rgb/Makefile.am: New makefile.
+	* tests/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
+
+
+	Define the HSL 3d component version of the the library.
+
+	* mln/accu/stat/histo3d_hsl.hh: New header file.
+
+	Give an example of code.
+
+	* use/accu/stat/histo3_hsl: New directory.
+	* use/accu/stat/histo3d_hsl/Makefile.am: New makefile.
+	* use/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
+
+	Make some unitary tests on histo3d library.
+
+	* tests/accu/stat/histo3d_hsl: New directory.
+	* tests/accu/stat/histo3d_hsl/Makefile.am: New makefile.
+	* tests/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
 
-	* mln/accu/histo/histo1d.hh: New header file.
-	* mln/accu/histo/histo2d.hh: New header file.
-	* mln/accu/histo/histo3d_rgb.hh: New header file.
-	* mln/accu/histo/histo3d_hsl.hh: New header file.
 
 2010-06-21  Yann Jacquelet  <jacquelet(a)lrde.epita.fr>
 
diff --git a/scribo/sandbox/green/README b/scribo/sandbox/green/README
index 3efe50d..4b6fb26 100644
--- a/scribo/sandbox/green/README
+++ b/scribo/sandbox/green/README
@@ -153,18 +153,8 @@ d'exécution (chmod 755 gnuplot_shell_file.sh). Comme je trouve le format
 extrêmement pratique, il se retrouve preque partout dans mes sources.
 
 
-V MLN
------
-
-a) La sauvegarde des images au format gnuplot shell
-
-* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
-
-to do ...
-
-
-
-b) Les histogrammes
+V HISTOGRAMMES
+--------------
 
 Un des travaux demandés par théo est la réalisation d'une librairie
 d'histogramme permettant de fournir un résultat sous forme d'image.
@@ -178,20 +168,67 @@ de comptage puisqu'il est décrit sous la forme de triplets de float
 contient une séquence d'appels pour les routines permettant de
 considérer la dimension de la teinte comme circulaire.
 
+
+a) version 1d
+
 * mln/accu/stat/histo1d.hh: Accumulateur histogramme image1d.
 * use/accu/stat/histo1d: Code minimal utilisant un histogramme 1d.
+* tests/accu/stat/histo1d: Test unitaire sur l'histogramme 1d.
+
+
+b) version 2d
 
-* mln/accu/stat/histo2d.hh: Accumulateur histogramme image2d.
 * mln/value/rg.hh: Définition du type vectoriel 2d rouge/vert (RG).
+* use/value/rg: Exemple de code pour l'utilisation de rg.
+
 * mln/fun/v2v/rgb_to_rg.hh: Transformation de l'espace RGB vers l'espace RG.
+* use/fun/v2v/rgb_to_rg: Exemple de code pour l'utilisation de rgb_to_rg.
+
+* mln/accu/stat/histo2d.hh: Accumulateur histogramme image2d.
 * use/accu/stat/histo2d: Code minimal utilisant un histogramme 2d.
 
 
-* mln/accu/stat/histo3d_rgb.hh: Accumulateur histogramme image3d RGB.
-* mln/accu/stat/histo3d_hsl.hh: Accumulateur histogramme image3d HSL.
+c) version 3d RGB
+
+
+* mln/fun/v2v/rgb8_to_rgbn.hh: Diminution de la quantification (n < 8 bits).
+* use/fun/v2v/rgb8_to_rgbn: Exemple de code pour l'utilisation de rgb8_to_rgbn.
 
+* mln/accu/stat/histo3d_rgb.hh: Accumulateur histogramme image3d RGB.
 * use/accu/stat/histo3_rgb: Code minimal utilisant un histogramme 3d RGB.
+
+
+
+d) version 3d HSL
+
+* mln/accu/stat/histo3d_hsl.hh: Accumulateur histogramme image3d HSL.
 * use/accu/stat/histo3_hsl: Code minimal utilisant un histogramme 3d HSL.
+* tests/accu/stat/histo3d_hsl: Test unitaire sur l'histogramme HSL 3d.
+
+Le code HSL ne compile plus car l'interface liant la transformation du
+domaine et la fonction fold a changée. Je n'ai pas le temps de
+regarder plus avant.
+
+
+
+V MLN
+-----
+
+a) La sauvegarde des images au format gnuplot shell
+
+* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
+
+to do ...
+
+
+
+b) Les histogrammes
+
+
+
+
+
+
 
 
 
@@ -210,6 +247,12 @@ considérer la dimension de la teinte comme circulaire.
 * use/accu/stat/histo3d_hsl
 * tests/accu/stat/histo3d_hsl
 
+VI SAUVEGARDE FORMAT GNUPLOT SHELL
+----------------------------------
+
+
+VII VISUALISATION HISTOGRAMMES 3D
+---------------------------------
 
 c) La visualisation des histogrammes 3d
 
diff --git a/scribo/sandbox/green/mln/accu/stat/histo1d.hh b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
index d480cf0..fae94c8 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo1d.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
@@ -24,7 +24,7 @@
 // executable file might be covered by the GNU General Public License.
 
 #ifndef MLN_ACCU_STAT_HISTO1D_HH
-#define MLN_ACCU_STAT_HISTO1D_HH
+# define MLN_ACCU_STAT_HISTO1D_HH
 
 /// \file
 ///
@@ -64,24 +64,24 @@
 /// }
 
 
-#include <iostream>
+# include <iostream>
 
-#include <mln/accu/internal/base.hh>
+# include <mln/accu/internal/base.hh>
 
-#include <mln/arith/plus.hh>
+# include <mln/arith/plus.hh>
 
-#include <mln/core/concept/meta_accumulator.hh>
-#include <mln/core/image/image1d.hh>
-#include <mln/core/macros.hh>
+# include <mln/core/concept/meta_accumulator.hh>
+# include <mln/core/image/image1d.hh>
+# include <mln/core/macros.hh>
 
-#include <mln/literal/zero.hh>
+# include <mln/literal/zero.hh>
 
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
 
-#include <mln/trait/value/comp.hh>
+# include <mln/trait/value/comp.hh>
 
-#include <mln/value/ops.hh>
+# include <mln/value/ops.hh>
 
 namespace mln
 {
@@ -168,7 +168,7 @@ namespace mln
 	typedef image1d<unsigned> result;
 	typedef result            q_result;
 
-	/// Constructors
+	/// Constructors.
 	/// \{
 	/// \brief Infer the size of the resulting image1d domain.
 	///
@@ -201,7 +201,6 @@ namespace mln
 	///
 	/// The end user shouldn't call this method. This is part of
 	/// data compute interface mechanism.
-
 	void take(const histo1d<V>& other);
 	/// \}
 
@@ -231,11 +230,10 @@ namespace mln
       ///
       /// The operator compares all the bins from the two histograms.
       /// Nobody uses this method unless unitary tests.
-
       template <typename V>
       bool operator==(const histo1d<V>& histo1, const histo1d<V>& histo2);
 
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
 
       template <typename V>
       inline
@@ -328,7 +326,7 @@ namespace mln
 	return result;
       }
 
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
 
 
     } // end of namespace mln::accu::stat
diff --git a/scribo/sandbox/green/mln/accu/stat/histo2d.hh b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
index c28723c..11a1bb3 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo2d.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
@@ -73,14 +73,16 @@
 
 # include <mln/accu/internal/base.hh>
 
+# include <mln/arith/plus.hh>
+
 # include <mln/core/macros.hh>
 # include <mln/core/image/image2d.hh>
 # include <mln/core/alias/point2d.hh>
 # include <mln/core/alias/box2d.hh>
 
-# include <mln/trait/value/comp.hh>
+#include <mln/literal/zero.hh>
 
-# include <mln/arith/plus.hh>
+# include <mln/trait/value/comp.hh>
 
 # include <mln/trace/entering.hh>
 # include <mln/trace/exiting.hh>
@@ -152,13 +154,13 @@ namespace mln
     namespace stat
     {
 
-      /// \brief Define an histogram which returns an image3d .
+      /// \brief Define a histogram as accumulator which returns an image2d.
       ///
-      /// Param V defines the space in which we count the values.
-      /// For instance, this histogram works image2d<rgb<2>> or
-      /// image2d<rgb<7>>. The histogram count the occurrence of each value.
-      /// The number of bins depends of the grayscale values, for 8 bits there
-      /// is 256x3 bins. Note that over
+      /// Param V defines the type of the input image value. It is in
+      /// this space that we count the values. For instance, this
+      /// histogram works well for image2d< rgb<2> > or with image2d<
+      /// rgb<7> >. The number of bins depends directly the values V.
+      /// For 8 bits there is 256x3 bins. Note that less
       /// quantification works too.
       ///
       /// \ingroup modaccuvalues
@@ -171,16 +173,15 @@ namespace mln
 	typedef image2d<unsigned> result;
 	typedef result            q_result;
 
-	/// Constructors
+	/// Constructors.
 	/// \{
-	/// \brief Initialize the size of the resulting image1d.
+	/// \brief Infer the size of the resulting image2d domain.
 	///
-	/// Initialize the size the resulting image from the theorical dynamic
-	/// of the greylevel values (Use V to manage it).
+	/// By evaluating the minimum and the maximum of V, we define the domain
+	/// of the resulting image2d.
 	histo2d();
 	/// \}
 
-
 	/// Manipulators.
 	/// \{
 	/// \brief Initialize the histogram with zero value.
@@ -190,23 +191,24 @@ namespace mln
 	/// density.
 	void init();
 
-
-	/// \brief Update the histogram with the RGB pixel t.
-	/// \param[in] t a greylevel pixel of type V.
+	/// \brief Update the histogram with the RG pixel t.
+	/// \param[in] t a graylevel pixel of type V.
 	///
 	/// The end user shouldn't call this method. In place of it, he can
 	/// go through the data compute interface.
 	void take(const argument& t);
 
-
 	/// \brief Update the histogram with an other histogram.
 	/// \param[in] other the other histogram.
+	///
+	/// The end user shouldn't call this method. This is part of
+	/// data compute interface mechanism.
 	void take(const histo2d<V>& other);
 	/// \}
 
 	/// Accessors.
 	/// \{
-	/// \brief Return the histogram as an image1d.
+	/// \brief Return the histogram as an image2d.
 	///
 	/// This is the machinery to communicate with data compute interface.
 	/// The end user should'nt use it.
@@ -228,19 +230,19 @@ namespace mln
       /// \param[in] histo1 the first histogram to compare with.
       /// \param[in] histo2 the second histogram.
       ///
-      /// The operator compare all the bins from the two histogram.
-
+      /// The operator compares all the bins from the two histograms.
+      /// Nobody uses this method unless unitary tests.
       template <typename V>
       bool operator==(const histo2d<V>& histo1,
 		      const histo2d<V>& histo2);
 
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
 
       template <typename V>
       inline
       histo2d<V>::histo2d()
       {
-	trace::entering("mln::accu::stat::histo2d::histo2d");
+	trace::entering("mln::accu::stat::histo2d::cstor");
 	typedef mln_trait_value_comp(V,0) comp0;
 	typedef mln_trait_value_comp(V,1) comp1;
 
@@ -253,31 +255,24 @@ namespace mln
 			   point2d(mln_max(comp0),
 				   mln_max(comp1))));
 
-	trace::exiting("mln::accu::stat::histo2d::histo2d");
+	trace::exiting("mln::accu::stat::histo2d::cstor");
       }
 
       template <typename V>
       inline
       void histo2d<V>::init()
       {
-	trace::entering("mln::accu::stat::histo2d::init");
-
-	data::fill(count_, 0);
-	trace::exiting("mln::accu::stat::histo2d::init");
+	data::fill(count_, literal::zero);
       }
 
       template <typename V>
       inline
       void histo2d<V>::take(const argument& t)
       {
-	trace::entering("mln::accu::stat::histo2d::take");
-
 	// Just convert a greyscale value (int_u8 like) to a position for an
 	// iterator on the resulting image.
 	// Take care to the constructor : Point(slice, row, column)
 	++count_(point2d(t.red(), t.green()));
-
-	trace::exiting("mln::accu::stat::histo2d::take");
       }
 
 
@@ -285,20 +280,13 @@ namespace mln
       inline
       void histo2d<V>::take(const histo2d<V>& other)
       {
-	trace::entering("mln::accu::stat::histo2d::take");
-
 	count_ += other.count_;
-
-	trace::exiting("mln::accu::stat::histo2d::take");
       }
 
       template <typename V>
       inline
       typename histo2d<V>::result histo2d<V>::to_result() const
       {
-	trace::entering("mln::accu::stat::histo2d::to_result");
-
-	trace::exiting("mln::accu::stat::histo2d::to_result");
 	return count_;
       }
 
@@ -306,9 +294,6 @@ namespace mln
       inline
       histo2d<V>::operator result() const
       {
-	trace::entering("mln::accu::stat::histo2d::operator result");
-
-	trace::exiting("mln::accu::stat::histo2d::operator result");
 	return count_;
       }
 
@@ -316,10 +301,8 @@ namespace mln
       inline
       bool histo2d<V>::is_valid() const
       {
-	trace::entering("mln::accu::stat::histo2d::is_valid");
 	bool result = count_.is_valid();
 
-	trace::exiting("mln::accu::stat::histo2d::is_valid");
 	return result;
       }
 
@@ -327,7 +310,7 @@ namespace mln
       bool operator==(const histo2d<V>& histo1,
 		      const histo2d<V>& histo2)
       {
-	trace::entering("mln::accu::stat::operator==");
+	trace::entering("mln::accu::stat::histo2d::operator==");
 
 	bool  result                  = true;
 	const image2d<unsigned>& res1 = histo1.to_result();
@@ -342,11 +325,11 @@ namespace mln
 	for_all_2(p1, p2)
 	  result &= (res1(p1) == res2(p2));
 
-	trace::exiting("mln::accu::stat::operator==");
+	trace::exiting("mln::accu::stat::histo2d::operator==");
 	return result;
       }
 
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
 
 
     } // end of namespace mln::accu::stat
diff --git a/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
index c84aaa4..35d78e2 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
@@ -1,6 +1,4 @@
-// Copyright (C) 2007 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -26,82 +24,115 @@
 // executable file might be covered by the GNU General Public License.
 
 #ifndef MLN_ACCU_STAT_HISTO3D_HSL_HH
-#define MLN_ACCU_STAT_HISTO3D_HSL_HH
+# define MLN_ACCU_STAT_HISTO3D_HSL_HH
 
 /// \file
 ///
-/// \brief Define a histogram as an accumulator which returns an image1d .
+/// \brief Define a histogram as accumulator which returns an HSL image3d.
+///
+/// This source implements the discrete histogram version. It was
+/// created for images which the values are derived from integer
+/// type. The number of bins is given by the user via the q parameter.
+/// It works for HSL space.
 ///
-/// This source implements the discrete histogram version. The number of beans
-/// is infer from the number of greylevels. A typical int_u8 image has got
-/// 256 bins. An int_u16 image has got 65535 bins.
 /// The following sample is a typical use of the histogram.
 ///
-/// #include <mln/value/int_u8.hh>
-/// #include <mln/core/image/image1d.hh>
+/// #include <mln/accu/stat/histo3d_hsl.hh>
 /// #include <mln/core/image/image2d.hh>
-/// #include <mln/io/pgm/load.hh>
-/// #include <mln/accu/stat/histo1d.hh>
+/// #include <mln/core/image/image3d.hh>
 /// #include <mln/data/compute.hh>
-/// #include <mln/io/plot/save_histo_sh.hh>
-///
-/// #define  OLENA_LENA "/usr/local/share/olena/images/lena.pgm"
+/// #include <mln/data/transform.hh>
+/// #include <mln/fun/v2v/rgb_to_hsl.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/ppm/load.hh>
+/// #include <mln/value/hsl.hh>
+/// #include <mln/value/rgb8.hh>
 ///
-/// void test()
+/// int main()
 /// {
-///   typedef mln::value::int_u8 int_u8;
-///   mln::image2d<int_u8>       img_ref;
-///   mln::image1d<unsigned>     img_res;
+///   typedef mln::value::rgb8                    t_rgb;
+///   typedef mln::value::hsl_f                   t_hsl;
+///   typedef mln::fun::v2v::f_rgb_to_hsl_<t_hsl> t_rgb_to_hsl;
+///   mln::image2d<t_rgb>                         img_rgb;
+///   mln::image2d<t_hsl>                         img_hsl;
+///   mln::image3d<unsigned>                      histo;
+///
+///   mln::io::ppm::load(img_rgb, OLENA_IMG_PATH"/lena.ppm");
+///  img_hsl = mln::data::transform(img_rgb, t_rgb_to_hsl());
+///  histo=mln::data::compute(mln::accu::meta::stat::histo3d_hsl<7>(),img_hsl);
 ///
-///   mln::io::pgm::load(img_ref, OLENA_LENA);
-///   img_res = mln::data::compute(mln::accu::stat::histo1d<int_u8>(), img_ref);
+///  return 0;
 /// }
+///
+/// \fixme This implementation is very doubtfull ! Be carefull !!
+/// \fixme This code should be compile, but it doesn't!
+/// \fixme The fold interface has changed v2v -> p2p or the inverse.
+
 
+# include <iostream>
 
-#include <iostream>
+# include <mln/accu/internal/base.hh>
 
-#include <mln/accu/internal/base.hh>
+# include <mln/arith/plus.hh>
 
-#include <mln/core/macros.hh>
-#include <mln/core/image/image3d.hh>
-#include <mln/core/alias/point3d.hh>
-#include <mln/core/alias/box3d.hh>
+# include <mln/core/alias/point3d.hh>
+# include <mln/core/alias/box3d.hh>
+# include <mln/core/image/image3d.hh>
+# include <mln/core/image/dmorph/transformed_image.hh>
+# include <mln/core/macros.hh>
 
-#include <mln/value/int_u.hh>
-#include <mln/trait/value/comp.hh>
+# include <mln/fun/p2p/fold.hh>
 
-#include <mln/arith/plus.hh>
+# include <mln/literal/zero.hh>
 
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
 
-#include <mln/value/ops.hh>
+# include <mln/trait/value/comp.hh>
 
-// make hue cyclic
-#include <mln/fun/p2p/fold.hh>
-#include <mln/core/image/dmorph/transformed_image.hh>
+# include <mln/value/int_u.hh>
+# include <mln/value/ops.hh>
 
 namespace mln
 {
-  
+
   namespace accu
   {
-    
+
     namespace stat
     {
-   
+
       // Forward declaration
       template <unsigned q, typename V>
       struct histo3d_hsl;
 
     } // end of namespace mln::accu::stat
-  
-  } // end of namespace mln::accu
 
+    namespace meta
+    {
+
+      namespace stat
+      {
+
+	template <unsigned q>
+	struct histo3d_hsl : public Meta_Accumulator< histo3d_hsl<q> >
+	{
+	  template <typename V>
+	  struct with
+	  {
+	    typedef accu::stat::histo3d_hsl<q,V> ret;
+	  };
+	};
+
+      } // end of namespace mln::accu::meta::stat
+
+    } // end of namespace mln::accu::meta
+
+  } // end of namespace mln::accu
 
   namespace trait
   {
-    
+
     template <unsigned q, typename V>
     struct accumulator_< mln::accu::stat::histo3d_hsl<q,V> >
     {
@@ -112,65 +143,59 @@ namespace mln
     };
 
     template <unsigned q, typename V>
-    struct set_precise_binary_<op::eq, 
+    struct set_precise_binary_<op::eq,
 			       accu::stat::histo3d_hsl<q,V>,
 			       accu::stat::histo3d_hsl<q,V> >
     {
       typedef bool ret;
     };
-        
+
   } // end of namespace mln::trait
 
   namespace accu
   {
-    
+
     namespace stat
-    {      
+    {
 
-      /// \brief Define an histogram which returns an image1d .  
+
+      /// \brief Define a histogram as accumulator which returns an image3d.
       ///
-      /// Param V defines the space in which we count the values.
-      /// For instance, this histogram works image2d<int_u8> or 
-      /// image1d<int_u16>. The histogram count the occurrence of each value.
-      /// The number of bins depends of the greyscale values, for 8 bits there
-      /// is 256 bins, for 16 bits there is 65536 bins. Note that over 
-      /// quantification works too.
+      /// Param q defines the number of bins per axe.
+      /// Param V defines the type of the input image value. We assume that
+      /// V is a kind of hsl_<float,float,float>.
       ///
       /// \ingroup modaccuvalues
-
-      /// q is the number of bins per axe because quantification info are died.
-      /// we assume that V is a kind of hsl_<float,float,float>
-
       template <unsigned q, typename V>
-      struct histo3d_hsl : 
+      struct histo3d_hsl :
 	public mln::accu::internal::base<image3d<unsigned>, histo3d_hsl<q,V> >
       {
 	typedef V                 argument;
 	typedef image3d<unsigned> result;
 	typedef result            q_result;
 
-	/// Constructors
+	/// Constructors.
 	/// \{
-	/// \brief Initialize the size of the resulting image1d.
+	/// \brief Infer the size of the resulting image3d domain.
 	///
-	/// Initialize the size the resulting image from the theorical dynamic 
-	/// of the greylevel values (Use V to manage it).
+	/// By evaluating the minimum and the maximum of V, we define the domain
+	/// of the resulting image3d.
 	histo3d_hsl();
 	/// \}
 
-	
+
 	/// Manipulators.
 	/// \{
 	/// \brief Initialize the histogram with zero value.
 	///
-	/// This method must be called just before starting the use of the 
-	/// histogram. If it's not, resulting values won't converge to the 
+	/// This method must be called just before starting the use of the
+	/// histogram. If it's not, resulting values won't converge to the
 	/// density.
 	void init();
 
-	
+
 	/// \brief Update the histogram with the RGB pixel t.
-	/// \param[in] t a greylevel pixel of type V.
+	/// \param[in] t a graylevel pixel of type V.
 	///
 	/// The end user shouldn't call this method. In place of it, he can
 	/// go through the data compute interface.
@@ -179,12 +204,15 @@ namespace mln
 
 	/// \brief Update the histogram with an other histogram.
 	/// \param[in] other the other histogram.
+	///
+	/// The end user shouldn't call this method. This is part of
+	/// data compute interface mechanism.
 	void take(const histo3d_hsl<q,V>& other);
 	/// \}
 
 	/// Accessors.
 	/// \{
-	/// \brief Return the histogram as an image1d.
+	/// \brief Return the histogram as an HSL image3d.
 	///
 	/// This is the machinery to communicate with data compute interface.
 	/// The end user should'nt use it.
@@ -208,31 +236,31 @@ namespace mln
 	const float min_sat;
 	const float max_sat;
 	float       step_sat;
-	result  count_;
+	result      count_;
       };
 
       /// \brief Check wethever an histogram is equal to an other one.
       /// \param[in] histo1 the first histogram to compare with.
       /// \param[in] histo2 the second histogram.
       ///
-      /// The operator compare all the bins from the two histogram.
-
+      /// The operator compares all the bins from the two histograms.
+      /// Nobody uses this method unless unitary tests.
       template <unsigned q, typename V>
-      bool operator==(const histo3d_hsl<q,V>& histo1, 
+      bool operator==(const histo3d_hsl<q,V>& histo1,
 		      const histo3d_hsl<q,V>& histo2);
 
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
 
       template <unsigned q, typename V>
       inline
       histo3d_hsl<q,V>::histo3d_hsl() : min_hue(0.0), max_hue(360.0),
-				      min_lum(0.0), max_lum(1.0),
-				      min_sat(0.0), max_sat(1.0)
+				        min_lum(0.0), max_lum(1.0),
+				        min_sat(0.0), max_sat(1.0)
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::histo3d_hsl");
-	
-	// As there is no info about preceding color space
-	// we ask the end user to specify the quantification he's looking for.
+	trace::entering("mln::accu::stat::histo3d_hsl::cstor");
+
+	/// As there is no info about preceding color space
+	/// we ask the end user to specify the quantification he's looking for.
 
 	count_.init_(box3d(point3d(mln_min(value::int_u<q>),
 				   mln_min(value::int_u<q>),
@@ -241,7 +269,7 @@ namespace mln
 				   mln_max(value::int_u<q>),
 				   mln_max(value::int_u<q>))));
 
-	// Make the hue domain cyclic
+	/// Make the hue domain cyclic
 	fun::p2p::fold<point3d,1,0,0> fold_(count_.domain());
 	transform_domain(count_, fold_);
 
@@ -249,39 +277,34 @@ namespace mln
 	step_lum = (max_lum - min_lum)/q;
 	step_sat = (max_sat - min_sat)/q;
 
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::histo3d_hsl");
+	trace::exiting("mln::accu::stat::histo3d_hsl::cstor");
       }
 
       template <unsigned q, typename V>
       inline
       void histo3d_hsl<q,V>::init()
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::init");
-
-	data::fill(count_, 0);
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::init");
+	data::fill(count_, literal::zero);
       }
 
       template <unsigned q, typename V>
       inline
       void histo3d_hsl<q,V>::take(const argument& t)
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::take");
-
-	// Just convert a greyscale value (int_u8 like) to a position for an 
+	// Just convert a greyscale value (int_u8 like) to a position for an
 	// iterator on the resulting image.
 	//++count_(point3d(t.red(), t.green(), t.blue()));
-	
-	
+
+
 	// Technical way to access i° component without kwnowing the name
 	// mln::trait::value_<argument>::get_comp_0(t);
-	
+
 	// is def::coord1d the type of x, y, z ??
 	unsigned x = (t.hue() - min_hue)/step_hue;
-	unsigned y = (t.lum() - min_lum)/step_lum;
-	unsigned z = (t.sat() - min_sat)/step_sat;
+	unsigned y = (t.sat() - min_sat)/step_sat;
+	unsigned z = (t.lum() - min_lum)/step_lum;
 	/*
-	
+
 	std::cout << "H : " << t.hue() << std::endl;
 	std::cout << "L : " << t.lum() << std::endl;
 	std::cout << "S : " << t.sat() << std::endl;
@@ -295,66 +318,50 @@ namespace mln
 	std::cout << "Z : " << z << std::endl;
 	*/
 
-	// faire attention avec les histoires de points et leurs coordonnées
 	++count_(point3d(z, x, y));
-	//++count_(point3d(t.hue(), t.sat(), t.lum()));
-
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::take");
       }
 
-      
+
       template <unsigned q, typename V>
       inline
       void histo3d_hsl<q,V>::take(const histo3d_hsl<q,V>& other)
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::take");
-
 	count_ += other.count_;
-
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::take");
       }
-      
+
       template <unsigned q, typename V>
       inline
       typename histo3d_hsl<q,V>::result histo3d_hsl<q,V>::to_result() const
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::to_result");
-
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::to_result");
 	return count_;
       }
-      
+
       template <unsigned q, typename V>
       inline
       histo3d_hsl<q,V>::operator result() const
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<q,V>::operator result");
-
-	trace::exiting("mln::accu::stat::histo3d_rgb<q,V>::operator result");
 	return count_;
-      }      
+      }
 
       template <unsigned q, typename V>
       inline
       bool histo3d_hsl<q,V>::is_valid() const
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::is_valid");
 	bool result = count_.is_valid();
-	
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::is_valid");
+
 	return result;
       }
 
       template <unsigned q, typename V>
-      bool operator==(const histo3d_hsl<q,V>& histo1, 
+      bool operator==(const histo3d_hsl<q,V>& histo1,
 		      const histo3d_hsl<q,V>& histo2)
       {
-	trace::entering("mln::accu::stat::operator==");
+	trace::entering("mln::accu::stat::histo3d_hsl::operator==");
 
 	bool  result                  = true;
 	const image3d<unsigned>& res1 = histo1.to_result();
 	const image3d<unsigned>& res2 = histo2.to_result();
-	
+
 	mln_precondition(res1.is_valid());
 	mln_precondition(res2.is_valid());
 
@@ -364,11 +371,11 @@ namespace mln
 	for_all_2(p1, p2)
 	  result &= (res1(p1) == res2(p2));
 
-	trace::exiting("mln::accu::stat::operator==");
+	trace::exiting("mln::accu::stat::histo3d_hsl::operator==");
 	return result;
       }
 
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
 
 
     } // end of namespace mln::accu::stat
@@ -377,4 +384,4 @@ namespace mln
 
 } // end of namespace mln
 
-#endif // ! MLN_ACCU_STAT_HISTO3D_RGB_HH
+#endif // ! MLN_ACCU_STAT_HISTO3D_HSL_HH
diff --git a/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
index 48c49da..6a48024 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
@@ -1,6 +1,4 @@
-// Copyright (C) 2007 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -26,54 +24,67 @@
 // executable file might be covered by the GNU General Public License.
 
 #ifndef MLN_ACCU_STAT_HISTO3D_RGB_HH
-#define MLN_ACCU_STAT_HISTO3D_RGB_HH
+# define MLN_ACCU_STAT_HISTO3D_RGB_HH
 
 /// \file
 ///
-/// \brief Define a histogram as an accumulator which returns an image1d .
+/// \brief Define a histogram as accumulator which returns an image3d.
+///
+/// This source implements the discrete histogram version. It was
+/// created for images which the values are derived from integer
+/// type. The number of bins is directly infered from the cardinality
+/// of the image value. It works for RGB space. See histo1d.hh for limitations
+/// of such implementation. 8 bits quantification is very
+/// expensive, it produces image3d with [0..255,0..255,0..255] as domain.
 ///
-/// This source implements the discrete histogram version. The number of beans
-/// is infer from the number of greylevels. A typical rgb8 image has got
-/// 256x3 bins. Working with a 8 bit quantification in rgb is very costly.
 /// The following sample is a typical use of the histogram.
 ///
-/// #include <mln/value/rgb.hh>
-/// #include <mln/core/image/image1d.hh>
-/// #include <mln/core/image/image3d.hh>
-/// #include <mln/io/ppm/load.hh>
 /// #include <mln/accu/stat/histo3d_rgb.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/core/image/image3d.hh>
 /// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.hh>
+/// #include <mln/fun/v2v/rgb8_to_rgbn.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/ppm/load.hh>
+/// #include <mln/value/rgb.hh>
+/// #include <mln/value/rgb8.hh>
 ///
-/// #define  OLENA_LENA ""/usr/local/share/olena/images/lena.ppm"
-///
-/// void test()
+/// int main()
 /// {
-///   typedef mln::value::rgb<7> rgb7;
-///   mln::image2d<rgb7>         img_ref;
-///   mln::image3d<unsigned>     img_res;
+///   typedef mln::value::rgb8   t_rgb8;
+///   typedef mln::value::rgb<7> t_rgb7;
+///   mln::image2d<t_rgb8>       img_rgb8;
+///   mln::image2d<t_rgb7>       img_rgb7;
+///   mln::image3d<unsigned>     histo;
 ///
-///   mln::io::ppm::load(img_ref, OLENA_LENA);
-///   img_res=mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_ref);
+///   mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+///   img_rgb7 =mln::data::transform(img_rgb8,mln::fun::v2v::rgb8_to_rgbn<7>());
+///   histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_rgb7);
+///
+///   return 0;
 /// }
 
 
-#include <iostream>
+# include <iostream>
+
+# include <mln/accu/internal/base.hh>
 
-#include <mln/accu/internal/base.hh>
+# include <mln/arith/plus.hh>
 
-#include <mln/core/macros.hh>
-#include <mln/core/image/image3d.hh>
-#include <mln/core/alias/point3d.hh>
-#include <mln/core/alias/box3d.hh>
+# include <mln/core/macros.hh>
+# include <mln/core/image/image3d.hh>
+# include <mln/core/alias/point3d.hh>
+# include <mln/core/alias/box3d.hh>
 
-#include <mln/trait/value/comp.hh>
+# include <mln/literal/zero.hh>
 
-#include <mln/arith/plus.hh>
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
 
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
+# include <mln/trait/value/comp.hh>
 
-#include <mln/value/ops.hh>
+# include <mln/value/ops.hh>
 
 namespace mln
 {
@@ -140,13 +151,13 @@ namespace mln
     namespace stat
     {
 
-      /// \brief Define an histogram which returns an image3d .
+      /// \brief Define a histogram as accumulator which returns an image3d.
       ///
-      /// Param V defines the space in which we count the values.
-      /// For instance, this histogram works image2d<rgb<2>> or
-      /// image2d<rgb<7>>. The histogram count the occurrence of each value.
-      /// The number of bins depends of the grayscale values, for 8 bits there
-      /// is 256x3 bins. Note that over
+      /// Param V defines the type of the input image value. It is in
+      /// this space that we count the values. For instance, this
+      /// histogram works well for image2d< rgb<2> > or with image2d<
+      /// rgb<7> >. The number of bins depends directly the values V.
+      /// For 8 bits there is 256x3 bins. Note that less
       /// quantification works too.
       ///
       /// \ingroup modaccuvalues
@@ -159,16 +170,15 @@ namespace mln
 	typedef image3d<unsigned> result;
 	typedef result            q_result;
 
-	/// Constructors
+	/// Constructors.
 	/// \{
-	/// \brief Initialize the size of the resulting image1d.
+	/// \brief Infer the size of the resulting image3d domain.
 	///
-	/// Initialize the size the resulting image from the theorical dynamic
-	/// of the greylevel values (Use V to manage it).
+	/// By evaluating the minimum and the maximum of V, we define the domain
+	/// of the resulting image3d.
 	histo3d_rgb();
 	/// \}
 
-
 	/// Manipulators.
 	/// \{
 	/// \brief Initialize the histogram with zero value.
@@ -180,7 +190,7 @@ namespace mln
 
 
 	/// \brief Update the histogram with the RGB pixel t.
-	/// \param[in] t a greylevel pixel of type V.
+	/// \param[in] t a graylevel pixel of type V.
 	///
 	/// The end user shouldn't call this method. In place of it, he can
 	/// go through the data compute interface.
@@ -189,12 +199,15 @@ namespace mln
 
 	/// \brief Update the histogram with an other histogram.
 	/// \param[in] other the other histogram.
+	///
+	/// The end user shouldn't call this method. This is part of
+	/// data compute interface mechanism.
 	void take(const histo3d_rgb<V>& other);
 	/// \}
 
 	/// Accessors.
 	/// \{
-	/// \brief Return the histogram as an image1d.
+	/// \brief Return the histogram as an RGB image3d.
 	///
 	/// This is the machinery to communicate with data compute interface.
 	/// The end user should'nt use it.
@@ -216,19 +229,19 @@ namespace mln
       /// \param[in] histo1 the first histogram to compare with.
       /// \param[in] histo2 the second histogram.
       ///
-      /// The operator compare all the bins from the two histogram.
-
+      /// The operator compares all the bins from the two histograms.
+      /// Nobody uses this method unless unitary tests.
       template <typename V>
       bool operator==(const histo3d_rgb<V>& histo1,
 		      const histo3d_rgb<V>& histo2);
 
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
 
       template <typename V>
       inline
       histo3d_rgb<V>::histo3d_rgb()
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::histo3d_rgb");
+	trace::entering("mln::accu::stat::histo3d_rgb::cstor");
 	typedef mln_trait_value_comp(V,0) comp0;
 	typedef mln_trait_value_comp(V,1) comp1;
 	typedef mln_trait_value_comp(V,2) comp2;
@@ -244,31 +257,24 @@ namespace mln
 				   mln_max(comp1),
 				   mln_max(comp2))));
 
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::histo3d_rgb");
+	trace::exiting("mln::accu::stat::histo3d_rgb::cstor");
       }
 
       template <typename V>
       inline
       void histo3d_rgb<V>::init()
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::init");
-
-	data::fill(count_, 0);
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::init");
+	data::fill(count_, literal::zero);
       }
 
       template <typename V>
       inline
       void histo3d_rgb<V>::take(const argument& t)
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::take");
-
 	// Just convert a greyscale value (int_u8 like) to a position for an
 	// iterator on the resulting image.
 	// Take care to the constructor : Point(slice, row, column)
 	++count_(point3d(t.blue(), t.red(), t.green()));
-
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::take");
       }
 
 
@@ -276,20 +282,13 @@ namespace mln
       inline
       void histo3d_rgb<V>::take(const histo3d_rgb<V>& other)
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::take");
-
 	count_ += other.count_;
-
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::take");
       }
 
       template <typename V>
       inline
       typename histo3d_rgb<V>::result histo3d_rgb<V>::to_result() const
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::to_result");
-
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::to_result");
 	return count_;
       }
 
@@ -297,9 +296,6 @@ namespace mln
       inline
       histo3d_rgb<V>::operator result() const
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::operator result");
-
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::operator result");
 	return count_;
       }
 
@@ -307,10 +303,8 @@ namespace mln
       inline
       bool histo3d_rgb<V>::is_valid() const
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::is_valid");
 	bool result = count_.is_valid();
 
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::is_valid");
 	return result;
       }
 
@@ -318,7 +312,7 @@ namespace mln
       bool operator==(const histo3d_rgb<V>& histo1,
 		      const histo3d_rgb<V>& histo2)
       {
-	trace::entering("mln::accu::stat::operator==");
+	trace::entering("mln::accu::stat::histo3d_rgb::operator==");
 
 	bool  result                  = true;
 	const image3d<unsigned>& res1 = histo1.to_result();
@@ -333,11 +327,11 @@ namespace mln
 	for_all_2(p1, p2)
 	  result &= (res1(p1) == res2(p2));
 
-	trace::exiting("mln::accu::stat::operator==");
+	trace::exiting("mln::accu::stat::histo3d_rgb::operator==");
 	return result;
       }
 
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
 
 
     } // end of namespace mln::accu::stat
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh b/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
index 2918b1a..acf1b5e 100644
--- a/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
@@ -1,6 +1,4 @@
-// Copyright (C) 2007 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -35,6 +33,37 @@
 /// \file
 ///
 /// \brief Convert rgb8 value to rgbn, n < 8.
+///
+/// The source implements the reduction of quantification for any size less 8.
+///
+/// The following sample is a typical use of the histogram.
+///
+/// #include <mln/accu/stat/histo3d_rgb.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/core/image/image3d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.hh>
+/// #include <mln/fun/v2v/rgb8_to_rgbn.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/ppm/load.hh>
+/// #include <mln/value/rgb.hh>
+/// #include <mln/value/rgb8.hh>
+///
+/// int main()
+/// {
+///   typedef mln::value::rgb8   t_rgb8;
+///   typedef mln::value::rgb<7> t_rgb7;
+///   mln::image2d<t_rgb8>       img_rgb8;
+///   mln::image2d<t_rgb7>       img_rgb7;
+///   mln::image3d<unsigned>     histo;
+///
+///   mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+///   img_rgb7 =mln::data::transform(img_rgb8,mln::fun::v2v::rgb8_to_rgbn<7>());
+///   histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_rgb7);
+///
+///   return 0;
+/// }
+
 
 namespace mln
 {
@@ -45,16 +74,24 @@ namespace mln
     namespace v2v
     {
 
-      /// \brief Convert rgb8 value to rgbn, n < 8.
+      /// \brief Convert a rgb8 value to a rgn, n < 8.
+      ///
+      /// Param n defines the output quantification used for the transformation.
       ///
       /// \ingroup modfunv2v
-
       template <unsigned n>
       struct rgb8_to_rgbn : Function_v2v< rgb8_to_rgbn<n> >
       {
 	typedef value::rgb8   argument;
 	typedef value::rgb<n> result;
 
+	/// \brief Convert a rgb8 value to a rgn, n < 8.
+	///
+	/// \param[in] v the rgb8 value to convert.
+	///
+	/// Conversion is done by computing the size by which we
+	/// divide each rgb component.
+
 	result operator()(const argument& c) const
 	{
 	  mln_precondition(8 > n);
@@ -65,7 +102,7 @@ namespace mln
 	  std::cout << "red  : " << c.red() << std::endl;
 	  std::cout << "size : " << size << std::endl;
 	  std::cout << "res  : " << (c.red() / size) << std::endl;
-	  std::cout << "max  : " << (mln_max(mln::value::int_u<n>)) << std::endl;
+	  std::cout << "max  : " << (mln_max(mln::value::int_u<n>))<< std::endl;
 	  */
 	  result   res(c.red() / size, c.green() / size, c.blue() / size);
 
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
index d4c1e46..e9450e1 100644
--- a/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
@@ -81,7 +81,6 @@ namespace mln
       /// Param n defines the quantification used for rgb space and rg space.
       ///
       /// \ingroup modfunv2v
-
       template <unsigned n>
       struct rgb_to_rg : Function_v2v< rgb_to_rg<n> >
       {
@@ -95,7 +94,6 @@ namespace mln
 	/// Conversion is done by calling the rg constructor. There is
 	/// no modification of values. The red/green fields from rgb the value
 	/// are preserved. Blue value is dropped.
-
 	result operator()(const argument& v) const
 	{
 	  return value::rg<n>(v);
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
index 5a5c4c4..2fdc7dd 100644
--- a/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
+++ b/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
@@ -1,21 +1,507 @@
-/// TEST HISTO1D
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
 
+/// \file
+///
+/// \brief This source manages unitary testing on image1d histogram component.
+///
+/// Tests are performed in 8 bits and also in 14 bits quantification. The goal
+/// is to go through each programmatic flow to verify the conformity of the
+/// code. It sounds like a theoritic model of unitary testing for milena.
+/// The last test enables statistic computations on that component.
+
+#include <mln/accu/math/count.hh>
+#include <mln/accu/math/sum.hh>
 #include <mln/accu/stat/histo1d.hh>
+#include <mln/accu/stat/mean.hh>
+#include <mln/accu/stat/variance.hh>
+
+#include <mln/core/alias/box1d.hh>
+#include <mln/core/alias/point1d.hh>
+#include <mln/core/contract.hh>
+#include <mln/core/grids.hh>
+#include <mln/core/routine/initialize.hh>
+
 #include <mln/data/compute.hh>
-#include <mln/core/image/image1d.hh>
-#include <mln/core/image/image2d.hh>
+#include <mln/data/fill.hh>
+#include <mln/data/transform.hh>
+
+#include <mln/fun/v2v/int_u16_to_int_u14.hh>
+
 #include <mln/img_path.hh>
+
 #include <mln/io/pgm/load.hh>
+
+#include <mln/math/sqr.hh>
+#include <mln/math/abs.hh>
+
 #include <mln/value/int_u8.hh>
+#include <mln/value/int_u16.hh>
+
+
+/// Specific histogram accumulators.
+/// \{
+/// \brief Define statistical accumulator for histogram.
+///
+/// Here, some histogram accumulators are defined, the sum of the frequencies,
+/// the average, the variance.
+
+double count_histo(const mln::image1d<unsigned> img)
+{
+  mln_precondition(img.is_valid());
+
+  double                             result = 0.0;
+  double                             value  = 0.0;
+  mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value  = img(p);
+    result += value;
+  }
+
+  return result;
+}
+
+double mean_histo(mln::image1d<unsigned> img)
+{
+  mln_precondition(img.is_valid());
+
+  double                             value  = 0.0;
+  double                             site   = 0.0;
+  double                             count  = 0.0;
+  double                             sum    = 0.0;
+  double                             result = 0.0;
+  mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value =  img(p);
+    site  =  p.ind();
+    count += value;
+    sum   += site * value;
+  }
+
+  result = sum / count;
+
+  return result;
+}
+
+
+/// \fixme there is a conversion type problem with the interface of iterator p.
+
+double var_histo(const mln::image1d<unsigned> img)
+{
+  mln_precondition(img.is_valid());
+
+  double                             value  = 0.0;
+  double                             site   = 0.0;
+  // FIXME: such variables value and site are necessary to obtain the
+  // well computation of the variance.
+
+  double                             count  = 0.0;
+  double                             sum    = 0.0;
+  double                             sum2   = 0.0;
+  double                             result = 0.0;
+  mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value  = img(p);
+    site   = p.ind();
+    count += value;
+    sum   += site * value;
+    sum2  += mln::math::sqr(site) * value;
+  }
+
+  result = sum2 / count - (sum / count) * (sum / count);
+
+  return result;
+}
+
+
+/// \fixme there is a conversion type problem with the interface of iterator p.
+
+double var_histo2(const mln::image1d<unsigned> img)
+{
+  mln_precondition(img.is_valid());
+
+  double                             value  = 0.0;
+  double                             site   = 0.0;
+  // FIXME: such variables value and site are necessary to obtain the
+  // well computation of the variance.
+
+  double                             count  = count_histo(img);
+  double                             mean   = mean_histo(img);
+  double                             result = 0.0;
+  mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value  = img(p);
+    site   = p.ind();
+    result += value * mln::math::sqr(site - mean);
+  }
+
+  result /= count;
+
+  return result;
+}
+
+/// \}
+
+
+/// 8-bits testing
+/// \{
+/// \brief This part of the code manages the 8-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
+
+void test_8bits_operator_equal()
+{
+  using namespace mln::accu::stat;
+
+  typedef mln::value::int_u8       int_u8;
+  mln::accu::stat::histo1d<int_u8> histo1;
+  mln::accu::stat::histo1d<int_u8> histo2;
+  int_u8                           val = 3;
+
+  histo1.init();
+  histo2.init();
+
+  mln_assertion(histo1 == histo2);
+
+  histo1.take(val);
+
+  mln_assertion(!(histo1 == histo2));
+  // mln_assertion(histo1 != histo2);
+  // FIXME: DOESN'T WORK !!
+
+  histo2.take(val);
+
+  mln_assertion(histo1 == histo2);
+
+  std::cout << "(08 bits) histo == histo       : ok" << std::endl;
+}
+
+void test_8bits_instantiation_without_argument()
+{
+  typedef mln::value::int_u8               int_u8;
+  const   mln::accu::stat::histo1d<int_u8> histo;
+  const   mln::image1d<unsigned>&          res = histo.to_result();
+  const   mln::point1d&                    min = mln::point1d(mln_min(int_u8));
+  const   mln::point1d&                    max = mln::point1d(mln_max(int_u8));
+  const   mln::box1d&                      ref = mln::box1d(min, max);
+
+  mln_assertion(ref == res.domain());
+  mln_assertion(res.is_valid());
+
+  std::cout << "(08 bits) histo<T> histo       : ok" << std::endl;
+}
+
+
+void test_8bits_initialization()
+{
+  typedef mln::value::int_u8       int_u8;
+  mln::accu::stat::histo1d<int_u8> histo;
+  mln::image1d<unsigned>           img_res = histo.to_result();
+  mln::image1d<unsigned>           img_ref;
+
+  mln::initialize(img_ref, img_res);
+  mln::data::fill(img_ref, 0);
+  histo.init();
+
+  unsigned res = mln::data::compute(mln::accu::math::sum<int_u8>(), img_res);
+  unsigned ref = mln::data::compute(mln::accu::math::sum<int_u8>(), img_ref);
+
+  mln_assertion(ref == res);
+
+  std::cout << "(08 bits) histo.init()         : ok" << std::endl;
+}
+
+
+void test_8bits_take_argument()
+{
+  typedef mln::value::int_u8       int_u8;
+  mln::accu::stat::histo1d<int_u8> histo1;
+  mln::accu::stat::histo1d<int_u8> histo2;
+  int_u8                           val = 3;
+
+  histo1.init();
+  histo2.init();
+  histo1.take(val);
+
+  const mln::image1d<unsigned>     img1 = histo1.to_result();
+  const mln::image1d<unsigned>     img2 = histo2.to_result();
+
+  const unsigned res = mln::data::compute(mln::accu::math::sum<int_u8>(), img1);
+  const unsigned ref = mln::data::compute(mln::accu::math::sum<int_u8>(), img2);
+
+  mln_assertion(ref == res-1);
+  mln_assertion(1 == img1(mln::point1d(val)));
+
+  std::cout << "(08 bits) histo.take(argument) : ok" << std::endl;
+}
+
+
+void test_8bits_take_other()
+{
+  typedef mln::value::int_u8       int_u8;
+  mln::accu::stat::histo1d<int_u8> histo1;
+  mln::accu::stat::histo1d<int_u8> histo2;
+  mln::accu::stat::histo1d<int_u8> histo3;
+  int_u8                           val = 3;
+
+  histo1.init();
+  histo2.init();
+  histo3.init();
+
+  histo1.take(val);
+  histo1.take(val);
+  histo3.take(val);
+  histo2.take(val);
+  histo2.take(histo3);
+
+  mln_assertion(histo1 == histo2);
+
+  std::cout << "(08 bits) histo.take(other)    : ok" << std::endl;
+}
+
+void test_8bits_integration()
+{
+  typedef mln::value::int_u8                int_u8;
+  typedef mln::accu::math::count<double>    count;
+  typedef mln::accu::math::sum<double>      sum;
+  typedef mln::accu::stat::mean<double>     mean;
+  typedef mln::accu::stat::variance<double> variance;
+
+  mln::image2d<int_u8>       img_ref;
+  mln::image1d<unsigned>     img_res;
+
+  mln::io::pgm::load(img_ref, OLENA_IMG_PATH"/lena.pgm");
+
+  const double count_ref = mln::data::compute(count(),    img_ref);
+  const double mean_ref  = mln::data::compute(mean(),     img_ref);
+  const double var_ref   = mln::data::compute(variance(), img_ref);
+
+  img_res = mln::data::compute(mln::accu::meta::stat::histo1d(), img_ref);
+
+  const double count_res = count_histo(img_res);
+  const double mean_res  = mean_histo(img_res);
+  const double var_res   = var_histo(img_res);
+
+  mln_assertion(count_ref == count_res);
+  mln_assertion( mean_ref == mean_res );
+
+  // std::cout << "var_ref : " << var_ref << std::endl;
+  // std::cout << "var_res : " << var_res << std::endl;
+
+  mln_assertion(0.0001 > mln::math::abs(var_ref - var_res));
+
+  std::cout << "(08 bits) test integration     : ok" << std::endl;
+}
+
+/// \}
+
+/// 14-bits testing
+/// \{
+/// \brief This part of the code manages the 14-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
+
+void test_14bits_operator_equal()
+{
+  using namespace mln::accu::stat;
+
+  typedef mln::value::int_u<14>     int_u14;
+  mln::accu::stat::histo1d<int_u14> histo1;
+  mln::accu::stat::histo1d<int_u14> histo2;
+  int_u14                           val = 3;
+
+  histo1.init();
+  histo2.init();
+
+  mln_assertion(histo1 == histo2);
+
+  histo1.take(val);
+
+  /// FIXME: mln_assertion(histo1 != histo2); doesn't work!!
+  mln_assertion(!(histo1 == histo2));
+
+  histo2.take(val);
+
+  mln_assertion(histo1 == histo2);
+
+  std::cout << "(14 bits) histo == histo       : ok" << std::endl;
+}
+
+void test_14bits_instantiation_without_argument()
+{
+  typedef mln::value::int_u<14>             int_u14;
+  const   mln::accu::stat::histo1d<int_u14> histo;
+  const   mln::image1d<unsigned>&           res = histo.to_result();
+  const   mln::point1d&                     min =mln::point1d(mln_min(int_u14));
+  const   mln::point1d&                     max =mln::point1d(mln_max(int_u14));
+  const   mln::box1d&                       ref = mln::box1d(min, max);
+
+  mln_assertion(ref == res.domain());
+  mln_assertion(res.is_valid());
+
+  std::cout << "(14 bits) histo<T> histo       : ok" << std::endl;
+}
+
+
+void test_14bits_initialization()
+{
+  typedef mln::value::int_u<14>     int_u14;
+  mln::accu::stat::histo1d<int_u14> histo;
+  mln::image1d<unsigned>            img_res = histo.to_result();
+  mln::image1d<unsigned>            img_ref;
+
+  mln::initialize(img_ref, img_res);
+  mln::data::fill(img_ref, 0);
+  histo.init();
+
+  unsigned res = mln::data::compute(mln::accu::math::sum<int_u14>(), img_res);
+  unsigned ref = mln::data::compute(mln::accu::math::sum<int_u14>(), img_ref);
+
+  mln_assertion(ref == res);
+
+  std::cout << "(14 bits) histo.init()         : ok" << std::endl;
+}
+
+
+void test_14bits_take_argument()
+{
+  typedef mln::value::int_u<14>     int_u14;
+  mln::accu::stat::histo1d<int_u14> histo1;
+  mln::accu::stat::histo1d<int_u14> histo2;
+  int_u14                           val = 3;
+
+  histo1.init();
+  histo2.init();
+  histo1.take(val);
+
+  const mln::image1d<unsigned>     img1 = histo1.to_result();
+  const mln::image1d<unsigned>     img2 = histo2.to_result();
+
+  const unsigned res = mln::data::compute(mln::accu::math::sum<int_u14>(),img1);
+  const unsigned ref = mln::data::compute(mln::accu::math::sum<int_u14>(),img2);
+
+  mln_assertion(ref == res-1);
+  mln_assertion(1 == img1(mln::point1d(val)));
+
+  std::cout << "(14 bits) histo.take(argument) : ok" << std::endl;
+}
+
+
+void test_14bits_take_other()
+{
+  typedef mln::value::int_u<14>     int_u14;
+  mln::accu::stat::histo1d<int_u14> histo1;
+  mln::accu::stat::histo1d<int_u14> histo2;
+  mln::accu::stat::histo1d<int_u14> histo3;
+  int_u14                           val = 3;
+
+  histo1.init();
+  histo2.init();
+  histo3.init();
+
+  histo1.take(val);
+  histo1.take(val);
+  histo3.take(val);
+  histo2.take(val);
+  histo2.take(histo3);
+
+  mln_assertion(histo1 == histo2);
+
+  std::cout << "(14 bits) histo.take(other)    : ok" << std::endl;
+}
+
+void test_14bits_integration()
+{
+  typedef mln::value::int_u16               int_u16;
+  typedef mln::value::int_u<14>             int_u14;
+  typedef mln::accu::math::count<double>    count;
+  typedef mln::accu::math::sum<double>      sum;
+  typedef mln::accu::stat::mean<double>     mean;
+  typedef mln::accu::stat::variance<double> variance;
+
+  mln::image2d<int_u16>      img_fst;
+  mln::image2d<int_u14>      img_ref;
+  mln::image1d<unsigned>     img_res;
+
+  mln::io::pgm::load(img_fst, OLENA_IMG_PATH"/lena_16_imageMagick.pgm");
+  img_ref = mln::data::transform(img_fst, mln::fun::v2v::int_u16_to_int_u14());
+
+  const double count_ref = mln::data::compute(count(),    img_ref);
+  const double mean_ref  = mln::data::compute(mean(),     img_ref);
+  const double var_ref   = mln::data::compute(variance(), img_ref);
+
+  img_res = mln::data::compute(mln::accu::stat::histo1d<int_u14>(), img_ref);
+
+  const double count_res = count_histo(img_res);
+  const double mean_res  = mean_histo(img_res);
+  const double var_res   = var_histo2(img_res);
+
+  //std::cout << "var_res : " << var_res << std::endl;
+  //std::cout << "var_ref : " << var_ref << std::endl;
+
+  mln_assertion(count_ref == count_res);
+  mln_assertion( mean_ref == mean_res );
+  mln_assertion(0.0001 > abs(var_ref - var_res));
+
+  std::cout << "(14 bits) test integration     : ok" << std::endl;
+}
+
+/// \}
 
 int main()
 {
-  typedef mln::value::int_u8 t_int_u8;
-  mln::image2d<t_int_u8>     img;
-  mln::image1d<unsigned>     histo;
+  test_8bits_operator_equal();
+  test_8bits_instantiation_without_argument();
+  test_8bits_initialization();
+  test_8bits_take_argument();
+  test_8bits_take_other();
+  test_8bits_operator_equal();
+  test_8bits_integration();
 
-  mln::io::pgm::load(img, OLENA_IMG_PATH"/lena.pgm");
-  histo = mln::data::compute(mln::accu::meta::stat::histo1d(), img);
+  test_14bits_instantiation_without_argument();
+  test_14bits_initialization();
+  test_14bits_take_argument();
+  test_14bits_take_other();
+  test_14bits_operator_equal();
+  test_14bits_integration();
 
   return 0;
 }
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/tests/accu/stat/histo3d_hsl/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/tests/accu/stat/histo3d_hsl/Makefile.am
diff --git a/milena/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc b/scribo/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
similarity index 73%
copy from milena/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
copy to scribo/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
index 0a12706..eed377c 100644
--- a/milena/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
+++ b/scribo/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
@@ -1,66 +1,189 @@
-/// TEST HISTO3D_HSL
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief This source manages unitary testing on rgb image3d histogram.
+///
+/// Tests are performed from 2 bits up to 8 bits quantification. The goal
+/// is to go through each programmatic flow to verify the conformity of the
+/// code. It sounds like a theoritic model of unitary testing for milena.
+/// The last test enables statistic computations on that component.
 
-#include <mln/img_path.hh>
-
-#include <mln/io/plot/save_histo_sh.hh>
+#include <mln/accu/math/sum.hh>
+#include <mln/accu/math/count.hh>
 #include <mln/accu/stat/histo3d_hsl.hh>
-#include <mln/fun/v2v/rgb8_to_rgbn.hh>
-#include <mln/fun/v2v/rgb_to_hsl.hh>
+#include <mln/accu/stat/mean.hh>
+#include <mln/accu/stat/variance.hh>
+#include <mln/accu/stat/var.hh>
 
-#include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-#include <mln/io/pfm/save.hh>
-#include <mln/io/plot/save.hh>
+#include <mln/core/alias/box3d.hh>
+#include <mln/core/alias/point3d.hh>
+#include <mln/core/contract.hh>
+#include <mln/core/grids.hh>
+#include <mln/core/routine/initialize.hh>
 
 #include <mln/data/compute.hh>
-#include <mln/data/transform.hh>
 #include <mln/data/fill.hh>
+#include <mln/data/transform.hh>
+
+#include <mln/fun/v2v/rgb_to_hsl.hh>
+
+#include <mln/img_path.hh>
+
+#include <mln/io/ppm/load.hh>
+
+#include <mln/literal/zero.hh>
+
+#include <mln/math/sqr.hh>
+#include <mln/math/abs.hh>
 
-#include <mln/value/label_8.hh>
 #include <mln/value/rgb8.hh>
 #include <mln/value/hsl.hh>
-#include <mln/value/rgb.hh>
-#include <mln/value/int_u.hh>
 
-#include <mln/core/alias/neighb3d.hh>
-#include <mln/core/alias/box3d.hh>
-#include <mln/core/alias/point3d.hh>
+/// Specific histogram accumulators.
+/// \{
+/// \brief Define statistical accumulator for histogram.
+///
+/// Here, some histogram accumulators are defined, the sum of the frequencies,
+/// the average, the variance.
 
-#include <mln/core/routine/initialize.hh>
-#include <mln/core/contract.hh>
-#include <mln/core/grids.hh>
+double count_histo(const mln::image3d<unsigned>& img)
+{
+  mln_precondition(img.is_valid());
 
-#include <mln/accu/math/sum.hh>
-#include <mln/accu/math/count.hh>
-#include <mln/accu/stat/mean.hh>
-#include <mln/accu/stat/variance.hh>
-#include <mln/accu/stat/var.hh>
+  double                             result = 0.0;
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
 
-#include <mln/morpho/watershed/flooding.hh>
-#include <mln/morpho/elementary/dilation.hh>
-#include <mln/morpho/elementary/closing.hh>
+  for_all(p)
+    result += img(p);
 
-#include <mln/literal/zero.hh>
-#include <mln/linear/convolve.hh>
-#include <mln/linear/gaussian.hh>
-#include <mln/labeling/regional_maxima.hh>
-#include <mln/labeling/colorize.hh>
-#include <mln/labeling/mean_values.hh>
+  return result;
+}
 
-#include <mln/make/w_window3d.hh>
+mln::algebra::vec<3,float> conv(const mln::algebra::vec<3,float>& vec,
+				const unsigned                    q)
+{
+  mln::algebra::vec<3,float> result;
 
-#include <mln/math/sqr.hh>
-#include <mln/math/pi.hh>
-#include <mln/math/abs.hh>
+  /*
+  result[0] = vec[2] * (360.0/q);
+  result[1] = vec[0] * (1.0/q);
+  result[2] = vec[1] * (1.0/q);
+  */
+
+  result[0] = (vec[0]+0.5) * (360.0/q);
+  result[1] = (vec[1]+0.5) * (1.0/q);
+  result[2] = (vec[2]+0.5) * (1.0/q);
+
+  return result;
+}
+
+mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img,
+				      const unsigned                  q)
+{
+  mln_precondition(img.is_valid());
+  typedef mln::algebra::vec<3,float> vec3f;
+  double                             count  = 0.0;
+  vec3f                              sum    = mln::literal::zero;
+  vec3f                              result;
+
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    count += img(p);
+    sum   += conv((vec3f)p, q) * img(p);
+  }
+
+  result = sum / count;
+
+  return result;
+}
+
+mln::algebra::mat<3,3,float> var_histo(const mln::image3d<unsigned>& img,
+				       const unsigned                q)
+{
+  mln_precondition(img.is_valid());
+  typedef mln::algebra::vec<3,float>   vec3f;
+  typedef mln::algebra::mat<3,3,float> mat3f;
+
+  double                             count  = count_histo(img);
+  vec3f                              mean   = mean_histo(img,q);
+  vec3f                              point;
+  mat3f                              result = mln::literal::zero;
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    point  = conv((vec3f)p, q) - mean;
+    result += img(p) * (point * point.t());
+  }
 
-#include <mln/core/image/dmorph/image_if.hh>
-#include <mln/pw/value.hh>
+  result /= count;
+
+  return result;
+}
 
-#include <mln/trait/image/print.hh>
-#include <mln/trait/value_.hh>
-#include <mln/core/concept/function.hh>
+/// \}
+
+struct hslf_2_vec3f : public mln::Function_v2v< hslf_2_vec3f >
+{
+  typedef mln::algebra::vec<3,float> result;
+  result operator()(const mln::value::hsl_f& hsl) const;
+};
+
+mln::algebra::vec<3,float>
+hslf_2_vec3f::operator()(const mln::value::hsl_f& hsl) const
+{
+  return mln::make::vec(hsl.hue(), hsl.lum(), hsl.sat());
+}
+
+struct hslf_2_h : public mln::Function_v2v< hslf_2_h >
+{
+  typedef float result;
+  result operator()(const mln::value::hsl_f& hsl) const;
+};
+
+float
+hslf_2_h::operator()(const mln::value::hsl_f& hsl) const
+{
+  return hsl.hue();
+}
 
 
+/// n-bits testing
+/// \{
+/// \brief This part of the code manages the n-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
+
 template <unsigned n>
 void test_operator_equal()
 {
@@ -129,7 +252,7 @@ void test_initialization()
 
   unsigned res = mln::data::compute(mln::accu::math::sum<int_un>(), img_res);
   unsigned ref = mln::data::compute(mln::accu::math::sum<int_un>(), img_ref);
-  
+
   mln_assertion(ref == res);
 
   std::cout << "(" << n << " bits) histo.init()         : ok" << std::endl;
@@ -184,131 +307,6 @@ void test_take_other()
   std::cout << "(" << n << " bits) histo.take(other)    : ok" << std::endl;
 }
 
-double count_histo(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  
-  double                             result = 0.0;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-    result += img(p);
-
-  return result;
-}
-
-mln::algebra::vec<3,float> conv(const mln::algebra::vec<3,float>& vec,
-				const unsigned                    q)
-{
-  mln::algebra::vec<3,float> result;
-
-  /*
-  result[0] = vec[2] * (360.0/q);
-  result[1] = vec[0] * (1.0/q);
-  result[2] = vec[1] * (1.0/q);
-  */
-
-  result[0] = (vec[0]+0.5) * (360.0/q);
-  result[1] = (vec[1]+0.5) * (1.0/q);
-  result[2] = (vec[2]+0.5) * (1.0/q);
-
-  return result;
-}
-
-mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img,
-				      const unsigned                  q)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float> vec3f;
-  double                             count  = 0.0;
-  vec3f                              sum    = mln::literal::zero;
-  vec3f                              result;
-
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    count += img(p);
-    sum   += conv((vec3f)p, q) * img(p);
-  }
-
-  result = sum / count;
-
-  return result;
-}
-
-
-double var_histo(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float>   vec3f;
-  typedef mln::algebra::mat<3,3,float> mat3f;
-  double                               count  = 0.0;
-  double                               sum    = 0.0;
-  double                               sum2   = 0.0;
-  double                               result = 0.0;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    count += img(p);
-    sum   += p[0] * img(p);
-    sum2  += p[0] * p[0] * img(p);
-  }
-
-  result = sum2 / count - (sum / count) * (sum / count);
-
-  return result;
-}
-
-mln::algebra::mat<3,3,float> var_histo2(const mln::image3d<unsigned>& img,
-					const unsigned                q)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float>   vec3f;
-  typedef mln::algebra::mat<3,3,float> mat3f;
-  
-  double                             count  = count_histo(img);
-  vec3f                              mean   = mean_histo(img,q);
-  vec3f                              point;
-  mat3f                              result = mln::literal::zero;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    point  = conv((vec3f)p, q) - mean;
-    result += img(p) * (point * point.t());
-  }
-
-  result /= count;
-
-  return result;
-}
-
-struct hslf_2_vec3f : public mln::Function_v2v< hslf_2_vec3f >
-{
-  typedef mln::algebra::vec<3,float> result;
-  result operator()(const mln::value::hsl_f& hsl) const;
-};
-
-mln::algebra::vec<3,float>
-hslf_2_vec3f::operator()(const mln::value::hsl_f& hsl) const
-{
-  return mln::make::vec(hsl.hue(), hsl.lum(), hsl.sat());
-}
-
-struct hslf_2_h : public mln::Function_v2v< hslf_2_h >
-{
-  typedef float result;
-  result operator()(const mln::value::hsl_f& hsl) const;
-};
-
-float
-hslf_2_h::operator()(const mln::value::hsl_f& hsl) const
-{
-  return hsl.hue();
-}
-
 template <unsigned n, unsigned q>
 void test_integration()
 {
@@ -331,37 +329,27 @@ void test_integration()
   mln::image2d<float>        img_sav;
 
   mln::io::ppm::load(img_fst, OLENA_IMG_PATH"/lena.ppm");
-    //mln::io::ppm::load(img_fst, OLENA_IMG_PATH"/fly.ppm");
-  //img_sec = mln::data::transform(img_fst, mln::fun::v2v::rgb8_to_rgbn<n>());
   img_thd = mln::data::transform(img_fst,mln::fun::v2v::f_rgb_to_hsl_<hsl_f>());
-
-  //img_sav = mln::data::transform(img_thd, hslf_2_h());
-  //mln::io::plot::save_histo_sh(img_sav, "lena2.sh");
-
   img_ref = mln::data::transform(img_thd, hslf_2_vec3f());
 
   const double count_ref = mln::data::compute(count(), img_ref);
-  //  const vec3f  sum_ref   = mln::data::compute(sum(),   img_ref);
-  const vec3f  mean_ref  = mln::data::compute(mean(),  img_ref);  
+  const vec3f  mean_ref  = mln::data::compute(mean(),  img_ref);
   const mat3f  var_ref   = mln::data::compute(var(),   img_ref);
 
-  img_res = mln::data::compute(mln::accu::stat::histo3d_hsl<q,hsl_f>(),img_thd);
-  
-  mln::io::plot::save_histo_sh(img_res, "histo_hsl.sh");
+  img_res = mln::data::compute(mln::accu::meta::stat::histo3d_hsl<q>(),img_thd);
 
   const double count_res = count_histo(img_res);
   const vec3f  mean_res  = mean_histo(img_res, q);
   const mat3f  var_res   = var_histo2(img_res, q);
- 
-  std::cout << "count_ref : " << count_ref << std::endl;
-  std::cout << "mean_ref  : " << mean_ref  << std::endl;
-  std::cout << "var_ref   : " << var_ref   << std::endl;
 
-  std::cout << "count_res : " << count_res << std::endl;
-  std::cout << "mean_res  : " << mean_res  << std::endl;
-  std::cout << "var_res   : " << var_res   << std::endl;
+  // std::cout << "count_ref : " << count_ref << std::endl;
+  // std::cout << "mean_ref  : " << mean_ref  << std::endl;
+  // std::cout << "var_ref   : " << var_ref   << std::endl;
+
+  // std::cout << "count_res : " << count_res << std::endl;
+  // std::cout << "mean_res  : " << mean_res  << std::endl;
+  // std::cout << "var_res   : " << var_res   << std::endl;
 
-  
   mln_assertion(count_ref == count_res);
 
   /*
@@ -385,39 +373,19 @@ void test_integration()
   std::cout << "(" << n << " bits) test integration     : ok" << std::endl;
 }
 
-void test()
-{
-  typedef mln::value::rgb8                    rgb8;
-  typedef mln::value::hsl_f                   hsl_f;
-  typedef mln::fun::v2v::f_rgb_to_hsl_<hsl_f> rgb_to_hsl_f;
-  mln::image2d<rgb8>                          img_fst;
-  mln::image2d<hsl_f>                         img_ref;
-  rgb_to_hsl_f                                instance;
-  rgb8                                        rgb(255,127,0);
-  hsl_f                                       hsl = instance(rgb);
-
-  std::cout << hsl.hue() << std::endl;
-  std::cout << hsl.lum() << std::endl;
-  std::cout << hsl.sat() << std::endl;
-
+/// \}
 
-  mln::io::ppm::load(img_fst, OLENA_IMG_PATH"/lena.ppm");
-  img_ref = mln::data::transform(img_fst, rgb_to_hsl_f());
-
-  //mln::accu::stat::histo3d_hsl<hsl_f>();
-
-}
+/// \fixme Should compile but doesn't. Fold problem in histo_hsl.hh.
 
 int main()
 {
-  /*
+
   test_operator_equal<3>();
   test_instantiation_without_argument<3>();
   test_initialization<3>();
-  test_take_argument<3>(); 
+  test_take_argument<3>();
   test_take_other<3>();
-  */
   test_integration<7,6>();
-  
+
   return 0;
 }
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/tests/accu/stat/histo3d_rgb/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/tests/accu/stat/histo3d_rgb/Makefile.am
diff --git a/milena/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc b/scribo/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
similarity index 64%
copy from milena/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
copy to scribo/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
index cbf273b..3f87c4d 100644
--- a/milena/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
+++ b/scribo/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
@@ -1,58 +1,152 @@
-/// TEST HISTO3D_RGB
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief This source manages unitary testing on rgb image3d histogram.
+///
+/// Tests are performed from 2 bits up to 8 bits quantification. The goal
+/// is to go through each programmatic flow to verify the conformity of the
+/// code. It sounds like a theoritic model of unitary testing for milena.
+/// The last test enables statistic computations on that component.
 
-#include <mln/img_path.hh>
-
-#include <mln/io/plot/save_histo_sh.hh>
+#include <mln/accu/math/sum.hh>
+#include <mln/accu/math/count.hh>
 #include <mln/accu/stat/histo3d_rgb.hh>
-#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+#include <mln/accu/stat/mean.hh>
+#include <mln/accu/stat/variance.hh>
+#include <mln/accu/stat/var.hh>
 
-#include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-#include <mln/io/plot/save.hh>
-#include <mln/io/plot/save_histo_sh.hh>
+#include <mln/core/alias/box3d.hh>
+#include <mln/core/alias/point3d.hh>
+#include <mln/core/contract.hh>
+#include <mln/core/grids.hh>
+#include <mln/core/routine/initialize.hh>
 
 #include <mln/data/compute.hh>
-#include <mln/data/transform.hh>
 #include <mln/data/fill.hh>
+#include <mln/data/transform.hh>
+
+#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+
+#include <mln/img_path.hh>
+
+#include <mln/io/ppm/load.hh>
+
+#include <mln/literal/zero.hh>
+
+#include <mln/math/sqr.hh>
+#include <mln/math/abs.hh>
 
-#include <mln/value/label_8.hh>
 #include <mln/value/rgb8.hh>
 #include <mln/value/rgb.hh>
-#include <mln/value/int_u.hh>
 
-#include <mln/core/alias/neighb3d.hh>
-#include <mln/core/alias/box3d.hh>
-#include <mln/core/alias/point3d.hh>
+/// Specific histogram accumulators.
+/// \{
+/// \brief Define statistical accumulator for histogram.
+///
+/// Here, some histogram accumulators are defined, the sum of the frequencies,
+/// the average, the variance.
 
-#include <mln/core/routine/initialize.hh>
-#include <mln/core/contract.hh>
-#include <mln/core/grids.hh>
+double count_histo(const mln::image3d<unsigned>& img)
+{
+  mln_precondition(img.is_valid());
 
-#include <mln/accu/math/sum.hh>
-#include <mln/accu/math/count.hh>
-#include <mln/accu/stat/mean.hh>
-#include <mln/accu/stat/variance.hh>
-#include <mln/accu/stat/var.hh>
+  double                             value  = 0.0;
+  double                             result = 0.0;
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value   = img(p);
+    result += value;
+  }
 
-#include <mln/morpho/watershed/flooding.hh>
-#include <mln/morpho/elementary/dilation.hh>
-#include <mln/morpho/elementary/closing.hh>
+  return result;
+}
 
-#include <mln/literal/zero.hh>
-#include <mln/linear/convolve.hh>
-#include <mln/linear/gaussian.hh>
-#include <mln/labeling/regional_maxima.hh>
-#include <mln/labeling/colorize.hh>
-#include <mln/labeling/mean_values.hh>
+mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img)
+{
+  mln_precondition(img.is_valid());
+  typedef mln::algebra::vec<3,float> vec3f;
+  double                             value  = 0.0;
+  double                             count  = 0.0;
+  vec3f                              sum    = mln::literal::zero;
+  vec3f                              result;
 
-#include <mln/make/w_window3d.hh>
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
 
-#include <mln/math/sqr.hh>
-#include <mln/math/pi.hh>
-#include <mln/math/abs.hh>
+  for_all(p)
+  {
+    value  = img(p);
+    count += value;
+    sum   += p.to_vec() * value;
+  }
 
-#include <mln/core/image/dmorph/image_if.hh>
-#include <mln/pw/value.hh>
+  result = sum / count;
+
+  return result;
+}
+
+
+mln::algebra::mat<3,3,float> var_histo (const mln::image3d<unsigned>& img)
+{
+  mln_precondition(img.is_valid());
+  typedef mln::algebra::vec<3,float>   vec3f;
+  typedef mln::algebra::mat<3,3,float> mat3f;
+
+  double                             value  = 0.0;
+  double                             count  = count_histo(img);
+  vec3f                              mean   = mean_histo(img);
+  vec3f                              point;
+  mat3f                              result = mln::literal::zero;
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value   = img(p);
+    point   = p.to_vec() - mean;
+    result += value * (point * point.t());
+  }
+
+  result /= count;
+
+  return result;
+}
+
+/// \}
+
+/// n-bits testing
+/// \{
+/// \brief This part of the code manages the n-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
 
 
 template <unsigned n>
@@ -72,8 +166,10 @@ void test_operator_equal()
 
   histo1.take(val);
 
-  /// FIXME mln_assertion(histo1 != histo2); doesn't work!!
   mln_assertion(!(histo1 == histo2));
+  // mln_assertion(histo1 != histo2);
+  // FIXME: DOESN'T WORK !!
+
 
   histo2.take(val);
 
@@ -118,7 +214,7 @@ void test_initialization()
 
   unsigned res = mln::data::compute(mln::accu::math::sum<int_un>(), img_res);
   unsigned ref = mln::data::compute(mln::accu::math::sum<int_un>(), img_ref);
-  
+
   mln_assertion(ref == res);
 
   std::cout << "(" << n << " bits) histo.init()         : ok" << std::endl;
@@ -173,86 +269,7 @@ void test_take_other()
   std::cout << "(" << n << " bits) histo.take(other)    : ok" << std::endl;
 }
 
-double count_histo(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  
-  double                             result = 0.0;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-    result += img(p);
-
-  return result;
-}
-
-mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float> vec3f;
-  double                             count  = 0.0;
-  vec3f                              sum    = mln::literal::zero;
-  vec3f                              result;
-
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    count += img(p);
-    sum   += p.to_vec() * img(p);
-  }
-
-  result = sum / count;
-
-  return result;
-}
-
-
-double var_histo(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float>   vec3f;
-  typedef mln::algebra::mat<3,3,float> mat3f;
-  double                               count  = 0.0;
-  double                               sum    = 0.0;
-  double                               sum2   = 0.0;
-  double                               result = 0.0;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    count += img(p);
-    sum   += p[0] * img(p);
-    sum2  += p[0] * p[0] * img(p);
-  }
-
-  result = sum2 / count - (sum / count) * (sum / count);
-
-  return result;
-}
-
-mln::algebra::mat<3,3,float> var_histo2(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float>   vec3f;
-  typedef mln::algebra::mat<3,3,float> mat3f;
-  
-  double                             count  = count_histo(img);
-  vec3f                              mean   = mean_histo(img);
-  vec3f                              point;
-  mat3f                              result = mln::literal::zero;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    point   = p.to_vec() - mean;
-    result += img(p) * (point * point.t());
-  }
-
-  result /= count;
-
-  return result;
-}
+/// \fixme When the quantification grows, the computation error grows.
 
 template <unsigned n>
 void test_integration()
@@ -277,77 +294,65 @@ void test_integration()
   const vec3f  sum_ref   = mln::data::compute(sum(),   img_ref);
   const vec3f  mean_ref  = mln::data::compute(mean(),  img_ref);
   const mat3f  var_ref   = mln::data::compute(var(),   img_ref);
-  
-  img_res = mln::data::compute(mln::accu::stat::histo3d_rgb<rgbn>(), img_ref);
 
-  mln::io::plot::save_histo_sh(img_res, "histo_rgb.sh");
+  img_res = mln::data::compute(mln::accu::stat::histo3d_rgb<rgbn>(), img_ref);
 
   const double count_res = count_histo(img_res);
   const vec3f  mean_res  = mean_histo(img_res);
-  const mat3f  var_res   = var_histo2(img_res);
- 
-  std::cout << "count_ref : " << count_ref << std::endl;
-  std::cout << "mean_ref  : " << mean_ref  << std::endl;
-  std::cout << "var_ref   : " << var_ref   << std::endl;
+  const mat3f  var_res   = var_histo(img_res);
+
+  // std::cout << "count_ref : " << count_ref << std::endl;
+  // std::cout << "mean_ref  : " << mean_ref  << std::endl;
+  // std::cout << "var_ref   : " << var_ref   << std::endl;
+
+  // std::cout << "count_res : " << count_res << std::endl;
+  // std::cout << "mean_res  : " << mean_res  << std::endl;
+  // std::cout << "var_res   : " << var_res   << std::endl;
 
-  std::cout << "count_res : " << count_res << std::endl;
-  std::cout << "mean_res  : " << mean_res  << std::endl;
-  std::cout << "var_res   : " << var_res   << std::endl;
 
-  
   mln_assertion(count_ref == count_res);
- 
-  mln_assertion(0.0001 > abs(mean_ref[0] - mean_res[0]));
-  mln_assertion(0.0001 > abs(mean_ref[1] - mean_res[1]));
-  mln_assertion(0.0001 > abs(mean_ref[2] - mean_res[2]));
 
-  mln_assertion(0.0001 > abs(var_ref(0,0) - var_res(0,0)));
-  mln_assertion(0.0001 > abs(var_ref(0,1) - var_res(0,1)));
-  mln_assertion(0.0001 > abs(var_ref(1,0) - var_res(1,0)));
+  /// FIXME: The error acceptance seems to high !!
+  mln_assertion(3 > mln::math::abs(mean_ref[0] - mean_res[0]));
+  mln_assertion(3 > mln::math::abs(mean_ref[1] - mean_res[1]));
+  mln_assertion(3 > mln::math::abs(mean_ref[2] - mean_res[2]));
+
+  mln_assertion(3 > mln::math::abs(var_ref(0,0) - var_res(0,0)));
+  mln_assertion(3 > mln::math::abs(var_ref(0,1) - var_res(0,1)));
+  mln_assertion(3 > mln::math::abs(var_ref(1,0) - var_res(1,0)));
 
-  mln_assertion(0.0001 > abs(var_ref(1,1) - var_res(1,1)));
-  mln_assertion(0.0001 > abs(var_ref(0,2) - var_res(0,2)));
-  mln_assertion(0.0001 > abs(var_ref(2,0) - var_res(2,0)));
+  mln_assertion(3 > mln::math::abs(var_ref(1,1) - var_res(1,1)));
+  mln_assertion(3 > mln::math::abs(var_ref(0,2) - var_res(0,2)));
+  mln_assertion(3 > mln::math::abs(var_ref(2,0) - var_res(2,0)));
 
+  mln_assertion(3 > mln::math::abs(var_ref(2,2) - var_res(2,2)));
+  mln_assertion(3 > mln::math::abs(var_ref(2,1) - var_res(2,1)));
+  mln_assertion(3 > mln::math::abs(var_ref(1,2) - var_res(1,2)));
 
-  mln_assertion(0.0001 > abs(var_ref(2,2) - var_res(2,2)));
-  mln_assertion(0.0001 > abs(var_ref(2,1) - var_res(2,1)));
-  mln_assertion(0.0001 > abs(var_ref(1,2) - var_res(1,2)));
-  
   std::cout << "(" << n << " bits) test integration     : ok" << std::endl;
 }
 
+/// \}
+
+/// \fixme Doesn't work with 1 bit, compilation problem.
+
 int main()
 {
-  //
-  // Doesn't work with 1 bit, compilation problem
-  //
 
-  /*
-  test_operator_equal<1>();
-  test_instantiation_without_argument<1>();
-  test_initialization<1>();
-  test_take_argument<1>();
-  test_take_other<1>();
-  test_integration<1>();
-  */
-  /*
   test_operator_equal<2>();
   test_instantiation_without_argument<2>();
   test_initialization<2>();
   test_take_argument<2>();
   test_take_other<2>();
   test_integration<2>();
-  */
-  /*
+
+
   test_operator_equal<3>();
   test_instantiation_without_argument<3>();
   test_initialization<3>();
   test_take_argument<3>();
   test_take_other<3>();
   test_integration<3>();
-  
-  
 
   test_operator_equal<4>();
   test_instantiation_without_argument<4>();
@@ -355,44 +360,38 @@ int main()
   test_take_argument<4>();
   test_take_other<4>();
   test_integration<4>();
-  
-  
+
   test_operator_equal<5>();
   test_instantiation_without_argument<5>();
   test_initialization<5>();
   test_take_argument<5>();
   test_take_other<5>();
   test_integration<5>();
-  */
+
   test_operator_equal<6>();
   test_instantiation_without_argument<6>();
   test_initialization<6>();
   test_take_argument<6>();
   test_take_other<6>();
   test_integration<6>();
-  
-  /*
+
   test_operator_equal<7>();
   test_instantiation_without_argument<7>();
   test_initialization<7>();
   test_take_argument<7>();
   test_take_other<7>();
   test_integration<7>();
-  */
-    
+
   //
   // Do not execute it, unless you have the time :)
   //
 
-  /*
-  test_operator_equal<8>();
-  test_instantiation_without_argument<8>();
-  test_initialization<8>();
-  test_take_argument<8>();
-  test_take_other<8>();
-  test_integration<8>();
-  */
- 
+  // test_operator_equal<8>();
+  // test_instantiation_without_argument<8>();
+  // test_initialization<8>();
+  // test_take_argument<8>();
+  // test_take_other<8>();
+  // test_integration<8>();
 
   return 0;
 }
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
index 1c6176b..af39d94 100644
--- a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
@@ -1,3 +1,28 @@
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
 /// \file
 ///
 /// \brief Minimal code for building 1d image histogram version.
@@ -11,6 +36,8 @@
 #include <mln/io/pgm/load.hh>
 #include <mln/value/int_u8.hh>
 
+
+
 int main()
 {
   typedef mln::value::int_u8 t_int_u8;
diff --git a/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc b/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
index 6369b5a..2e36867 100644
--- a/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
@@ -1,3 +1,28 @@
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
 /// \file
 ///
 /// \brief Minimal code for building 2d image histogram version.
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/accu/stat/histo3d_hsl/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/accu/stat/histo3d_hsl/Makefile.am
diff --git a/milena/tests/fun/v2v/rgb_to_hsl.cc b/scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc
similarity index 57%
copy from milena/tests/fun/v2v/rgb_to_hsl.cc
copy to scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc
index 6fd9a17..17b12cc 100644
--- a/milena/tests/fun/v2v/rgb_to_hsl.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -23,37 +23,37 @@
 // exception does not however invalidate any other reasons why the
 // executable file might be covered by the GNU General Public License.
 
-#include <mln/core/image/image2d.hh>
+/// \file
+///
+/// \brief Minimal code for building HSL 3d image histogram version.
+//
+/// \fixme This code should compile but it doesn't.
+///
 
+#include <mln/accu/stat/histo3d_hsl.hh>
+#include <mln/core/image/image2d.hh>
+#include <mln/core/image/image3d.hh>
+#include <mln/data/compute.hh>
+#include <mln/data/transform.hh>
+#include <mln/fun/v2v/rgb_to_hsl.hh>
+#include <mln/img_path.hh>
+#include <mln/io/ppm/load.hh>
 #include <mln/value/hsl.hh>
 #include <mln/value/rgb8.hh>
 
-#include <mln/fun/v2v/rgb_to_hsl.hh>
-
-#include <mln/data/compare.hh>
-#include <mln/data/transform.hh>
-
-#include <mln/make/image.hh>
-
-#include <mln/debug/println.hh>
-
-using mln::value::rgb8;
-using mln::value::hsl_f;
-
-rgb8 dat[][2] = { { rgb8(0,0,0), rgb8(255,255,255) },
-		  { rgb8(128,128,128), rgb8(90,90, 90) } };
-
-hsl_f ref[][2] = { { hsl_f(0,0,0), hsl_f(0,0,1.0) },
-		   { hsl_f(0,0,128.0 / 255.0), hsl_f(0,0,90.0 / 255.0) } };
-
 int main()
 {
-  using namespace mln;
-
-  image2d<value::rgb8> ima = make::image(dat);
-  image2d<hsl_f> ref_ima = make::image(ref);
-  image2d<hsl_f> ima_hsl = data::transform(ima,
-					    fun::v2v::f_rgb_to_hsl_f);
-
-  mln_assertion(ima_hsl == ref_ima);
+  typedef mln::value::rgb8                    t_rgb;
+  typedef mln::value::hsl_f                   t_hsl;
+  typedef mln::fun::v2v::f_rgb_to_hsl_<t_hsl> t_rgb_to_hsl;
+  mln::image2d<t_rgb>                         img_rgb;
+  mln::image2d<t_hsl>                         img_hsl;
+  mln::image3d<unsigned>                      histo;
+
+  mln::io::ppm::load(img_rgb, OLENA_IMG_PATH"/lena.ppm");
+  img_hsl = mln::data::transform(img_rgb, t_rgb_to_hsl());
+  //histo =mln::data::compute(mln::accu::meta::stat::histo3d_hsl<7>(), img_hsl);
+  //histo =mln::data::compute(mln::accu::stat::histo3d_hsl<7,t_hsl>(), img_hsl);
+  mln::accu::stat::histo3d_hsl<7,t_hsl>();
+  return 0;
 }
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/accu/stat/histo3d_rgb/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/accu/stat/histo3d_rgb/Makefile.am
diff --git a/milena/tests/io/ppm/ppm.cc b/scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc
similarity index 63%
copy from milena/tests/io/ppm/ppm.cc
copy to scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc
index c2dac07..20267a0 100644
--- a/milena/tests/io/ppm/ppm.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -23,32 +23,35 @@
 // exception does not however invalidate any other reasons why the
 // executable file might be covered by the GNU General Public License.
 
+/// \file
+///
+/// \brief Minimal code for building 3d image histogram version.
+///
+
+
+#include <mln/accu/stat/histo3d_rgb.hh>
 #include <mln/core/image/image2d.hh>
 #include <mln/core/image/image3d.hh>
-#include <mln/core/image/dmorph/slice_image.hh>
-#include <mln/value/rgb8.hh>
-
+#include <mln/data/compute.hh>
+#include <mln/data/transform.hh>
+#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+#include <mln/img_path.hh>
 #include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-
-#include <mln/data/compare.hh>
-
-#include <mln/util/array.hh>
-
-#include <mln/literal/colors.hh>
-
-#include "tests/data.hh"
-
+#include <mln/value/rgb.hh>
+#include <mln/value/rgb8.hh>
 
 int main()
 {
-  using namespace mln;
-  using value::rgb8;
+  typedef mln::value::rgb8   t_rgb8;
+  typedef mln::value::rgb<7> t_rgb7;
+  mln::image2d<t_rgb8>       img_rgb8;
+  mln::image2d<t_rgb7>       img_rgb7;
+  mln::image3d<unsigned>     histo;
+
+  mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+  img_rgb7 = mln::data::transform(img_rgb8, mln::fun::v2v::rgb8_to_rgbn<7>());
 
-  image2d<rgb8> lena = io::ppm::load<rgb8>(MLN_IMG_DIR "/lena.ppm");
-  io::ppm::save(lena, "out.ppm");
+  histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(), img_rgb7);
 
-  image2d<rgb8> lena2;
-  io::ppm::load(lena2, "out.ppm");
-  mln_assertion(lena2 == lena);
+  return 0;
 }
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/Makefile.am
diff --git a/milena/tests/io/ppm/ppm.cc b/scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc
similarity index 63%
copy from milena/tests/io/ppm/ppm.cc
copy to scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc
index c2dac07..cec04e7 100644
--- a/milena/tests/io/ppm/ppm.cc
+++ b/scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -23,32 +23,35 @@
 // exception does not however invalidate any other reasons why the
 // executable file might be covered by the GNU General Public License.
 
+/// \file
+///
+/// \brief Example of using rgb8_t_rgbn transformation to compute 3d histogram.
+///
+
+
+#include <mln/accu/stat/histo3d_rgb.hh>
 #include <mln/core/image/image2d.hh>
 #include <mln/core/image/image3d.hh>
-#include <mln/core/image/dmorph/slice_image.hh>
-#include <mln/value/rgb8.hh>
-
+#include <mln/data/compute.hh>
+#include <mln/data/transform.hh>
+#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+#include <mln/img_path.hh>
 #include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-
-#include <mln/data/compare.hh>
-
-#include <mln/util/array.hh>
-
-#include <mln/literal/colors.hh>
-
-#include "tests/data.hh"
-
+#include <mln/value/rgb.hh>
+#include <mln/value/rgb8.hh>
 
 int main()
 {
-  using namespace mln;
-  using value::rgb8;
+  typedef mln::value::rgb8   t_rgb8;
+  typedef mln::value::rgb<7> t_rgb7;
+  mln::image2d<t_rgb8>       img_rgb8;
+  mln::image2d<t_rgb7>       img_rgb7;
+  mln::image3d<unsigned>     histo;
+
+  mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+  img_rgb7 = mln::data::transform(img_rgb8, mln::fun::v2v::rgb8_to_rgbn<7>());
 
-  image2d<rgb8> lena = io::ppm::load<rgb8>(MLN_IMG_DIR "/lena.ppm");
-  io::ppm::save(lena, "out.ppm");
+  histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(), img_rgb7);
 
-  image2d<rgb8> lena2;
-  io::ppm::load(lena2, "out.ppm");
-  mln_assertion(lena2 == lena);
+  return 0;
 }
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/fun/v2v/rgb_to_rg/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/fun/v2v/rgb_to_rg/Makefile.am
diff --git a/milena/tests/fun/v2v/hsl_to_rgb.cc b/scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc
similarity index 59%
copy from milena/tests/fun/v2v/hsl_to_rgb.cc
copy to scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc
index 237e605..8e612b2 100644
--- a/milena/tests/fun/v2v/hsl_to_rgb.cc
+++ b/scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -23,33 +23,36 @@
 // exception does not however invalidate any other reasons why the
 // executable file might be covered by the GNU General Public License.
 
+/// \file
+///
+/// \brief Example of using rgb_t_rg transformation to compute 2d histogram.
+///
+
+#include <mln/accu/stat/histo2d.hh>
 #include <mln/core/image/image2d.hh>
-#include <mln/fun/v2v/hsl_to_rgb.hh>
-#include <mln/data/compare.hh>
+#include <mln/data/compute.hh>
 #include <mln/data/transform.hh>
-#include <mln/value/hsl.hh>
+#include <mln/fun/v2v/rgb_to_rg.hh>
+#include <mln/img_path.hh>
+#include <mln/io/ppm/load.hh>
+#include <mln/value/rg.hh>
 #include <mln/value/rgb8.hh>
 
-
 int main()
 {
-  using namespace mln;
-
-  using mln::value::rgb8;
-  using mln::value::hsl_f;
-
-  rgb8 ref[][2] = { { rgb8(0,0,0), rgb8(255,255,255) },
-		    { rgb8(128,128,128), rgb8(90,90, 90) } };
-
-  hsl_f dat[][2] = { { hsl_f(0,0,0), hsl_f(0,0,1.0) },
-		     { hsl_f(0,0,128.0 / 255.0), hsl_f(0,0,90.0 / 255.0) } };
-
-  image2d<rgb8> ref_ima = make::image(ref);
-  image2d<hsl_f> ima = make::image(dat);
-
-  image2d<value::rgb8> ima_rgb = data::transform(ima,
-						 fun::v2v::f_hsl_to_rgb_3x8);
-
-  // mln_assertion(ima_rgb == ref_ima);
-  (void) ima_rgb;
+  typedef mln::value::rg<8>		t_rg8;
+  typedef mln::value::rgb8		t_rgb8;
+  typedef mln::fun::v2v::rgb_to_rg<8>	t_rgb_to_rg;
+  typedef mln::image2d<t_rg8>		t_image2d_rg8;
+  typedef mln::image2d<t_rgb8>		t_image2d_rgb8;
+  typedef mln::image2d<unsigned>	t_histo;
+  t_image2d_rgb8			img_rgb8;
+  t_image2d_rg8				img_rg8;
+  t_histo				histo;
+
+  mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+  img_rg8 = mln::data::transform(img_rgb8, t_rgb_to_rg());
+  histo   = mln::data::compute(mln::accu::meta::stat::histo2d(), img_rg8);
+
+  return 0;
 }
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/value/rg/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/value/rg/Makefile.am
diff --git a/milena/tests/fun/v2v/hsl_to_rgb.cc b/scribo/sandbox/green/use/value/rg/rg.cc
similarity index 60%
copy from milena/tests/fun/v2v/hsl_to_rgb.cc
copy to scribo/sandbox/green/use/value/rg/rg.cc
index 237e605..b5ea15f 100644
--- a/milena/tests/fun/v2v/hsl_to_rgb.cc
+++ b/scribo/sandbox/green/use/value/rg/rg.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -23,33 +23,36 @@
 // exception does not however invalidate any other reasons why the
 // executable file might be covered by the GNU General Public License.
 
+/// \file
+///
+/// \brief Example of using rg to compute an 2d histogram.
+///
+
+#include <mln/accu/stat/histo2d.hh>
 #include <mln/core/image/image2d.hh>
-#include <mln/fun/v2v/hsl_to_rgb.hh>
-#include <mln/data/compare.hh>
+#include <mln/data/compute.hh>
 #include <mln/data/transform.hh>
-#include <mln/value/hsl.hh>
+#include <mln/fun/v2v/rgb_to_rg.hh>
+#include <mln/img_path.hh>
+#include <mln/io/ppm/load.hh>
+#include <mln/value/rg.hh>
 #include <mln/value/rgb8.hh>
 
-
 int main()
 {
-  using namespace mln;
-
-  using mln::value::rgb8;
-  using mln::value::hsl_f;
-
-  rgb8 ref[][2] = { { rgb8(0,0,0), rgb8(255,255,255) },
-		    { rgb8(128,128,128), rgb8(90,90, 90) } };
-
-  hsl_f dat[][2] = { { hsl_f(0,0,0), hsl_f(0,0,1.0) },
-		     { hsl_f(0,0,128.0 / 255.0), hsl_f(0,0,90.0 / 255.0) } };
-
-  image2d<rgb8> ref_ima = make::image(ref);
-  image2d<hsl_f> ima = make::image(dat);
-
-  image2d<value::rgb8> ima_rgb = data::transform(ima,
-						 fun::v2v::f_hsl_to_rgb_3x8);
-
-  // mln_assertion(ima_rgb == ref_ima);
-  (void) ima_rgb;
+  typedef mln::value::rg<8>		t_rg8;
+  typedef mln::value::rgb8		t_rgb8;
+  typedef mln::fun::v2v::rgb_to_rg<8>	t_rgb_to_rg;
+  typedef mln::image2d<t_rg8>		t_image2d_rg8;
+  typedef mln::image2d<t_rgb8>		t_image2d_rgb8;
+  typedef mln::image2d<unsigned>	t_histo;
+  t_image2d_rgb8			img_rgb8;
+  t_image2d_rg8				img_rg8;
+  t_histo				histo;
+
+  mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+  img_rg8 = mln::data::transform(img_rgb8, t_rgb_to_rg());
+  histo   = mln::data::compute(mln::accu::meta::stat::histo2d(), img_rg8);
+
+  return 0;
 }
-- 
1.5.6.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            last-svn-commit-43-gde3450d Define accumulator	which computes histogram view as image.
                        
                        
by Yann Jacquelet 22 Jun '10
                    by Yann Jacquelet 22 Jun '10
22 Jun '10
                    
                        	* mln/img_path.hh: New header file.
	Define the 1d component version of the the library.
	* mln/accu/stat/histo1d.hh: New header file.
	Give an example of code.
	* use/accu/stat/histo1d: New directory.
	* use/accu/stat/histo1d/Makefile.am: New makefile.
	* use/accu/stat/histo1d/histo1d.cc: New source.
	Make some unitary tests on histo1d library.
	* tests/accu/stat/histo1d: New directory.
	* tests/accu/stat/histo1d/Makefile.am: New makefile.
	* tests/accu/stat/histo1d/histo1d.cc: New source.
	Define the 2d component version of the the library.
	* mln/accu/stat/histo2d.hh: New header file.
	* mln/value/rg.hh: New header file.
	* mln/fun/v2v/rgb_to_rg.hh: New header file.
	Give an example of code.
	* use/accu/stat/histo2d: New directory.
	* use/accu/stat/histo2d/Makefile.am: New makefile.
	* use/accu/stat/histo2d/histo2d.cc: New source.
	* use/value/rg: New directory.
	* use/value/rg/Makefile.am: New makefile.
	* use/value/rg/rg.cc: New source.
	* use/fun/v2v/rgb_to_rg: New directory.
	* use/fun/v2v/rgb_to_rg/Makefile.am: New makefile.
	* use/fun/v2v/rgb_to_rg/rgb_to_rg.cc: New source.
	Define the RGB 3d component version of the the library.
	* mln/accu/stat/histo3d_rgb.hh: New header file.
	* mln/fun/v2v/rgb8_to_rgbn.hh: New header file.
	Give an example of code.
	* use/accu/stat/histo3_rgb: New directory.
	* use/accu/stat/histo3d_rgb/Makefile.am: New makefile.
	* use/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
	* use/fun/v2v/rgb8_to_rgbn: New directory.
	* use/fun/v2v/rgb8_to_rgbn/Makefile.am: New makefile.
	* use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc: New source.
	Make some unitary tests on histo3d library.
	* tests/accu/stat/histo3d_rgb: New directory.
	* tests/accu/stat/histo3d_rgb/Makefile.am: New makefile.
	* tests/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
	Define the HSL 3d component version of the the library.
	* mln/accu/stat/histo3d_hsl.hh: New header file.
	Give an example of code.
	* use/accu/stat/histo3_hsl: New directory.
	* use/accu/stat/histo3d_hsl/Makefile.am: New makefile.
	* use/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
	Make some unitary tests on histo3d library.
	* tests/accu/stat/histo3d_hsl: New directory.
	* tests/accu/stat/histo3d_hsl/Makefile.am: New makefile.
	* tests/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
---
 scribo/sandbox/green/ChangeLog                     |   82 +++-
 scribo/sandbox/green/README                        |   73 +++-
 scribo/sandbox/green/mln/accu/stat/histo1d.hh      |   32 +-
 scribo/sandbox/green/mln/accu/stat/histo2d.hh      |   75 ++--
 scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh  |  249 +++++-----
 scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh  |  138 +++---
 scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh   |   49 ++-
 scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh      |    2 -
 .../green/tests/accu/stat/histo1d/histo1d.cc       |  502 +++++++++++++++++++-
 .../accu/stat/{histo1d => histo3d_hsl}/Makefile.am |    0 
 .../tests/accu/stat/histo3d_hsl/histo3d_hsl.cc     |  394 +++++++---------
 .../accu/stat/{histo1d => histo3d_rgb}/Makefile.am |    0 
 .../tests/accu/stat/histo3d_rgb/histo3d_rgb.cc     |  355 +++++++-------
 .../sandbox/green/use/accu/stat/histo1d/histo1d.cc |   27 +
 .../sandbox/green/use/accu/stat/histo2d/histo2d.cc |   25 +
 .../accu/stat/{histo1d => histo3d_hsl}/Makefile.am |    0 
 .../green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc |   56 ++--
 .../accu/stat/{histo1d => histo3d_rgb}/Makefile.am |    0 
 .../green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc |   45 +-
 .../histo1d => fun/v2v/rgb8_to_rgbn}/Makefile.am   |    0 
 .../green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc |   45 +-
 .../stat/histo1d => fun/v2v/rgb_to_rg}/Makefile.am |    0 
 .../green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc       |   51 +-
 .../{accu/stat/histo1d => value/rg}/Makefile.am    |    0 
 .../sandbox/green/use/value/rg/rg.cc               |   51 +-
 25 files changed, 1450 insertions(+), 801 deletions(-)
 copy scribo/sandbox/green/tests/accu/stat/{histo1d => histo3d_hsl}/Makefile.am (100%)
 copy {milena => scribo}/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc (73%)
 copy scribo/sandbox/green/tests/accu/stat/{histo1d => histo3d_rgb}/Makefile.am (100%)
 copy {milena => scribo}/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc (64%)
 copy scribo/sandbox/green/use/accu/stat/{histo1d => histo3d_hsl}/Makefile.am (100%)
 copy milena/tests/fun/v2v/rgb_to_hsl.cc => scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc (57%)
 copy scribo/sandbox/green/use/accu/stat/{histo1d => histo3d_rgb}/Makefile.am (100%)
 copy milena/tests/io/ppm/ppm.cc => scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc (63%)
 copy scribo/sandbox/green/use/{accu/stat/histo1d => fun/v2v/rgb8_to_rgbn}/Makefile.am (100%)
 copy milena/tests/io/ppm/ppm.cc => scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc (63%)
 copy scribo/sandbox/green/use/{accu/stat/histo1d => fun/v2v/rgb_to_rg}/Makefile.am (100%)
 copy milena/tests/fun/v2v/hsl_to_rgb.cc => scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc (59%)
 copy scribo/sandbox/green/use/{accu/stat/histo1d => value/rg}/Makefile.am (100%)
 copy milena/tests/fun/v2v/hsl_to_rgb.cc => scribo/sandbox/green/use/value/rg/rg.cc (60%)
diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog
index 1824e47..58b5379 100644
--- a/scribo/sandbox/green/ChangeLog
+++ b/scribo/sandbox/green/ChangeLog
@@ -1,11 +1,83 @@
 2010-06-21  Yann Jacquelet  <jacquelet(a)lrde.epita.fr>
 
-	Save histogram library.
+	Define accumulator which computes histogram view as image.
+
+	* mln/img_path.hh: New header file.
+
+	Define the 1d component version of the the library.
+
+	* mln/accu/stat/histo1d.hh: New header file.
+
+	Give an example of code.
+
+	* use/accu/stat/histo1d: New directory.
+	* use/accu/stat/histo1d/Makefile.am: New makefile.
+	* use/accu/stat/histo1d/histo1d.cc: New source.
+
+	Make some unitary tests on histo1d library.
+
+	* tests/accu/stat/histo1d: New directory.
+	* tests/accu/stat/histo1d/Makefile.am: New makefile.
+	* tests/accu/stat/histo1d/histo1d.cc: New source.
+
+	Define the 2d component version of the the library.
+
+	* mln/accu/stat/histo2d.hh: New header file.
+	* mln/value/rg.hh: New header file.
+	* mln/fun/v2v/rgb_to_rg.hh: New header file.
+
+	Give an example of code.
+
+	* use/accu/stat/histo2d: New directory.
+	* use/accu/stat/histo2d/Makefile.am: New makefile.
+	* use/accu/stat/histo2d/histo2d.cc: New source.
+
+	* use/value/rg: New directory.
+	* use/value/rg/Makefile.am: New makefile.
+	* use/value/rg/rg.cc: New source.
+
+	* use/fun/v2v/rgb_to_rg: New directory.
+	* use/fun/v2v/rgb_to_rg/Makefile.am: New makefile.
+	* use/fun/v2v/rgb_to_rg/rgb_to_rg.cc: New source.
+
+	Define the RGB 3d component version of the the library.
+
+	* mln/accu/stat/histo3d_rgb.hh: New header file.
+	* mln/fun/v2v/rgb8_to_rgbn.hh: New header file.
+
+	Give an example of code.
+
+	* use/accu/stat/histo3_rgb: New directory.
+	* use/accu/stat/histo3d_rgb/Makefile.am: New makefile.
+	* use/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
+
+	* use/fun/v2v/rgb8_to_rgbn: New directory.
+	* use/fun/v2v/rgb8_to_rgbn/Makefile.am: New makefile.
+	* use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc: New source.
+
+	Make some unitary tests on histo3d library.
+
+	* tests/accu/stat/histo3d_rgb: New directory.
+	* tests/accu/stat/histo3d_rgb/Makefile.am: New makefile.
+	* tests/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
+
+
+	Define the HSL 3d component version of the the library.
+
+	* mln/accu/stat/histo3d_hsl.hh: New header file.
+
+	Give an example of code.
+
+	* use/accu/stat/histo3_hsl: New directory.
+	* use/accu/stat/histo3d_hsl/Makefile.am: New makefile.
+	* use/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
+
+	Make some unitary tests on histo3d library.
+
+	* tests/accu/stat/histo3d_hsl: New directory.
+	* tests/accu/stat/histo3d_hsl/Makefile.am: New makefile.
+	* tests/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
 
-	* mln/accu/histo/histo1d.hh: New header file.
-	* mln/accu/histo/histo2d.hh: New header file.
-	* mln/accu/histo/histo3d_rgb.hh: New header file.
-	* mln/accu/histo/histo3d_hsl.hh: New header file.
 
 2010-06-21  Yann Jacquelet  <jacquelet(a)lrde.epita.fr>
 
diff --git a/scribo/sandbox/green/README b/scribo/sandbox/green/README
index 3efe50d..4b6fb26 100644
--- a/scribo/sandbox/green/README
+++ b/scribo/sandbox/green/README
@@ -153,18 +153,8 @@ d'exécution (chmod 755 gnuplot_shell_file.sh). Comme je trouve le format
 extrêmement pratique, il se retrouve preque partout dans mes sources.
 
 
-V MLN
------
-
-a) La sauvegarde des images au format gnuplot shell
-
-* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
-
-to do ...
-
-
-
-b) Les histogrammes
+V HISTOGRAMMES
+--------------
 
 Un des travaux demandés par théo est la réalisation d'une librairie
 d'histogramme permettant de fournir un résultat sous forme d'image.
@@ -178,20 +168,67 @@ de comptage puisqu'il est décrit sous la forme de triplets de float
 contient une séquence d'appels pour les routines permettant de
 considérer la dimension de la teinte comme circulaire.
 
+
+a) version 1d
+
 * mln/accu/stat/histo1d.hh: Accumulateur histogramme image1d.
 * use/accu/stat/histo1d: Code minimal utilisant un histogramme 1d.
+* tests/accu/stat/histo1d: Test unitaire sur l'histogramme 1d.
+
+
+b) version 2d
 
-* mln/accu/stat/histo2d.hh: Accumulateur histogramme image2d.
 * mln/value/rg.hh: Définition du type vectoriel 2d rouge/vert (RG).
+* use/value/rg: Exemple de code pour l'utilisation de rg.
+
 * mln/fun/v2v/rgb_to_rg.hh: Transformation de l'espace RGB vers l'espace RG.
+* use/fun/v2v/rgb_to_rg: Exemple de code pour l'utilisation de rgb_to_rg.
+
+* mln/accu/stat/histo2d.hh: Accumulateur histogramme image2d.
 * use/accu/stat/histo2d: Code minimal utilisant un histogramme 2d.
 
 
-* mln/accu/stat/histo3d_rgb.hh: Accumulateur histogramme image3d RGB.
-* mln/accu/stat/histo3d_hsl.hh: Accumulateur histogramme image3d HSL.
+c) version 3d RGB
+
+
+* mln/fun/v2v/rgb8_to_rgbn.hh: Diminution de la quantification (n < 8 bits).
+* use/fun/v2v/rgb8_to_rgbn: Exemple de code pour l'utilisation de rgb8_to_rgbn.
 
+* mln/accu/stat/histo3d_rgb.hh: Accumulateur histogramme image3d RGB.
 * use/accu/stat/histo3_rgb: Code minimal utilisant un histogramme 3d RGB.
+
+
+
+d) version 3d HSL
+
+* mln/accu/stat/histo3d_hsl.hh: Accumulateur histogramme image3d HSL.
 * use/accu/stat/histo3_hsl: Code minimal utilisant un histogramme 3d HSL.
+* tests/accu/stat/histo3d_hsl: Test unitaire sur l'histogramme HSL 3d.
+
+Le code HSL ne compile plus car l'interface liant la transformation du
+domaine et la fonction fold a changée. Je n'ai pas le temps de
+regarder plus avant.
+
+
+
+V MLN
+-----
+
+a) La sauvegarde des images au format gnuplot shell
+
+* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
+
+to do ...
+
+
+
+b) Les histogrammes
+
+
+
+
+
+
 
 
 
@@ -210,6 +247,12 @@ considérer la dimension de la teinte comme circulaire.
 * use/accu/stat/histo3d_hsl
 * tests/accu/stat/histo3d_hsl
 
+VI SAUVEGARDE FORMAT GNUPLOT SHELL
+----------------------------------
+
+
+VII VISUALISATION HISTOGRAMMES 3D
+---------------------------------
 
 c) La visualisation des histogrammes 3d
 
diff --git a/scribo/sandbox/green/mln/accu/stat/histo1d.hh b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
index d480cf0..fae94c8 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo1d.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
@@ -24,7 +24,7 @@
 // executable file might be covered by the GNU General Public License.
 
 #ifndef MLN_ACCU_STAT_HISTO1D_HH
-#define MLN_ACCU_STAT_HISTO1D_HH
+# define MLN_ACCU_STAT_HISTO1D_HH
 
 /// \file
 ///
@@ -64,24 +64,24 @@
 /// }
 
 
-#include <iostream>
+# include <iostream>
 
-#include <mln/accu/internal/base.hh>
+# include <mln/accu/internal/base.hh>
 
-#include <mln/arith/plus.hh>
+# include <mln/arith/plus.hh>
 
-#include <mln/core/concept/meta_accumulator.hh>
-#include <mln/core/image/image1d.hh>
-#include <mln/core/macros.hh>
+# include <mln/core/concept/meta_accumulator.hh>
+# include <mln/core/image/image1d.hh>
+# include <mln/core/macros.hh>
 
-#include <mln/literal/zero.hh>
+# include <mln/literal/zero.hh>
 
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
 
-#include <mln/trait/value/comp.hh>
+# include <mln/trait/value/comp.hh>
 
-#include <mln/value/ops.hh>
+# include <mln/value/ops.hh>
 
 namespace mln
 {
@@ -168,7 +168,7 @@ namespace mln
 	typedef image1d<unsigned> result;
 	typedef result            q_result;
 
-	/// Constructors
+	/// Constructors.
 	/// \{
 	/// \brief Infer the size of the resulting image1d domain.
 	///
@@ -201,7 +201,6 @@ namespace mln
 	///
 	/// The end user shouldn't call this method. This is part of
 	/// data compute interface mechanism.
-
 	void take(const histo1d<V>& other);
 	/// \}
 
@@ -231,11 +230,10 @@ namespace mln
       ///
       /// The operator compares all the bins from the two histograms.
       /// Nobody uses this method unless unitary tests.
-
       template <typename V>
       bool operator==(const histo1d<V>& histo1, const histo1d<V>& histo2);
 
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
 
       template <typename V>
       inline
@@ -328,7 +326,7 @@ namespace mln
 	return result;
       }
 
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
 
 
     } // end of namespace mln::accu::stat
diff --git a/scribo/sandbox/green/mln/accu/stat/histo2d.hh b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
index c28723c..11a1bb3 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo2d.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
@@ -73,14 +73,16 @@
 
 # include <mln/accu/internal/base.hh>
 
+# include <mln/arith/plus.hh>
+
 # include <mln/core/macros.hh>
 # include <mln/core/image/image2d.hh>
 # include <mln/core/alias/point2d.hh>
 # include <mln/core/alias/box2d.hh>
 
-# include <mln/trait/value/comp.hh>
+#include <mln/literal/zero.hh>
 
-# include <mln/arith/plus.hh>
+# include <mln/trait/value/comp.hh>
 
 # include <mln/trace/entering.hh>
 # include <mln/trace/exiting.hh>
@@ -152,13 +154,13 @@ namespace mln
     namespace stat
     {
 
-      /// \brief Define an histogram which returns an image3d .
+      /// \brief Define a histogram as accumulator which returns an image2d.
       ///
-      /// Param V defines the space in which we count the values.
-      /// For instance, this histogram works image2d<rgb<2>> or
-      /// image2d<rgb<7>>. The histogram count the occurrence of each value.
-      /// The number of bins depends of the grayscale values, for 8 bits there
-      /// is 256x3 bins. Note that over
+      /// Param V defines the type of the input image value. It is in
+      /// this space that we count the values. For instance, this
+      /// histogram works well for image2d< rgb<2> > or with image2d<
+      /// rgb<7> >. The number of bins depends directly the values V.
+      /// For 8 bits there is 256x3 bins. Note that less
       /// quantification works too.
       ///
       /// \ingroup modaccuvalues
@@ -171,16 +173,15 @@ namespace mln
 	typedef image2d<unsigned> result;
 	typedef result            q_result;
 
-	/// Constructors
+	/// Constructors.
 	/// \{
-	/// \brief Initialize the size of the resulting image1d.
+	/// \brief Infer the size of the resulting image2d domain.
 	///
-	/// Initialize the size the resulting image from the theorical dynamic
-	/// of the greylevel values (Use V to manage it).
+	/// By evaluating the minimum and the maximum of V, we define the domain
+	/// of the resulting image2d.
 	histo2d();
 	/// \}
 
-
 	/// Manipulators.
 	/// \{
 	/// \brief Initialize the histogram with zero value.
@@ -190,23 +191,24 @@ namespace mln
 	/// density.
 	void init();
 
-
-	/// \brief Update the histogram with the RGB pixel t.
-	/// \param[in] t a greylevel pixel of type V.
+	/// \brief Update the histogram with the RG pixel t.
+	/// \param[in] t a graylevel pixel of type V.
 	///
 	/// The end user shouldn't call this method. In place of it, he can
 	/// go through the data compute interface.
 	void take(const argument& t);
 
-
 	/// \brief Update the histogram with an other histogram.
 	/// \param[in] other the other histogram.
+	///
+	/// The end user shouldn't call this method. This is part of
+	/// data compute interface mechanism.
 	void take(const histo2d<V>& other);
 	/// \}
 
 	/// Accessors.
 	/// \{
-	/// \brief Return the histogram as an image1d.
+	/// \brief Return the histogram as an image2d.
 	///
 	/// This is the machinery to communicate with data compute interface.
 	/// The end user should'nt use it.
@@ -228,19 +230,19 @@ namespace mln
       /// \param[in] histo1 the first histogram to compare with.
       /// \param[in] histo2 the second histogram.
       ///
-      /// The operator compare all the bins from the two histogram.
-
+      /// The operator compares all the bins from the two histograms.
+      /// Nobody uses this method unless unitary tests.
       template <typename V>
       bool operator==(const histo2d<V>& histo1,
 		      const histo2d<V>& histo2);
 
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
 
       template <typename V>
       inline
       histo2d<V>::histo2d()
       {
-	trace::entering("mln::accu::stat::histo2d::histo2d");
+	trace::entering("mln::accu::stat::histo2d::cstor");
 	typedef mln_trait_value_comp(V,0) comp0;
 	typedef mln_trait_value_comp(V,1) comp1;
 
@@ -253,31 +255,24 @@ namespace mln
 			   point2d(mln_max(comp0),
 				   mln_max(comp1))));
 
-	trace::exiting("mln::accu::stat::histo2d::histo2d");
+	trace::exiting("mln::accu::stat::histo2d::cstor");
       }
 
       template <typename V>
       inline
       void histo2d<V>::init()
       {
-	trace::entering("mln::accu::stat::histo2d::init");
-
-	data::fill(count_, 0);
-	trace::exiting("mln::accu::stat::histo2d::init");
+	data::fill(count_, literal::zero);
       }
 
       template <typename V>
       inline
       void histo2d<V>::take(const argument& t)
       {
-	trace::entering("mln::accu::stat::histo2d::take");
-
 	// Just convert a greyscale value (int_u8 like) to a position for an
 	// iterator on the resulting image.
 	// Take care to the constructor : Point(slice, row, column)
 	++count_(point2d(t.red(), t.green()));
-
-	trace::exiting("mln::accu::stat::histo2d::take");
       }
 
 
@@ -285,20 +280,13 @@ namespace mln
       inline
       void histo2d<V>::take(const histo2d<V>& other)
       {
-	trace::entering("mln::accu::stat::histo2d::take");
-
 	count_ += other.count_;
-
-	trace::exiting("mln::accu::stat::histo2d::take");
       }
 
       template <typename V>
       inline
       typename histo2d<V>::result histo2d<V>::to_result() const
       {
-	trace::entering("mln::accu::stat::histo2d::to_result");
-
-	trace::exiting("mln::accu::stat::histo2d::to_result");
 	return count_;
       }
 
@@ -306,9 +294,6 @@ namespace mln
       inline
       histo2d<V>::operator result() const
       {
-	trace::entering("mln::accu::stat::histo2d::operator result");
-
-	trace::exiting("mln::accu::stat::histo2d::operator result");
 	return count_;
       }
 
@@ -316,10 +301,8 @@ namespace mln
       inline
       bool histo2d<V>::is_valid() const
       {
-	trace::entering("mln::accu::stat::histo2d::is_valid");
 	bool result = count_.is_valid();
 
-	trace::exiting("mln::accu::stat::histo2d::is_valid");
 	return result;
       }
 
@@ -327,7 +310,7 @@ namespace mln
       bool operator==(const histo2d<V>& histo1,
 		      const histo2d<V>& histo2)
       {
-	trace::entering("mln::accu::stat::operator==");
+	trace::entering("mln::accu::stat::histo2d::operator==");
 
 	bool  result                  = true;
 	const image2d<unsigned>& res1 = histo1.to_result();
@@ -342,11 +325,11 @@ namespace mln
 	for_all_2(p1, p2)
 	  result &= (res1(p1) == res2(p2));
 
-	trace::exiting("mln::accu::stat::operator==");
+	trace::exiting("mln::accu::stat::histo2d::operator==");
 	return result;
       }
 
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
 
 
     } // end of namespace mln::accu::stat
diff --git a/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
index c84aaa4..35d78e2 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
@@ -1,6 +1,4 @@
-// Copyright (C) 2007 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -26,82 +24,115 @@
 // executable file might be covered by the GNU General Public License.
 
 #ifndef MLN_ACCU_STAT_HISTO3D_HSL_HH
-#define MLN_ACCU_STAT_HISTO3D_HSL_HH
+# define MLN_ACCU_STAT_HISTO3D_HSL_HH
 
 /// \file
 ///
-/// \brief Define a histogram as an accumulator which returns an image1d .
+/// \brief Define a histogram as accumulator which returns an HSL image3d.
+///
+/// This source implements the discrete histogram version. It was
+/// created for images which the values are derived from integer
+/// type. The number of bins is given by the user via the q parameter.
+/// It works for HSL space.
 ///
-/// This source implements the discrete histogram version. The number of beans
-/// is infer from the number of greylevels. A typical int_u8 image has got
-/// 256 bins. An int_u16 image has got 65535 bins.
 /// The following sample is a typical use of the histogram.
 ///
-/// #include <mln/value/int_u8.hh>
-/// #include <mln/core/image/image1d.hh>
+/// #include <mln/accu/stat/histo3d_hsl.hh>
 /// #include <mln/core/image/image2d.hh>
-/// #include <mln/io/pgm/load.hh>
-/// #include <mln/accu/stat/histo1d.hh>
+/// #include <mln/core/image/image3d.hh>
 /// #include <mln/data/compute.hh>
-/// #include <mln/io/plot/save_histo_sh.hh>
-///
-/// #define  OLENA_LENA "/usr/local/share/olena/images/lena.pgm"
+/// #include <mln/data/transform.hh>
+/// #include <mln/fun/v2v/rgb_to_hsl.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/ppm/load.hh>
+/// #include <mln/value/hsl.hh>
+/// #include <mln/value/rgb8.hh>
 ///
-/// void test()
+/// int main()
 /// {
-///   typedef mln::value::int_u8 int_u8;
-///   mln::image2d<int_u8>       img_ref;
-///   mln::image1d<unsigned>     img_res;
+///   typedef mln::value::rgb8                    t_rgb;
+///   typedef mln::value::hsl_f                   t_hsl;
+///   typedef mln::fun::v2v::f_rgb_to_hsl_<t_hsl> t_rgb_to_hsl;
+///   mln::image2d<t_rgb>                         img_rgb;
+///   mln::image2d<t_hsl>                         img_hsl;
+///   mln::image3d<unsigned>                      histo;
+///
+///   mln::io::ppm::load(img_rgb, OLENA_IMG_PATH"/lena.ppm");
+///  img_hsl = mln::data::transform(img_rgb, t_rgb_to_hsl());
+///  histo=mln::data::compute(mln::accu::meta::stat::histo3d_hsl<7>(),img_hsl);
 ///
-///   mln::io::pgm::load(img_ref, OLENA_LENA);
-///   img_res = mln::data::compute(mln::accu::stat::histo1d<int_u8>(), img_ref);
+///  return 0;
 /// }
+///
+/// \fixme This implementation is very doubtfull ! Be carefull !!
+/// \fixme This code should be compile, but it doesn't!
+/// \fixme The fold interface has changed v2v -> p2p or the inverse.
+
 
+# include <iostream>
 
-#include <iostream>
+# include <mln/accu/internal/base.hh>
 
-#include <mln/accu/internal/base.hh>
+# include <mln/arith/plus.hh>
 
-#include <mln/core/macros.hh>
-#include <mln/core/image/image3d.hh>
-#include <mln/core/alias/point3d.hh>
-#include <mln/core/alias/box3d.hh>
+# include <mln/core/alias/point3d.hh>
+# include <mln/core/alias/box3d.hh>
+# include <mln/core/image/image3d.hh>
+# include <mln/core/image/dmorph/transformed_image.hh>
+# include <mln/core/macros.hh>
 
-#include <mln/value/int_u.hh>
-#include <mln/trait/value/comp.hh>
+# include <mln/fun/p2p/fold.hh>
 
-#include <mln/arith/plus.hh>
+# include <mln/literal/zero.hh>
 
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
 
-#include <mln/value/ops.hh>
+# include <mln/trait/value/comp.hh>
 
-// make hue cyclic
-#include <mln/fun/p2p/fold.hh>
-#include <mln/core/image/dmorph/transformed_image.hh>
+# include <mln/value/int_u.hh>
+# include <mln/value/ops.hh>
 
 namespace mln
 {
-  
+
   namespace accu
   {
-    
+
     namespace stat
     {
-   
+
       // Forward declaration
       template <unsigned q, typename V>
       struct histo3d_hsl;
 
     } // end of namespace mln::accu::stat
-  
-  } // end of namespace mln::accu
 
+    namespace meta
+    {
+
+      namespace stat
+      {
+
+	template <unsigned q>
+	struct histo3d_hsl : public Meta_Accumulator< histo3d_hsl<q> >
+	{
+	  template <typename V>
+	  struct with
+	  {
+	    typedef accu::stat::histo3d_hsl<q,V> ret;
+	  };
+	};
+
+      } // end of namespace mln::accu::meta::stat
+
+    } // end of namespace mln::accu::meta
+
+  } // end of namespace mln::accu
 
   namespace trait
   {
-    
+
     template <unsigned q, typename V>
     struct accumulator_< mln::accu::stat::histo3d_hsl<q,V> >
     {
@@ -112,65 +143,59 @@ namespace mln
     };
 
     template <unsigned q, typename V>
-    struct set_precise_binary_<op::eq, 
+    struct set_precise_binary_<op::eq,
 			       accu::stat::histo3d_hsl<q,V>,
 			       accu::stat::histo3d_hsl<q,V> >
     {
       typedef bool ret;
     };
-        
+
   } // end of namespace mln::trait
 
   namespace accu
   {
-    
+
     namespace stat
-    {      
+    {
 
-      /// \brief Define an histogram which returns an image1d .  
+
+      /// \brief Define a histogram as accumulator which returns an image3d.
       ///
-      /// Param V defines the space in which we count the values.
-      /// For instance, this histogram works image2d<int_u8> or 
-      /// image1d<int_u16>. The histogram count the occurrence of each value.
-      /// The number of bins depends of the greyscale values, for 8 bits there
-      /// is 256 bins, for 16 bits there is 65536 bins. Note that over 
-      /// quantification works too.
+      /// Param q defines the number of bins per axe.
+      /// Param V defines the type of the input image value. We assume that
+      /// V is a kind of hsl_<float,float,float>.
       ///
       /// \ingroup modaccuvalues
-
-      /// q is the number of bins per axe because quantification info are died.
-      /// we assume that V is a kind of hsl_<float,float,float>
-
       template <unsigned q, typename V>
-      struct histo3d_hsl : 
+      struct histo3d_hsl :
 	public mln::accu::internal::base<image3d<unsigned>, histo3d_hsl<q,V> >
       {
 	typedef V                 argument;
 	typedef image3d<unsigned> result;
 	typedef result            q_result;
 
-	/// Constructors
+	/// Constructors.
 	/// \{
-	/// \brief Initialize the size of the resulting image1d.
+	/// \brief Infer the size of the resulting image3d domain.
 	///
-	/// Initialize the size the resulting image from the theorical dynamic 
-	/// of the greylevel values (Use V to manage it).
+	/// By evaluating the minimum and the maximum of V, we define the domain
+	/// of the resulting image3d.
 	histo3d_hsl();
 	/// \}
 
-	
+
 	/// Manipulators.
 	/// \{
 	/// \brief Initialize the histogram with zero value.
 	///
-	/// This method must be called just before starting the use of the 
-	/// histogram. If it's not, resulting values won't converge to the 
+	/// This method must be called just before starting the use of the
+	/// histogram. If it's not, resulting values won't converge to the
 	/// density.
 	void init();
 
-	
+
 	/// \brief Update the histogram with the RGB pixel t.
-	/// \param[in] t a greylevel pixel of type V.
+	/// \param[in] t a graylevel pixel of type V.
 	///
 	/// The end user shouldn't call this method. In place of it, he can
 	/// go through the data compute interface.
@@ -179,12 +204,15 @@ namespace mln
 
 	/// \brief Update the histogram with an other histogram.
 	/// \param[in] other the other histogram.
+	///
+	/// The end user shouldn't call this method. This is part of
+	/// data compute interface mechanism.
 	void take(const histo3d_hsl<q,V>& other);
 	/// \}
 
 	/// Accessors.
 	/// \{
-	/// \brief Return the histogram as an image1d.
+	/// \brief Return the histogram as an HSL image3d.
 	///
 	/// This is the machinery to communicate with data compute interface.
 	/// The end user should'nt use it.
@@ -208,31 +236,31 @@ namespace mln
 	const float min_sat;
 	const float max_sat;
 	float       step_sat;
-	result  count_;
+	result      count_;
       };
 
       /// \brief Check wethever an histogram is equal to an other one.
       /// \param[in] histo1 the first histogram to compare with.
       /// \param[in] histo2 the second histogram.
       ///
-      /// The operator compare all the bins from the two histogram.
-
+      /// The operator compares all the bins from the two histograms.
+      /// Nobody uses this method unless unitary tests.
       template <unsigned q, typename V>
-      bool operator==(const histo3d_hsl<q,V>& histo1, 
+      bool operator==(const histo3d_hsl<q,V>& histo1,
 		      const histo3d_hsl<q,V>& histo2);
 
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
 
       template <unsigned q, typename V>
       inline
       histo3d_hsl<q,V>::histo3d_hsl() : min_hue(0.0), max_hue(360.0),
-				      min_lum(0.0), max_lum(1.0),
-				      min_sat(0.0), max_sat(1.0)
+				        min_lum(0.0), max_lum(1.0),
+				        min_sat(0.0), max_sat(1.0)
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::histo3d_hsl");
-	
-	// As there is no info about preceding color space
-	// we ask the end user to specify the quantification he's looking for.
+	trace::entering("mln::accu::stat::histo3d_hsl::cstor");
+
+	/// As there is no info about preceding color space
+	/// we ask the end user to specify the quantification he's looking for.
 
 	count_.init_(box3d(point3d(mln_min(value::int_u<q>),
 				   mln_min(value::int_u<q>),
@@ -241,7 +269,7 @@ namespace mln
 				   mln_max(value::int_u<q>),
 				   mln_max(value::int_u<q>))));
 
-	// Make the hue domain cyclic
+	/// Make the hue domain cyclic
 	fun::p2p::fold<point3d,1,0,0> fold_(count_.domain());
 	transform_domain(count_, fold_);
 
@@ -249,39 +277,34 @@ namespace mln
 	step_lum = (max_lum - min_lum)/q;
 	step_sat = (max_sat - min_sat)/q;
 
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::histo3d_hsl");
+	trace::exiting("mln::accu::stat::histo3d_hsl::cstor");
       }
 
       template <unsigned q, typename V>
       inline
       void histo3d_hsl<q,V>::init()
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::init");
-
-	data::fill(count_, 0);
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::init");
+	data::fill(count_, literal::zero);
       }
 
       template <unsigned q, typename V>
       inline
       void histo3d_hsl<q,V>::take(const argument& t)
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::take");
-
-	// Just convert a greyscale value (int_u8 like) to a position for an 
+	// Just convert a greyscale value (int_u8 like) to a position for an
 	// iterator on the resulting image.
 	//++count_(point3d(t.red(), t.green(), t.blue()));
-	
-	
+
+
 	// Technical way to access i° component without kwnowing the name
 	// mln::trait::value_<argument>::get_comp_0(t);
-	
+
 	// is def::coord1d the type of x, y, z ??
 	unsigned x = (t.hue() - min_hue)/step_hue;
-	unsigned y = (t.lum() - min_lum)/step_lum;
-	unsigned z = (t.sat() - min_sat)/step_sat;
+	unsigned y = (t.sat() - min_sat)/step_sat;
+	unsigned z = (t.lum() - min_lum)/step_lum;
 	/*
-	
+
 	std::cout << "H : " << t.hue() << std::endl;
 	std::cout << "L : " << t.lum() << std::endl;
 	std::cout << "S : " << t.sat() << std::endl;
@@ -295,66 +318,50 @@ namespace mln
 	std::cout << "Z : " << z << std::endl;
 	*/
 
-	// faire attention avec les histoires de points et leurs coordonnées
 	++count_(point3d(z, x, y));
-	//++count_(point3d(t.hue(), t.sat(), t.lum()));
-
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::take");
       }
 
-      
+
       template <unsigned q, typename V>
       inline
       void histo3d_hsl<q,V>::take(const histo3d_hsl<q,V>& other)
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::take");
-
 	count_ += other.count_;
-
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::take");
       }
-      
+
       template <unsigned q, typename V>
       inline
       typename histo3d_hsl<q,V>::result histo3d_hsl<q,V>::to_result() const
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::to_result");
-
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::to_result");
 	return count_;
       }
-      
+
       template <unsigned q, typename V>
       inline
       histo3d_hsl<q,V>::operator result() const
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<q,V>::operator result");
-
-	trace::exiting("mln::accu::stat::histo3d_rgb<q,V>::operator result");
 	return count_;
-      }      
+      }
 
       template <unsigned q, typename V>
       inline
       bool histo3d_hsl<q,V>::is_valid() const
       {
-	trace::entering("mln::accu::stat::histo3d_hsl<q,V>::is_valid");
 	bool result = count_.is_valid();
-	
-	trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::is_valid");
+
 	return result;
       }
 
       template <unsigned q, typename V>
-      bool operator==(const histo3d_hsl<q,V>& histo1, 
+      bool operator==(const histo3d_hsl<q,V>& histo1,
 		      const histo3d_hsl<q,V>& histo2)
       {
-	trace::entering("mln::accu::stat::operator==");
+	trace::entering("mln::accu::stat::histo3d_hsl::operator==");
 
 	bool  result                  = true;
 	const image3d<unsigned>& res1 = histo1.to_result();
 	const image3d<unsigned>& res2 = histo2.to_result();
-	
+
 	mln_precondition(res1.is_valid());
 	mln_precondition(res2.is_valid());
 
@@ -364,11 +371,11 @@ namespace mln
 	for_all_2(p1, p2)
 	  result &= (res1(p1) == res2(p2));
 
-	trace::exiting("mln::accu::stat::operator==");
+	trace::exiting("mln::accu::stat::histo3d_hsl::operator==");
 	return result;
       }
 
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
 
 
     } // end of namespace mln::accu::stat
@@ -377,4 +384,4 @@ namespace mln
 
 } // end of namespace mln
 
-#endif // ! MLN_ACCU_STAT_HISTO3D_RGB_HH
+#endif // ! MLN_ACCU_STAT_HISTO3D_HSL_HH
diff --git a/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
index 48c49da..6a48024 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
@@ -1,6 +1,4 @@
-// Copyright (C) 2007 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -26,54 +24,67 @@
 // executable file might be covered by the GNU General Public License.
 
 #ifndef MLN_ACCU_STAT_HISTO3D_RGB_HH
-#define MLN_ACCU_STAT_HISTO3D_RGB_HH
+# define MLN_ACCU_STAT_HISTO3D_RGB_HH
 
 /// \file
 ///
-/// \brief Define a histogram as an accumulator which returns an image1d .
+/// \brief Define a histogram as accumulator which returns an image3d.
+///
+/// This source implements the discrete histogram version. It was
+/// created for images which the values are derived from integer
+/// type. The number of bins is directly infered from the cardinality
+/// of the image value. It works for RGB space. See histo1d.hh for limitations
+/// of such implementation. 8 bits quantification is very
+/// expensive, it produces image3d with [0..255,0..255,0..255] as domain.
 ///
-/// This source implements the discrete histogram version. The number of beans
-/// is infer from the number of greylevels. A typical rgb8 image has got
-/// 256x3 bins. Working with a 8 bit quantification in rgb is very costly.
 /// The following sample is a typical use of the histogram.
 ///
-/// #include <mln/value/rgb.hh>
-/// #include <mln/core/image/image1d.hh>
-/// #include <mln/core/image/image3d.hh>
-/// #include <mln/io/ppm/load.hh>
 /// #include <mln/accu/stat/histo3d_rgb.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/core/image/image3d.hh>
 /// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.hh>
+/// #include <mln/fun/v2v/rgb8_to_rgbn.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/ppm/load.hh>
+/// #include <mln/value/rgb.hh>
+/// #include <mln/value/rgb8.hh>
 ///
-/// #define  OLENA_LENA ""/usr/local/share/olena/images/lena.ppm"
-///
-/// void test()
+/// int main()
 /// {
-///   typedef mln::value::rgb<7> rgb7;
-///   mln::image2d<rgb7>         img_ref;
-///   mln::image3d<unsigned>     img_res;
+///   typedef mln::value::rgb8   t_rgb8;
+///   typedef mln::value::rgb<7> t_rgb7;
+///   mln::image2d<t_rgb8>       img_rgb8;
+///   mln::image2d<t_rgb7>       img_rgb7;
+///   mln::image3d<unsigned>     histo;
 ///
-///   mln::io::ppm::load(img_ref, OLENA_LENA);
-///   img_res=mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_ref);
+///   mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+///   img_rgb7 =mln::data::transform(img_rgb8,mln::fun::v2v::rgb8_to_rgbn<7>());
+///   histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_rgb7);
+///
+///   return 0;
 /// }
 
 
-#include <iostream>
+# include <iostream>
+
+# include <mln/accu/internal/base.hh>
 
-#include <mln/accu/internal/base.hh>
+# include <mln/arith/plus.hh>
 
-#include <mln/core/macros.hh>
-#include <mln/core/image/image3d.hh>
-#include <mln/core/alias/point3d.hh>
-#include <mln/core/alias/box3d.hh>
+# include <mln/core/macros.hh>
+# include <mln/core/image/image3d.hh>
+# include <mln/core/alias/point3d.hh>
+# include <mln/core/alias/box3d.hh>
 
-#include <mln/trait/value/comp.hh>
+# include <mln/literal/zero.hh>
 
-#include <mln/arith/plus.hh>
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
 
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
+# include <mln/trait/value/comp.hh>
 
-#include <mln/value/ops.hh>
+# include <mln/value/ops.hh>
 
 namespace mln
 {
@@ -140,13 +151,13 @@ namespace mln
     namespace stat
     {
 
-      /// \brief Define an histogram which returns an image3d .
+      /// \brief Define a histogram as accumulator which returns an image3d.
       ///
-      /// Param V defines the space in which we count the values.
-      /// For instance, this histogram works image2d<rgb<2>> or
-      /// image2d<rgb<7>>. The histogram count the occurrence of each value.
-      /// The number of bins depends of the grayscale values, for 8 bits there
-      /// is 256x3 bins. Note that over
+      /// Param V defines the type of the input image value. It is in
+      /// this space that we count the values. For instance, this
+      /// histogram works well for image2d< rgb<2> > or with image2d<
+      /// rgb<7> >. The number of bins depends directly the values V.
+      /// For 8 bits there is 256x3 bins. Note that less
       /// quantification works too.
       ///
       /// \ingroup modaccuvalues
@@ -159,16 +170,15 @@ namespace mln
 	typedef image3d<unsigned> result;
 	typedef result            q_result;
 
-	/// Constructors
+	/// Constructors.
 	/// \{
-	/// \brief Initialize the size of the resulting image1d.
+	/// \brief Infer the size of the resulting image3d domain.
 	///
-	/// Initialize the size the resulting image from the theorical dynamic
-	/// of the greylevel values (Use V to manage it).
+	/// By evaluating the minimum and the maximum of V, we define the domain
+	/// of the resulting image3d.
 	histo3d_rgb();
 	/// \}
 
-
 	/// Manipulators.
 	/// \{
 	/// \brief Initialize the histogram with zero value.
@@ -180,7 +190,7 @@ namespace mln
 
 
 	/// \brief Update the histogram with the RGB pixel t.
-	/// \param[in] t a greylevel pixel of type V.
+	/// \param[in] t a graylevel pixel of type V.
 	///
 	/// The end user shouldn't call this method. In place of it, he can
 	/// go through the data compute interface.
@@ -189,12 +199,15 @@ namespace mln
 
 	/// \brief Update the histogram with an other histogram.
 	/// \param[in] other the other histogram.
+	///
+	/// The end user shouldn't call this method. This is part of
+	/// data compute interface mechanism.
 	void take(const histo3d_rgb<V>& other);
 	/// \}
 
 	/// Accessors.
 	/// \{
-	/// \brief Return the histogram as an image1d.
+	/// \brief Return the histogram as an RGB image3d.
 	///
 	/// This is the machinery to communicate with data compute interface.
 	/// The end user should'nt use it.
@@ -216,19 +229,19 @@ namespace mln
       /// \param[in] histo1 the first histogram to compare with.
       /// \param[in] histo2 the second histogram.
       ///
-      /// The operator compare all the bins from the two histogram.
-
+      /// The operator compares all the bins from the two histograms.
+      /// Nobody uses this method unless unitary tests.
       template <typename V>
       bool operator==(const histo3d_rgb<V>& histo1,
 		      const histo3d_rgb<V>& histo2);
 
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
 
       template <typename V>
       inline
       histo3d_rgb<V>::histo3d_rgb()
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::histo3d_rgb");
+	trace::entering("mln::accu::stat::histo3d_rgb::cstor");
 	typedef mln_trait_value_comp(V,0) comp0;
 	typedef mln_trait_value_comp(V,1) comp1;
 	typedef mln_trait_value_comp(V,2) comp2;
@@ -244,31 +257,24 @@ namespace mln
 				   mln_max(comp1),
 				   mln_max(comp2))));
 
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::histo3d_rgb");
+	trace::exiting("mln::accu::stat::histo3d_rgb::cstor");
       }
 
       template <typename V>
       inline
       void histo3d_rgb<V>::init()
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::init");
-
-	data::fill(count_, 0);
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::init");
+	data::fill(count_, literal::zero);
       }
 
       template <typename V>
       inline
       void histo3d_rgb<V>::take(const argument& t)
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::take");
-
 	// Just convert a greyscale value (int_u8 like) to a position for an
 	// iterator on the resulting image.
 	// Take care to the constructor : Point(slice, row, column)
 	++count_(point3d(t.blue(), t.red(), t.green()));
-
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::take");
       }
 
 
@@ -276,20 +282,13 @@ namespace mln
       inline
       void histo3d_rgb<V>::take(const histo3d_rgb<V>& other)
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::take");
-
 	count_ += other.count_;
-
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::take");
       }
 
       template <typename V>
       inline
       typename histo3d_rgb<V>::result histo3d_rgb<V>::to_result() const
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::to_result");
-
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::to_result");
 	return count_;
       }
 
@@ -297,9 +296,6 @@ namespace mln
       inline
       histo3d_rgb<V>::operator result() const
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::operator result");
-
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::operator result");
 	return count_;
       }
 
@@ -307,10 +303,8 @@ namespace mln
       inline
       bool histo3d_rgb<V>::is_valid() const
       {
-	trace::entering("mln::accu::stat::histo3d_rgb<V>::is_valid");
 	bool result = count_.is_valid();
 
-	trace::exiting("mln::accu::stat::histo3d_rgb<V>::is_valid");
 	return result;
       }
 
@@ -318,7 +312,7 @@ namespace mln
       bool operator==(const histo3d_rgb<V>& histo1,
 		      const histo3d_rgb<V>& histo2)
       {
-	trace::entering("mln::accu::stat::operator==");
+	trace::entering("mln::accu::stat::histo3d_rgb::operator==");
 
 	bool  result                  = true;
 	const image3d<unsigned>& res1 = histo1.to_result();
@@ -333,11 +327,11 @@ namespace mln
 	for_all_2(p1, p2)
 	  result &= (res1(p1) == res2(p2));
 
-	trace::exiting("mln::accu::stat::operator==");
+	trace::exiting("mln::accu::stat::histo3d_rgb::operator==");
 	return result;
       }
 
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
 
 
     } // end of namespace mln::accu::stat
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh b/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
index 2918b1a..acf1b5e 100644
--- a/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
@@ -1,6 +1,4 @@
-// Copyright (C) 2007 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -35,6 +33,37 @@
 /// \file
 ///
 /// \brief Convert rgb8 value to rgbn, n < 8.
+///
+/// The source implements the reduction of quantification for any size less 8.
+///
+/// The following sample is a typical use of the histogram.
+///
+/// #include <mln/accu/stat/histo3d_rgb.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/core/image/image3d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.hh>
+/// #include <mln/fun/v2v/rgb8_to_rgbn.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/ppm/load.hh>
+/// #include <mln/value/rgb.hh>
+/// #include <mln/value/rgb8.hh>
+///
+/// int main()
+/// {
+///   typedef mln::value::rgb8   t_rgb8;
+///   typedef mln::value::rgb<7> t_rgb7;
+///   mln::image2d<t_rgb8>       img_rgb8;
+///   mln::image2d<t_rgb7>       img_rgb7;
+///   mln::image3d<unsigned>     histo;
+///
+///   mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+///   img_rgb7 =mln::data::transform(img_rgb8,mln::fun::v2v::rgb8_to_rgbn<7>());
+///   histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_rgb7);
+///
+///   return 0;
+/// }
+
 
 namespace mln
 {
@@ -45,16 +74,24 @@ namespace mln
     namespace v2v
     {
 
-      /// \brief Convert rgb8 value to rgbn, n < 8.
+      /// \brief Convert a rgb8 value to a rgn, n < 8.
+      ///
+      /// Param n defines the output quantification used for the transformation.
       ///
       /// \ingroup modfunv2v
-
       template <unsigned n>
       struct rgb8_to_rgbn : Function_v2v< rgb8_to_rgbn<n> >
       {
 	typedef value::rgb8   argument;
 	typedef value::rgb<n> result;
 
+	/// \brief Convert a rgb8 value to a rgn, n < 8.
+	///
+	/// \param[in] v the rgb8 value to convert.
+	///
+	/// Conversion is done by computing the size by which we
+	/// divide each rgb component.
+
 	result operator()(const argument& c) const
 	{
 	  mln_precondition(8 > n);
@@ -65,7 +102,7 @@ namespace mln
 	  std::cout << "red  : " << c.red() << std::endl;
 	  std::cout << "size : " << size << std::endl;
 	  std::cout << "res  : " << (c.red() / size) << std::endl;
-	  std::cout << "max  : " << (mln_max(mln::value::int_u<n>)) << std::endl;
+	  std::cout << "max  : " << (mln_max(mln::value::int_u<n>))<< std::endl;
 	  */
 	  result   res(c.red() / size, c.green() / size, c.blue() / size);
 
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
index d4c1e46..e9450e1 100644
--- a/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
@@ -81,7 +81,6 @@ namespace mln
       /// Param n defines the quantification used for rgb space and rg space.
       ///
       /// \ingroup modfunv2v
-
       template <unsigned n>
       struct rgb_to_rg : Function_v2v< rgb_to_rg<n> >
       {
@@ -95,7 +94,6 @@ namespace mln
 	/// Conversion is done by calling the rg constructor. There is
 	/// no modification of values. The red/green fields from rgb the value
 	/// are preserved. Blue value is dropped.
-
 	result operator()(const argument& v) const
 	{
 	  return value::rg<n>(v);
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
index 5a5c4c4..2fdc7dd 100644
--- a/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
+++ b/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
@@ -1,21 +1,507 @@
-/// TEST HISTO1D
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
 
+/// \file
+///
+/// \brief This source manages unitary testing on image1d histogram component.
+///
+/// Tests are performed in 8 bits and also in 14 bits quantification. The goal
+/// is to go through each programmatic flow to verify the conformity of the
+/// code. It sounds like a theoritic model of unitary testing for milena.
+/// The last test enables statistic computations on that component.
+
+#include <mln/accu/math/count.hh>
+#include <mln/accu/math/sum.hh>
 #include <mln/accu/stat/histo1d.hh>
+#include <mln/accu/stat/mean.hh>
+#include <mln/accu/stat/variance.hh>
+
+#include <mln/core/alias/box1d.hh>
+#include <mln/core/alias/point1d.hh>
+#include <mln/core/contract.hh>
+#include <mln/core/grids.hh>
+#include <mln/core/routine/initialize.hh>
+
 #include <mln/data/compute.hh>
-#include <mln/core/image/image1d.hh>
-#include <mln/core/image/image2d.hh>
+#include <mln/data/fill.hh>
+#include <mln/data/transform.hh>
+
+#include <mln/fun/v2v/int_u16_to_int_u14.hh>
+
 #include <mln/img_path.hh>
+
 #include <mln/io/pgm/load.hh>
+
+#include <mln/math/sqr.hh>
+#include <mln/math/abs.hh>
+
 #include <mln/value/int_u8.hh>
+#include <mln/value/int_u16.hh>
+
+
+/// Specific histogram accumulators.
+/// \{
+/// \brief Define statistical accumulator for histogram.
+///
+/// Here, some histogram accumulators are defined, the sum of the frequencies,
+/// the average, the variance.
+
+double count_histo(const mln::image1d<unsigned> img)
+{
+  mln_precondition(img.is_valid());
+
+  double                             result = 0.0;
+  double                             value  = 0.0;
+  mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value  = img(p);
+    result += value;
+  }
+
+  return result;
+}
+
+double mean_histo(mln::image1d<unsigned> img)
+{
+  mln_precondition(img.is_valid());
+
+  double                             value  = 0.0;
+  double                             site   = 0.0;
+  double                             count  = 0.0;
+  double                             sum    = 0.0;
+  double                             result = 0.0;
+  mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value =  img(p);
+    site  =  p.ind();
+    count += value;
+    sum   += site * value;
+  }
+
+  result = sum / count;
+
+  return result;
+}
+
+
+/// \fixme there is a conversion type problem with the interface of iterator p.
+
+double var_histo(const mln::image1d<unsigned> img)
+{
+  mln_precondition(img.is_valid());
+
+  double                             value  = 0.0;
+  double                             site   = 0.0;
+  // FIXME: such variables value and site are necessary to obtain the
+  // well computation of the variance.
+
+  double                             count  = 0.0;
+  double                             sum    = 0.0;
+  double                             sum2   = 0.0;
+  double                             result = 0.0;
+  mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value  = img(p);
+    site   = p.ind();
+    count += value;
+    sum   += site * value;
+    sum2  += mln::math::sqr(site) * value;
+  }
+
+  result = sum2 / count - (sum / count) * (sum / count);
+
+  return result;
+}
+
+
+/// \fixme there is a conversion type problem with the interface of iterator p.
+
+double var_histo2(const mln::image1d<unsigned> img)
+{
+  mln_precondition(img.is_valid());
+
+  double                             value  = 0.0;
+  double                             site   = 0.0;
+  // FIXME: such variables value and site are necessary to obtain the
+  // well computation of the variance.
+
+  double                             count  = count_histo(img);
+  double                             mean   = mean_histo(img);
+  double                             result = 0.0;
+  mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value  = img(p);
+    site   = p.ind();
+    result += value * mln::math::sqr(site - mean);
+  }
+
+  result /= count;
+
+  return result;
+}
+
+/// \}
+
+
+/// 8-bits testing
+/// \{
+/// \brief This part of the code manages the 8-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
+
+void test_8bits_operator_equal()
+{
+  using namespace mln::accu::stat;
+
+  typedef mln::value::int_u8       int_u8;
+  mln::accu::stat::histo1d<int_u8> histo1;
+  mln::accu::stat::histo1d<int_u8> histo2;
+  int_u8                           val = 3;
+
+  histo1.init();
+  histo2.init();
+
+  mln_assertion(histo1 == histo2);
+
+  histo1.take(val);
+
+  mln_assertion(!(histo1 == histo2));
+  // mln_assertion(histo1 != histo2);
+  // FIXME: DOESN'T WORK !!
+
+  histo2.take(val);
+
+  mln_assertion(histo1 == histo2);
+
+  std::cout << "(08 bits) histo == histo       : ok" << std::endl;
+}
+
+void test_8bits_instantiation_without_argument()
+{
+  typedef mln::value::int_u8               int_u8;
+  const   mln::accu::stat::histo1d<int_u8> histo;
+  const   mln::image1d<unsigned>&          res = histo.to_result();
+  const   mln::point1d&                    min = mln::point1d(mln_min(int_u8));
+  const   mln::point1d&                    max = mln::point1d(mln_max(int_u8));
+  const   mln::box1d&                      ref = mln::box1d(min, max);
+
+  mln_assertion(ref == res.domain());
+  mln_assertion(res.is_valid());
+
+  std::cout << "(08 bits) histo<T> histo       : ok" << std::endl;
+}
+
+
+void test_8bits_initialization()
+{
+  typedef mln::value::int_u8       int_u8;
+  mln::accu::stat::histo1d<int_u8> histo;
+  mln::image1d<unsigned>           img_res = histo.to_result();
+  mln::image1d<unsigned>           img_ref;
+
+  mln::initialize(img_ref, img_res);
+  mln::data::fill(img_ref, 0);
+  histo.init();
+
+  unsigned res = mln::data::compute(mln::accu::math::sum<int_u8>(), img_res);
+  unsigned ref = mln::data::compute(mln::accu::math::sum<int_u8>(), img_ref);
+
+  mln_assertion(ref == res);
+
+  std::cout << "(08 bits) histo.init()         : ok" << std::endl;
+}
+
+
+void test_8bits_take_argument()
+{
+  typedef mln::value::int_u8       int_u8;
+  mln::accu::stat::histo1d<int_u8> histo1;
+  mln::accu::stat::histo1d<int_u8> histo2;
+  int_u8                           val = 3;
+
+  histo1.init();
+  histo2.init();
+  histo1.take(val);
+
+  const mln::image1d<unsigned>     img1 = histo1.to_result();
+  const mln::image1d<unsigned>     img2 = histo2.to_result();
+
+  const unsigned res = mln::data::compute(mln::accu::math::sum<int_u8>(), img1);
+  const unsigned ref = mln::data::compute(mln::accu::math::sum<int_u8>(), img2);
+
+  mln_assertion(ref == res-1);
+  mln_assertion(1 == img1(mln::point1d(val)));
+
+  std::cout << "(08 bits) histo.take(argument) : ok" << std::endl;
+}
+
+
+void test_8bits_take_other()
+{
+  typedef mln::value::int_u8       int_u8;
+  mln::accu::stat::histo1d<int_u8> histo1;
+  mln::accu::stat::histo1d<int_u8> histo2;
+  mln::accu::stat::histo1d<int_u8> histo3;
+  int_u8                           val = 3;
+
+  histo1.init();
+  histo2.init();
+  histo3.init();
+
+  histo1.take(val);
+  histo1.take(val);
+  histo3.take(val);
+  histo2.take(val);
+  histo2.take(histo3);
+
+  mln_assertion(histo1 == histo2);
+
+  std::cout << "(08 bits) histo.take(other)    : ok" << std::endl;
+}
+
+void test_8bits_integration()
+{
+  typedef mln::value::int_u8                int_u8;
+  typedef mln::accu::math::count<double>    count;
+  typedef mln::accu::math::sum<double>      sum;
+  typedef mln::accu::stat::mean<double>     mean;
+  typedef mln::accu::stat::variance<double> variance;
+
+  mln::image2d<int_u8>       img_ref;
+  mln::image1d<unsigned>     img_res;
+
+  mln::io::pgm::load(img_ref, OLENA_IMG_PATH"/lena.pgm");
+
+  const double count_ref = mln::data::compute(count(),    img_ref);
+  const double mean_ref  = mln::data::compute(mean(),     img_ref);
+  const double var_ref   = mln::data::compute(variance(), img_ref);
+
+  img_res = mln::data::compute(mln::accu::meta::stat::histo1d(), img_ref);
+
+  const double count_res = count_histo(img_res);
+  const double mean_res  = mean_histo(img_res);
+  const double var_res   = var_histo(img_res);
+
+  mln_assertion(count_ref == count_res);
+  mln_assertion( mean_ref == mean_res );
+
+  // std::cout << "var_ref : " << var_ref << std::endl;
+  // std::cout << "var_res : " << var_res << std::endl;
+
+  mln_assertion(0.0001 > mln::math::abs(var_ref - var_res));
+
+  std::cout << "(08 bits) test integration     : ok" << std::endl;
+}
+
+/// \}
+
+/// 14-bits testing
+/// \{
+/// \brief This part of the code manages the 14-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
+
+void test_14bits_operator_equal()
+{
+  using namespace mln::accu::stat;
+
+  typedef mln::value::int_u<14>     int_u14;
+  mln::accu::stat::histo1d<int_u14> histo1;
+  mln::accu::stat::histo1d<int_u14> histo2;
+  int_u14                           val = 3;
+
+  histo1.init();
+  histo2.init();
+
+  mln_assertion(histo1 == histo2);
+
+  histo1.take(val);
+
+  /// FIXME: mln_assertion(histo1 != histo2); doesn't work!!
+  mln_assertion(!(histo1 == histo2));
+
+  histo2.take(val);
+
+  mln_assertion(histo1 == histo2);
+
+  std::cout << "(14 bits) histo == histo       : ok" << std::endl;
+}
+
+void test_14bits_instantiation_without_argument()
+{
+  typedef mln::value::int_u<14>             int_u14;
+  const   mln::accu::stat::histo1d<int_u14> histo;
+  const   mln::image1d<unsigned>&           res = histo.to_result();
+  const   mln::point1d&                     min =mln::point1d(mln_min(int_u14));
+  const   mln::point1d&                     max =mln::point1d(mln_max(int_u14));
+  const   mln::box1d&                       ref = mln::box1d(min, max);
+
+  mln_assertion(ref == res.domain());
+  mln_assertion(res.is_valid());
+
+  std::cout << "(14 bits) histo<T> histo       : ok" << std::endl;
+}
+
+
+void test_14bits_initialization()
+{
+  typedef mln::value::int_u<14>     int_u14;
+  mln::accu::stat::histo1d<int_u14> histo;
+  mln::image1d<unsigned>            img_res = histo.to_result();
+  mln::image1d<unsigned>            img_ref;
+
+  mln::initialize(img_ref, img_res);
+  mln::data::fill(img_ref, 0);
+  histo.init();
+
+  unsigned res = mln::data::compute(mln::accu::math::sum<int_u14>(), img_res);
+  unsigned ref = mln::data::compute(mln::accu::math::sum<int_u14>(), img_ref);
+
+  mln_assertion(ref == res);
+
+  std::cout << "(14 bits) histo.init()         : ok" << std::endl;
+}
+
+
+void test_14bits_take_argument()
+{
+  typedef mln::value::int_u<14>     int_u14;
+  mln::accu::stat::histo1d<int_u14> histo1;
+  mln::accu::stat::histo1d<int_u14> histo2;
+  int_u14                           val = 3;
+
+  histo1.init();
+  histo2.init();
+  histo1.take(val);
+
+  const mln::image1d<unsigned>     img1 = histo1.to_result();
+  const mln::image1d<unsigned>     img2 = histo2.to_result();
+
+  const unsigned res = mln::data::compute(mln::accu::math::sum<int_u14>(),img1);
+  const unsigned ref = mln::data::compute(mln::accu::math::sum<int_u14>(),img2);
+
+  mln_assertion(ref == res-1);
+  mln_assertion(1 == img1(mln::point1d(val)));
+
+  std::cout << "(14 bits) histo.take(argument) : ok" << std::endl;
+}
+
+
+void test_14bits_take_other()
+{
+  typedef mln::value::int_u<14>     int_u14;
+  mln::accu::stat::histo1d<int_u14> histo1;
+  mln::accu::stat::histo1d<int_u14> histo2;
+  mln::accu::stat::histo1d<int_u14> histo3;
+  int_u14                           val = 3;
+
+  histo1.init();
+  histo2.init();
+  histo3.init();
+
+  histo1.take(val);
+  histo1.take(val);
+  histo3.take(val);
+  histo2.take(val);
+  histo2.take(histo3);
+
+  mln_assertion(histo1 == histo2);
+
+  std::cout << "(14 bits) histo.take(other)    : ok" << std::endl;
+}
+
+void test_14bits_integration()
+{
+  typedef mln::value::int_u16               int_u16;
+  typedef mln::value::int_u<14>             int_u14;
+  typedef mln::accu::math::count<double>    count;
+  typedef mln::accu::math::sum<double>      sum;
+  typedef mln::accu::stat::mean<double>     mean;
+  typedef mln::accu::stat::variance<double> variance;
+
+  mln::image2d<int_u16>      img_fst;
+  mln::image2d<int_u14>      img_ref;
+  mln::image1d<unsigned>     img_res;
+
+  mln::io::pgm::load(img_fst, OLENA_IMG_PATH"/lena_16_imageMagick.pgm");
+  img_ref = mln::data::transform(img_fst, mln::fun::v2v::int_u16_to_int_u14());
+
+  const double count_ref = mln::data::compute(count(),    img_ref);
+  const double mean_ref  = mln::data::compute(mean(),     img_ref);
+  const double var_ref   = mln::data::compute(variance(), img_ref);
+
+  img_res = mln::data::compute(mln::accu::stat::histo1d<int_u14>(), img_ref);
+
+  const double count_res = count_histo(img_res);
+  const double mean_res  = mean_histo(img_res);
+  const double var_res   = var_histo2(img_res);
+
+  //std::cout << "var_res : " << var_res << std::endl;
+  //std::cout << "var_ref : " << var_ref << std::endl;
+
+  mln_assertion(count_ref == count_res);
+  mln_assertion( mean_ref == mean_res );
+  mln_assertion(0.0001 > abs(var_ref - var_res));
+
+  std::cout << "(14 bits) test integration     : ok" << std::endl;
+}
+
+/// \}
 
 int main()
 {
-  typedef mln::value::int_u8 t_int_u8;
-  mln::image2d<t_int_u8>     img;
-  mln::image1d<unsigned>     histo;
+  test_8bits_operator_equal();
+  test_8bits_instantiation_without_argument();
+  test_8bits_initialization();
+  test_8bits_take_argument();
+  test_8bits_take_other();
+  test_8bits_operator_equal();
+  test_8bits_integration();
 
-  mln::io::pgm::load(img, OLENA_IMG_PATH"/lena.pgm");
-  histo = mln::data::compute(mln::accu::meta::stat::histo1d(), img);
+  test_14bits_instantiation_without_argument();
+  test_14bits_initialization();
+  test_14bits_take_argument();
+  test_14bits_take_other();
+  test_14bits_operator_equal();
+  test_14bits_integration();
 
   return 0;
 }
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/tests/accu/stat/histo3d_hsl/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/tests/accu/stat/histo3d_hsl/Makefile.am
diff --git a/milena/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc b/scribo/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
similarity index 73%
copy from milena/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
copy to scribo/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
index 0a12706..eed377c 100644
--- a/milena/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
+++ b/scribo/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
@@ -1,66 +1,189 @@
-/// TEST HISTO3D_HSL
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief This source manages unitary testing on rgb image3d histogram.
+///
+/// Tests are performed from 2 bits up to 8 bits quantification. The goal
+/// is to go through each programmatic flow to verify the conformity of the
+/// code. It sounds like a theoritic model of unitary testing for milena.
+/// The last test enables statistic computations on that component.
 
-#include <mln/img_path.hh>
-
-#include <mln/io/plot/save_histo_sh.hh>
+#include <mln/accu/math/sum.hh>
+#include <mln/accu/math/count.hh>
 #include <mln/accu/stat/histo3d_hsl.hh>
-#include <mln/fun/v2v/rgb8_to_rgbn.hh>
-#include <mln/fun/v2v/rgb_to_hsl.hh>
+#include <mln/accu/stat/mean.hh>
+#include <mln/accu/stat/variance.hh>
+#include <mln/accu/stat/var.hh>
 
-#include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-#include <mln/io/pfm/save.hh>
-#include <mln/io/plot/save.hh>
+#include <mln/core/alias/box3d.hh>
+#include <mln/core/alias/point3d.hh>
+#include <mln/core/contract.hh>
+#include <mln/core/grids.hh>
+#include <mln/core/routine/initialize.hh>
 
 #include <mln/data/compute.hh>
-#include <mln/data/transform.hh>
 #include <mln/data/fill.hh>
+#include <mln/data/transform.hh>
+
+#include <mln/fun/v2v/rgb_to_hsl.hh>
+
+#include <mln/img_path.hh>
+
+#include <mln/io/ppm/load.hh>
+
+#include <mln/literal/zero.hh>
+
+#include <mln/math/sqr.hh>
+#include <mln/math/abs.hh>
 
-#include <mln/value/label_8.hh>
 #include <mln/value/rgb8.hh>
 #include <mln/value/hsl.hh>
-#include <mln/value/rgb.hh>
-#include <mln/value/int_u.hh>
 
-#include <mln/core/alias/neighb3d.hh>
-#include <mln/core/alias/box3d.hh>
-#include <mln/core/alias/point3d.hh>
+/// Specific histogram accumulators.
+/// \{
+/// \brief Define statistical accumulator for histogram.
+///
+/// Here, some histogram accumulators are defined, the sum of the frequencies,
+/// the average, the variance.
 
-#include <mln/core/routine/initialize.hh>
-#include <mln/core/contract.hh>
-#include <mln/core/grids.hh>
+double count_histo(const mln::image3d<unsigned>& img)
+{
+  mln_precondition(img.is_valid());
 
-#include <mln/accu/math/sum.hh>
-#include <mln/accu/math/count.hh>
-#include <mln/accu/stat/mean.hh>
-#include <mln/accu/stat/variance.hh>
-#include <mln/accu/stat/var.hh>
+  double                             result = 0.0;
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
 
-#include <mln/morpho/watershed/flooding.hh>
-#include <mln/morpho/elementary/dilation.hh>
-#include <mln/morpho/elementary/closing.hh>
+  for_all(p)
+    result += img(p);
 
-#include <mln/literal/zero.hh>
-#include <mln/linear/convolve.hh>
-#include <mln/linear/gaussian.hh>
-#include <mln/labeling/regional_maxima.hh>
-#include <mln/labeling/colorize.hh>
-#include <mln/labeling/mean_values.hh>
+  return result;
+}
 
-#include <mln/make/w_window3d.hh>
+mln::algebra::vec<3,float> conv(const mln::algebra::vec<3,float>& vec,
+				const unsigned                    q)
+{
+  mln::algebra::vec<3,float> result;
 
-#include <mln/math/sqr.hh>
-#include <mln/math/pi.hh>
-#include <mln/math/abs.hh>
+  /*
+  result[0] = vec[2] * (360.0/q);
+  result[1] = vec[0] * (1.0/q);
+  result[2] = vec[1] * (1.0/q);
+  */
+
+  result[0] = (vec[0]+0.5) * (360.0/q);
+  result[1] = (vec[1]+0.5) * (1.0/q);
+  result[2] = (vec[2]+0.5) * (1.0/q);
+
+  return result;
+}
+
+mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img,
+				      const unsigned                  q)
+{
+  mln_precondition(img.is_valid());
+  typedef mln::algebra::vec<3,float> vec3f;
+  double                             count  = 0.0;
+  vec3f                              sum    = mln::literal::zero;
+  vec3f                              result;
+
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    count += img(p);
+    sum   += conv((vec3f)p, q) * img(p);
+  }
+
+  result = sum / count;
+
+  return result;
+}
+
+mln::algebra::mat<3,3,float> var_histo(const mln::image3d<unsigned>& img,
+				       const unsigned                q)
+{
+  mln_precondition(img.is_valid());
+  typedef mln::algebra::vec<3,float>   vec3f;
+  typedef mln::algebra::mat<3,3,float> mat3f;
+
+  double                             count  = count_histo(img);
+  vec3f                              mean   = mean_histo(img,q);
+  vec3f                              point;
+  mat3f                              result = mln::literal::zero;
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    point  = conv((vec3f)p, q) - mean;
+    result += img(p) * (point * point.t());
+  }
 
-#include <mln/core/image/dmorph/image_if.hh>
-#include <mln/pw/value.hh>
+  result /= count;
+
+  return result;
+}
 
-#include <mln/trait/image/print.hh>
-#include <mln/trait/value_.hh>
-#include <mln/core/concept/function.hh>
+/// \}
+
+struct hslf_2_vec3f : public mln::Function_v2v< hslf_2_vec3f >
+{
+  typedef mln::algebra::vec<3,float> result;
+  result operator()(const mln::value::hsl_f& hsl) const;
+};
+
+mln::algebra::vec<3,float>
+hslf_2_vec3f::operator()(const mln::value::hsl_f& hsl) const
+{
+  return mln::make::vec(hsl.hue(), hsl.lum(), hsl.sat());
+}
+
+struct hslf_2_h : public mln::Function_v2v< hslf_2_h >
+{
+  typedef float result;
+  result operator()(const mln::value::hsl_f& hsl) const;
+};
+
+float
+hslf_2_h::operator()(const mln::value::hsl_f& hsl) const
+{
+  return hsl.hue();
+}
 
 
+/// n-bits testing
+/// \{
+/// \brief This part of the code manages the n-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
+
 template <unsigned n>
 void test_operator_equal()
 {
@@ -129,7 +252,7 @@ void test_initialization()
 
   unsigned res = mln::data::compute(mln::accu::math::sum<int_un>(), img_res);
   unsigned ref = mln::data::compute(mln::accu::math::sum<int_un>(), img_ref);
-  
+
   mln_assertion(ref == res);
 
   std::cout << "(" << n << " bits) histo.init()         : ok" << std::endl;
@@ -184,131 +307,6 @@ void test_take_other()
   std::cout << "(" << n << " bits) histo.take(other)    : ok" << std::endl;
 }
 
-double count_histo(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  
-  double                             result = 0.0;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-    result += img(p);
-
-  return result;
-}
-
-mln::algebra::vec<3,float> conv(const mln::algebra::vec<3,float>& vec,
-				const unsigned                    q)
-{
-  mln::algebra::vec<3,float> result;
-
-  /*
-  result[0] = vec[2] * (360.0/q);
-  result[1] = vec[0] * (1.0/q);
-  result[2] = vec[1] * (1.0/q);
-  */
-
-  result[0] = (vec[0]+0.5) * (360.0/q);
-  result[1] = (vec[1]+0.5) * (1.0/q);
-  result[2] = (vec[2]+0.5) * (1.0/q);
-
-  return result;
-}
-
-mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img,
-				      const unsigned                  q)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float> vec3f;
-  double                             count  = 0.0;
-  vec3f                              sum    = mln::literal::zero;
-  vec3f                              result;
-
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    count += img(p);
-    sum   += conv((vec3f)p, q) * img(p);
-  }
-
-  result = sum / count;
-
-  return result;
-}
-
-
-double var_histo(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float>   vec3f;
-  typedef mln::algebra::mat<3,3,float> mat3f;
-  double                               count  = 0.0;
-  double                               sum    = 0.0;
-  double                               sum2   = 0.0;
-  double                               result = 0.0;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    count += img(p);
-    sum   += p[0] * img(p);
-    sum2  += p[0] * p[0] * img(p);
-  }
-
-  result = sum2 / count - (sum / count) * (sum / count);
-
-  return result;
-}
-
-mln::algebra::mat<3,3,float> var_histo2(const mln::image3d<unsigned>& img,
-					const unsigned                q)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float>   vec3f;
-  typedef mln::algebra::mat<3,3,float> mat3f;
-  
-  double                             count  = count_histo(img);
-  vec3f                              mean   = mean_histo(img,q);
-  vec3f                              point;
-  mat3f                              result = mln::literal::zero;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    point  = conv((vec3f)p, q) - mean;
-    result += img(p) * (point * point.t());
-  }
-
-  result /= count;
-
-  return result;
-}
-
-struct hslf_2_vec3f : public mln::Function_v2v< hslf_2_vec3f >
-{
-  typedef mln::algebra::vec<3,float> result;
-  result operator()(const mln::value::hsl_f& hsl) const;
-};
-
-mln::algebra::vec<3,float>
-hslf_2_vec3f::operator()(const mln::value::hsl_f& hsl) const
-{
-  return mln::make::vec(hsl.hue(), hsl.lum(), hsl.sat());
-}
-
-struct hslf_2_h : public mln::Function_v2v< hslf_2_h >
-{
-  typedef float result;
-  result operator()(const mln::value::hsl_f& hsl) const;
-};
-
-float
-hslf_2_h::operator()(const mln::value::hsl_f& hsl) const
-{
-  return hsl.hue();
-}
-
 template <unsigned n, unsigned q>
 void test_integration()
 {
@@ -331,37 +329,27 @@ void test_integration()
   mln::image2d<float>        img_sav;
 
   mln::io::ppm::load(img_fst, OLENA_IMG_PATH"/lena.ppm");
-    //mln::io::ppm::load(img_fst, OLENA_IMG_PATH"/fly.ppm");
-  //img_sec = mln::data::transform(img_fst, mln::fun::v2v::rgb8_to_rgbn<n>());
   img_thd = mln::data::transform(img_fst,mln::fun::v2v::f_rgb_to_hsl_<hsl_f>());
-
-  //img_sav = mln::data::transform(img_thd, hslf_2_h());
-  //mln::io::plot::save_histo_sh(img_sav, "lena2.sh");
-
   img_ref = mln::data::transform(img_thd, hslf_2_vec3f());
 
   const double count_ref = mln::data::compute(count(), img_ref);
-  //  const vec3f  sum_ref   = mln::data::compute(sum(),   img_ref);
-  const vec3f  mean_ref  = mln::data::compute(mean(),  img_ref);  
+  const vec3f  mean_ref  = mln::data::compute(mean(),  img_ref);
   const mat3f  var_ref   = mln::data::compute(var(),   img_ref);
 
-  img_res = mln::data::compute(mln::accu::stat::histo3d_hsl<q,hsl_f>(),img_thd);
-  
-  mln::io::plot::save_histo_sh(img_res, "histo_hsl.sh");
+  img_res = mln::data::compute(mln::accu::meta::stat::histo3d_hsl<q>(),img_thd);
 
   const double count_res = count_histo(img_res);
   const vec3f  mean_res  = mean_histo(img_res, q);
   const mat3f  var_res   = var_histo2(img_res, q);
- 
-  std::cout << "count_ref : " << count_ref << std::endl;
-  std::cout << "mean_ref  : " << mean_ref  << std::endl;
-  std::cout << "var_ref   : " << var_ref   << std::endl;
 
-  std::cout << "count_res : " << count_res << std::endl;
-  std::cout << "mean_res  : " << mean_res  << std::endl;
-  std::cout << "var_res   : " << var_res   << std::endl;
+  // std::cout << "count_ref : " << count_ref << std::endl;
+  // std::cout << "mean_ref  : " << mean_ref  << std::endl;
+  // std::cout << "var_ref   : " << var_ref   << std::endl;
+
+  // std::cout << "count_res : " << count_res << std::endl;
+  // std::cout << "mean_res  : " << mean_res  << std::endl;
+  // std::cout << "var_res   : " << var_res   << std::endl;
 
-  
   mln_assertion(count_ref == count_res);
 
   /*
@@ -385,39 +373,19 @@ void test_integration()
   std::cout << "(" << n << " bits) test integration     : ok" << std::endl;
 }
 
-void test()
-{
-  typedef mln::value::rgb8                    rgb8;
-  typedef mln::value::hsl_f                   hsl_f;
-  typedef mln::fun::v2v::f_rgb_to_hsl_<hsl_f> rgb_to_hsl_f;
-  mln::image2d<rgb8>                          img_fst;
-  mln::image2d<hsl_f>                         img_ref;
-  rgb_to_hsl_f                                instance;
-  rgb8                                        rgb(255,127,0);
-  hsl_f                                       hsl = instance(rgb);
-
-  std::cout << hsl.hue() << std::endl;
-  std::cout << hsl.lum() << std::endl;
-  std::cout << hsl.sat() << std::endl;
-
+/// \}
 
-  mln::io::ppm::load(img_fst, OLENA_IMG_PATH"/lena.ppm");
-  img_ref = mln::data::transform(img_fst, rgb_to_hsl_f());
-
-  //mln::accu::stat::histo3d_hsl<hsl_f>();
-
-}
+/// \fixme Should compile but doesn't. Fold problem in histo_hsl.hh.
 
 int main()
 {
-  /*
+
   test_operator_equal<3>();
   test_instantiation_without_argument<3>();
   test_initialization<3>();
-  test_take_argument<3>(); 
+  test_take_argument<3>();
   test_take_other<3>();
-  */
   test_integration<7,6>();
-  
+
   return 0;
 }
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/tests/accu/stat/histo3d_rgb/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/tests/accu/stat/histo3d_rgb/Makefile.am
diff --git a/milena/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc b/scribo/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
similarity index 64%
copy from milena/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
copy to scribo/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
index cbf273b..3f87c4d 100644
--- a/milena/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
+++ b/scribo/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
@@ -1,58 +1,152 @@
-/// TEST HISTO3D_RGB
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief This source manages unitary testing on rgb image3d histogram.
+///
+/// Tests are performed from 2 bits up to 8 bits quantification. The goal
+/// is to go through each programmatic flow to verify the conformity of the
+/// code. It sounds like a theoritic model of unitary testing for milena.
+/// The last test enables statistic computations on that component.
 
-#include <mln/img_path.hh>
-
-#include <mln/io/plot/save_histo_sh.hh>
+#include <mln/accu/math/sum.hh>
+#include <mln/accu/math/count.hh>
 #include <mln/accu/stat/histo3d_rgb.hh>
-#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+#include <mln/accu/stat/mean.hh>
+#include <mln/accu/stat/variance.hh>
+#include <mln/accu/stat/var.hh>
 
-#include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-#include <mln/io/plot/save.hh>
-#include <mln/io/plot/save_histo_sh.hh>
+#include <mln/core/alias/box3d.hh>
+#include <mln/core/alias/point3d.hh>
+#include <mln/core/contract.hh>
+#include <mln/core/grids.hh>
+#include <mln/core/routine/initialize.hh>
 
 #include <mln/data/compute.hh>
-#include <mln/data/transform.hh>
 #include <mln/data/fill.hh>
+#include <mln/data/transform.hh>
+
+#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+
+#include <mln/img_path.hh>
+
+#include <mln/io/ppm/load.hh>
+
+#include <mln/literal/zero.hh>
+
+#include <mln/math/sqr.hh>
+#include <mln/math/abs.hh>
 
-#include <mln/value/label_8.hh>
 #include <mln/value/rgb8.hh>
 #include <mln/value/rgb.hh>
-#include <mln/value/int_u.hh>
 
-#include <mln/core/alias/neighb3d.hh>
-#include <mln/core/alias/box3d.hh>
-#include <mln/core/alias/point3d.hh>
+/// Specific histogram accumulators.
+/// \{
+/// \brief Define statistical accumulator for histogram.
+///
+/// Here, some histogram accumulators are defined, the sum of the frequencies,
+/// the average, the variance.
 
-#include <mln/core/routine/initialize.hh>
-#include <mln/core/contract.hh>
-#include <mln/core/grids.hh>
+double count_histo(const mln::image3d<unsigned>& img)
+{
+  mln_precondition(img.is_valid());
 
-#include <mln/accu/math/sum.hh>
-#include <mln/accu/math/count.hh>
-#include <mln/accu/stat/mean.hh>
-#include <mln/accu/stat/variance.hh>
-#include <mln/accu/stat/var.hh>
+  double                             value  = 0.0;
+  double                             result = 0.0;
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value   = img(p);
+    result += value;
+  }
 
-#include <mln/morpho/watershed/flooding.hh>
-#include <mln/morpho/elementary/dilation.hh>
-#include <mln/morpho/elementary/closing.hh>
+  return result;
+}
 
-#include <mln/literal/zero.hh>
-#include <mln/linear/convolve.hh>
-#include <mln/linear/gaussian.hh>
-#include <mln/labeling/regional_maxima.hh>
-#include <mln/labeling/colorize.hh>
-#include <mln/labeling/mean_values.hh>
+mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img)
+{
+  mln_precondition(img.is_valid());
+  typedef mln::algebra::vec<3,float> vec3f;
+  double                             value  = 0.0;
+  double                             count  = 0.0;
+  vec3f                              sum    = mln::literal::zero;
+  vec3f                              result;
 
-#include <mln/make/w_window3d.hh>
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
 
-#include <mln/math/sqr.hh>
-#include <mln/math/pi.hh>
-#include <mln/math/abs.hh>
+  for_all(p)
+  {
+    value  = img(p);
+    count += value;
+    sum   += p.to_vec() * value;
+  }
 
-#include <mln/core/image/dmorph/image_if.hh>
-#include <mln/pw/value.hh>
+  result = sum / count;
+
+  return result;
+}
+
+
+mln::algebra::mat<3,3,float> var_histo (const mln::image3d<unsigned>& img)
+{
+  mln_precondition(img.is_valid());
+  typedef mln::algebra::vec<3,float>   vec3f;
+  typedef mln::algebra::mat<3,3,float> mat3f;
+
+  double                             value  = 0.0;
+  double                             count  = count_histo(img);
+  vec3f                              mean   = mean_histo(img);
+  vec3f                              point;
+  mat3f                              result = mln::literal::zero;
+  mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+  for_all(p)
+  {
+    value   = img(p);
+    point   = p.to_vec() - mean;
+    result += value * (point * point.t());
+  }
+
+  result /= count;
+
+  return result;
+}
+
+/// \}
+
+/// n-bits testing
+/// \{
+/// \brief This part of the code manages the n-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
 
 
 template <unsigned n>
@@ -72,8 +166,10 @@ void test_operator_equal()
 
   histo1.take(val);
 
-  /// FIXME mln_assertion(histo1 != histo2); doesn't work!!
   mln_assertion(!(histo1 == histo2));
+  // mln_assertion(histo1 != histo2);
+  // FIXME: DOESN'T WORK !!
+
 
   histo2.take(val);
 
@@ -118,7 +214,7 @@ void test_initialization()
 
   unsigned res = mln::data::compute(mln::accu::math::sum<int_un>(), img_res);
   unsigned ref = mln::data::compute(mln::accu::math::sum<int_un>(), img_ref);
-  
+
   mln_assertion(ref == res);
 
   std::cout << "(" << n << " bits) histo.init()         : ok" << std::endl;
@@ -173,86 +269,7 @@ void test_take_other()
   std::cout << "(" << n << " bits) histo.take(other)    : ok" << std::endl;
 }
 
-double count_histo(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  
-  double                             result = 0.0;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-    result += img(p);
-
-  return result;
-}
-
-mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float> vec3f;
-  double                             count  = 0.0;
-  vec3f                              sum    = mln::literal::zero;
-  vec3f                              result;
-
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    count += img(p);
-    sum   += p.to_vec() * img(p);
-  }
-
-  result = sum / count;
-
-  return result;
-}
-
-
-double var_histo(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float>   vec3f;
-  typedef mln::algebra::mat<3,3,float> mat3f;
-  double                               count  = 0.0;
-  double                               sum    = 0.0;
-  double                               sum2   = 0.0;
-  double                               result = 0.0;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    count += img(p);
-    sum   += p[0] * img(p);
-    sum2  += p[0] * p[0] * img(p);
-  }
-
-  result = sum2 / count - (sum / count) * (sum / count);
-
-  return result;
-}
-
-mln::algebra::mat<3,3,float> var_histo2(const mln::image3d<unsigned>& img)
-{
-  mln_precondition(img.is_valid());
-  typedef mln::algebra::vec<3,float>   vec3f;
-  typedef mln::algebra::mat<3,3,float> mat3f;
-  
-  double                             count  = count_histo(img);
-  vec3f                              mean   = mean_histo(img);
-  vec3f                              point;
-  mat3f                              result = mln::literal::zero;
-  mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
-  for_all(p)
-  {
-    point   = p.to_vec() - mean;
-    result += img(p) * (point * point.t());
-  }
-
-  result /= count;
-
-  return result;
-}
+/// \fixme When the quantification grows, the computation error grows.
 
 template <unsigned n>
 void test_integration()
@@ -277,77 +294,65 @@ void test_integration()
   const vec3f  sum_ref   = mln::data::compute(sum(),   img_ref);
   const vec3f  mean_ref  = mln::data::compute(mean(),  img_ref);
   const mat3f  var_ref   = mln::data::compute(var(),   img_ref);
-  
-  img_res = mln::data::compute(mln::accu::stat::histo3d_rgb<rgbn>(), img_ref);
 
-  mln::io::plot::save_histo_sh(img_res, "histo_rgb.sh");
+  img_res = mln::data::compute(mln::accu::stat::histo3d_rgb<rgbn>(), img_ref);
 
   const double count_res = count_histo(img_res);
   const vec3f  mean_res  = mean_histo(img_res);
-  const mat3f  var_res   = var_histo2(img_res);
- 
-  std::cout << "count_ref : " << count_ref << std::endl;
-  std::cout << "mean_ref  : " << mean_ref  << std::endl;
-  std::cout << "var_ref   : " << var_ref   << std::endl;
+  const mat3f  var_res   = var_histo(img_res);
+
+  // std::cout << "count_ref : " << count_ref << std::endl;
+  // std::cout << "mean_ref  : " << mean_ref  << std::endl;
+  // std::cout << "var_ref   : " << var_ref   << std::endl;
+
+  // std::cout << "count_res : " << count_res << std::endl;
+  // std::cout << "mean_res  : " << mean_res  << std::endl;
+  // std::cout << "var_res   : " << var_res   << std::endl;
 
-  std::cout << "count_res : " << count_res << std::endl;
-  std::cout << "mean_res  : " << mean_res  << std::endl;
-  std::cout << "var_res   : " << var_res   << std::endl;
 
-  
   mln_assertion(count_ref == count_res);
- 
-  mln_assertion(0.0001 > abs(mean_ref[0] - mean_res[0]));
-  mln_assertion(0.0001 > abs(mean_ref[1] - mean_res[1]));
-  mln_assertion(0.0001 > abs(mean_ref[2] - mean_res[2]));
 
-  mln_assertion(0.0001 > abs(var_ref(0,0) - var_res(0,0)));
-  mln_assertion(0.0001 > abs(var_ref(0,1) - var_res(0,1)));
-  mln_assertion(0.0001 > abs(var_ref(1,0) - var_res(1,0)));
+  /// FIXME: The error acceptance seems to high !!
+  mln_assertion(3 > mln::math::abs(mean_ref[0] - mean_res[0]));
+  mln_assertion(3 > mln::math::abs(mean_ref[1] - mean_res[1]));
+  mln_assertion(3 > mln::math::abs(mean_ref[2] - mean_res[2]));
+
+  mln_assertion(3 > mln::math::abs(var_ref(0,0) - var_res(0,0)));
+  mln_assertion(3 > mln::math::abs(var_ref(0,1) - var_res(0,1)));
+  mln_assertion(3 > mln::math::abs(var_ref(1,0) - var_res(1,0)));
 
-  mln_assertion(0.0001 > abs(var_ref(1,1) - var_res(1,1)));
-  mln_assertion(0.0001 > abs(var_ref(0,2) - var_res(0,2)));
-  mln_assertion(0.0001 > abs(var_ref(2,0) - var_res(2,0)));
+  mln_assertion(3 > mln::math::abs(var_ref(1,1) - var_res(1,1)));
+  mln_assertion(3 > mln::math::abs(var_ref(0,2) - var_res(0,2)));
+  mln_assertion(3 > mln::math::abs(var_ref(2,0) - var_res(2,0)));
 
+  mln_assertion(3 > mln::math::abs(var_ref(2,2) - var_res(2,2)));
+  mln_assertion(3 > mln::math::abs(var_ref(2,1) - var_res(2,1)));
+  mln_assertion(3 > mln::math::abs(var_ref(1,2) - var_res(1,2)));
 
-  mln_assertion(0.0001 > abs(var_ref(2,2) - var_res(2,2)));
-  mln_assertion(0.0001 > abs(var_ref(2,1) - var_res(2,1)));
-  mln_assertion(0.0001 > abs(var_ref(1,2) - var_res(1,2)));
-  
   std::cout << "(" << n << " bits) test integration     : ok" << std::endl;
 }
 
+/// \}
+
+/// \fixme Doesn't work with 1 bit, compilation problem.
+
 int main()
 {
-  //
-  // Doesn't work with 1 bit, compilation problem
-  //
 
-  /*
-  test_operator_equal<1>();
-  test_instantiation_without_argument<1>();
-  test_initialization<1>();
-  test_take_argument<1>();
-  test_take_other<1>();
-  test_integration<1>();
-  */
-  /*
   test_operator_equal<2>();
   test_instantiation_without_argument<2>();
   test_initialization<2>();
   test_take_argument<2>();
   test_take_other<2>();
   test_integration<2>();
-  */
-  /*
+
+
   test_operator_equal<3>();
   test_instantiation_without_argument<3>();
   test_initialization<3>();
   test_take_argument<3>();
   test_take_other<3>();
   test_integration<3>();
-  
-  
 
   test_operator_equal<4>();
   test_instantiation_without_argument<4>();
@@ -355,44 +360,38 @@ int main()
   test_take_argument<4>();
   test_take_other<4>();
   test_integration<4>();
-  
-  
+
   test_operator_equal<5>();
   test_instantiation_without_argument<5>();
   test_initialization<5>();
   test_take_argument<5>();
   test_take_other<5>();
   test_integration<5>();
-  */
+
   test_operator_equal<6>();
   test_instantiation_without_argument<6>();
   test_initialization<6>();
   test_take_argument<6>();
   test_take_other<6>();
   test_integration<6>();
-  
-  /*
+
   test_operator_equal<7>();
   test_instantiation_without_argument<7>();
   test_initialization<7>();
   test_take_argument<7>();
   test_take_other<7>();
   test_integration<7>();
-  */
-    
+
   //
   // Do not execute it, unless you have the time :)
   //
 
-  /*
-  test_operator_equal<8>();
-  test_instantiation_without_argument<8>();
-  test_initialization<8>();
-  test_take_argument<8>();
-  test_take_other<8>();
-  test_integration<8>();
-  */
- 
+  // test_operator_equal<8>();
+  // test_instantiation_without_argument<8>();
+  // test_initialization<8>();
+  // test_take_argument<8>();
+  // test_take_other<8>();
+  // test_integration<8>();
 
   return 0;
 }
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
index 1c6176b..af39d94 100644
--- a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
@@ -1,3 +1,28 @@
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
 /// \file
 ///
 /// \brief Minimal code for building 1d image histogram version.
@@ -11,6 +36,8 @@
 #include <mln/io/pgm/load.hh>
 #include <mln/value/int_u8.hh>
 
+
+
 int main()
 {
   typedef mln::value::int_u8 t_int_u8;
diff --git a/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc b/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
index 6369b5a..2e36867 100644
--- a/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
@@ -1,3 +1,28 @@
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena 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 Olena.  If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction.  Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License.  This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
 /// \file
 ///
 /// \brief Minimal code for building 2d image histogram version.
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/accu/stat/histo3d_hsl/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/accu/stat/histo3d_hsl/Makefile.am
diff --git a/milena/tests/fun/v2v/rgb_to_hsl.cc b/scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc
similarity index 57%
copy from milena/tests/fun/v2v/rgb_to_hsl.cc
copy to scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc
index 6fd9a17..17b12cc 100644
--- a/milena/tests/fun/v2v/rgb_to_hsl.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -23,37 +23,37 @@
 // exception does not however invalidate any other reasons why the
 // executable file might be covered by the GNU General Public License.
 
-#include <mln/core/image/image2d.hh>
+/// \file
+///
+/// \brief Minimal code for building HSL 3d image histogram version.
+//
+/// \fixme This code should compile but it doesn't.
+///
 
+#include <mln/accu/stat/histo3d_hsl.hh>
+#include <mln/core/image/image2d.hh>
+#include <mln/core/image/image3d.hh>
+#include <mln/data/compute.hh>
+#include <mln/data/transform.hh>
+#include <mln/fun/v2v/rgb_to_hsl.hh>
+#include <mln/img_path.hh>
+#include <mln/io/ppm/load.hh>
 #include <mln/value/hsl.hh>
 #include <mln/value/rgb8.hh>
 
-#include <mln/fun/v2v/rgb_to_hsl.hh>
-
-#include <mln/data/compare.hh>
-#include <mln/data/transform.hh>
-
-#include <mln/make/image.hh>
-
-#include <mln/debug/println.hh>
-
-using mln::value::rgb8;
-using mln::value::hsl_f;
-
-rgb8 dat[][2] = { { rgb8(0,0,0), rgb8(255,255,255) },
-		  { rgb8(128,128,128), rgb8(90,90, 90) } };
-
-hsl_f ref[][2] = { { hsl_f(0,0,0), hsl_f(0,0,1.0) },
-		   { hsl_f(0,0,128.0 / 255.0), hsl_f(0,0,90.0 / 255.0) } };
-
 int main()
 {
-  using namespace mln;
-
-  image2d<value::rgb8> ima = make::image(dat);
-  image2d<hsl_f> ref_ima = make::image(ref);
-  image2d<hsl_f> ima_hsl = data::transform(ima,
-					    fun::v2v::f_rgb_to_hsl_f);
-
-  mln_assertion(ima_hsl == ref_ima);
+  typedef mln::value::rgb8                    t_rgb;
+  typedef mln::value::hsl_f                   t_hsl;
+  typedef mln::fun::v2v::f_rgb_to_hsl_<t_hsl> t_rgb_to_hsl;
+  mln::image2d<t_rgb>                         img_rgb;
+  mln::image2d<t_hsl>                         img_hsl;
+  mln::image3d<unsigned>                      histo;
+
+  mln::io::ppm::load(img_rgb, OLENA_IMG_PATH"/lena.ppm");
+  img_hsl = mln::data::transform(img_rgb, t_rgb_to_hsl());
+  //histo =mln::data::compute(mln::accu::meta::stat::histo3d_hsl<7>(), img_hsl);
+  //histo =mln::data::compute(mln::accu::stat::histo3d_hsl<7,t_hsl>(), img_hsl);
+  mln::accu::stat::histo3d_hsl<7,t_hsl>();
+  return 0;
 }
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/accu/stat/histo3d_rgb/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/accu/stat/histo3d_rgb/Makefile.am
diff --git a/milena/tests/io/ppm/ppm.cc b/scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc
similarity index 63%
copy from milena/tests/io/ppm/ppm.cc
copy to scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc
index c2dac07..20267a0 100644
--- a/milena/tests/io/ppm/ppm.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -23,32 +23,35 @@
 // exception does not however invalidate any other reasons why the
 // executable file might be covered by the GNU General Public License.
 
+/// \file
+///
+/// \brief Minimal code for building 3d image histogram version.
+///
+
+
+#include <mln/accu/stat/histo3d_rgb.hh>
 #include <mln/core/image/image2d.hh>
 #include <mln/core/image/image3d.hh>
-#include <mln/core/image/dmorph/slice_image.hh>
-#include <mln/value/rgb8.hh>
-
+#include <mln/data/compute.hh>
+#include <mln/data/transform.hh>
+#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+#include <mln/img_path.hh>
 #include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-
-#include <mln/data/compare.hh>
-
-#include <mln/util/array.hh>
-
-#include <mln/literal/colors.hh>
-
-#include "tests/data.hh"
-
+#include <mln/value/rgb.hh>
+#include <mln/value/rgb8.hh>
 
 int main()
 {
-  using namespace mln;
-  using value::rgb8;
+  typedef mln::value::rgb8   t_rgb8;
+  typedef mln::value::rgb<7> t_rgb7;
+  mln::image2d<t_rgb8>       img_rgb8;
+  mln::image2d<t_rgb7>       img_rgb7;
+  mln::image3d<unsigned>     histo;
+
+  mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+  img_rgb7 = mln::data::transform(img_rgb8, mln::fun::v2v::rgb8_to_rgbn<7>());
 
-  image2d<rgb8> lena = io::ppm::load<rgb8>(MLN_IMG_DIR "/lena.ppm");
-  io::ppm::save(lena, "out.ppm");
+  histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(), img_rgb7);
 
-  image2d<rgb8> lena2;
-  io::ppm::load(lena2, "out.ppm");
-  mln_assertion(lena2 == lena);
+  return 0;
 }
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/Makefile.am
diff --git a/milena/tests/io/ppm/ppm.cc b/scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc
similarity index 63%
copy from milena/tests/io/ppm/ppm.cc
copy to scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc
index c2dac07..cec04e7 100644
--- a/milena/tests/io/ppm/ppm.cc
+++ b/scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -23,32 +23,35 @@
 // exception does not however invalidate any other reasons why the
 // executable file might be covered by the GNU General Public License.
 
+/// \file
+///
+/// \brief Example of using rgb8_t_rgbn transformation to compute 3d histogram.
+///
+
+
+#include <mln/accu/stat/histo3d_rgb.hh>
 #include <mln/core/image/image2d.hh>
 #include <mln/core/image/image3d.hh>
-#include <mln/core/image/dmorph/slice_image.hh>
-#include <mln/value/rgb8.hh>
-
+#include <mln/data/compute.hh>
+#include <mln/data/transform.hh>
+#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+#include <mln/img_path.hh>
 #include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-
-#include <mln/data/compare.hh>
-
-#include <mln/util/array.hh>
-
-#include <mln/literal/colors.hh>
-
-#include "tests/data.hh"
-
+#include <mln/value/rgb.hh>
+#include <mln/value/rgb8.hh>
 
 int main()
 {
-  using namespace mln;
-  using value::rgb8;
+  typedef mln::value::rgb8   t_rgb8;
+  typedef mln::value::rgb<7> t_rgb7;
+  mln::image2d<t_rgb8>       img_rgb8;
+  mln::image2d<t_rgb7>       img_rgb7;
+  mln::image3d<unsigned>     histo;
+
+  mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+  img_rgb7 = mln::data::transform(img_rgb8, mln::fun::v2v::rgb8_to_rgbn<7>());
 
-  image2d<rgb8> lena = io::ppm::load<rgb8>(MLN_IMG_DIR "/lena.ppm");
-  io::ppm::save(lena, "out.ppm");
+  histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(), img_rgb7);
 
-  image2d<rgb8> lena2;
-  io::ppm::load(lena2, "out.ppm");
-  mln_assertion(lena2 == lena);
+  return 0;
 }
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/fun/v2v/rgb_to_rg/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/fun/v2v/rgb_to_rg/Makefile.am
diff --git a/milena/tests/fun/v2v/hsl_to_rgb.cc b/scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc
similarity index 59%
copy from milena/tests/fun/v2v/hsl_to_rgb.cc
copy to scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc
index 237e605..8e612b2 100644
--- a/milena/tests/fun/v2v/hsl_to_rgb.cc
+++ b/scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -23,33 +23,36 @@
 // exception does not however invalidate any other reasons why the
 // executable file might be covered by the GNU General Public License.
 
+/// \file
+///
+/// \brief Example of using rgb_t_rg transformation to compute 2d histogram.
+///
+
+#include <mln/accu/stat/histo2d.hh>
 #include <mln/core/image/image2d.hh>
-#include <mln/fun/v2v/hsl_to_rgb.hh>
-#include <mln/data/compare.hh>
+#include <mln/data/compute.hh>
 #include <mln/data/transform.hh>
-#include <mln/value/hsl.hh>
+#include <mln/fun/v2v/rgb_to_rg.hh>
+#include <mln/img_path.hh>
+#include <mln/io/ppm/load.hh>
+#include <mln/value/rg.hh>
 #include <mln/value/rgb8.hh>
 
-
 int main()
 {
-  using namespace mln;
-
-  using mln::value::rgb8;
-  using mln::value::hsl_f;
-
-  rgb8 ref[][2] = { { rgb8(0,0,0), rgb8(255,255,255) },
-		    { rgb8(128,128,128), rgb8(90,90, 90) } };
-
-  hsl_f dat[][2] = { { hsl_f(0,0,0), hsl_f(0,0,1.0) },
-		     { hsl_f(0,0,128.0 / 255.0), hsl_f(0,0,90.0 / 255.0) } };
-
-  image2d<rgb8> ref_ima = make::image(ref);
-  image2d<hsl_f> ima = make::image(dat);
-
-  image2d<value::rgb8> ima_rgb = data::transform(ima,
-						 fun::v2v::f_hsl_to_rgb_3x8);
-
-  // mln_assertion(ima_rgb == ref_ima);
-  (void) ima_rgb;
+  typedef mln::value::rg<8>		t_rg8;
+  typedef mln::value::rgb8		t_rgb8;
+  typedef mln::fun::v2v::rgb_to_rg<8>	t_rgb_to_rg;
+  typedef mln::image2d<t_rg8>		t_image2d_rg8;
+  typedef mln::image2d<t_rgb8>		t_image2d_rgb8;
+  typedef mln::image2d<unsigned>	t_histo;
+  t_image2d_rgb8			img_rgb8;
+  t_image2d_rg8				img_rg8;
+  t_histo				histo;
+
+  mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+  img_rg8 = mln::data::transform(img_rgb8, t_rgb_to_rg());
+  histo   = mln::data::compute(mln::accu::meta::stat::histo2d(), img_rg8);
+
+  return 0;
 }
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/value/rg/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/value/rg/Makefile.am
diff --git a/milena/tests/fun/v2v/hsl_to_rgb.cc b/scribo/sandbox/green/use/value/rg/rg.cc
similarity index 60%
copy from milena/tests/fun/v2v/hsl_to_rgb.cc
copy to scribo/sandbox/green/use/value/rg/rg.cc
index 237e605..b5ea15f 100644
--- a/milena/tests/fun/v2v/hsl_to_rgb.cc
+++ b/scribo/sandbox/green/use/value/rg/rg.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
 //
 // This file is part of Olena.
 //
@@ -23,33 +23,36 @@
 // exception does not however invalidate any other reasons why the
 // executable file might be covered by the GNU General Public License.
 
+/// \file
+///
+/// \brief Example of using rg to compute an 2d histogram.
+///
+
+#include <mln/accu/stat/histo2d.hh>
 #include <mln/core/image/image2d.hh>
-#include <mln/fun/v2v/hsl_to_rgb.hh>
-#include <mln/data/compare.hh>
+#include <mln/data/compute.hh>
 #include <mln/data/transform.hh>
-#include <mln/value/hsl.hh>
+#include <mln/fun/v2v/rgb_to_rg.hh>
+#include <mln/img_path.hh>
+#include <mln/io/ppm/load.hh>
+#include <mln/value/rg.hh>
 #include <mln/value/rgb8.hh>
 
-
 int main()
 {
-  using namespace mln;
-
-  using mln::value::rgb8;
-  using mln::value::hsl_f;
-
-  rgb8 ref[][2] = { { rgb8(0,0,0), rgb8(255,255,255) },
-		    { rgb8(128,128,128), rgb8(90,90, 90) } };
-
-  hsl_f dat[][2] = { { hsl_f(0,0,0), hsl_f(0,0,1.0) },
-		     { hsl_f(0,0,128.0 / 255.0), hsl_f(0,0,90.0 / 255.0) } };
-
-  image2d<rgb8> ref_ima = make::image(ref);
-  image2d<hsl_f> ima = make::image(dat);
-
-  image2d<value::rgb8> ima_rgb = data::transform(ima,
-						 fun::v2v::f_hsl_to_rgb_3x8);
-
-  // mln_assertion(ima_rgb == ref_ima);
-  (void) ima_rgb;
+  typedef mln::value::rg<8>		t_rg8;
+  typedef mln::value::rgb8		t_rgb8;
+  typedef mln::fun::v2v::rgb_to_rg<8>	t_rgb_to_rg;
+  typedef mln::image2d<t_rg8>		t_image2d_rg8;
+  typedef mln::image2d<t_rgb8>		t_image2d_rgb8;
+  typedef mln::image2d<unsigned>	t_histo;
+  t_image2d_rgb8			img_rgb8;
+  t_image2d_rg8				img_rg8;
+  t_histo				histo;
+
+  mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+  img_rg8 = mln::data::transform(img_rgb8, t_rgb_to_rg());
+  histo   = mln::data::compute(mln::accu::meta::stat::histo2d(), img_rg8);
+
+  return 0;
 }
-- 
1.5.6.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            last-svn-commit-180-g2da0101 Clean up and new	FIXMES in in apps/mesh-segm-skel.
                        
                        
by Roland Levillain 21 Jun '10
                    by Roland Levillain 21 Jun '10
21 Jun '10
                    
                        	* apps/mesh-segm-skel/mesh-complex-max-curv.cc: Remove dead code.
	* apps/mesh-segm-skel/mesh-complex-skel.cc: Typo.
	* apps/mesh-segm-skel/Makefile.am: Add titles and FIXMES.
---
 milena/ChangeLog                                   |    8 ++++
 milena/apps/mesh-segm-skel/Makefile.am             |   36 ++++++++++++++++++--
 .../apps/mesh-segm-skel/mesh-complex-max-curv.cc   |   13 +------
 milena/apps/mesh-segm-skel/mesh-complex-skel.cc    |    2 +-
 4 files changed, 44 insertions(+), 15 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 58cd008..8b45871 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,5 +1,13 @@
 2010-05-11  Roland Levillain  <roland(a)lrde.epita.fr>
 
+	Clean up and new FIXMES in in apps/mesh-segm-skel.
+
+	* apps/mesh-segm-skel/mesh-complex-max-curv.cc: Remove dead code.
+	* apps/mesh-segm-skel/mesh-complex-skel.cc: Typo.
+	* apps/mesh-segm-skel/Makefile.am: Add titles and FIXMES.
+
+2010-05-11  Roland Levillain  <roland(a)lrde.epita.fr>
+
 	New application: mesh-complex-max-curv-extrema.
 
 	* apps/mesh-segm-skel/mesh-complex-max-curv-extrema.cc: New.
diff --git a/milena/apps/mesh-segm-skel/Makefile.am b/milena/apps/mesh-segm-skel/Makefile.am
index 460e6e9..b702ccb 100644
--- a/milena/apps/mesh-segm-skel/Makefile.am
+++ b/milena/apps/mesh-segm-skel/Makefile.am
@@ -79,11 +79,13 @@ endif ENABLE_TRIMESH
 if ENABLE_TRIMESH
   bin_PROGRAMS += mesh-pinv-curv mesh-max-curv
 
+  # FIXME: Rename as mesh-trimesh-pinv-curv?
   mesh_pinv_curv_SOURCES = mesh-pinv-curv.cc io.hh
   mesh_pinv_curv_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_trimesh)
   mesh_pinv_curv_LDFLAGS = $(LDFLAGS_trimesh)
   mesh_pinv_curv_LDADD = $(LDADD_trimesh)
 
+  # FIXME: Rename as mesh-trimesh-max-curv?
   mesh_max_curv_SOURCES = mesh-max-curv.cc io.hh
   mesh_max_curv_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_trimesh)
   mesh_max_curv_LDFLAGS = $(LDFLAGS_trimesh)
@@ -93,17 +95,34 @@ if ENABLE_TRIMESH
 endif ENABLE_TRIMESH
 
 ## ---------------------------------------------------- ##
+## Graph-based applications, independent of Trimesh.    ##
+## ---------------------------------------------------- ##
+
+# FIXME: To be written (and factored, of course):
+#
+#  mesh-graph-{max,pinv}-curv
+#
+#  mesh-graph-segm
+#  mesh-graph-{max,pinv}-curv-segm
+#
+#  mesh-graph-skel
+#  mesh-graph-{max,pinv}-curv-skel
+#
+#  ...
+
+## ---------------------------------------------------- ##
 ## Complex-based applications, independent of Trimesh.  ##
 ## ---------------------------------------------------- ##
 
 # A Milena re-implementation of some features from Trimesh.  This code
 # is completely independent from the Trimesh library.
 # FIXME: Change the name of this directory, as it is confusing.
+# FIXME: Integrate this header into Milena.
 noinst_HEADERS = trimesh/misc.hh
 EXTRA_DIST = trimesh/README
 
-## Segmentation.
-## ------------
+## Curvature computation.
+## ----------------------
 
 # A small program exercising the curvature computation routines ported
 # from Trimesh to Milena.
@@ -112,6 +131,7 @@ mesh_complex_max_curv_SOURCES = mesh-complex-max-curv.cc
 TESTS += test-mesh-complex-max-curv
 CLEANFILES += teapot-complex-max-curv.off
 
+# FIXME: Implement (and exercise) mesh-complex-pinv-curv.
 
 # A program computing the max curvature at each (2-)face of the
 # surface of a triangle mesh and displaying its local minima
@@ -123,7 +143,14 @@ CLEANFILES +=					\
   socket-complex-max-curv-extrema.off		\
   teapot-complex-max-curv-extrema.off
 
-# Segmentation program working on precomputed meshes with curvatures data.
+# FIXME: Implement (and exercise) mesh-complex-pinv-curv-extrema.
+
+## Segmentation.
+## -------------
+
+# Segmentation program working on precomputed meshes with curvature
+# data.  Less accurate, since curvature is stored on triangles
+# (polygons), whereas the segmentation is performed on edges.
 bin_PROGRAMS += mesh-complex-segm
 mesh_complex_segm_SOURCES = mesh-complex-segm.cc
 TESTS += test-mesh-complex-segm
@@ -159,3 +186,6 @@ CLEANFILES +=					\
   socket-max-curv-skel.off			\
   teapot-max-curv.off				\
   three-triangles-skel.off
+
+# FIXME: Implement `mesh-complex-{max,pinv}-curv-skel'.
+# ...
diff --git a/milena/apps/mesh-segm-skel/mesh-complex-max-curv.cc b/milena/apps/mesh-segm-skel/mesh-complex-max-curv.cc
index 8d79839..79ac4ea 100644
--- a/milena/apps/mesh-segm-skel/mesh-complex-max-curv.cc
+++ b/milena/apps/mesh-segm-skel/mesh-complex-max-curv.cc
@@ -1,4 +1,5 @@
-// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2008, 2009, 2010 EPITA Research and Development
+// Laboratory (LRDE)
 //
 // This file is part of the Milena Library.  This library is free
 // software; you can redistribute it and/or modify it under the terms
@@ -86,16 +87,6 @@ int main(int argc, char* argv[])
   mln::bin_2complex_image3df input;
   mln::io::off::load(input, input_filename);
 
-//   // ------------------------------------------------------------
-//   // FIXME: TEST.
-//   mln::complex_image< 2, mln::space_2complex_geometry, mln::algebra::vec<3, float> >
-//     normal = mesh_normal(input.domain());
-//   mln::p_n_faces_fwd_piter<D, G> v_(normal.domain(), 0);
-//   for_all(v_)
-//     std::cout << normal(v_) << std::endl;
-//   std::exit(0);
-//   // ------------------------------------------------------------
-
   std::pair<ima_t, ima_t> curv = mln::geom::mesh_curvature(input.domain());
 
   // Compute the max curvature at each vertex.
diff --git a/milena/apps/mesh-segm-skel/mesh-complex-skel.cc b/milena/apps/mesh-segm-skel/mesh-complex-skel.cc
index a4df815..b7e1f1f 100644
--- a/milena/apps/mesh-segm-skel/mesh-complex-skel.cc
+++ b/milena/apps/mesh-segm-skel/mesh-complex-skel.cc
@@ -209,7 +209,7 @@ main(int argc, char* argv[])
   `---------*/
 
   /* FIXME: This does not work (yet).
-     Use workaround mln::io::off::save_bin_salt instead (bad!)  */
+     Use workaround mln::io::off::save_bin_alt instead (bad!)  */
 #if 0
   mln::io::off::save(skel | mln::pw::value(skel) == mln::pw::cst(true),
 		     output_filename);
-- 
1.5.6.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            last-svn-commit-179-g3cdb8bb Configure	milena/apps/mesh-segm-skel/test-mesh-complex-max-curv-extrema.
                        
                        
by Roland Levillain 21 Jun '10
                    by Roland Levillain 21 Jun '10
21 Jun '10
                    
                        	* configure.ac: Here.
---
 ChangeLog    |    6 ++++++
 configure.ac |    2 ++
 2 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 57df1c6..6c4d3ff 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2010-05-11  Roland Levillain  <roland(a)lrde.epita.fr>
+
+	Configure milena/apps/mesh-segm-skel/test-mesh-complex-max-curv-extrema.
+
+	* configure.ac: Here.
+
 2010-04-23  Roland Levillain  <roland(a)lrde.epita.fr>
 
 	Add variables for C++ compiler flags for Scribo.
diff --git a/configure.ac b/configure.ac
index 20efb20..4d6bfaf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -505,6 +505,8 @@ AC_CONFIG_FILES([milena/apps/mesh-segm-skel/test-mesh-max-curv],
 		[chmod +x milena/apps/mesh-segm-skel/test-mesh-max-curv])
 AC_CONFIG_FILES([milena/apps/mesh-segm-skel/test-mesh-complex-max-curv],
 		[chmod +x milena/apps/mesh-segm-skel/test-mesh-complex-max-curv])
+AC_CONFIG_FILES([milena/apps/mesh-segm-skel/test-mesh-complex-max-curv-extrema],
+		[chmod +x milena/apps/mesh-segm-skel/test-mesh-complex-max-curv-extrema])
 AC_CONFIG_FILES([milena/apps/mesh-segm-skel/test-mesh-segm],
 		[chmod +x milena/apps/mesh-segm-skel/test-mesh-segm])
 AC_CONFIG_FILES([milena/apps/mesh-segm-skel/test-mesh-complex-segm],
-- 
1.5.6.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            last-svn-commit-178-g7c9b5a3 New application:	mesh-complex-max-curv-extrema.
                        
                        
by Roland Levillain 21 Jun '10
                    by Roland Levillain 21 Jun '10
21 Jun '10
                    
                        	* apps/mesh-segm-skel/mesh-complex-max-curv-extrema.cc: New.
	* apps/mesh-segm-skel/test-mesh-complex-max-curv-extrema.in: New.
	* apps/mesh-segm-skel/Makefile.am (bin_PROGRAMS): Add
	mesh-complex-max-curv-extrema.
	(mesh_complex_max_curv_extrema_SOURCES): New.
	(TESTS): Add test-mesh-complex-max-curv-segm-extrema.
	(CLEANFILES): Add socket-complex-max-curv-segm-extrema.off,
	teapot-complex-max-curv-segm-extrema.off and
	bunny-holefilled-complex-max-curv-segm-extrema.off.
---
 milena/ChangeLog                                   |   14 +++
 milena/apps/mesh-segm-skel/Makefile.am             |   13 ++-
 ...ax-curv.cc => mesh-complex-max-curv-extrema.cc} |  105 +++++++++++++-------
 .../test-mesh-complex-max-curv-extrema.in          |   10 ++
 4 files changed, 102 insertions(+), 40 deletions(-)
 copy milena/apps/mesh-segm-skel/{mesh-complex-max-curv.cc => mesh-complex-max-curv-extrema.cc} (64%)
 create mode 100644 milena/apps/mesh-segm-skel/test-mesh-complex-max-curv-extrema.in
diff --git a/milena/ChangeLog b/milena/ChangeLog
index f112bea..58cd008 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,5 +1,19 @@
 2010-05-11  Roland Levillain  <roland(a)lrde.epita.fr>
 
+	New application: mesh-complex-max-curv-extrema.
+
+	* apps/mesh-segm-skel/mesh-complex-max-curv-extrema.cc: New.
+	* apps/mesh-segm-skel/test-mesh-complex-max-curv-extrema.in: New.
+	* apps/mesh-segm-skel/Makefile.am (bin_PROGRAMS): Add
+	mesh-complex-max-curv-extrema.
+	(mesh_complex_max_curv_extrema_SOURCES): New.
+	(TESTS): Add test-mesh-complex-max-curv-segm-extrema.
+	(CLEANFILES): Add socket-complex-max-curv-segm-extrema.off,
+	teapot-complex-max-curv-segm-extrema.off and
+	bunny-holefilled-complex-max-curv-segm-extrema.off.
+
+2010-05-11  Roland Levillain  <roland(a)lrde.epita.fr>
+
 	Revive, fix and update application mesh-segm.
 
 	* apps/mesh-segm-skel/mesh-segm.cc: Catch up with the new
diff --git a/milena/apps/mesh-segm-skel/Makefile.am b/milena/apps/mesh-segm-skel/Makefile.am
index aa71ef3..460e6e9 100644
--- a/milena/apps/mesh-segm-skel/Makefile.am
+++ b/milena/apps/mesh-segm-skel/Makefile.am
@@ -112,9 +112,16 @@ mesh_complex_max_curv_SOURCES = mesh-complex-max-curv.cc
 TESTS += test-mesh-complex-max-curv
 CLEANFILES += teapot-complex-max-curv.off
 
-# FIXME: Write a program showing the local minima (and maxima) of
-# scalar-valued complex-based mesh (to see the curvature extrema).
-# ...
+
+# A program computing the max curvature at each (2-)face of the
+# surface of a triangle mesh and displaying its local minima
+# (in blue) and maxima (in red).
+bin_PROGRAMS += mesh-complex-max-curv-extrema
+mesh_complex_max_curv_extrema_SOURCES = mesh-complex-max-curv-extrema.cc
+TESTS += test-mesh-complex-max-curv-extrema
+CLEANFILES +=					\
+  socket-complex-max-curv-extrema.off		\
+  teapot-complex-max-curv-extrema.off
 
 # Segmentation program working on precomputed meshes with curvatures data.
 bin_PROGRAMS += mesh-complex-segm
diff --git a/milena/apps/mesh-segm-skel/mesh-complex-max-curv.cc b/milena/apps/mesh-segm-skel/mesh-complex-max-curv-extrema.cc
similarity index 64%
copy from milena/apps/mesh-segm-skel/mesh-complex-max-curv.cc
copy to milena/apps/mesh-segm-skel/mesh-complex-max-curv-extrema.cc
index 8d79839..8f68b3d 100644
--- a/milena/apps/mesh-segm-skel/mesh-complex-max-curv.cc
+++ b/milena/apps/mesh-segm-skel/mesh-complex-max-curv-extrema.cc
@@ -1,4 +1,5 @@
-// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2008, 2009, 2010 EPITA Research and Development
+// Laboratory (LRDE)
 //
 // This file is part of the Milena Library.  This library is free
 // software; you can redistribute it and/or modify it under the terms
@@ -25,10 +26,11 @@
 // reasons why the executable file might be covered by the GNU General
 // Public License.
 
-/// \file apps/mesh-segm-skel/mesh-complex-max-curv.cc
+/// \file apps/mesh-segm-skel/mesh-complex-max-curv-extrema.cc
 /// \brief A program computing the max curvature at each (2-)face of
-/// the surface of the (triangle) mesh of a statue, using a
-/// complex-based image.
+/// the surface of the (triangle) mesh of a statue, using
+/// complex-based image, and displaying its local minima (in blue) and
+/// maxima (in red).
 
 #include <cstdlib>
 #include <cmath>
@@ -42,13 +44,20 @@
 #include <mln/data/fill.hh>
 #include <mln/literal/zero.hh>
 
+#include <mln/labeling/regional_minima.hh>
+#include <mln/labeling/regional_maxima.hh>
+
 #include <mln/math/max.hh>
 #include <mln/math/sqr.hh>
 #include <mln/accu/stat/min_max.hh>
 #include <mln/fun/v2v/linear.hh>
 #include <mln/data/transform.hh>
 
+#include <mln/value/label_16.hh>
+
 #include <mln/literal/white.hh>
+#include <mln/literal/grays.hh>
+#include <mln/literal/colors.hh>
 
 #include <mln/io/off/load.hh>
 #include <mln/io/off/save.hh>
@@ -86,16 +95,6 @@ int main(int argc, char* argv[])
   mln::bin_2complex_image3df input;
   mln::io::off::load(input, input_filename);
 
-//   // ------------------------------------------------------------
-//   // FIXME: TEST.
-//   mln::complex_image< 2, mln::space_2complex_geometry, mln::algebra::vec<3, float> >
-//     normal = mesh_normal(input.domain());
-//   mln::p_n_faces_fwd_piter<D, G> v_(normal.domain(), 0);
-//   for_all(v_)
-//     std::cout << normal(v_) << std::endl;
-//   std::exit(0);
-//   // ------------------------------------------------------------
-
   std::pair<ima_t, ima_t> curv = mln::geom::mesh_curvature(input.domain());
 
   // Compute the max curvature at each vertex.
@@ -133,29 +132,61 @@ int main(int argc, char* argv[])
     mln_invariant(n <= 3);
   }
 
-  // Normalize values between 0 and 1.
-  /* Shrink the values of FACE_M into the range 0..1, as these are
-     the only values accepted a an RGB floating-point component in the
-     OFF file format.  */
-  ima_t output(max_curv.domain());
-  mln::data::fill(output, mln::literal::zero);
-  std::pair<float, float> min_max(acc);
-  // FIXME: Taken from mln/data/stretch.hh (this should be factored).
-  float min = min_max.first;
-  float max = min_max.second;
-  std::cout << min << std::endl;
-  std::cout << max << std::endl;
-  // Don't normalize actually if the curvature is constant (i.e.,
-  // if min == max).
-  if (min != max)
-    {
-      float m = 0.0f;
-      float M = 1.0f;
-      float a = (M - m) / (max - min);
-      float b = (m * max - M * min) / (max - min);
-      mln::fun::v2v::linear<float, float, float> f(a, b);
-      output = mln::data::transform(max_curv, f);
-    }
+  /*----------------.
+  | Local extrema.  |
+  `----------------*/
+
+  /// Adjacent triangles are connected by shared edges.
+  typedef mln::complex_lower_dim_connected_n_face_neighborhood<D, G> nbh_t;
+  nbh_t nbh;
+
+  typedef mln::value::label_16 label_t;
+  typedef mln_ch_value_(ima_t, label_t) label_ima_t;
+
+  /* FIXME: We should use something like `ima_t | p_n_faces(2)' instead
+     of `ima_t' here.  Or better: `input' should only associate data
+     to 2-faces.  */
+  label_t nminima;
+  label_ima_t minima =
+    mln::labeling::regional_minima(max_curv, nbh, nminima);
+  std::cout << "nminima = " << nminima << std::endl;
+
+  label_t nmaxima;
+  label_ima_t maxima =
+    mln::labeling::regional_maxima(max_curv, nbh, nmaxima);
+  std::cout << "nmaxima = " << nmaxima << std::endl;
+
+  /*-----------------.
+  | Colored output.  |
+  `-----------------*/
+
+  typedef mln::rgb8_2complex_image3df output_t;
+  output_t output(max_curv.domain());
+
+  for_all(t)
+  {
+    if (minima(t) != mln::literal::zero)
+      {
+	// Special (unexpected) case: T is both a minimum and a
+	// maximum.  Paint it in magenta (blue + red).
+	if (maxima(t) != mln::literal::zero)
+	  {
+	    std::cerr
+	      << "warning: " << t << " is both a minimum and a maximum."
+	      << std::endl;
+	    output(t) = mln::literal::magenta;
+	  }
+	else
+	  // Paint minimum T in blue.
+	  output(t) = mln::literal::blue;
+      }
+    else if (maxima(t) != mln::literal::zero)
+      // Paint maximum T in red.
+      output(t) = mln::literal::red;
+    else
+      // Default color.
+      output(t) = mln::literal::medium_gray;
+  }
 
   // Output.
   mln::io::off::save(output, output_filename);
diff --git a/milena/apps/mesh-segm-skel/test-mesh-complex-max-curv-extrema.in b/milena/apps/mesh-segm-skel/test-mesh-complex-max-curv-extrema.in
new file mode 100644
index 0000000..c6fa1e8
--- /dev/null
+++ b/milena/apps/mesh-segm-skel/test-mesh-complex-max-curv-extrema.in
@@ -0,0 +1,10 @@
+#! /bin/sh
+
+set -ex
+
+mesh_dir=@top_srcdir@/milena/mesh
+
+time ./mesh-complex-max-curv-extrema $mesh_dir/socket.off socket-complex-max-curv-extrema.off
+time ./mesh-complex-max-curv-extrema $mesh_dir/teapot.off teapot-complex-max-curv-extrema.off
+# FIXME: Too long.  Should be run with (future) target `check-full'.
+#time ./mesh-complex-max-curv-extrema $mesh_dir/bunny-holefilled.off bunny-holefilled-complex-max-curv-extrema.off
-- 
1.5.6.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            last-svn-commit-177-g679f73c Revive,	fix and update application mesh-segm.
                        
                        
by Roland Levillain 21 Jun '10
                    by Roland Levillain 21 Jun '10
21 Jun '10
                    
                        	* apps/mesh-segm-skel/mesh-segm.cc: Catch up with the new
	interface of graphs.
	Use mln::edge_image instead of mln::line_graph_image.
	Turn a test into an invariant.
	Use mln::morpho::watershed::flooding instead of
	mln::morpho::meyer_wst.
	* apps/mesh-segm-skel/Makefile.am (bin_PROGRAMS):
	Re-enable mesg-segm.
	(mesh_segm_SOURCES, mesh_segm_CPPFLAGS)
	(mesh_segm_LDFLAGS, mesh_segm_LDADD):
	Re-enable.
	(TESTS): Reenable test-mesh-segm.
	(CLEANFILES): Reenable socket-segm.off and teapot-segm.off.
---
 milena/ChangeLog                        |   18 +++++
 milena/apps/mesh-segm-skel/Makefile.am  |   28 +++++----
 milena/apps/mesh-segm-skel/mesh-segm.cc |  110 +++++++++++++++++++------------
 3 files changed, 103 insertions(+), 53 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index c2f04e9..f112bea 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,21 @@
+2010-05-11  Roland Levillain  <roland(a)lrde.epita.fr>
+
+	Revive, fix and update application mesh-segm.
+
+	* apps/mesh-segm-skel/mesh-segm.cc: Catch up with the new
+	interface of graphs.
+	Use mln::edge_image instead of mln::line_graph_image.
+	Turn a test into an invariant.
+	Use mln::morpho::watershed::flooding instead of
+	mln::morpho::meyer_wst.
+	* apps/mesh-segm-skel/Makefile.am (bin_PROGRAMS):
+	Re-enable mesg-segm.
+	(mesh_segm_SOURCES, mesh_segm_CPPFLAGS)
+	(mesh_segm_LDFLAGS, mesh_segm_LDADD):
+	Re-enable.
+	(TESTS): Reenable test-mesh-segm.
+	(CLEANFILES): Reenable socket-segm.off and teapot-segm.off.
+
 2010-05-10  Roland Levillain  <roland(a)lrde.epita.fr>
 
 	Fix a bug in the reimplementation of Trimesh algorithms.
diff --git a/milena/apps/mesh-segm-skel/Makefile.am b/milena/apps/mesh-segm-skel/Makefile.am
index 5852011..aa71ef3 100644
--- a/milena/apps/mesh-segm-skel/Makefile.am
+++ b/milena/apps/mesh-segm-skel/Makefile.am
@@ -1,4 +1,5 @@
-# Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (LRDE).
+# Copyright (C) 2008, 2009, 2010 EPITA Research and Development
+# Laboratory (LRDE).
 #
 # This file is part of Olena.
 #
@@ -49,19 +50,22 @@ CLEANFILES =
 ## ------------------------------------------------ ##
 
 if ENABLE_TRIMESH
-# bin_PROGRAMS += mesh-segm mesh-skel
-# 
-# mesh_segm_SOURCES = mesh-segm.cc io.hh
-# mesh_segm_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_trimesh)
-# mesh_segm_LDFLAGS = $(LDFLAGS_trimesh)
-# mesh_segm_LDADD = $(LDADD_trimesh)
-#
-# TESTS += test-mesh-segm
-# CLEANFILES += socket-segm.off teapot-segm.off
-
-# FIXME: mesh_skel is unfinished.  Anyway, it should be superseded by
-# another program, using no Trimesh code.
-
+## FIXME: Rename as mesh-trimesh-graph-{max,pinv}-curv-segm?
+bin_PROGRAMS += mesh-segm
+mesh_segm_SOURCES = mesh-segm.cc io.hh
+mesh_segm_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_trimesh)
+mesh_segm_LDFLAGS = $(LDFLAGS_trimesh)
+mesh_segm_LDADD = $(LDADD_trimesh)
+
+TESTS += test-mesh-segm
+# FIXME: Likewise.
+CLEANFILES += socket-segm.off teapot-segm.off
+
+# FIXME: mesh_skel is unfinished.  Anyway, it has been be superseded
+# by `mesh-complex-skel' (see below), using no Trimesh code.
+
+## FIXME: Rename as mesh-trimesh-graph-{max,pinv}-curv-skel?
+# bin_PROGRAMS += mesh-skel
 # mesh_skel_SOURCES = mesh-skel.cc io.hh
 # mesh_skel_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_trimesh)
 # mesh_skel_LDFLAGS = $(LDFLAGS_trimesh)
diff --git a/milena/apps/mesh-segm-skel/mesh-segm.cc b/milena/apps/mesh-segm-skel/mesh-segm.cc
index bf87249..06ddc93 100644
--- a/milena/apps/mesh-segm-skel/mesh-segm.cc
+++ b/milena/apps/mesh-segm-skel/mesh-segm.cc
@@ -1,4 +1,5 @@
-// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2008, 2009, 2010 EPITA Research and Development
+// Laboratory (LRDE)
 //
 // This file is part of the Milena Library.  This library is free
 // software; you can redistribute it and/or modify it under the terms
@@ -40,14 +41,18 @@
 #include <TriMesh.h>
 
 #include <mln/core/alias/point3d.hh>
-#include <mln/core/alias/point3d.hh>
+
+#include <mln/fun/i2v/array.hh>
+#include <mln/convert/from_to.hh>
 
 #include <mln/util/graph.hh>
-#include <mln/core/image/line_graph_image.hh>
-#include <mln/core/image/line_graph_elt_neighborhood.hh>
+#include <mln/util/line_graph.hh>
+#include <mln/util/site_pair.hh>
+#include <mln/core/image/edge_image.hh>
+#include <mln/make/edge_image.hh>
 
 #include <mln/morpho/closing/area.hh>
-#include <mln/morpho/meyer_wst.hh>
+#include <mln/morpho/watershed/flooding.hh>
 
 #include "io.hh"
 
@@ -116,12 +121,9 @@ int main(int argc, char* argv[])
   std::vector<curv_t> vertex_values (mesh.faces.size(), 0.f);
   std::vector<curv_t> edge_values;
 
-  /* FIXME: We don't have the required site type yet.  Simulate with a
-     dummy type (point3d).  */
-  mln::util::graph<mln::point3d> g;
+  mln::util::graph g;
   // Populate the graph with vertices.
-  for (unsigned i = 0; i < mesh.faces.size(); ++i)
-    g.add_vertex (mln::point3d(i, i, i));
+  g.add_vertices(mesh.faces.size());
 
   // Populate the graph with edges.
   mesh.need_across_edge();
@@ -132,25 +134,26 @@ int main(int argc, char* argv[])
 	if (f_adj != -1)
 	  {
 	    // Add an edge into the graph.
-	    if (g.add_edge(f, f_adj) != mln_max(mln::util::edge_id::equiv))
-	      {
-		// Find the edge (i.e., the two vertices) common to faces
-		// F and F_ADJ.
-		/* FIXME: We lack a proper interface from the TriMesh
-		   structure to do this elegantly.  */
-		std::vector<int> adj_vertices;
-		adj_vertices.reserve(2);
-		for (unsigned i = 0; i < 3; ++i)
-		  for (unsigned j = 0; j < 3; ++j)
-		    if (mesh.faces[f][i] == mesh.faces[f_adj][j])
-		      adj_vertices.push_back(mesh.faces[f][i]);
-		mln_assertion(adj_vertices.size() == 2);
-		
-		// Compute the mean curvature on the edge.
-		edge_values.push_back((vertex_h_inv[adj_vertices[0]] + 
-				       vertex_h_inv[adj_vertices[1]])
-				      / 2);
-	      }
+	    mln::util::edge_id_t new_edge = g.add_edge(f, f_adj);
+	    mln_invariant(new_edge.is_valid());
+
+	    /* Among the edges adjacent to F and F_ADJ, find the one
+	       they share.  In practice, find the two vertices shared
+	       by F and F_ADJ.  */
+	    /* FIXME: We lack a proper interface from the TriMesh
+	       structure to do this elegantly.  */
+	    std::vector<int> adj_vertices;
+	    adj_vertices.reserve(2);
+	    for (unsigned i = 0; i < 3; ++i)
+	      for (unsigned j = 0; j < 3; ++j)
+		if (mesh.faces[f][i] == mesh.faces[f_adj][j])
+		  adj_vertices.push_back(mesh.faces[f][i]);
+	    mln_assertion(adj_vertices.size() == 2);
+
+	    // Compute the mean curvature on the edge.
+	    edge_values.push_back((vertex_h_inv[adj_vertices[0]] + 
+				   vertex_h_inv[adj_vertices[1]])
+				  / 2);
 
 	    // Check the consistency of the two arrays.
 	    mln_assertion(g.edges().size() == edge_values.size());
@@ -161,19 +164,38 @@ int main(int argc, char* argv[])
   | Line graph image.  |
   `-------------------*/
 
-  mln::p_line_graph<mln::point3d> plg(g);
+  // Points associated to the line graph vertices (edges in the graph).
+  typedef mln::util::site_pair<mln::point3df> P;
+  typedef mln::fun::i2v::array<P> fsite_t;
+  fsite_t sites(g.e_nmax());
+  for (unsigned i = 0; i < g.e_nmax(); ++i)
+    /* FIXME: Add a dummy location information for the moment.  This
+       doesn't really matter as we won't use it to produce the output.
+       However, we may need it later: do not forget to add relevant
+       locations (obtained from the mesh) in a future version of this
+       program.  */
+    sites(i) = P(mln::point3df(0, 0, 0), mln::point3df(1, 1, 1));
+
+  // FIXME: This intermediate structure costs us a copy.
+  typedef mln::fun::i2v::array<curv_t> values_t;
+  values_t values;
+  mln::convert::from_to(edge_values, values);
+
+  typedef mln::edge_image<P, curv_t, mln::util::graph> ima_t;
+  ima_t graph_ima(g, sites, values);
 
-  typedef mln::line_graph_image<mln::point3d, curv_t> ima_t;
-  ima_t lg_ima(plg, vertex_values, edge_values);
 
   /*-----------------.
   | Simplification.  |
   `-----------------*/
 
-  typedef mln::line_graph_elt_neighborhood<mln::point3d> nbh_t;
+  typedef ima_t::nbh_t nbh_t;
   nbh_t nbh;
 
-  ima_t closed_lg_ima = mln::morpho::closing::area(lg_ima, nbh, lambda);
+  // ``Area'' is not a proper term here, since it is defined to the
+  // number of edges in the graph.  Taking into account the actual
+  // area of triangles would be a more clever choice.
+  ima_t closed_graph_ima = mln::morpho::closing::area(graph_ima, nbh, lambda);
 
   /*------.
   | WST.  |
@@ -181,24 +203,30 @@ int main(int argc, char* argv[])
 
   typedef unsigned wst_val_t;
   wst_val_t nbasins;
-  typedef mln::line_graph_image<mln::point3d, wst_val_t> wst_ima_t;
-  wst_ima_t wshed = mln::morpho::meyer_wst(closed_lg_ima, nbh, nbasins);
+  typedef mln_ch_value_(ima_t, wst_val_t) wst_ima_t;
+  wst_ima_t wshed =
+    mln::morpho::watershed::flooding(closed_graph_ima, nbh, nbasins);
   std::cout << "nbasins = " << nbasins << std::endl;
 
   /*------------------------------------------.
   | Label graph vertices (i.e., mesh faces).  |
   `------------------------------------------*/
 
-  /* FIXME: We should be using wshed.vertex_values_ if
-     mln::line_graph_image were fully functional...  */
-  std::vector<unsigned> vertex_label(wshed.domain().nvertices(), 0);
+  // FIXME: Use a vertex_image and a e2v neighborhood instead?
+
+  /* FIXME: p_edges does not provide nvertices(), so we cannot write
+
+       std::vector<unsigned> vertex_label(wshed.domain().nvertices(), 0);
+
+     Likewise, p_vertices does not provide n_edges(). */
+  std::vector<unsigned> vertex_label(wshed.domain().graph().v_nmax(), 0);
   mln_piter_(wst_ima_t) pw(wshed.domain());
   for_all(pw)
     if (wshed(pw) != 0)
       {
 	mln_psite_(wst_ima_t) pp(pw);
-	vertex_label[pp.first_id().to_equiv()] = wshed(pw);
-	vertex_label[pp.second_id().to_equiv()] = wshed(pw);
+	vertex_label[pp.v1().id()] = wshed(pw);
+	vertex_label[pp.v2().id()] = wshed(pw);
       }
 
   /*---------.
-- 
1.5.6.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            last-svn-commit-176-g40ba1ad Fix a bug in the	reimplementation of Trimesh algorithms.
                        
                        
by Roland Levillain 21 Jun '10
                    by Roland Levillain 21 Jun '10
21 Jun '10
                    
                        	* apps/mesh-segm-skel/trimesh/misc.hh (mln::geom::mesh_curvature):
	Always call algebra::ldlt_decomp, even when NDEBUG is defined.
	Typo.
	Avoid a warning about an undefined variable when NDEBUG is not
	defined.
---
 milena/ChangeLog                           |   10 ++++++++++
 milena/apps/mesh-segm-skel/trimesh/misc.hh |   15 +++++++++------
 2 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 72cd006..c2f04e9 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,13 @@
+2010-05-10  Roland Levillain  <roland(a)lrde.epita.fr>
+
+	Fix a bug in the reimplementation of Trimesh algorithms.
+
+	* apps/mesh-segm-skel/trimesh/misc.hh (mln::geom::mesh_curvature):
+	Always call algebra::ldlt_decomp, even when NDEBUG is defined.
+	Typo.
+	Avoid a warning about an undefined variable when NDEBUG is not
+	defined.
+
 2010-05-04  Roland Levillain  <roland(a)lrde.epita.fr>
 
 	Improve topo::skeleton::breadth_first_thinning.
diff --git a/milena/apps/mesh-segm-skel/trimesh/misc.hh b/milena/apps/mesh-segm-skel/trimesh/misc.hh
index 5084632..79eea14 100644
--- a/milena/apps/mesh-segm-skel/trimesh/misc.hh
+++ b/milena/apps/mesh-segm-skel/trimesh/misc.hh
@@ -1,5 +1,5 @@
-// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory
-// (LRDE)
+// Copyright (C) 2008, 2009, 2010 EPITA Research and Development
+// Laboratory (LRDE)
 //
 // This file is part of the Milena Library.  This library is free
 // software; you can redistribute it and/or modify it under the terms
@@ -623,10 +623,13 @@ namespace mln
 
 	  // Least squares solution.
 	  vec3f diag;
-#ifndef NDEBUG
-	  bool ldlt_decomp_sucess_p = algebra::ldlt_decomp(w, diag);
-#endif // ! NDEBUG
-	  mln_assertion(ldlt_decomp_sucess_p);
+	  // Note that algebra::ldlt_decomp has side effects on its
+	  // arguments; this call is not ``just an assertion''.
+	  bool ldlt_decomp_success_p = algebra::ldlt_decomp(w, diag);
+	  mln_assertion(ldlt_decomp_success_p);
+	  // Avoid a warning about an undefined variable when NDEBUG
+	  // is not defined.
+	  (void) ldlt_decomp_success_p;
 	  algebra::ldlt_solve(w, diag, m, m);
 
 	  // Push it back out to the vertices
-- 
1.5.6.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            last-svn-commit-175-g9a842d1 Improve	topo::skeleton::breadth_first_thinning.
                        
                        
by Roland Levillain 21 Jun '10
                    by Roland Levillain 21 Jun '10
21 Jun '10
                    
                        	* mln/topo/skeleton/breadth_first_thinning.hh
	(mln::topo::skeleton::breadth_first_thinning):
	Fix a bias in the algorithm due to a buggy predicate.
	Introduce a temporary psite to help the compiler.
	Fix the type of `output'.
---
 milena/ChangeLog                                   |   10 ++++++++++
 milena/mln/topo/skeleton/breadth_first_thinning.hh |   20 ++++++++++++++------
 2 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 69c050f..72cd006 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,13 @@
+2010-05-04  Roland Levillain  <roland(a)lrde.epita.fr>
+
+	Improve topo::skeleton::breadth_first_thinning.
+
+	* mln/topo/skeleton/breadth_first_thinning.hh
+	(mln::topo::skeleton::breadth_first_thinning):
+	Fix a bias in the algorithm due to a buggy predicate.
+	Introduce a temporary psite to help the compiler.
+	Fix the type of `output'.
+
 2010-05-11  Roland Levillain  <roland(a)lrde.epita.fr>
 
 	Add missing const qualifiers in iterators on complexes.
diff --git a/milena/mln/topo/skeleton/breadth_first_thinning.hh b/milena/mln/topo/skeleton/breadth_first_thinning.hh
index 42e1bef..8039ffb 100644
--- a/milena/mln/topo/skeleton/breadth_first_thinning.hh
+++ b/milena/mln/topo/skeleton/breadth_first_thinning.hh
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2009, 2010 EPITA Research and Development Laboratory (LRDE)
 //
 // This file is part of Olena.
 //
@@ -90,7 +90,7 @@ namespace mln
 	F& is_simple = exact(is_simple_);
 	const H& constraint = exact(constraint_);
 
-	I output = duplicate(input);
+	mln_concrete(I) output = duplicate(input);
 	// Attach the work image to IS_SIMPLE.
 	is_simple.set_image(output);
 
@@ -133,15 +133,23 @@ namespace mln
 		/* FIXME: We compute the cell and attachment of P twice:
 		   during the call to is_simple() and within detach().
 		   How could we reuse this elegantly, without breaking
-		   the genericity of the skeleton algorithm?  */
+		   the genericity of the skeleton algorithm?
+		   Also, keep in mind that functors can maintain an
+		   internal state and make side effects, meaning that
+		   e.g. constraint(p) might not be constant for a
+		   given p during the thinning.  */
 		if (constraint(p) && is_simple(p))
 		  {
 		    detach(p, output);
-		    mln_niter(N) n(nbh, p);
-		    for_all(n)
+		    mln_niter(N) n_(nbh, p);
+		    for_all(n_)
+		    {
+		      // Same remark as above regarding P and P_.
+		      psite n = n_;
 		      if (output.domain().has(n)
-			  && output(n) && constraint(p) && is_simple(n))
+			  && output(n) && constraint(n) && is_simple(n))
 			next_set.insert(n);
+		    }
 		  }
 	      }
 	    set.clear();
-- 
1.5.6.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0