Olena-patches
Threads by month
- ----- 2025 -----
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- 9625 discussions
24 Jun '10
* mln/accu/stat/histo1d.hh: New header file.
* mln/accu/stat/histo2d.hh: New header file.
* mln/accu/stat/histo3d_hsl.hh: New header file.
* mln/accu/stat/histo3d_rgb.hh: New header file.
* mln/clustering/k_mean.hh: New header file.
* mln/clustering/kmean1d.hh: New header file.
* mln/clustering/kmean2d.hh: New header file.
* mln/clustering/kmean3d.hh: New header file.
* mln/clustering/kmean_rgb.hh: New header file.
* mln/display/display_histo.hh: New header file.
* mln/display/project_histo.hh: New header file.
* mln/fun/p2b/achromatic.hh: New header file.
* mln/fun/p2b/component_equals.hh: New header file.
* mln/fun/v2v/achromatism.hh: New header file.
* mln/fun/v2v/hue_concentration.hh: New header file.
* mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
* mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
* mln/fun/v2v/log.hh: New header file.
* mln/fun/v2v/rg_to_rgb.hh: New header file.
* mln/fun/v2v/rgb8_to_int_u8: New header file.
* mln/fun/v2v/rgb_to_achromastism_map.hh: New header file.
* mln/fun/v2v/rgb_to_hsv.hh: New header file.
* mln/fun/v2v/rgb_to_hue_map.hh: New header file.
* mln/fun/v2v/rgb_to_saturation_map.hh: New header file.
* mln/fun/v2v/rgb_to_value_map.hh: New header file.
* mln/img_path.hh: New header file.
* mln/io/plot/save_image_sh.hh: New header file.
* mln/math/cell.hh: New header file.
* mln/math/floor.hh: New header file.
* tests/accu/stat/histo1d/Makefile.am: New makefile.
* tests/accu/stat/histo1d/histo1d.cc: New source.
* tests/accu/stat/histo2d/Makefile.am: New makefile.
* tests/accu/stat/histo2d/histo2d.cc: New source.
---
scribo/sandbox/green/ChangeLog | 47 +
scribo/sandbox/green/README | 223 ++++-
scribo/sandbox/green/mln/accu/stat/histo1d.hh | 340 +++++++
scribo/sandbox/green/mln/accu/stat/histo2d.hh | 358 +++++++
.../sandbox/green/mln/accu/stat/histo3d_hsl.hh | 0
.../sandbox/green/mln/accu/stat/histo3d_rgb.hh | 0
.../sandbox/green/mln/clustering/k_mean.hh | 0
.../sandbox/green/mln/clustering/kmean1d.hh | 0
.../sandbox/green/mln/clustering/kmean2d.hh | 0
.../sandbox/green/mln/clustering/kmean3d.hh | 0
.../sandbox/green/mln/clustering/kmean_rgb.hh | 0
.../sandbox/green/mln/display/display_histo.hh | 0
.../sandbox/green/mln/display/project_histo.hh | 0
.../sandbox/green/mln/fun/p2b/achromatic.hh | 0
.../sandbox/green/mln/fun/p2b/component_equals.hh | 0
.../sandbox/green/mln/fun/v2v/achromatism.hh | 0
.../sandbox/green/mln/fun/v2v/hue_concentration.hh | 0
.../green/mln/fun/v2v/int_u16_to_int_u14.hh | 0
.../sandbox/green/mln/fun/v2v/log.hh | 0
.../sandbox/green/mln/fun/v2v/rg_to_rgb.hh | 0
.../sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh | 0
.../sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh | 0
.../green/mln/fun/v2v/rgb_to_achromatism_map.hh | 0
.../sandbox/green/mln/fun/v2v/rgb_to_hsv.hh | 0
.../sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh | 0
scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh | 111 ++
.../green/mln/fun/v2v/rgb_to_saturation_map.hh | 0
.../sandbox/green/mln/fun/v2v/rgb_to_value_map.hh | 0
{milena => scribo}/sandbox/green/mln/img_path.hh | 0
scribo/sandbox/green/mln/io/plot/save_image_sh.hh | 1056 ++++++++++++++++++++
{milena => scribo}/sandbox/green/mln/math/ceil.hh | 0
{milena => scribo}/sandbox/green/mln/math/floor.hh | 0
{milena => scribo}/sandbox/green/mln/value/hsv.hh | 0
scribo/sandbox/green/mln/value/rg.hh | 175 ++++
.../green/tests/accu/stat/histo1d/Makefile.am | 153 +++
.../green/tests/accu/stat/histo1d/histo1d.cc | 21 +
.../green/use/accu/stat/histo1d/Makefile.am | 153 +++
.../sandbox/green/use/accu/stat/histo1d/histo1d.cc | 24 +
.../green/use/accu/stat/histo2d/Makefile.am | 153 +++
.../sandbox/green/use/accu/stat/histo2d/histo2d.cc | 33 +
40 files changed, 2829 insertions(+), 18 deletions(-)
create mode 100644 scribo/sandbox/green/mln/accu/stat/histo1d.hh
create mode 100644 scribo/sandbox/green/mln/accu/stat/histo2d.hh
copy {milena => scribo}/sandbox/green/mln/accu/stat/histo3d_hsl.hh (100%)
copy {milena => scribo}/sandbox/green/mln/accu/stat/histo3d_rgb.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/k_mean.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/kmean1d.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/kmean2d.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/kmean3d.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/kmean_rgb.hh (100%)
copy {milena => scribo}/sandbox/green/mln/display/display_histo.hh (100%)
copy {milena => scribo}/sandbox/green/mln/display/project_histo.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/p2b/achromatic.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/p2b/component_equals.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/achromatism.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/hue_concentration.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/log.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rg_to_rgb.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb_to_achromatism_map.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh (100%)
create mode 100644 scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb_to_saturation_map.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb_to_value_map.hh (100%)
copy {milena => scribo}/sandbox/green/mln/img_path.hh (100%)
create mode 100644 scribo/sandbox/green/mln/io/plot/save_image_sh.hh
copy {milena => scribo}/sandbox/green/mln/math/ceil.hh (100%)
copy {milena => scribo}/sandbox/green/mln/math/floor.hh (100%)
copy {milena => scribo}/sandbox/green/mln/value/hsv.hh (100%)
create mode 100644 scribo/sandbox/green/mln/value/rg.hh
create mode 100644 scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
create mode 100644 scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
create mode 100644 scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
create mode 100644 scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
create mode 100644 scribo/sandbox/green/use/accu/stat/histo2d/Makefile.am
create mode 100644 scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog
index ed399c5..6a3c8fa 100644
--- a/scribo/sandbox/green/ChangeLog
+++ b/scribo/sandbox/green/ChangeLog
@@ -1,3 +1,50 @@
+2010-06-24 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Import files from milena/sandbox/green.
+
+ * mln/accu/stat/histo1d.hh: New header file.
+ * mln/accu/stat/histo2d.hh: New header file.
+ * mln/accu/stat/histo3d_hsl.hh: New header file.
+ * mln/accu/stat/histo3d_rgb.hh: New header file.
+ * mln/clustering/k_mean.hh: New header file.
+ * mln/clustering/kmean1d.hh: New header file.
+ * mln/clustering/kmean2d.hh: New header file.
+ * mln/clustering/kmean3d.hh: New header file.
+ * mln/clustering/kmean_rgb.hh: New header file.
+ * mln/display/display_histo.hh: New header file.
+ * mln/display/project_histo.hh: New header file.
+ * mln/fun/p2b/achromatic.hh: New header file.
+ * mln/fun/p2b/component_equals.hh: New header file.
+ * mln/fun/v2v/achromatism.hh: New header file.
+ * mln/fun/v2v/hue_concentration.hh: New header file.
+ * mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
+ * mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
+ * mln/fun/v2v/log.hh: New header file.
+ * mln/fun/v2v/rg_to_rgb.hh: New header file.
+ * mln/fun/v2v/rgb8_to_int_u8: New header file.
+ * mln/fun/v2v/rgb_to_achromastism_map.hh: New header file.
+ * mln/fun/v2v/rgb_to_hsv.hh: New header file.
+ * mln/fun/v2v/rgb_to_hue_map.hh: New header file.
+ * mln/fun/v2v/rgb_to_saturation_map.hh: New header file.
+ * mln/fun/v2v/rgb_to_value_map.hh: New header file.
+ * mln/img_path.hh: New header file.
+ * mln/io/plot/save_image_sh.hh: New header file.
+ * mln/math/cell.hh: New header file.
+ * mln/math/floor.hh: New header file.
+ * tests/accu/stat/histo1d/Makefile.am: New makefile.
+ * tests/accu/stat/histo1d/histo1d.cc: New source.
+ * tests/accu/stat/histo2d/Makefile.am: New makefile.
+ * tests/accu/stat/histo2d/histo2d.cc: New source.
+
+2010-06-21 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Save histogram library.
+
+ * 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>
Simple integration test.
diff --git a/scribo/sandbox/green/README b/scribo/sandbox/green/README
index 4eb71b7..3efe50d 100644
--- a/scribo/sandbox/green/README
+++ b/scribo/sandbox/green/README
@@ -1,32 +1,219 @@
-Le travail est classé dans deux répertoires ok et ko.
-Le répertoire ok correspond aux sources qui ont été reprises et retestées.
-Le répertoire ko correspond aux sources qui ont été juste transférées.
+I ARBORESCENCE
+--------------
-La première brique logicielle importante sur laquelle s'appuie mes travaux est
-la création d'histogrammes sous forme d'image.
+bench ==> Comparaison d'algorithmes d'un point de vue temps d'exécution.
+bug ==> Bug rencontrés dans milena et archivés sous forme de programme.
+build ==> Répertoire d'exécution, non sauvé dans git.
+demo ==> Première version d'un algorithme pour voir son comportement.
+doc ==> Documentation tex ou code minimal pour de petits exemples.
+exp ==> Version avancée des algorithmes pour traitées les bases de données.
+mln ==> Partie mise en librairie milena des différents travaux.
+tests ==> Tests unitaires sur certains algorithmes.
+tools ==> Découpage de certains algorithmes pour mieux les tester séparément.
+use ==> Test de compilation, code minimal pour compiler un élément.
+II COMPILATION
+--------------
-CREATION DES HISTOGRAMMES
--------------------------
+L'unité minimale de code choisie est le répertoire.
+Donc aller dans le répertoire qui nous interesse,
+par exemple, green/demo/annotating/hsv et lancé le make
-ko/mln/accu/stat/histo1d.hh: histogramme image valeur scalaire.
-ko/mln/accu/stat/histo2d.hh: histogramme image valeur vectorielle 2d.
-ko/mln/accu/stat/histo3d_hsl.hh: histogramme image valeur vectorielle 3d (HSL).
-ko/mln/accu/stat/histo3d_rgb.hh: histogramme image valeur vectorielle 3d (RGB).
+#:~/git/olena/scribo/sandbox/green$cd demo/annotating/hsv
+#:~/git/olena/scribo/sandbox/green/demo/annotating/hsv$ make -f Makefile.am
+Cette opération créé dans build le répertoire de compilation
+green/build/demo/annotating/hsv. Dans ce répertoire aura été copié un
+Makefile et tous les fichiers qui ne sont pas des sources. Par
+exemple, des fichiers de calibration comme gaussian.sh (pour vérifier
+la mire du filtre de gaussienne) ou de la documentation à la sauvette
+sous forme de fichiers textes jetés à la va vite dans le répertoire
+pour ne pas perdre l'information recherchée. En l'occurence, ici, il
+n'y a rien à copier. Rendons-nous dans le répertoire de compilation et lançons
+le makefile.
+#:~/git/olena/scribo/sandbox/green/demo/annotating/hsv$
+cd ../../../build/demo/annotating/hsv
+#:~/git/olena/scribo/sandbox/green/build/demo/annotating/hsv$ make clean all
-ok/mln/accu/histo/histo1d.hh: histogramme image valeur scalaire entière.
-ok/mln/accu/histo/histo2d.hh: histogramme image valeur vectorielle 2d entière.
-ok/mln/accu/histo/histo3d.hh: histogramme image valeur vectorielle 3d entière.
+L'exécutable est généré par le makefile, il porte le nom du
+répertoire. Si il y a besoin de mettre à jour le makefile, le faire
+dans le répertoire des sources en éditant Makefile.am, puis en
+régénérant le Makefile dans le répertoire d'exécution par la commande
+make -f Makefile.am depuis le répertoire source.
-SAUVEGARDE DES HISTOGRAMMES
----------------------------
+III MAKEFILE
+------------
+Les makefiles utilisés sont tous les mêmes avec quelques variables
+dont le contenu change dans leur partie en-tête.
+Pour chaque répertoire, le makefile doit savoir si le chemin courant
+est un répertoire de compilation ou un répertoire de source. Pour les
+identifier, il a recours à un pattern qui malheureusemnt fait
+intervenir le nom de la branche de développement (bench,demo,bug,exp ...).
+SOURCE_PATTERN= green/demo
+BUILD__PATTERN= green/build/demo
-VISUALISATION DES HISTOGRAMMES
-------------------------------
\ No newline at end of file
+Si un makefile ne fonctionne pas, il faut vérifier ceci en premier
+lieu. Ici, le makefile doit être situé dans la branche démo.
+
+Autre élément à savoir, la compilation nécessite d'inclure la
+librairie milena, ainsi que les développements propres en vu de leur
+intégration futur dans milena, ceci est fait par un jeu d'INCLUDES1
+et INCLUDES2.
+
+INCLUDES1= -I$(HOME)/git/olena/scribo/sandbox/green
+INCLUDES2= -I$(HOME)/git/olena/milena
+INCLUDES= $(INCLUDES1) $(INCLUDES2)
+
+Suivant l'allure du compte où l'on exécute les makefiles, il faut
+revoir le chemin pour trouver des deux répertoires.
+
+Enfin, les options de compilations ne sont pas toujours les mêmes. Les
+trois lignes possibles sont toutes présentes et seule celle qui est
+utilisée n'est pas commentée. Typiquement, dans la branche de
+développement démo où les perfomances ne sont pas le problème, on
+compilera avec tout le matériel pour utiliser gdb et sans
+optimisation. A l'inverse, dans la branche d'expérimentation, où le
+code a déjà été testé, on cherche à aller vite car on exécute ce code
+sur de nombreuses images. Dans cette optique, pas de débugage, pas de
+traçage, optimisation conséquente.
+
+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)
+
+Une dernière dernière information, dans le cadre des développements
+exp, et tools, on utilise la librairie boost soit pour la
+virtualisation du filesystem, soit pour le formatage des fichiers text
+(réalisation de colonnes, mettre des entiers sur un certain nombre de
+caractères). Une ligne de chargement des librairies peut apparaitre donc.
+
+LOADLIBES= -lboost_filesystem
+
+On retrouvera les includes suivantes dans les sources:
+
+#include <boost/format.hpp>
+#include <boost/filesystem.hpp>
+
+
+IV CHEMINS DES IMAGES
+---------------------
+
+Toutes les images ont toujours été locales sur mon ordinateur. La
+politique a toujours été d'utiliser un fichier img_path pour coder les
+chemins des images. Les chemins étant plutôt long, j'ai toujours eu
+tendance à faire en sorte qu'ils soient compilés en dur (sauf pour la
+partie développement tools qui est vraiment voué à donner des
+exécutables indépendants et génériques). Le fichier mln/img_path.hh
+code la position de toutes les images dans mon arborescence. Il faudra
+donc veiller à changer tous les chemins pour les adapter au compte
+dans lequel on voudra reprendre le code. Dans le code, les références
+aux positions des images sont faites via des macros.
+
+Toutes les images sont située dans git/img. En règle générale, je ne
+traite que des images au format .pgm, .pbm et .ppm. Il m'arrive
+fréquemment de dumper des images au format .sh (gnuplot shell
+image). Pour la branche tools, nous avons utilisé les dumps de milena
+comme format de transfert d'un utilitaire à un autre. Les images sont
+classées suivant leur provenance. Nous avons tout d'abord la base
+OLENA (copie des images de tests milena), la base INIM (très peu
+utilisée voire jamais), la base ICDAR (très utilisée, surtout dans
+exp), la base AFP (très utilisée dans exp) et les bases ANNOTATING1 et
+ANNOTATING2 (pas très utilisées ni l'une, ni l'autre).
+
+La plus part du temps, sauver les résultats dans le répertoire
+d'exécution courant est largement suffisant. Parfois, il est
+nécessaire de sauvegarder de grosses quantités d'informations et de
+les classer comme dans la branche de développement exp. C'est pour
+cela, qu'un certain nombre de macros définissent des endroits pour
+sauvegarder les résultats lors d'expérimentation de grande ampleur sur
+toute la base ICDAR ou AFP.
+
+
+V GNUPLOT SCRIPT SHELL IMAGE FORMAT
+-----------------------------------
+
+J'abrège le nom du format par gnuplot shell format. En fait, c'est un
+format d'image particulier qui a besoin de gnuplot pour être lu. Il
+est donc compatible avec aucun viewer si ce n'est gnuplot, mais a la
+caractéristique d'afficher tous les points de manière visible. Par
+ailleurs, comme il s'agit d'un script gnuplot il permet d'insérer très
+facilement une fonction pour visualiser les données autrement (par
+exemple, changer d'espace: HSL, HSV). Le fichier tire son nom de la
+façon dont il fonctionne. C'est un script shell qui fait un appel à
+gnuplot et lui passe le jeu de données directement à partir de ce même
+fichier, pas besoin de faire appel à un autre fichier. Une fois
+généré, le fichier doit être modifié pour avoir les permissions
+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
+
+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.
+L'intérêt est ensuite de pouvoir filtrer directement ces histogrammes
+par les algorithmes de milena, ou encore d'étudier les valeurs
+caractéristiques par d'autres accumulateurs. Les codes réellement
+utilisés sont histo1d et histo3d RGB. Tous les autres codes sont très
+expérimentaux. Notemment, le code HSL demande de quantifier l'espace
+de comptage puisqu'il est décrit sous la forme de triplets de float
+(les autres sont inférés). Néanmoins, le code est à conserver car il
+contient une séquence d'appels pour les routines permettant de
+considérer la dimension de la teinte comme circulaire.
+
+* mln/accu/stat/histo1d.hh: Accumulateur histogramme image1d.
+* use/accu/stat/histo1d: Code minimal utilisant un histogramme 1d.
+
+* mln/accu/stat/histo2d.hh: Accumulateur histogramme image2d.
+* mln/value/rg.hh: Définition du type vectoriel 2d rouge/vert (RG).
+* mln/fun/v2v/rgb_to_rg.hh: Transformation de l'espace RGB vers l'espace RG.
+* 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.
+
+* use/accu/stat/histo3_rgb: Code minimal utilisant un histogramme 3d RGB.
+* use/accu/stat/histo3_hsl: Code minimal utilisant un histogramme 3d HSL.
+
+
+
+* tests/accu/stat/histo1d
+
+
+
+
+* tests/accu/stat/histo2d
+
+
+
+* use/accu/stat/histo3d_rgb
+* tests/accu/stat/histo3d_rgb
+
+* use/accu/stat/histo3d_hsl
+* tests/accu/stat/histo3d_hsl
+
+
+c) La visualisation des histogrammes 3d
+
+* demo/accu/stat/histo2d
+
+* mln/display/dispay_histo.hh
+* mln/displayproject_histo.hh
diff --git a/scribo/sandbox/green/mln/accu/stat/histo1d.hh b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
new file mode 100644
index 0000000..d480cf0
--- /dev/null
+++ b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
@@ -0,0 +1,340 @@
+// 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.
+
+#ifndef MLN_ACCU_STAT_HISTO1D_HH
+#define MLN_ACCU_STAT_HISTO1D_HH
+
+/// \file
+///
+/// \brief Define a histogram as accumulator which returns an image1d.
+///
+/// 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. So the int_u8 image has got 256 bins, the
+/// int_u<14> image has got 16384 bins. But, this code doesn't work
+/// for that quantification because of the coord limitation (signed
+/// short, as it is defined in mln/core/def/coord.hh). Take care of
+/// the limitation from the result image value. We hard code unsigned,
+/// but it sometimes not enought to count data in one bin. That last
+/// case has not occured since the beginning of the creation of the type.
+///
+/// The following sample is a typical use of the histogram.
+///
+/// #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/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);
+///
+/// return 0;
+/// }
+
+
+#include <iostream>
+
+#include <mln/accu/internal/base.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/literal/zero.hh>
+
+#include <mln/trace/entering.hh>
+#include <mln/trace/exiting.hh>
+
+#include <mln/trait/value/comp.hh>
+
+#include <mln/value/ops.hh>
+
+namespace mln
+{
+
+ namespace accu
+ {
+
+ namespace stat
+ {
+
+ // Forward declaration
+ template <typename V>
+ struct histo1d;
+
+ } // end of namespace mln::accu::stat
+
+
+ namespace meta
+ {
+
+ namespace stat
+ {
+
+ struct histo1d : public Meta_Accumulator<histo1d>
+ {
+ template <typename V>
+ struct with
+ {
+ typedef accu::stat::histo1d<V> ret;
+ };
+ };
+
+ } // end of namespace mln::accu::meta::stat
+
+ } // end of namespace mln::accu::meta
+
+ } // end of namespace mln::accu
+
+ namespace trait
+ {
+
+ template <typename V>
+ struct accumulator_< mln::accu::stat::histo1d<V> >
+ {
+ typedef accumulator::has_untake::no has_untake;
+ typedef accumulator::has_set_value::no has_set_value;
+ typedef accumulator::has_stop::no has_stop;
+ typedef accumulator::when_pix::use_v when_pix;
+ };
+
+ template <typename V>
+ struct set_precise_binary_<op::eq,
+ accu::stat::histo1d<V>,
+ accu::stat::histo1d<V> >
+ {
+ typedef bool ret;
+ };
+
+ } // end of namespace mln::trait
+
+ namespace accu
+ {
+
+ namespace stat
+ {
+
+ /// \brief Define a histogram as accumulator which returns an image1d.
+ ///
+ /// 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<int_u8> or with
+ /// image2d<int_u<14> >. The number of bins depends directly the
+ /// values V. For 8 bits there is 256 bins, for 14 bits there
+ /// is 16384 bins. Note that over quantification works too (up
+ /// to 14 bits).
+ ///
+ /// \ingroup modaccuvalues
+
+ template <typename V>
+ struct histo1d :
+ public mln::accu::internal::base<image1d<unsigned>, histo1d<V> >
+ {
+ typedef V argument;
+ typedef image1d<unsigned> result;
+ typedef result q_result;
+
+ /// Constructors
+ /// \{
+ /// \brief Infer the size of the resulting image1d domain.
+ ///
+ /// By evaluating the minimum and the maximum of V, we define the domain
+ /// of the resulting image1d.
+ histo1d();
+ /// \}
+
+
+ /// 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
+ /// density.
+ void init();
+
+
+ /// \brief Update the histogram with the graylevel of the 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 histo1d<V>& other);
+ /// \}
+
+ /// Accessors.
+ /// \{
+ /// \brief Return the histogram as an image1d.
+ ///
+ /// This is the machinery to communicate with data compute interface.
+ /// The end user should'nt use it.
+ result to_result() const;
+ operator result () const;
+ /// \}
+
+ /// \brief Check whethever this accumulator is able to return a result.
+ ///
+ /// Depends if the resulting image1d is valid. We can assume it is quite
+ /// always the case.
+ bool is_valid() const;
+
+ protected:
+ 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 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
+
+ template <typename V>
+ inline
+ histo1d<V>::histo1d()
+ {
+ trace::entering("mln::accu::stat::histo1d::cstor");
+ typedef mln_trait_value_comp(V,0) comp;
+ typedef point<grid::tick, V> v_point1d;
+ typedef box<v_point1d> v_box1d;
+
+ // comp keep a trace of the dimension of the theorical image.
+ // mln_min(comp) --> 0
+ // mln_max(comp) --> 2^(n-1) [127 for n=7][255 for n=8] ...
+
+ count_.init_(box1d(point1d(mln_min(comp)),
+ point1d(mln_max(comp))));
+
+ // std::cout << "min : " << mln_min(comp) << std::endl;
+ // std::cout << "max : " << mln_max(comp) << std::endl;
+
+ trace::exiting("mln::accu::stat::histo1d::cstor");
+ }
+
+ template <typename V>
+ inline
+ void histo1d<V>::init()
+ {
+ data::fill(count_, literal::zero);
+ }
+
+ template <typename V>
+ inline
+ void histo1d<V>::take(const argument& t)
+ {
+ // Just convert a graylevel value (int_u8 like) to a position for an
+ // iterator on the resulting image.
+ ++count_(point1d(t));
+ }
+
+
+ template <typename V>
+ inline
+ void histo1d<V>::take(const histo1d<V>& other)
+ {
+ count_ += other.count_;
+ }
+
+ template <typename V>
+ inline
+ typename histo1d<V>::result histo1d<V>::to_result() const
+ {
+ return count_;
+ }
+
+ template <typename V>
+ inline
+ histo1d<V>::operator result() const
+ {
+ return count_;
+ }
+
+ template <typename V>
+ inline
+ bool histo1d<V>::is_valid() const
+ {
+ bool result = count_.is_valid();
+
+ return result;
+ }
+
+ template <typename V>
+ bool operator==(const histo1d<V>& histo1, const histo1d<V>& histo2)
+ {
+ trace::entering("mln::accu::stat::histo1d::operator==");
+
+ bool result = true;
+ const image1d<unsigned>& res1 = histo1.to_result();
+ const image1d<unsigned>& res2 = histo2.to_result();
+
+ mln_precondition(res1.is_valid());
+ mln_precondition(res2.is_valid());
+
+ mln_piter(image1d<unsigned>) p1(res1.domain());
+ mln_piter(image1d<unsigned>) p2(res2.domain());
+
+ for_all_2(p1, p2)
+ result &= (res1(p1) == res2(p2));
+
+ trace::exiting("mln::accu::stat::histo1d::operator==");
+ return result;
+ }
+
+#endif // ! MLN_INCLUDE_ONLY
+
+
+ } // end of namespace mln::accu::stat
+
+ } // end of namespace mln::accu
+
+} // end of namespace mln
+
+#endif // ! MLN_ACCU_STAT_HISTO1D_HH
diff --git a/scribo/sandbox/green/mln/accu/stat/histo2d.hh b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
new file mode 100644
index 0000000..c28723c
--- /dev/null
+++ b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
@@ -0,0 +1,358 @@
+// 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.
+
+#ifndef MLN_ACCU_STAT_HISTO2D_HH
+# define MLN_ACCU_STAT_HISTO2D_HH
+
+/// \file
+///
+/// \brief Define a histogram as accumulator which returns an image2d.
+///
+/// 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 with vectorial image, typically RGB
+/// space where only RG are preserved. See histo1d.hh for limitations
+/// of such implementation. 8 bits quantification starts to be
+/// expensive, it produces image2d with [0..255,0..255] as domain.
+///
+/// The following sample is a typical use of the histogram.
+///
+/// #include <mln/accu/stat/histo2d.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.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()
+/// {
+/// 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;
+/// }
+
+# include <iostream>
+
+# include <mln/accu/internal/base.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/arith/plus.hh>
+
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
+
+# include <mln/value/ops.hh>
+
+namespace mln
+{
+
+ namespace accu
+ {
+
+ namespace stat
+ {
+
+ // Forward declaration
+ template <typename V>
+ struct histo2d;
+
+ } // end of namespace mln::accu::stat
+
+ namespace meta
+ {
+
+ namespace stat
+ {
+
+ struct histo2d : public Meta_Accumulator<histo2d>
+ {
+ template <typename V>
+ struct with
+ {
+ typedef accu::stat::histo2d<V> ret;
+ };
+ };
+
+ } // end of namespace mln::accu::meta::stat
+
+ } // end of namespace mln::accu::meta
+
+ } // end of namespace mln::accu
+
+
+ namespace trait
+ {
+
+ template <typename V>
+ struct accumulator_< mln::accu::stat::histo2d<V> >
+ {
+ typedef accumulator::has_untake::no has_untake;
+ typedef accumulator::has_set_value::no has_set_value;
+ typedef accumulator::has_stop::no has_stop;
+ typedef accumulator::when_pix::use_v when_pix;
+ };
+
+ template <typename V>
+ struct set_precise_binary_<op::eq,
+ accu::stat::histo2d<V>,
+ accu::stat::histo2d<V> >
+ {
+ typedef bool ret;
+ };
+
+ } // end of namespace mln::trait
+
+ namespace accu
+ {
+
+ namespace stat
+ {
+
+ /// \brief Define an histogram 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
+ /// quantification works too.
+ ///
+ /// \ingroup modaccuvalues
+
+ template <typename V>
+ struct histo2d :
+ public mln::accu::internal::base<image2d<unsigned>, histo2d<V> >
+ {
+ typedef V argument;
+ typedef image2d<unsigned> result;
+ typedef result q_result;
+
+ /// Constructors
+ /// \{
+ /// \brief Initialize the size of the resulting image1d.
+ ///
+ /// Initialize the size the resulting image from the theorical dynamic
+ /// of the greylevel values (Use V to manage it).
+ histo2d();
+ /// \}
+
+
+ /// 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
+ /// density.
+ void init();
+
+
+ /// \brief Update the histogram with the RGB pixel t.
+ /// \param[in] t a greylevel 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.
+ void take(const histo2d<V>& other);
+ /// \}
+
+ /// Accessors.
+ /// \{
+ /// \brief Return the histogram as an image1d.
+ ///
+ /// This is the machinery to communicate with data compute interface.
+ /// The end user should'nt use it.
+ result to_result() const;
+ operator result () const;
+ /// \}
+
+ /// \brief Check whethever this accumulator is able to return a result.
+ ///
+ /// Depends if the resulting image1d is valid. We can assume it is quite
+ /// always the case.
+ bool is_valid() const;
+
+ protected:
+ 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.
+
+ template <typename V>
+ bool operator==(const histo2d<V>& histo1,
+ const histo2d<V>& histo2);
+
+#ifndef MLN_INCLUDE_ONLY
+
+ template <typename V>
+ inline
+ histo2d<V>::histo2d()
+ {
+ trace::entering("mln::accu::stat::histo2d::histo2d");
+ typedef mln_trait_value_comp(V,0) comp0;
+ typedef mln_trait_value_comp(V,1) comp1;
+
+ // comp keep a trace of the dimension of the theorical image.
+ // mln_min(comp) --> 0
+ // mln_max(comp) --> 2^(n-1) [127 for n=7][255 for n=8] ...
+
+ count_.init_(box2d(point2d(mln_min(comp0),
+ mln_min(comp1)),
+ point2d(mln_max(comp0),
+ mln_max(comp1))));
+
+ trace::exiting("mln::accu::stat::histo2d::histo2d");
+ }
+
+ 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");
+ }
+
+ 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");
+ }
+
+
+ template <typename V>
+ 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_;
+ }
+
+ template <typename V>
+ inline
+ histo2d<V>::operator result() const
+ {
+ trace::entering("mln::accu::stat::histo2d::operator result");
+
+ trace::exiting("mln::accu::stat::histo2d::operator result");
+ return count_;
+ }
+
+ template <typename V>
+ 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;
+ }
+
+ template <typename V>
+ bool operator==(const histo2d<V>& histo1,
+ const histo2d<V>& histo2)
+ {
+ trace::entering("mln::accu::stat::operator==");
+
+ bool result = true;
+ const image2d<unsigned>& res1 = histo1.to_result();
+ const image2d<unsigned>& res2 = histo2.to_result();
+
+ mln_precondition(res1.is_valid());
+ mln_precondition(res2.is_valid());
+
+ mln_piter(image2d<unsigned>) p1(res1.domain());
+ mln_piter(image2d<unsigned>) p2(res2.domain());
+
+ for_all_2(p1, p2)
+ result &= (res1(p1) == res2(p2));
+
+ trace::exiting("mln::accu::stat::operator==");
+ return result;
+ }
+
+#endif // ! MLN_INCLUDE_ONLY
+
+
+ } // end of namespace mln::accu::stat
+
+ } // end of namespace mln::accu
+
+} // end of namespace mln
+
+#endif // ! MLN_ACCU_STAT_HISTO2D_HH
diff --git a/milena/sandbox/green/mln/accu/stat/histo3d_hsl.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
similarity index 100%
copy from milena/sandbox/green/mln/accu/stat/histo3d_hsl.hh
copy to scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
diff --git a/milena/sandbox/green/mln/accu/stat/histo3d_rgb.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
similarity index 100%
copy from milena/sandbox/green/mln/accu/stat/histo3d_rgb.hh
copy to scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
diff --git a/milena/sandbox/green/mln/clustering/k_mean.hh b/scribo/sandbox/green/mln/clustering/k_mean.hh
similarity index 100%
copy from milena/sandbox/green/mln/clustering/k_mean.hh
copy to scribo/sandbox/green/mln/clustering/k_mean.hh
diff --git a/milena/sandbox/green/mln/clustering/kmean1d.hh b/scribo/sandbox/green/mln/clustering/kmean1d.hh
similarity index 100%
copy from milena/sandbox/green/mln/clustering/kmean1d.hh
copy to scribo/sandbox/green/mln/clustering/kmean1d.hh
diff --git a/milena/sandbox/green/mln/clustering/kmean2d.hh b/scribo/sandbox/green/mln/clustering/kmean2d.hh
similarity index 100%
copy from milena/sandbox/green/mln/clustering/kmean2d.hh
copy to scribo/sandbox/green/mln/clustering/kmean2d.hh
diff --git a/milena/sandbox/green/mln/clustering/kmean3d.hh b/scribo/sandbox/green/mln/clustering/kmean3d.hh
similarity index 100%
copy from milena/sandbox/green/mln/clustering/kmean3d.hh
copy to scribo/sandbox/green/mln/clustering/kmean3d.hh
diff --git a/milena/sandbox/green/mln/clustering/kmean_rgb.hh b/scribo/sandbox/green/mln/clustering/kmean_rgb.hh
similarity index 100%
copy from milena/sandbox/green/mln/clustering/kmean_rgb.hh
copy to scribo/sandbox/green/mln/clustering/kmean_rgb.hh
diff --git a/milena/sandbox/green/mln/display/display_histo.hh b/scribo/sandbox/green/mln/display/display_histo.hh
similarity index 100%
copy from milena/sandbox/green/mln/display/display_histo.hh
copy to scribo/sandbox/green/mln/display/display_histo.hh
diff --git a/milena/sandbox/green/mln/display/project_histo.hh b/scribo/sandbox/green/mln/display/project_histo.hh
similarity index 100%
copy from milena/sandbox/green/mln/display/project_histo.hh
copy to scribo/sandbox/green/mln/display/project_histo.hh
diff --git a/milena/sandbox/green/mln/fun/p2b/achromatic.hh b/scribo/sandbox/green/mln/fun/p2b/achromatic.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/p2b/achromatic.hh
copy to scribo/sandbox/green/mln/fun/p2b/achromatic.hh
diff --git a/milena/sandbox/green/mln/fun/p2b/component_equals.hh b/scribo/sandbox/green/mln/fun/p2b/component_equals.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/p2b/component_equals.hh
copy to scribo/sandbox/green/mln/fun/p2b/component_equals.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/achromatism.hh b/scribo/sandbox/green/mln/fun/v2v/achromatism.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/achromatism.hh
copy to scribo/sandbox/green/mln/fun/v2v/achromatism.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/hue_concentration.hh b/scribo/sandbox/green/mln/fun/v2v/hue_concentration.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/hue_concentration.hh
copy to scribo/sandbox/green/mln/fun/v2v/hue_concentration.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh b/scribo/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh
copy to scribo/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/log.hh b/scribo/sandbox/green/mln/fun/v2v/log.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/log.hh
copy to scribo/sandbox/green/mln/fun/v2v/log.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/rg_to_rgb.hh b/scribo/sandbox/green/mln/fun/v2v/rg_to_rgb.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rg_to_rgb.hh
copy to scribo/sandbox/green/mln/fun/v2v/rg_to_rgb.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh b/scribo/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh
copy to scribo/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh b/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
copy to scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/rgb_to_achromatism_map.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_achromatism_map.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rgb_to_achromatism_map.hh
copy to scribo/sandbox/green/mln/fun/v2v/rgb_to_achromatism_map.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh
copy to scribo/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh
copy to scribo/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
new file mode 100644
index 0000000..d4c1e46
--- /dev/null
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
@@ -0,0 +1,111 @@
+// 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.
+
+#ifndef MLN_FUN_V2V_RGB_TO_RG_HH
+# define MLN_FUN_V2V_RGB_TO_RG_HH
+
+# include <mln/value/rg.hh>
+# include <mln/value/rgb.hh>
+# include <mln/core/contract.hh>
+
+/// \file
+///
+/// \brief Convert a rgb value to a rg value.
+///
+/// This source implements the conversion between rgb space and rg space.
+///
+/// The following sample is a typical use of the rgb/rg conversion function.
+///
+/// #include <mln/accu/stat/histo2d.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.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()
+/// {
+/// 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;
+/// }
+
+namespace mln
+{
+
+ namespace fun
+ {
+
+ namespace v2v
+ {
+
+ /// \brief Convert a rgb value to a rg value.
+ ///
+ /// 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> >
+ {
+ typedef value::rg<n> result;
+ typedef value::rgb<n> argument;
+
+ /// \brief Convert rgb value to rg value.
+ ///
+ /// \param[in] v the rgb value to convert.
+ ///
+ /// 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);
+ }
+ };
+
+ } // end of namespace mln::fun::v2v
+
+ } // end of namespace mln::fun
+
+} // end of namespace mln
+
+#endif // ! MLN_FUN_V2V_RGB_TO_RG_HH
diff --git a/milena/sandbox/green/mln/fun/v2v/rgb_to_saturation_map.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_saturation_map.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rgb_to_saturation_map.hh
copy to scribo/sandbox/green/mln/fun/v2v/rgb_to_saturation_map.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/rgb_to_value_map.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_value_map.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rgb_to_value_map.hh
copy to scribo/sandbox/green/mln/fun/v2v/rgb_to_value_map.hh
diff --git a/milena/sandbox/green/mln/img_path.hh b/scribo/sandbox/green/mln/img_path.hh
similarity index 100%
copy from milena/sandbox/green/mln/img_path.hh
copy to scribo/sandbox/green/mln/img_path.hh
diff --git a/scribo/sandbox/green/mln/io/plot/save_image_sh.hh b/scribo/sandbox/green/mln/io/plot/save_image_sh.hh
new file mode 100644
index 0000000..137f78d
--- /dev/null
+++ b/scribo/sandbox/green/mln/io/plot/save_image_sh.hh
@@ -0,0 +1,1056 @@
+// 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.
+
+#ifndef MLN_IO_PLOT_SAVE_IMAGE_SH_HH
+# define MLN_IO_PLOT_SAVE_IMAGE_SH_HH
+
+/// \file
+///
+/// \brief Define some functions to export to gnuplot format as a script shell.
+///
+/// Theses routines are dedicated to image visualization. The aim is to display
+/// image whatever the value used as pixel. The behaviour of gnuplot is more
+/// like xv than imageMagick. A Gnuplot script shell file is a text dump file
+/// with a preambule to let gnuplot interpret data. As a script shell, you can
+/// launch it (don't forget the permissions), and every thing is packed in it.
+/// The script file call gnuplot in batch mode, the result window persists and
+/// that's all.
+///
+
+# include <fstream>
+# include <string>
+
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
+
+# include <mln/core/macros.hh>
+# include <mln/core/contract.hh>
+# include <mln/core/image/image1d.hh>
+# include <mln/core/image/image2d.hh>
+# include <mln/core/image/image3d.hh>
+
+# include <mln/geom/min_ind.hh>
+# include <mln/geom/max_ind.hh>
+# include <mln/geom/min_row.hh>
+# include <mln/geom/max_row.hh>
+# include <mln/geom/min_col.hh>
+# include <mln/geom/max_col.hh>
+
+# include <mln/trait/value_.hh>
+
+# include <mln/value/int_u.hh>
+# include <mln/value/int_s.hh>
+# include <mln/value/rgb.hh>
+# include <mln/value/hsl.hh>
+# include <mln/value/hsi.hh>
+
+# include <mln/util/array.hh>
+
+
+namespace mln
+{
+
+ namespace io
+ {
+
+ namespace plot
+ {
+
+ /// \brief Save an image as a gnuplot script shell.
+ ///
+ /// Every thing is save. The image could be 1d, 2d or 3d. The value of
+ /// the pixels could be int_u<n>, int_s<n>, float, double, hsl_f, hsl_d,
+ /// hsi_f, hsi_d and rgb<n>.
+ ///
+ /// \param[in] img the image which contains the data 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 Image<I>& img, const std::string& filename);
+
+ /// \brief Save a 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< image1d<I> >& stack,
+ const std::string& filename);
+
+ template <typename I>
+ bool save_image_sh(const util::array< util::array< image1d<I> > >& stack,
+ const std::string& filename);
+
+ } // end of namespace mln::io::plot
+
+ } // end of namespace mln::io
+
+
+ namespace io
+ {
+
+ namespace plot
+ {
+
+#ifndef MLN_INCLUDE_ONLY
+
+ //------------------------------------------------------------------------
+ // Impl.
+ //------------------------------------------------------------------------
+
+ namespace impl
+ {
+
+
+ //----------------------------------------------------------------------
+ // save_image_sh_array_array_image1d(const array<array<image1d<I>>>&,
+ // const string&)
+ //----------------------------------------------------------------------
+
+ template <typename I>
+ inline
+ bool save_image_sh_array_array_image1d(const util::array< util::array<
+ image1d<I> > >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d");
+
+ mln_precondition(!stack.is_empty());
+ mln_precondition(!stack[0].is_empty());
+ mln_precondition(stack[0][0].is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_ind = geom::min_ind(stack[0][0]);
+ unsigned max_ind = geom::max_ind(stack[0][0]);
+
+ if (result)
+ {
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set xrange [" << min_ind;
+ out << ":" << max_ind;
+ out << "]" << std::endl;
+ out << "plot '-' with line";
+
+ for (unsigned i = 1; i < stack.size(); ++i)
+ {
+ for (unsigned j = 1; j < stack[i].size(); ++j)
+ {
+
+ out << ",\\" << std::endl;
+ out << " '-' with line";
+ }
+ }
+
+ out << std::endl;
+
+ mln_eiter(util::array< util::array< image1d<I> > >) e0(stack);
+
+ for_all (e0)
+ {
+ mln_eiter(util::array< image1d<I> >) e1(stack[e0.index_()]);
+
+ for_all (e1)
+ {
+ mln_piter(image1d< I >)
+ p(stack[e0.index_()][e1.index_()].domain());
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.ind() << " ";
+ out << stack[e0.index_()][e1.index_()](p) << std::endl;;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ }
+ }
+
+ out << "EOF" << std::endl;
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d");
+
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_array_array_image1d_vec3(
+ // const array<array<image1d<vec<3,T>>>>&,
+ // const string&)
+ //----------------------------------------------------------------------
+
+ template <typename T>
+ inline
+ bool save_image_sh_array_array_image1d_vec3(
+ const util::array<util::array<image1d<algebra::vec<3,T> > > >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d_vec3");
+
+ typedef algebra::vec<3,T> t_val;
+ typedef image1d<t_val> t_img;
+ typedef util::array<t_img> t_array;
+ typedef util::array<t_array> t_stack;
+
+ mln_precondition(!stack.is_empty());
+ mln_precondition(!stack[0].is_empty());
+ mln_precondition(stack[0][0].is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_ind = geom::min_ind(stack[0][0]);
+ unsigned max_ind = geom::max_ind(stack[0][0]);
+
+ if (result)
+ {
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set xrange [" << min_ind;
+ out << ":" << max_ind;
+ out << "]" << std::endl;
+ out << "splot '-' with line palette";
+
+ for (unsigned i = 1; i < stack.size(); ++i)
+ {
+ for (unsigned j = 1; j < stack[i].size(); ++j)
+ {
+
+ out << ",\\" << std::endl;
+ out << " '-' with line palette";
+ }
+ }
+
+ out << std::endl;
+
+ mln_eiter(t_stack) e0(stack);
+
+ for_all (e0)
+ {
+ mln_eiter(t_array) e1(stack[e0.index_()]);
+
+ for_all (e1)
+ {
+ mln_piter(t_img) p(stack[e0.index_()][e1.index_()].domain());
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.ind() << " ";
+ out << stack[e0.index_()][e1.index_()](p)[0] << " ";
+ out << stack[e0.index_()][e1.index_()](p)[1] << " ";
+ out << stack[e0.index_()][e1.index_()](p)[2] << std::endl;;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ }
+ }
+
+ out << "EOF" << std::endl;
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d_vec3");
+
+ return result;
+ }
+
+
+ //----------------------------------------------------------------------
+ // save_image_sh_array_array_image1d_vec2(
+ // const array<array<image1d<vec<2,T>>>>&,
+ // const string&)
+ //----------------------------------------------------------------------
+
+ template <typename T>
+ inline
+ bool save_image_sh_array_array_image1d_vec2(
+ const util::array<util::array<image1d<algebra::vec<2,T> > > >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d_vec2");
+
+ typedef algebra::vec<2,T> t_val;
+ typedef image1d<t_val> t_img;
+ typedef util::array<t_img> t_array;
+ typedef util::array<t_array> t_stack;
+
+ mln_precondition(!stack.is_empty());
+ mln_precondition(!stack[0].is_empty());
+ mln_precondition(stack[0][0].is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_ind = geom::min_ind(stack[0][0]);
+ unsigned max_ind = geom::max_ind(stack[0][0]);
+
+ if (result)
+ {
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set xrange [" << min_ind;
+ out << ":" << max_ind;
+ out << "]" << std::endl;
+ out << "splot '-' with line";
+
+ for (unsigned i = 1; i < stack.size(); ++i)
+ {
+ for (unsigned j = 1; j < stack[i].size(); ++j)
+ {
+
+ out << ",\\" << std::endl;
+ out << " '-' with line";
+ }
+ }
+
+ out << std::endl;
+
+ mln_eiter(t_stack) e0(stack);
+
+ for_all (e0)
+ {
+ mln_eiter(t_array) e1(stack[e0.index_()]);
+
+ for_all (e1)
+ {
+ mln_piter(t_img) p(stack[e0.index_()][e1.index_()].domain());
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.ind() << " ";
+ out << stack[e0.index_()][e1.index_()](p)[0] << " ";
+ out << stack[e0.index_()][e1.index_()](p)[1] << std::endl;;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ }
+ }
+
+ out << "EOF" << std::endl;
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d_vec2");
+
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_array_image1d(const array<image1d<I>>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <typename I>
+ inline
+ bool save_image_sh_array_image1d(const util::array< image1d<I> >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_array_image1d");
+ mln_precondition(!stack.is_empty());
+ mln_precondition(stack[0].is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_ind = geom::min_ind(stack[0]);
+ unsigned max_ind = geom::max_ind(stack[0]);
+
+ if (result)
+ {
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set xrange [" << min_ind;
+ out << ":" << max_ind;
+ out << "]" << std::endl;
+ out << "plot '-' with line";
+
+ for (unsigned i = 1; i < stack.size(); ++i)
+ {
+
+ out << ",\\" << std::endl;
+ out << " '-' with line";
+ }
+
+ out << std::endl;
+
+ mln_eiter(util::array< image1d<I> >) e(stack);
+
+ for_all (e)
+ {
+ mln_piter(image1d< I >) p(stack[e.index_()].domain());
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.ind() << " ";
+ out << stack[e.index_()](p) << std::endl;;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ }
+
+ out << "EOF" << std::endl;
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_array_image1d");
+ return result;
+ }
+
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image2d_rgb(const image2d<rgb<n>>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <unsigned n>
+ inline
+ bool save_image_sh_image2d_rgb(const image2d<value::rgb<n> >& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image2d_rgb");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_row = geom::min_row(img);
+ unsigned max_row = geom::max_row(img);
+ unsigned min_col = geom::min_col(img);
+ unsigned max_col = geom::max_col(img);
+
+ if (result)
+ {
+ mln_piter(image2d< value::rgb<n> >) p(img.domain());
+
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, r, g, b) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set xrange [" << min_col;
+ out << ":" << max_col;
+ out << "]" << std::endl;
+ out << "set yrange [-" << max_row;
+ out << ":" << min_row;
+ out << "]" << std::endl;
+ out << "plot '-' using 2:(-\\$1):3:4:5 with rgbimage" << std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.row() << " ";
+ out << p.col() << " ";
+ out << img(p).red() << " ";
+ out << img(p).green() << " ";
+ out << img(p).blue() << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image2d_rgb");
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image2d_hsl(const image2d<hsl_<T,T,T>>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <typename T>
+ inline
+ bool save_image_sh_image2d_hsl(const image2d<value::hsl_<T,T,T> >& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image2d_hsl");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_row = geom::min_row(img);
+ unsigned max_row = geom::max_row(img);
+ unsigned min_col = geom::min_col(img);
+ unsigned max_col = geom::max_col(img);
+
+ typedef mln::value::hsl_<T,T,T> hsl;
+
+ if (result)
+ {
+ mln_piter(image2d< hsl >) p(img.domain());
+
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "q(l,s) = (l < 0.5)? (l*(1+s)):(l+s-(l*s))" << std::endl;
+ out << "p(l,s) = (2.0 * l - q(l,s))" << std::endl;
+ out << "n(x) = (x < 0)?(x+1):(x > 1)?(x-1) : (x)"<< std::endl;
+ out << std::endl;
+ out << "c(p,q,t) = (t <(1.0/6.0))?(p+(q-p)*6.0*t):\\"<< std::endl;
+ out << " (t <(1.0/2.0))?(q) :\\" << std::endl;
+ out << " (t<(2.0/3.0))?(p+(q-p)*6.0*((2.0/3.0)-t)):\\" << std::endl;
+ out << " (p)" << std::endl;
+ out << std::endl;
+ out << "r(h,s,l) = c(p(l,s),q(l,s),n(h/360.0+1.0/3.0))"<< std::endl;
+ out << "g(h,s,l) = c(p(l,s),q(l,s),n(h/360.0))" << std::endl;
+ out << "b(h,s,l) = c(p(l,s),q(l,s),n(h/360.0-1.0/3.0))"<< std::endl;
+ out << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set palette gray" << std::endl;
+ out << "set xrange [" << min_col;
+ out << ":" << max_col;
+ out << "]" << std::endl;
+ out << "set yrange [-" << max_row;
+ out << ":" << min_row;
+ out << "]" << std::endl;
+ out << "plot '-' using 2:(-\\$1):\\" << std::endl;
+ out << " (r(\\$3,\\$4,\\$5)):\\" << std::endl;
+ out << " (g(\\$3,\\$4,\\$5)):\\" << std::endl;
+ out << " (b(\\$3,\\$4,\\$5)) with rgbimage" << std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.row() << " ";
+ out << p.col() << " ";
+ out << img(p).hue() << " ";
+ out << img(p).sat() << " ";
+ out << img(p).lum() << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image2d_hsl");
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image2d_hsi(const image2d<hsi_<T,T,T>>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <typename T>
+ inline
+ bool save_image_sh_image2d_hsi(const image2d<value::hsi_<T,T,T> >& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image2d_hsi");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_row = geom::min_row(img);
+ unsigned max_row = geom::max_row(img);
+ unsigned min_col = geom::min_col(img);
+ unsigned max_col = geom::max_col(img);
+
+ typedef mln::value::hsi_<T,T,T> hsi;
+
+ if (result)
+ {
+ mln_piter(image2d< hsi >) p(img.domain());
+
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "teta(h) = (h/180.0) * pi" << std::endl;
+ out << "alpha(s,h) = s*cos(teta(h))" << std::endl;
+ out << "beta(s,h) = s*sin(teta(h))" << std::endl;
+ out << "n(x) = (x < 0)?(x+1) : (x > 1)?(x-1):(x)"<< std::endl;
+ out << std::endl;
+ out << "c(p,q,t) = (t <(1.0/6.0))?(p+(q-p)*6.0*t):\\"<< std::endl;
+ out << " (t <(1.0/2.0))?(q) :\\" << std::endl;
+ out << " (t <(2.0/3.0))?(p+(q-p)*6.0*((2.0/3.0)-t)):\\"<< std::endl;
+ out << " (p)" << std::endl;
+ out << std::endl;
+ out << "r(h,s,i) = (sqrt(3.0)/3.0) * i \\" << std::endl;
+ out << " + (2.0/(sqrt(6.0))) * beta(s,h)" << std::endl;
+ out << "g(h,s,i) = (sqrt(3.0)/3.0) * i \\" << std::endl;
+ out << " + (2.0/(sqrt(2.0))) * alpha(s,h)\\" << std::endl;
+ out << " - (1.0/(sqrt(6.0))) * beta(s,h)" << std::endl;
+ out << "b(h,s,i) = (sqrt(3.0)/3.0) * i \\" << std::endl;
+ out << " - (2.0/(sqrt(2.0))) * alpha(s,h) \\"<< std::endl;
+ out << " - (1.0/(sqrt(6.0))) * beta(s,h)" << std::endl;
+ out << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set palette gray" << std::endl;
+ out << "set xrange [" << min_col;
+ out << ":" << max_col;
+ out << "]" << std::endl;
+ out << "set yrange [-" << max_row;
+ out << ":" << min_row;
+ out << "]" << std::endl;
+ out << "plot '-' using 2:(-\\$1):\\" << std::endl;
+ out << " (r(\\$3,\\$4,\\$5)):\\" << std::endl;
+ out << " (g(\\$3,\\$4,\\$5)):\\" << std::endl;
+ out << " (b(\\$3,\\$4,\\$5)) with rgbimage" << std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.row() << " ";
+ out << p.col() << " ";
+ out << img(p).hue() << " ";
+ out << img(p).sat() << " ";
+ out << img(p).inty() << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image2d_hsi");
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image2d(const image2d<I>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <typename I>
+ inline
+ bool save_image_sh_image2d(const image2d<I>& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image2d");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_row = geom::min_row(img);
+ unsigned max_row = geom::max_row(img);
+ unsigned min_col = geom::min_col(img);
+ unsigned max_col = geom::max_col(img);
+
+ if (result)
+ {
+ mln_piter(image2d<I>) p(img.domain());
+
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set palette gray" << std::endl;
+ out << "set xrange [" << min_col;
+ out << ":" << max_col;
+ out << "]" << std::endl;
+ out << "set yrange [-" << max_row;
+ out << ":" << min_row;
+ out << "]" << std::endl;
+ out << "plot '-' using 2:(-\\$1):3 with image" <<std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.row() << " ";
+ out << p.col() << " ";
+ out << img(p) << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:"<< filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image2d");
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image1d(const image1d<I>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <typename I>
+ inline
+ bool save_image_sh_image1d(const image1d<I>& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image1d");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+
+ if (result)
+ {
+ mln_piter(image1d<I>) p(img.domain());
+
+ // Output data prelude (terminal X11, impulse).
+ out << "#!/bin/sh" << std::endl;
+ out << "##########################" << std::endl;
+ out << "# Two columns = (x, val) #" << std::endl;
+ out << "##########################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "plot '-' with impulse" << std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.ind() << " ";
+ out << img(p) << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:"<< filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image1d");
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image3d(const image3d<I>&, const string&)
+ //----------------------------------------------------------------------
+
+
+ template <typename I>
+ inline
+ bool save_image_sh_image3d(const image3d<I>& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image3d");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+
+ if (result)
+ {
+ mln_piter(image3d<I>) p(img.domain());
+
+ // Output data prelude (terminal X11, pointtype 0).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, z, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "splot '-' with points palette pointtype 7" << std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.row() << " ";
+ out << p.col() << " ";
+ out << p.sli() << " ";
+ out << img(p) << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:"<< filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image3d");
+ return result;
+ }
+
+ } // end of namespace impl
+
+
+ //------------------------------------------------------------------------
+ // Internal.
+ //------------------------------------------------------------------------
+
+ namespace internal
+ {
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const util::array< image1d<I> >& stack,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_array_image1d(stack, filename);
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const util::array<
+ util::array <image1d<I> > >& stack,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_array_array_image1d(stack, filename);
+ }
+
+ template <typename T>
+ inline
+ bool save_image_sh_dispatch(
+ const util::array<util::array<image1d<algebra::vec<3,T> > > >& stack,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_array_array_image1d_vec3(stack, filename);
+ }
+
+ template <typename T>
+ inline
+ bool save_image_sh_dispatch(
+ const util::array<util::array<image1d<algebra::vec<2,T> > > >& stack,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_array_array_image1d_vec2(stack, filename);
+ }
+
+ template <unsigned n>
+ inline
+ bool save_image_sh_dispatch(const image2d<value::rgb<n> >& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image2d_rgb(img, filename);
+ }
+
+ template <typename T>
+ inline
+ bool save_image_sh_dispatch(const image2d<value::hsl_<T,T,T> >& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image2d_hsl(img, filename);
+ }
+
+ template <typename T>
+ inline
+ bool save_image_sh_dispatch(const image2d<value::hsi_<T,T,T> >& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image2d_hsi(img, filename);
+ }
+
+
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const image2d<I>& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image2d(img, filename);
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const image1d<I>& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image1d(img, filename);
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const image3d<I>& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image3d(img, filename);
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const Image<I>& img,
+ const std::string& filename)
+ {
+ return save_image_sh_dispatch(exact(img), filename);
+ }
+
+ } // end of namespace mln::io::plot::internal
+
+ //------------------------------------------------------------------------
+ // Facade.
+ //------------------------------------------------------------------------
+
+ template <typename I>
+ inline
+ bool save_image_sh(const Image<I>& img, const std::string& filename)
+ {
+ trace::entering("mln::io::plot::save_image_sh");
+
+ bool result = internal::save_image_sh_dispatch(img, filename);
+
+ trace::exiting("mln::io::plot::save_image_sh");
+ return result;
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh(const util::array< image1d<I> >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::save_image_sh");
+
+ bool result = internal::save_image_sh_dispatch(stack, filename);
+
+ trace::exiting("mln::io::plot::save_image_sh");
+ return result;
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh(const util::array< util::array< image1d<I> > >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::save_image_sh");
+
+ bool result = internal::save_image_sh_dispatch(stack, filename);
+
+ trace::exiting("mln::io::plot::save_image_sh");
+ return result;
+ }
+
+
+#endif // ! MLN_INCLUDE_ONLY
+
+
+ } // end of namespace mln::io::plot
+
+ } // end of namespace mln::io
+
+} // end of namespace mln
+
+#endif // ! MLN_IO_PLOT_SAVE_IMAGE_SH_HH
diff --git a/milena/sandbox/green/mln/math/ceil.hh b/scribo/sandbox/green/mln/math/ceil.hh
similarity index 100%
copy from milena/sandbox/green/mln/math/ceil.hh
copy to scribo/sandbox/green/mln/math/ceil.hh
diff --git a/milena/sandbox/green/mln/math/floor.hh b/scribo/sandbox/green/mln/math/floor.hh
similarity index 100%
copy from milena/sandbox/green/mln/math/floor.hh
copy to scribo/sandbox/green/mln/math/floor.hh
diff --git a/milena/sandbox/green/mln/value/hsv.hh b/scribo/sandbox/green/mln/value/hsv.hh
similarity index 100%
copy from milena/sandbox/green/mln/value/hsv.hh
copy to scribo/sandbox/green/mln/value/hsv.hh
diff --git a/scribo/sandbox/green/mln/value/rg.hh b/scribo/sandbox/green/mln/value/rg.hh
new file mode 100644
index 0000000..d083ffd
--- /dev/null
+++ b/scribo/sandbox/green/mln/value/rg.hh
@@ -0,0 +1,175 @@
+// 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.
+
+#ifndef MLN_VALUE_RG_HH
+# define MLN_VALUE_RG_HH
+
+/// \file
+///
+/// \brief Define the red/green vectorial image type.
+///
+/// This source implements the red/green (RG) vectorial image type. It
+/// is a partial copy of the rgb type. This type doesn't manage
+/// anykind of interaction. Its purpose is limited to store a couple
+/// of values. Do not use it outside this purpose, i can't garantie
+/// the behaviour.
+///
+/// The following sample is a typical use of the rg type.
+///
+/// #include <mln/accu/stat/histo2d.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.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()
+/// {
+/// 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;
+/// }
+
+
+# include <mln/algebra/vec.hh>
+# include <mln/value/concept/vectorial.hh>
+# include <mln/value/int_u.hh>
+# include <mln/value/rgb8.hh>
+# include <mln/trait/value_.hh>
+
+
+namespace mln
+{
+
+ namespace value
+ {
+
+ // Forward declaration.
+ template <unsigned n> struct rg;
+
+ } // end of namespace mln::value
+
+ namespace trait
+ {
+
+ template <unsigned n>
+ struct value_< mln::value::rg<n> >
+ {
+ enum {
+ dim = 2,
+ nbits = dim * n,
+ card = mln_value_card_from_(nbits)
+ };
+
+ typedef trait::value::nature::vectorial nature;
+ typedef trait::value::kind::color kind;
+ typedef trait::value::quant::high quant;
+
+ typedef void comp;
+ typedef mln::value::int_u<n> comp_0;
+ typedef mln::value::int_u<n> comp_1;
+
+ static comp_0 get_comp_0(const mln::value::rg<n>& v){return v.red(); }
+ static comp_1 get_comp_1(const mln::value::rg<n>& v){return v.green();}
+
+ typedef algebra::vec<dim, float> sum;
+
+ static const char* name()
+ {
+ static std::string s = std::string("rg").append(1, 8 + '0');
+ return s.c_str();
+ }
+ };
+
+ } // end of namespace mln::trait
+
+ namespace value
+ {
+
+ /// \brief Define the red/green vectorial image type.
+ ///
+ /// Param n defines the quantification used for red/green space.
+
+ template <unsigned n>
+ struct rg :public mln::value::Vectorial< rg<n> >,
+ public internal::value_like_<
+ algebra::vec< 2, int_u<n> >, // Equivalent.
+ algebra::vec< 2, int_u<n> >, // Encoding.
+ algebra::vec< 2, int >, // Interoperation.
+ rg<n> > // Exact.
+ {
+ typedef int_u<n> t_red;
+ typedef int_u<n> t_green;
+
+ int_u<n> red() const {return this->v_[0];}
+ int_u<n>& red() {return this->v_[0];}
+ int_u<n> green() const {return this->v_[1];}
+ int_u<n>& green() {return this->v_[1];}
+
+ /// Constructors
+ /// \{
+ /// \brief Create a rg value.
+ ///
+ /// Two constructors exist, the first one do nothing and the second one
+ /// initializes the red/green components from a rgb value.
+ rg(){}
+ rg(const rgb8& val){this->v_[0] = val.red(); this->v_[1] = val.green();}
+ /// \}
+
+ /// \brief Affect a rg value to this object.
+ /// \param[in] rhs the value to affect to this object.
+ ///
+ /// If the two objects are different, then then copy the
+ /// underline array of values.
+
+ rg operator=(const rg& rhs)
+ {
+ if (&rhs != this)
+ this->v_ = rhs.v_;
+
+ return *this;
+ }
+ };
+
+ } // end of namespace mln::value
+
+} // end of namespace mln
+
+#endif // ! MLN_VALUE_RG_HH
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
new file mode 100644
index 0000000..77f9015
--- /dev/null
+++ b/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
@@ -0,0 +1,153 @@
+#
+# Generic Makefile
+#
+
+#########
+# TOOLS #
+#########
+
+#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
+CP= cp
+
+SOURCE_PATTERN= green/tests
+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)/
+else
+# Case where make is done from source directory.
+SOURCE_DIR= $(PWD)/
+BUILD__DIR= $(subst $(SOURCE_PATTERN),$(BUILD__PATTERN),$(PWD))
+endif
+
+SRC= $(notdir $(wildcard $(SOURCE_DIR)/*.cc))
+OLD= $(notdir $(wildcard $(SOURCE_DIR)/*~))
+OBJ= $(patsubst %.cc,%.o,$(SRC))
+SOURCE_MAKEFILE=Makefile.am
+BUILD__MAKEFILE=Makefile
+TARGET_FILE= $(notdir $(PWD))
+SOURCE_FILES= $(notdir $(wildcard $(SOURCE_DIR)/*.*))
+BUILD__FILES= $(filter-out $(SRC) $(SOURCE_MAKEFILE), $(SOURCE_FILES))
+
+BUILD__F_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__FILES))
+SOURCE_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_FILES))
+
+BUILD__M_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__MAKEFILE))
+SOURCE_M_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_MAKEFILE))
+
+TARGET_F_PATH= $(addprefix $(BUILD__DIR)/,$(TARGET_FILE))
+OBJ_F_PATH= $(addprefix $(BUILD__DIR)/,$(OBJ))
+SRC_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SRC))
+OLD_F_PATH= $(addprefix $(SOURCE_DIR)/,$(OLD))
+
+#############
+# BOOTSTRAP #
+#############
+
+
+bootstrap: $(BUILD__DIR) $(BUILD__F_PATH) $(BUILD__M_PATH)
+
+# Create, if nessary, the destination directory
+$(BUILD__DIR):
+ $(MKDIR) $(BUILD__DIR)
+
+# Copy, if nessary, all the files, except the Makefile.am
+$(BUILD__F_PATH): $(SOURCE_F_PATH)
+ $(CP) $(addprefix $(SOURCE_DIR),$(@F)) $@
+
+# Copy if nessary, the Makefile.am into Makefile
+$(BUILD__M_PATH): $(SOURCE_M_PATH)
+ $(CP) $(SOURCE_M_PATH) $(BUILD__M_PATH)
+
+
+#######
+# ALL #
+#######
+
+# We assume that the call is done from the build directory.
+# With the directive vpath, hidden files are found in the source directory.
+
+all: $(TARGET_F_PATH)
+
+
+$(TARGET_F_PATH): $(OBJ_F_PATH)
+ $(LINK.cc) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+$(OBJ_F_PATH):$(SRC_F_PATH)
+ $(COMPILE.cc) $(OUTPUT_OPTION) $<
+
+
+#########
+# CLEAN #
+#########
+
+# Force every time the deletion
+clean: clean_target clean_obj clean_dst clean_old #clean_make
+
+
+clean_target:
+ -@$(RM) $(TARGET_F_PATH) &> /dev/null
+
+clean_obj:
+ -@$(RM) $(OBJ_F_PATH) &> /dev/null
+
+clean_dst:
+ -@$(RM) $(BUILD_F_PATH) &> /dev/null
+
+clean_make:
+ -@$(RM) $(BUILD_M_PATH) &> /dev/null
+
+clean_old:
+ -@$(RM) $(OLD_F_PATH) &> /dev/null
+
+
+#########
+# PRINT #
+#########
+
+print: print_tools print_bootstrap
+
+print_tools:
+ @$(ECHO) "HOME = $(HOME)"
+ @$(ECHO) "INCLUDES = $(INCLUDES)"
+ @$(ECHO) "CXXFLAGS = $(CXXFLAGS)"
+ @$(ECHO) "ECHO = $(ECHO)"
+ @$(ECHO) "RM = $(RM)"
+ @$(ECHO) "MKDIR = $(MKDIR)"
+ @$(ECHO) "CP = $(CP)"
+ @$(ECHO)
+
+print_bootstrap:
+ @$(ECHO) "PWD = $(PWD)"
+ @$(ECHO) "SOURCE_PATTERN = $(SOURCE_PATTERN)"
+ @$(ECHO) "BUILD__PATTERN = $(BUILD__PATTERN)"
+ @$(ECHO) "SOURCE_DIR = $(SOURCE_DIR)"
+ @$(ECHO) "BUILD__DIR = $(BUILD__DIR)"
+ @$(ECHO) "SOURCE_MAKEFILE = $(SOURCE_MAKEFILE)"
+ @$(ECHO) "BUILD__MAKEFILE = $(BUILD__MAKEFILE)"
+ @$(ECHO) "TARGET_FILE = $(TARGET_FILE)"
+ @$(ECHO) "SOURCE_FILES = $(SOURCE_FILES)"
+ @$(ECHO) "SOURCE_F_PATH = $(SOURCE_F_PATH)"
+ @$(ECHO) "BUILD__FILES = $(BUILD__FILES)"
+ @$(ECHO) "BUILD__F_PATH = $(BUILD__F_PATH)"
+ @$(ECHO) "BUILD__M_PATH = $(BUILD__M_PATH)"
+ @$(ECHO) "SOURCE_M_PATH = $(SOURCE_M_PATH)"
+ @$(ECHO) "SRC = $(SRC)"
+ @$(ECHO) "OBJ = $(OBJ)"
+ @$(ECHO) "OLD = $(OLD)"
+ @$(ECHO) "SRC_F_PATH = $(SRC_F_PATH)"
+ @$(ECHO) "OBJ_F_PATH = $(OBJ_F_PATH)"
+ @$(ECHO) "OLD_F_PATH = $(OLD_F_PATH)"
+ @$(ECHO)
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
new file mode 100644
index 0000000..5a5c4c4
--- /dev/null
+++ b/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
@@ -0,0 +1,21 @@
+/// TEST HISTO1D
+
+#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/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::stat::histo1d(), img);
+
+ return 0;
+}
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
new file mode 100644
index 0000000..a96b2e9
--- /dev/null
+++ b/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
@@ -0,0 +1,153 @@
+#
+# Generic Makefile
+#
+
+#########
+# TOOLS #
+#########
+
+#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
+CP= cp
+
+SOURCE_PATTERN= green/use
+BUILD__PATTERN= green/build/use
+
+
+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)/
+else
+# Case where make is done from source directory.
+SOURCE_DIR= $(PWD)/
+BUILD__DIR= $(subst $(SOURCE_PATTERN),$(BUILD__PATTERN),$(PWD))
+endif
+
+SRC= $(notdir $(wildcard $(SOURCE_DIR)/*.cc))
+OLD= $(notdir $(wildcard $(SOURCE_DIR)/*~))
+OBJ= $(patsubst %.cc,%.o,$(SRC))
+SOURCE_MAKEFILE=Makefile.am
+BUILD__MAKEFILE=Makefile
+TARGET_FILE= $(notdir $(PWD))
+SOURCE_FILES= $(notdir $(wildcard $(SOURCE_DIR)/*.*))
+BUILD__FILES= $(filter-out $(SRC) $(SOURCE_MAKEFILE), $(SOURCE_FILES))
+
+BUILD__F_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__FILES))
+SOURCE_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_FILES))
+
+BUILD__M_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__MAKEFILE))
+SOURCE_M_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_MAKEFILE))
+
+TARGET_F_PATH= $(addprefix $(BUILD__DIR)/,$(TARGET_FILE))
+OBJ_F_PATH= $(addprefix $(BUILD__DIR)/,$(OBJ))
+SRC_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SRC))
+OLD_F_PATH= $(addprefix $(SOURCE_DIR)/,$(OLD))
+
+#############
+# BOOTSTRAP #
+#############
+
+
+bootstrap: $(BUILD__DIR) $(BUILD__F_PATH) $(BUILD__M_PATH)
+
+# Create, if nessary, the destination directory
+$(BUILD__DIR):
+ $(MKDIR) $(BUILD__DIR)
+
+# Copy, if nessary, all the files, except the Makefile.am
+$(BUILD__F_PATH): $(SOURCE_F_PATH)
+ $(CP) $(addprefix $(SOURCE_DIR),$(@F)) $@
+
+# Copy if nessary, the Makefile.am into Makefile
+$(BUILD__M_PATH): $(SOURCE_M_PATH)
+ $(CP) $(SOURCE_M_PATH) $(BUILD__M_PATH)
+
+
+#######
+# ALL #
+#######
+
+# We assume that the call is done from the build directory.
+# With the directive vpath, hidden files are found in the source directory.
+
+all: $(TARGET_F_PATH)
+
+
+$(TARGET_F_PATH): $(OBJ_F_PATH)
+ $(LINK.cc) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+$(OBJ_F_PATH):$(SRC_F_PATH)
+ $(COMPILE.cc) $(OUTPUT_OPTION) $<
+
+
+#########
+# CLEAN #
+#########
+
+# Force every time the deletion
+clean: clean_target clean_obj clean_dst clean_old #clean_make
+
+
+clean_target:
+ -@$(RM) $(TARGET_F_PATH) &> /dev/null
+
+clean_obj:
+ -@$(RM) $(OBJ_F_PATH) &> /dev/null
+
+clean_dst:
+ -@$(RM) $(BUILD_F_PATH) &> /dev/null
+
+clean_make:
+ -@$(RM) $(BUILD_M_PATH) &> /dev/null
+
+clean_old:
+ -@$(RM) $(OLD_F_PATH) &> /dev/null
+
+
+#########
+# PRINT #
+#########
+
+print: print_tools print_bootstrap
+
+print_tools:
+ @$(ECHO) "HOME = $(HOME)"
+ @$(ECHO) "INCLUDES = $(INCLUDES)"
+ @$(ECHO) "CXXFLAGS = $(CXXFLAGS)"
+ @$(ECHO) "ECHO = $(ECHO)"
+ @$(ECHO) "RM = $(RM)"
+ @$(ECHO) "MKDIR = $(MKDIR)"
+ @$(ECHO) "CP = $(CP)"
+ @$(ECHO)
+
+print_bootstrap:
+ @$(ECHO) "PWD = $(PWD)"
+ @$(ECHO) "SOURCE_PATTERN = $(SOURCE_PATTERN)"
+ @$(ECHO) "BUILD__PATTERN = $(BUILD__PATTERN)"
+ @$(ECHO) "SOURCE_DIR = $(SOURCE_DIR)"
+ @$(ECHO) "BUILD__DIR = $(BUILD__DIR)"
+ @$(ECHO) "SOURCE_MAKEFILE = $(SOURCE_MAKEFILE)"
+ @$(ECHO) "BUILD__MAKEFILE = $(BUILD__MAKEFILE)"
+ @$(ECHO) "TARGET_FILE = $(TARGET_FILE)"
+ @$(ECHO) "SOURCE_FILES = $(SOURCE_FILES)"
+ @$(ECHO) "SOURCE_F_PATH = $(SOURCE_F_PATH)"
+ @$(ECHO) "BUILD__FILES = $(BUILD__FILES)"
+ @$(ECHO) "BUILD__F_PATH = $(BUILD__F_PATH)"
+ @$(ECHO) "BUILD__M_PATH = $(BUILD__M_PATH)"
+ @$(ECHO) "SOURCE_M_PATH = $(SOURCE_M_PATH)"
+ @$(ECHO) "SRC = $(SRC)"
+ @$(ECHO) "OBJ = $(OBJ)"
+ @$(ECHO) "OLD = $(OLD)"
+ @$(ECHO) "SRC_F_PATH = $(SRC_F_PATH)"
+ @$(ECHO) "OBJ_F_PATH = $(OBJ_F_PATH)"
+ @$(ECHO) "OLD_F_PATH = $(OLD_F_PATH)"
+ @$(ECHO)
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
new file mode 100644
index 0000000..1c6176b
--- /dev/null
+++ b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
@@ -0,0 +1,24 @@
+/// \file
+///
+/// \brief Minimal code for building 1d image histogram version.
+///
+
+#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/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::stat::histo1d(), img);
+
+ return 0;
+}
diff --git a/scribo/sandbox/green/use/accu/stat/histo2d/Makefile.am b/scribo/sandbox/green/use/accu/stat/histo2d/Makefile.am
new file mode 100644
index 0000000..a96b2e9
--- /dev/null
+++ b/scribo/sandbox/green/use/accu/stat/histo2d/Makefile.am
@@ -0,0 +1,153 @@
+#
+# Generic Makefile
+#
+
+#########
+# TOOLS #
+#########
+
+#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
+CP= cp
+
+SOURCE_PATTERN= green/use
+BUILD__PATTERN= green/build/use
+
+
+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)/
+else
+# Case where make is done from source directory.
+SOURCE_DIR= $(PWD)/
+BUILD__DIR= $(subst $(SOURCE_PATTERN),$(BUILD__PATTERN),$(PWD))
+endif
+
+SRC= $(notdir $(wildcard $(SOURCE_DIR)/*.cc))
+OLD= $(notdir $(wildcard $(SOURCE_DIR)/*~))
+OBJ= $(patsubst %.cc,%.o,$(SRC))
+SOURCE_MAKEFILE=Makefile.am
+BUILD__MAKEFILE=Makefile
+TARGET_FILE= $(notdir $(PWD))
+SOURCE_FILES= $(notdir $(wildcard $(SOURCE_DIR)/*.*))
+BUILD__FILES= $(filter-out $(SRC) $(SOURCE_MAKEFILE), $(SOURCE_FILES))
+
+BUILD__F_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__FILES))
+SOURCE_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_FILES))
+
+BUILD__M_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__MAKEFILE))
+SOURCE_M_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_MAKEFILE))
+
+TARGET_F_PATH= $(addprefix $(BUILD__DIR)/,$(TARGET_FILE))
+OBJ_F_PATH= $(addprefix $(BUILD__DIR)/,$(OBJ))
+SRC_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SRC))
+OLD_F_PATH= $(addprefix $(SOURCE_DIR)/,$(OLD))
+
+#############
+# BOOTSTRAP #
+#############
+
+
+bootstrap: $(BUILD__DIR) $(BUILD__F_PATH) $(BUILD__M_PATH)
+
+# Create, if nessary, the destination directory
+$(BUILD__DIR):
+ $(MKDIR) $(BUILD__DIR)
+
+# Copy, if nessary, all the files, except the Makefile.am
+$(BUILD__F_PATH): $(SOURCE_F_PATH)
+ $(CP) $(addprefix $(SOURCE_DIR),$(@F)) $@
+
+# Copy if nessary, the Makefile.am into Makefile
+$(BUILD__M_PATH): $(SOURCE_M_PATH)
+ $(CP) $(SOURCE_M_PATH) $(BUILD__M_PATH)
+
+
+#######
+# ALL #
+#######
+
+# We assume that the call is done from the build directory.
+# With the directive vpath, hidden files are found in the source directory.
+
+all: $(TARGET_F_PATH)
+
+
+$(TARGET_F_PATH): $(OBJ_F_PATH)
+ $(LINK.cc) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+$(OBJ_F_PATH):$(SRC_F_PATH)
+ $(COMPILE.cc) $(OUTPUT_OPTION) $<
+
+
+#########
+# CLEAN #
+#########
+
+# Force every time the deletion
+clean: clean_target clean_obj clean_dst clean_old #clean_make
+
+
+clean_target:
+ -@$(RM) $(TARGET_F_PATH) &> /dev/null
+
+clean_obj:
+ -@$(RM) $(OBJ_F_PATH) &> /dev/null
+
+clean_dst:
+ -@$(RM) $(BUILD_F_PATH) &> /dev/null
+
+clean_make:
+ -@$(RM) $(BUILD_M_PATH) &> /dev/null
+
+clean_old:
+ -@$(RM) $(OLD_F_PATH) &> /dev/null
+
+
+#########
+# PRINT #
+#########
+
+print: print_tools print_bootstrap
+
+print_tools:
+ @$(ECHO) "HOME = $(HOME)"
+ @$(ECHO) "INCLUDES = $(INCLUDES)"
+ @$(ECHO) "CXXFLAGS = $(CXXFLAGS)"
+ @$(ECHO) "ECHO = $(ECHO)"
+ @$(ECHO) "RM = $(RM)"
+ @$(ECHO) "MKDIR = $(MKDIR)"
+ @$(ECHO) "CP = $(CP)"
+ @$(ECHO)
+
+print_bootstrap:
+ @$(ECHO) "PWD = $(PWD)"
+ @$(ECHO) "SOURCE_PATTERN = $(SOURCE_PATTERN)"
+ @$(ECHO) "BUILD__PATTERN = $(BUILD__PATTERN)"
+ @$(ECHO) "SOURCE_DIR = $(SOURCE_DIR)"
+ @$(ECHO) "BUILD__DIR = $(BUILD__DIR)"
+ @$(ECHO) "SOURCE_MAKEFILE = $(SOURCE_MAKEFILE)"
+ @$(ECHO) "BUILD__MAKEFILE = $(BUILD__MAKEFILE)"
+ @$(ECHO) "TARGET_FILE = $(TARGET_FILE)"
+ @$(ECHO) "SOURCE_FILES = $(SOURCE_FILES)"
+ @$(ECHO) "SOURCE_F_PATH = $(SOURCE_F_PATH)"
+ @$(ECHO) "BUILD__FILES = $(BUILD__FILES)"
+ @$(ECHO) "BUILD__F_PATH = $(BUILD__F_PATH)"
+ @$(ECHO) "BUILD__M_PATH = $(BUILD__M_PATH)"
+ @$(ECHO) "SOURCE_M_PATH = $(SOURCE_M_PATH)"
+ @$(ECHO) "SRC = $(SRC)"
+ @$(ECHO) "OBJ = $(OBJ)"
+ @$(ECHO) "OLD = $(OLD)"
+ @$(ECHO) "SRC_F_PATH = $(SRC_F_PATH)"
+ @$(ECHO) "OBJ_F_PATH = $(OBJ_F_PATH)"
+ @$(ECHO) "OLD_F_PATH = $(OLD_F_PATH)"
+ @$(ECHO)
diff --git a/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc b/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
new file mode 100644
index 0000000..6369b5a
--- /dev/null
+++ b/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
@@ -0,0 +1,33 @@
+/// \file
+///
+/// \brief Minimal code for building 2d image histogram version.
+///
+
+#include <mln/accu/stat/histo2d.hh>
+#include <mln/core/image/image2d.hh>
+#include <mln/data/compute.hh>
+#include <mln/data/transform.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()
+{
+ 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
24 Jun '10
* mln/accu/stat/histo1d.hh: New header file.
* mln/accu/stat/histo2d.hh: New header file.
* mln/accu/stat/histo3d_hsl.hh: New header file.
* mln/accu/stat/histo3d_rgb.hh: New header file.
* mln/clustering/k_mean.hh: New header file.
* mln/clustering/kmean1d.hh: New header file.
* mln/clustering/kmean2d.hh: New header file.
* mln/clustering/kmean3d.hh: New header file.
* mln/clustering/kmean_rgb.hh: New header file.
* mln/display/display_histo.hh: New header file.
* mln/display/project_histo.hh: New header file.
* mln/fun/p2b/achromatic.hh: New header file.
* mln/fun/p2b/component_equals.hh: New header file.
* mln/fun/v2v/achromatism.hh: New header file.
* mln/fun/v2v/hue_concentration.hh: New header file.
* mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
* mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
* mln/fun/v2v/log.hh: New header file.
* mln/fun/v2v/rg_to_rgb.hh: New header file.
* mln/fun/v2v/rgb8_to_int_u8: New header file.
* mln/fun/v2v/rgb_to_achromastism_map.hh: New header file.
* mln/fun/v2v/rgb_to_hsv.hh: New header file.
* mln/fun/v2v/rgb_to_hue_map.hh: New header file.
* mln/fun/v2v/rgb_to_saturation_map.hh: New header file.
* mln/fun/v2v/rgb_to_value_map.hh: New header file.
* mln/img_path.hh: New header file.
* mln/io/plot/save_image_sh.hh: New header file.
* mln/math/cell.hh: New header file.
* mln/math/floor.hh: New header file.
* tests/accu/stat/histo1d/Makefile.am: New makefile.
* tests/accu/stat/histo1d/histo1d.cc: New source.
* tests/accu/stat/histo2d/Makefile.am: New makefile.
* tests/accu/stat/histo2d/histo2d.cc: New source.
---
scribo/sandbox/green/ChangeLog | 59 ++
scribo/sandbox/green/README | 223 ++++-
scribo/sandbox/green/mln/accu/stat/histo1d.hh | 340 +++++++
scribo/sandbox/green/mln/accu/stat/histo2d.hh | 358 +++++++
.../sandbox/green/mln/accu/stat/histo3d_hsl.hh | 0
.../sandbox/green/mln/accu/stat/histo3d_rgb.hh | 0
.../sandbox/green/mln/clustering/k_mean.hh | 0
.../sandbox/green/mln/clustering/kmean1d.hh | 0
.../sandbox/green/mln/clustering/kmean2d.hh | 0
.../sandbox/green/mln/clustering/kmean3d.hh | 0
scribo/sandbox/green/mln/clustering/kmean_rgb.hh | 973 ++++++++++++++++++
scribo/sandbox/green/mln/display/display_histo.hh | 180 ++++
scribo/sandbox/green/mln/display/project_histo.hh | 536 ++++++++++
scribo/sandbox/green/mln/fun/p2b/achromatic.hh | 112 ++
.../sandbox/green/mln/fun/p2b/component_equals.hh | 99 ++
scribo/sandbox/green/mln/fun/v2v/achromatism.hh | 64 ++
.../sandbox/green/mln/fun/v2v/hue_concentration.hh | 100 ++
.../green/mln/fun/v2v/int_u16_to_int_u14.hh | 0
.../sandbox/green/mln/fun/v2v/log.hh | 0
.../sandbox/green/mln/fun/v2v/rg_to_rgb.hh | 0
scribo/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh | 71 ++
.../sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh | 0
.../green/mln/fun/v2v/rgb_to_achromatism_map.hh | 77 ++
scribo/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh | 149 +++
scribo/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh | 96 ++
scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh | 111 ++
.../green/mln/fun/v2v/rgb_to_saturation_map.hh | 83 ++
.../sandbox/green/mln/fun/v2v/rgb_to_value_map.hh | 75 ++
scribo/sandbox/green/mln/img_path.hh | 239 +++++
scribo/sandbox/green/mln/io/plot/save_image_sh.hh | 1056 ++++++++++++++++++++
scribo/sandbox/green/mln/math/ceil.hh | 64 ++
scribo/sandbox/green/mln/math/floor.hh | 64 ++
scribo/sandbox/green/mln/value/hsv.hh | 424 ++++++++
scribo/sandbox/green/mln/value/rg.hh | 175 ++++
.../green/tests/accu/stat/histo1d/Makefile.am | 153 +++
.../green/tests/accu/stat/histo1d/histo1d.cc | 21 +
.../green/use/accu/stat/histo1d/Makefile.am | 153 +++
.../sandbox/green/use/accu/stat/histo1d/histo1d.cc | 24 +
.../green/use/accu/stat/histo2d/Makefile.am | 153 +++
.../sandbox/green/use/accu/stat/histo2d/histo2d.cc | 33 +
40 files changed, 6247 insertions(+), 18 deletions(-)
create mode 100644 scribo/sandbox/green/mln/accu/stat/histo1d.hh
create mode 100644 scribo/sandbox/green/mln/accu/stat/histo2d.hh
copy {milena => scribo}/sandbox/green/mln/accu/stat/histo3d_hsl.hh (100%)
copy {milena => scribo}/sandbox/green/mln/accu/stat/histo3d_rgb.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/k_mean.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/kmean1d.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/kmean2d.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/kmean3d.hh (100%)
create mode 100644 scribo/sandbox/green/mln/clustering/kmean_rgb.hh
create mode 100644 scribo/sandbox/green/mln/display/display_histo.hh
create mode 100644 scribo/sandbox/green/mln/display/project_histo.hh
create mode 100644 scribo/sandbox/green/mln/fun/p2b/achromatic.hh
create mode 100644 scribo/sandbox/green/mln/fun/p2b/component_equals.hh
create mode 100644 scribo/sandbox/green/mln/fun/v2v/achromatism.hh
create mode 100644 scribo/sandbox/green/mln/fun/v2v/hue_concentration.hh
copy {milena => scribo}/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/log.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rg_to_rgb.hh (100%)
create mode 100644 scribo/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh (100%)
create mode 100644 scribo/sandbox/green/mln/fun/v2v/rgb_to_achromatism_map.hh
create mode 100644 scribo/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh
create mode 100644 scribo/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh
create mode 100644 scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
create mode 100644 scribo/sandbox/green/mln/fun/v2v/rgb_to_saturation_map.hh
create mode 100644 scribo/sandbox/green/mln/fun/v2v/rgb_to_value_map.hh
create mode 100644 scribo/sandbox/green/mln/img_path.hh
create mode 100644 scribo/sandbox/green/mln/io/plot/save_image_sh.hh
create mode 100644 scribo/sandbox/green/mln/math/ceil.hh
create mode 100644 scribo/sandbox/green/mln/math/floor.hh
create mode 100644 scribo/sandbox/green/mln/value/hsv.hh
create mode 100644 scribo/sandbox/green/mln/value/rg.hh
create mode 100644 scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
create mode 100644 scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
create mode 100644 scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
create mode 100644 scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
create mode 100644 scribo/sandbox/green/use/accu/stat/histo2d/Makefile.am
create mode 100644 scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog
index e69de29..6a3c8fa 100644
--- a/scribo/sandbox/green/ChangeLog
+++ b/scribo/sandbox/green/ChangeLog
@@ -0,0 +1,59 @@
+2010-06-24 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Import files from milena/sandbox/green.
+
+ * mln/accu/stat/histo1d.hh: New header file.
+ * mln/accu/stat/histo2d.hh: New header file.
+ * mln/accu/stat/histo3d_hsl.hh: New header file.
+ * mln/accu/stat/histo3d_rgb.hh: New header file.
+ * mln/clustering/k_mean.hh: New header file.
+ * mln/clustering/kmean1d.hh: New header file.
+ * mln/clustering/kmean2d.hh: New header file.
+ * mln/clustering/kmean3d.hh: New header file.
+ * mln/clustering/kmean_rgb.hh: New header file.
+ * mln/display/display_histo.hh: New header file.
+ * mln/display/project_histo.hh: New header file.
+ * mln/fun/p2b/achromatic.hh: New header file.
+ * mln/fun/p2b/component_equals.hh: New header file.
+ * mln/fun/v2v/achromatism.hh: New header file.
+ * mln/fun/v2v/hue_concentration.hh: New header file.
+ * mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
+ * mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
+ * mln/fun/v2v/log.hh: New header file.
+ * mln/fun/v2v/rg_to_rgb.hh: New header file.
+ * mln/fun/v2v/rgb8_to_int_u8: New header file.
+ * mln/fun/v2v/rgb_to_achromastism_map.hh: New header file.
+ * mln/fun/v2v/rgb_to_hsv.hh: New header file.
+ * mln/fun/v2v/rgb_to_hue_map.hh: New header file.
+ * mln/fun/v2v/rgb_to_saturation_map.hh: New header file.
+ * mln/fun/v2v/rgb_to_value_map.hh: New header file.
+ * mln/img_path.hh: New header file.
+ * mln/io/plot/save_image_sh.hh: New header file.
+ * mln/math/cell.hh: New header file.
+ * mln/math/floor.hh: New header file.
+ * tests/accu/stat/histo1d/Makefile.am: New makefile.
+ * tests/accu/stat/histo1d/histo1d.cc: New source.
+ * tests/accu/stat/histo2d/Makefile.am: New makefile.
+ * tests/accu/stat/histo2d/histo2d.cc: New source.
+
+2010-06-21 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Save histogram library.
+
+ * 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>
+
+ Simple integration test.
+
+ * README: New text file.
+ * ok/mln/img_path.hh: New header file.
+ * ok/mln/accu/histo/histo1d.hh: New header file.
+ * ok/mln/accu/histo/histo2d.hh: New header file.
+ * ok/mln/accu/histo/histo3d.hh: New header file.
+ * ok/test/accu/histo/gaussian.sh: New gnuplot script file.
+ * ok/test/accu/histo/histo1d.cc: New source file.
+
diff --git a/scribo/sandbox/green/README b/scribo/sandbox/green/README
index 4eb71b7..3efe50d 100644
--- a/scribo/sandbox/green/README
+++ b/scribo/sandbox/green/README
@@ -1,32 +1,219 @@
-Le travail est classé dans deux répertoires ok et ko.
-Le répertoire ok correspond aux sources qui ont été reprises et retestées.
-Le répertoire ko correspond aux sources qui ont été juste transférées.
+I ARBORESCENCE
+--------------
-La première brique logicielle importante sur laquelle s'appuie mes travaux est
-la création d'histogrammes sous forme d'image.
+bench ==> Comparaison d'algorithmes d'un point de vue temps d'exécution.
+bug ==> Bug rencontrés dans milena et archivés sous forme de programme.
+build ==> Répertoire d'exécution, non sauvé dans git.
+demo ==> Première version d'un algorithme pour voir son comportement.
+doc ==> Documentation tex ou code minimal pour de petits exemples.
+exp ==> Version avancée des algorithmes pour traitées les bases de données.
+mln ==> Partie mise en librairie milena des différents travaux.
+tests ==> Tests unitaires sur certains algorithmes.
+tools ==> Découpage de certains algorithmes pour mieux les tester séparément.
+use ==> Test de compilation, code minimal pour compiler un élément.
+II COMPILATION
+--------------
-CREATION DES HISTOGRAMMES
--------------------------
+L'unité minimale de code choisie est le répertoire.
+Donc aller dans le répertoire qui nous interesse,
+par exemple, green/demo/annotating/hsv et lancé le make
-ko/mln/accu/stat/histo1d.hh: histogramme image valeur scalaire.
-ko/mln/accu/stat/histo2d.hh: histogramme image valeur vectorielle 2d.
-ko/mln/accu/stat/histo3d_hsl.hh: histogramme image valeur vectorielle 3d (HSL).
-ko/mln/accu/stat/histo3d_rgb.hh: histogramme image valeur vectorielle 3d (RGB).
+#:~/git/olena/scribo/sandbox/green$cd demo/annotating/hsv
+#:~/git/olena/scribo/sandbox/green/demo/annotating/hsv$ make -f Makefile.am
+Cette opération créé dans build le répertoire de compilation
+green/build/demo/annotating/hsv. Dans ce répertoire aura été copié un
+Makefile et tous les fichiers qui ne sont pas des sources. Par
+exemple, des fichiers de calibration comme gaussian.sh (pour vérifier
+la mire du filtre de gaussienne) ou de la documentation à la sauvette
+sous forme de fichiers textes jetés à la va vite dans le répertoire
+pour ne pas perdre l'information recherchée. En l'occurence, ici, il
+n'y a rien à copier. Rendons-nous dans le répertoire de compilation et lançons
+le makefile.
+#:~/git/olena/scribo/sandbox/green/demo/annotating/hsv$
+cd ../../../build/demo/annotating/hsv
+#:~/git/olena/scribo/sandbox/green/build/demo/annotating/hsv$ make clean all
-ok/mln/accu/histo/histo1d.hh: histogramme image valeur scalaire entière.
-ok/mln/accu/histo/histo2d.hh: histogramme image valeur vectorielle 2d entière.
-ok/mln/accu/histo/histo3d.hh: histogramme image valeur vectorielle 3d entière.
+L'exécutable est généré par le makefile, il porte le nom du
+répertoire. Si il y a besoin de mettre à jour le makefile, le faire
+dans le répertoire des sources en éditant Makefile.am, puis en
+régénérant le Makefile dans le répertoire d'exécution par la commande
+make -f Makefile.am depuis le répertoire source.
-SAUVEGARDE DES HISTOGRAMMES
----------------------------
+III MAKEFILE
+------------
+Les makefiles utilisés sont tous les mêmes avec quelques variables
+dont le contenu change dans leur partie en-tête.
+Pour chaque répertoire, le makefile doit savoir si le chemin courant
+est un répertoire de compilation ou un répertoire de source. Pour les
+identifier, il a recours à un pattern qui malheureusemnt fait
+intervenir le nom de la branche de développement (bench,demo,bug,exp ...).
+SOURCE_PATTERN= green/demo
+BUILD__PATTERN= green/build/demo
-VISUALISATION DES HISTOGRAMMES
-------------------------------
\ No newline at end of file
+Si un makefile ne fonctionne pas, il faut vérifier ceci en premier
+lieu. Ici, le makefile doit être situé dans la branche démo.
+
+Autre élément à savoir, la compilation nécessite d'inclure la
+librairie milena, ainsi que les développements propres en vu de leur
+intégration futur dans milena, ceci est fait par un jeu d'INCLUDES1
+et INCLUDES2.
+
+INCLUDES1= -I$(HOME)/git/olena/scribo/sandbox/green
+INCLUDES2= -I$(HOME)/git/olena/milena
+INCLUDES= $(INCLUDES1) $(INCLUDES2)
+
+Suivant l'allure du compte où l'on exécute les makefiles, il faut
+revoir le chemin pour trouver des deux répertoires.
+
+Enfin, les options de compilations ne sont pas toujours les mêmes. Les
+trois lignes possibles sont toutes présentes et seule celle qui est
+utilisée n'est pas commentée. Typiquement, dans la branche de
+développement démo où les perfomances ne sont pas le problème, on
+compilera avec tout le matériel pour utiliser gdb et sans
+optimisation. A l'inverse, dans la branche d'expérimentation, où le
+code a déjà été testé, on cherche à aller vite car on exécute ce code
+sur de nombreuses images. Dans cette optique, pas de débugage, pas de
+traçage, optimisation conséquente.
+
+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)
+
+Une dernière dernière information, dans le cadre des développements
+exp, et tools, on utilise la librairie boost soit pour la
+virtualisation du filesystem, soit pour le formatage des fichiers text
+(réalisation de colonnes, mettre des entiers sur un certain nombre de
+caractères). Une ligne de chargement des librairies peut apparaitre donc.
+
+LOADLIBES= -lboost_filesystem
+
+On retrouvera les includes suivantes dans les sources:
+
+#include <boost/format.hpp>
+#include <boost/filesystem.hpp>
+
+
+IV CHEMINS DES IMAGES
+---------------------
+
+Toutes les images ont toujours été locales sur mon ordinateur. La
+politique a toujours été d'utiliser un fichier img_path pour coder les
+chemins des images. Les chemins étant plutôt long, j'ai toujours eu
+tendance à faire en sorte qu'ils soient compilés en dur (sauf pour la
+partie développement tools qui est vraiment voué à donner des
+exécutables indépendants et génériques). Le fichier mln/img_path.hh
+code la position de toutes les images dans mon arborescence. Il faudra
+donc veiller à changer tous les chemins pour les adapter au compte
+dans lequel on voudra reprendre le code. Dans le code, les références
+aux positions des images sont faites via des macros.
+
+Toutes les images sont située dans git/img. En règle générale, je ne
+traite que des images au format .pgm, .pbm et .ppm. Il m'arrive
+fréquemment de dumper des images au format .sh (gnuplot shell
+image). Pour la branche tools, nous avons utilisé les dumps de milena
+comme format de transfert d'un utilitaire à un autre. Les images sont
+classées suivant leur provenance. Nous avons tout d'abord la base
+OLENA (copie des images de tests milena), la base INIM (très peu
+utilisée voire jamais), la base ICDAR (très utilisée, surtout dans
+exp), la base AFP (très utilisée dans exp) et les bases ANNOTATING1 et
+ANNOTATING2 (pas très utilisées ni l'une, ni l'autre).
+
+La plus part du temps, sauver les résultats dans le répertoire
+d'exécution courant est largement suffisant. Parfois, il est
+nécessaire de sauvegarder de grosses quantités d'informations et de
+les classer comme dans la branche de développement exp. C'est pour
+cela, qu'un certain nombre de macros définissent des endroits pour
+sauvegarder les résultats lors d'expérimentation de grande ampleur sur
+toute la base ICDAR ou AFP.
+
+
+V GNUPLOT SCRIPT SHELL IMAGE FORMAT
+-----------------------------------
+
+J'abrège le nom du format par gnuplot shell format. En fait, c'est un
+format d'image particulier qui a besoin de gnuplot pour être lu. Il
+est donc compatible avec aucun viewer si ce n'est gnuplot, mais a la
+caractéristique d'afficher tous les points de manière visible. Par
+ailleurs, comme il s'agit d'un script gnuplot il permet d'insérer très
+facilement une fonction pour visualiser les données autrement (par
+exemple, changer d'espace: HSL, HSV). Le fichier tire son nom de la
+façon dont il fonctionne. C'est un script shell qui fait un appel à
+gnuplot et lui passe le jeu de données directement à partir de ce même
+fichier, pas besoin de faire appel à un autre fichier. Une fois
+généré, le fichier doit être modifié pour avoir les permissions
+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
+
+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.
+L'intérêt est ensuite de pouvoir filtrer directement ces histogrammes
+par les algorithmes de milena, ou encore d'étudier les valeurs
+caractéristiques par d'autres accumulateurs. Les codes réellement
+utilisés sont histo1d et histo3d RGB. Tous les autres codes sont très
+expérimentaux. Notemment, le code HSL demande de quantifier l'espace
+de comptage puisqu'il est décrit sous la forme de triplets de float
+(les autres sont inférés). Néanmoins, le code est à conserver car il
+contient une séquence d'appels pour les routines permettant de
+considérer la dimension de la teinte comme circulaire.
+
+* mln/accu/stat/histo1d.hh: Accumulateur histogramme image1d.
+* use/accu/stat/histo1d: Code minimal utilisant un histogramme 1d.
+
+* mln/accu/stat/histo2d.hh: Accumulateur histogramme image2d.
+* mln/value/rg.hh: Définition du type vectoriel 2d rouge/vert (RG).
+* mln/fun/v2v/rgb_to_rg.hh: Transformation de l'espace RGB vers l'espace RG.
+* 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.
+
+* use/accu/stat/histo3_rgb: Code minimal utilisant un histogramme 3d RGB.
+* use/accu/stat/histo3_hsl: Code minimal utilisant un histogramme 3d HSL.
+
+
+
+* tests/accu/stat/histo1d
+
+
+
+
+* tests/accu/stat/histo2d
+
+
+
+* use/accu/stat/histo3d_rgb
+* tests/accu/stat/histo3d_rgb
+
+* use/accu/stat/histo3d_hsl
+* tests/accu/stat/histo3d_hsl
+
+
+c) La visualisation des histogrammes 3d
+
+* demo/accu/stat/histo2d
+
+* mln/display/dispay_histo.hh
+* mln/displayproject_histo.hh
diff --git a/scribo/sandbox/green/mln/accu/stat/histo1d.hh b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
new file mode 100644
index 0000000..d480cf0
--- /dev/null
+++ b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
@@ -0,0 +1,340 @@
+// 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.
+
+#ifndef MLN_ACCU_STAT_HISTO1D_HH
+#define MLN_ACCU_STAT_HISTO1D_HH
+
+/// \file
+///
+/// \brief Define a histogram as accumulator which returns an image1d.
+///
+/// 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. So the int_u8 image has got 256 bins, the
+/// int_u<14> image has got 16384 bins. But, this code doesn't work
+/// for that quantification because of the coord limitation (signed
+/// short, as it is defined in mln/core/def/coord.hh). Take care of
+/// the limitation from the result image value. We hard code unsigned,
+/// but it sometimes not enought to count data in one bin. That last
+/// case has not occured since the beginning of the creation of the type.
+///
+/// The following sample is a typical use of the histogram.
+///
+/// #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/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);
+///
+/// return 0;
+/// }
+
+
+#include <iostream>
+
+#include <mln/accu/internal/base.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/literal/zero.hh>
+
+#include <mln/trace/entering.hh>
+#include <mln/trace/exiting.hh>
+
+#include <mln/trait/value/comp.hh>
+
+#include <mln/value/ops.hh>
+
+namespace mln
+{
+
+ namespace accu
+ {
+
+ namespace stat
+ {
+
+ // Forward declaration
+ template <typename V>
+ struct histo1d;
+
+ } // end of namespace mln::accu::stat
+
+
+ namespace meta
+ {
+
+ namespace stat
+ {
+
+ struct histo1d : public Meta_Accumulator<histo1d>
+ {
+ template <typename V>
+ struct with
+ {
+ typedef accu::stat::histo1d<V> ret;
+ };
+ };
+
+ } // end of namespace mln::accu::meta::stat
+
+ } // end of namespace mln::accu::meta
+
+ } // end of namespace mln::accu
+
+ namespace trait
+ {
+
+ template <typename V>
+ struct accumulator_< mln::accu::stat::histo1d<V> >
+ {
+ typedef accumulator::has_untake::no has_untake;
+ typedef accumulator::has_set_value::no has_set_value;
+ typedef accumulator::has_stop::no has_stop;
+ typedef accumulator::when_pix::use_v when_pix;
+ };
+
+ template <typename V>
+ struct set_precise_binary_<op::eq,
+ accu::stat::histo1d<V>,
+ accu::stat::histo1d<V> >
+ {
+ typedef bool ret;
+ };
+
+ } // end of namespace mln::trait
+
+ namespace accu
+ {
+
+ namespace stat
+ {
+
+ /// \brief Define a histogram as accumulator which returns an image1d.
+ ///
+ /// 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<int_u8> or with
+ /// image2d<int_u<14> >. The number of bins depends directly the
+ /// values V. For 8 bits there is 256 bins, for 14 bits there
+ /// is 16384 bins. Note that over quantification works too (up
+ /// to 14 bits).
+ ///
+ /// \ingroup modaccuvalues
+
+ template <typename V>
+ struct histo1d :
+ public mln::accu::internal::base<image1d<unsigned>, histo1d<V> >
+ {
+ typedef V argument;
+ typedef image1d<unsigned> result;
+ typedef result q_result;
+
+ /// Constructors
+ /// \{
+ /// \brief Infer the size of the resulting image1d domain.
+ ///
+ /// By evaluating the minimum and the maximum of V, we define the domain
+ /// of the resulting image1d.
+ histo1d();
+ /// \}
+
+
+ /// 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
+ /// density.
+ void init();
+
+
+ /// \brief Update the histogram with the graylevel of the 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 histo1d<V>& other);
+ /// \}
+
+ /// Accessors.
+ /// \{
+ /// \brief Return the histogram as an image1d.
+ ///
+ /// This is the machinery to communicate with data compute interface.
+ /// The end user should'nt use it.
+ result to_result() const;
+ operator result () const;
+ /// \}
+
+ /// \brief Check whethever this accumulator is able to return a result.
+ ///
+ /// Depends if the resulting image1d is valid. We can assume it is quite
+ /// always the case.
+ bool is_valid() const;
+
+ protected:
+ 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 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
+
+ template <typename V>
+ inline
+ histo1d<V>::histo1d()
+ {
+ trace::entering("mln::accu::stat::histo1d::cstor");
+ typedef mln_trait_value_comp(V,0) comp;
+ typedef point<grid::tick, V> v_point1d;
+ typedef box<v_point1d> v_box1d;
+
+ // comp keep a trace of the dimension of the theorical image.
+ // mln_min(comp) --> 0
+ // mln_max(comp) --> 2^(n-1) [127 for n=7][255 for n=8] ...
+
+ count_.init_(box1d(point1d(mln_min(comp)),
+ point1d(mln_max(comp))));
+
+ // std::cout << "min : " << mln_min(comp) << std::endl;
+ // std::cout << "max : " << mln_max(comp) << std::endl;
+
+ trace::exiting("mln::accu::stat::histo1d::cstor");
+ }
+
+ template <typename V>
+ inline
+ void histo1d<V>::init()
+ {
+ data::fill(count_, literal::zero);
+ }
+
+ template <typename V>
+ inline
+ void histo1d<V>::take(const argument& t)
+ {
+ // Just convert a graylevel value (int_u8 like) to a position for an
+ // iterator on the resulting image.
+ ++count_(point1d(t));
+ }
+
+
+ template <typename V>
+ inline
+ void histo1d<V>::take(const histo1d<V>& other)
+ {
+ count_ += other.count_;
+ }
+
+ template <typename V>
+ inline
+ typename histo1d<V>::result histo1d<V>::to_result() const
+ {
+ return count_;
+ }
+
+ template <typename V>
+ inline
+ histo1d<V>::operator result() const
+ {
+ return count_;
+ }
+
+ template <typename V>
+ inline
+ bool histo1d<V>::is_valid() const
+ {
+ bool result = count_.is_valid();
+
+ return result;
+ }
+
+ template <typename V>
+ bool operator==(const histo1d<V>& histo1, const histo1d<V>& histo2)
+ {
+ trace::entering("mln::accu::stat::histo1d::operator==");
+
+ bool result = true;
+ const image1d<unsigned>& res1 = histo1.to_result();
+ const image1d<unsigned>& res2 = histo2.to_result();
+
+ mln_precondition(res1.is_valid());
+ mln_precondition(res2.is_valid());
+
+ mln_piter(image1d<unsigned>) p1(res1.domain());
+ mln_piter(image1d<unsigned>) p2(res2.domain());
+
+ for_all_2(p1, p2)
+ result &= (res1(p1) == res2(p2));
+
+ trace::exiting("mln::accu::stat::histo1d::operator==");
+ return result;
+ }
+
+#endif // ! MLN_INCLUDE_ONLY
+
+
+ } // end of namespace mln::accu::stat
+
+ } // end of namespace mln::accu
+
+} // end of namespace mln
+
+#endif // ! MLN_ACCU_STAT_HISTO1D_HH
diff --git a/scribo/sandbox/green/mln/accu/stat/histo2d.hh b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
new file mode 100644
index 0000000..c28723c
--- /dev/null
+++ b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
@@ -0,0 +1,358 @@
+// 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.
+
+#ifndef MLN_ACCU_STAT_HISTO2D_HH
+# define MLN_ACCU_STAT_HISTO2D_HH
+
+/// \file
+///
+/// \brief Define a histogram as accumulator which returns an image2d.
+///
+/// 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 with vectorial image, typically RGB
+/// space where only RG are preserved. See histo1d.hh for limitations
+/// of such implementation. 8 bits quantification starts to be
+/// expensive, it produces image2d with [0..255,0..255] as domain.
+///
+/// The following sample is a typical use of the histogram.
+///
+/// #include <mln/accu/stat/histo2d.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.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()
+/// {
+/// 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;
+/// }
+
+# include <iostream>
+
+# include <mln/accu/internal/base.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/arith/plus.hh>
+
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
+
+# include <mln/value/ops.hh>
+
+namespace mln
+{
+
+ namespace accu
+ {
+
+ namespace stat
+ {
+
+ // Forward declaration
+ template <typename V>
+ struct histo2d;
+
+ } // end of namespace mln::accu::stat
+
+ namespace meta
+ {
+
+ namespace stat
+ {
+
+ struct histo2d : public Meta_Accumulator<histo2d>
+ {
+ template <typename V>
+ struct with
+ {
+ typedef accu::stat::histo2d<V> ret;
+ };
+ };
+
+ } // end of namespace mln::accu::meta::stat
+
+ } // end of namespace mln::accu::meta
+
+ } // end of namespace mln::accu
+
+
+ namespace trait
+ {
+
+ template <typename V>
+ struct accumulator_< mln::accu::stat::histo2d<V> >
+ {
+ typedef accumulator::has_untake::no has_untake;
+ typedef accumulator::has_set_value::no has_set_value;
+ typedef accumulator::has_stop::no has_stop;
+ typedef accumulator::when_pix::use_v when_pix;
+ };
+
+ template <typename V>
+ struct set_precise_binary_<op::eq,
+ accu::stat::histo2d<V>,
+ accu::stat::histo2d<V> >
+ {
+ typedef bool ret;
+ };
+
+ } // end of namespace mln::trait
+
+ namespace accu
+ {
+
+ namespace stat
+ {
+
+ /// \brief Define an histogram 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
+ /// quantification works too.
+ ///
+ /// \ingroup modaccuvalues
+
+ template <typename V>
+ struct histo2d :
+ public mln::accu::internal::base<image2d<unsigned>, histo2d<V> >
+ {
+ typedef V argument;
+ typedef image2d<unsigned> result;
+ typedef result q_result;
+
+ /// Constructors
+ /// \{
+ /// \brief Initialize the size of the resulting image1d.
+ ///
+ /// Initialize the size the resulting image from the theorical dynamic
+ /// of the greylevel values (Use V to manage it).
+ histo2d();
+ /// \}
+
+
+ /// 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
+ /// density.
+ void init();
+
+
+ /// \brief Update the histogram with the RGB pixel t.
+ /// \param[in] t a greylevel 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.
+ void take(const histo2d<V>& other);
+ /// \}
+
+ /// Accessors.
+ /// \{
+ /// \brief Return the histogram as an image1d.
+ ///
+ /// This is the machinery to communicate with data compute interface.
+ /// The end user should'nt use it.
+ result to_result() const;
+ operator result () const;
+ /// \}
+
+ /// \brief Check whethever this accumulator is able to return a result.
+ ///
+ /// Depends if the resulting image1d is valid. We can assume it is quite
+ /// always the case.
+ bool is_valid() const;
+
+ protected:
+ 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.
+
+ template <typename V>
+ bool operator==(const histo2d<V>& histo1,
+ const histo2d<V>& histo2);
+
+#ifndef MLN_INCLUDE_ONLY
+
+ template <typename V>
+ inline
+ histo2d<V>::histo2d()
+ {
+ trace::entering("mln::accu::stat::histo2d::histo2d");
+ typedef mln_trait_value_comp(V,0) comp0;
+ typedef mln_trait_value_comp(V,1) comp1;
+
+ // comp keep a trace of the dimension of the theorical image.
+ // mln_min(comp) --> 0
+ // mln_max(comp) --> 2^(n-1) [127 for n=7][255 for n=8] ...
+
+ count_.init_(box2d(point2d(mln_min(comp0),
+ mln_min(comp1)),
+ point2d(mln_max(comp0),
+ mln_max(comp1))));
+
+ trace::exiting("mln::accu::stat::histo2d::histo2d");
+ }
+
+ 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");
+ }
+
+ 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");
+ }
+
+
+ template <typename V>
+ 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_;
+ }
+
+ template <typename V>
+ inline
+ histo2d<V>::operator result() const
+ {
+ trace::entering("mln::accu::stat::histo2d::operator result");
+
+ trace::exiting("mln::accu::stat::histo2d::operator result");
+ return count_;
+ }
+
+ template <typename V>
+ 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;
+ }
+
+ template <typename V>
+ bool operator==(const histo2d<V>& histo1,
+ const histo2d<V>& histo2)
+ {
+ trace::entering("mln::accu::stat::operator==");
+
+ bool result = true;
+ const image2d<unsigned>& res1 = histo1.to_result();
+ const image2d<unsigned>& res2 = histo2.to_result();
+
+ mln_precondition(res1.is_valid());
+ mln_precondition(res2.is_valid());
+
+ mln_piter(image2d<unsigned>) p1(res1.domain());
+ mln_piter(image2d<unsigned>) p2(res2.domain());
+
+ for_all_2(p1, p2)
+ result &= (res1(p1) == res2(p2));
+
+ trace::exiting("mln::accu::stat::operator==");
+ return result;
+ }
+
+#endif // ! MLN_INCLUDE_ONLY
+
+
+ } // end of namespace mln::accu::stat
+
+ } // end of namespace mln::accu
+
+} // end of namespace mln
+
+#endif // ! MLN_ACCU_STAT_HISTO2D_HH
diff --git a/milena/sandbox/green/mln/accu/stat/histo3d_hsl.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
similarity index 100%
copy from milena/sandbox/green/mln/accu/stat/histo3d_hsl.hh
copy to scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
diff --git a/milena/sandbox/green/mln/accu/stat/histo3d_rgb.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
similarity index 100%
copy from milena/sandbox/green/mln/accu/stat/histo3d_rgb.hh
copy to scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
diff --git a/milena/sandbox/green/mln/clustering/k_mean.hh b/scribo/sandbox/green/mln/clustering/k_mean.hh
similarity index 100%
copy from milena/sandbox/green/mln/clustering/k_mean.hh
copy to scribo/sandbox/green/mln/clustering/k_mean.hh
diff --git a/milena/sandbox/green/mln/clustering/kmean1d.hh b/scribo/sandbox/green/mln/clustering/kmean1d.hh
similarity index 100%
copy from milena/sandbox/green/mln/clustering/kmean1d.hh
copy to scribo/sandbox/green/mln/clustering/kmean1d.hh
diff --git a/milena/sandbox/green/mln/clustering/kmean2d.hh b/scribo/sandbox/green/mln/clustering/kmean2d.hh
similarity index 100%
copy from milena/sandbox/green/mln/clustering/kmean2d.hh
copy to scribo/sandbox/green/mln/clustering/kmean2d.hh
diff --git a/milena/sandbox/green/mln/clustering/kmean3d.hh b/scribo/sandbox/green/mln/clustering/kmean3d.hh
similarity index 100%
copy from milena/sandbox/green/mln/clustering/kmean3d.hh
copy to scribo/sandbox/green/mln/clustering/kmean3d.hh
diff --git a/scribo/sandbox/green/mln/clustering/kmean_rgb.hh b/scribo/sandbox/green/mln/clustering/kmean_rgb.hh
new file mode 100644
index 0000000..253745b
--- /dev/null
+++ b/scribo/sandbox/green/mln/clustering/kmean_rgb.hh
@@ -0,0 +1,973 @@
+// Copyright (C) 2008,2009 EPITA Research and Development Laboratory (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.
+
+#ifndef MLN_CLUSTERING_KMEAN_RGB_HH
+# define MLN_CLUSTERING_KMEAN_RGB_HH
+
+/// \file
+///
+/// \brief Implements the optimized kmean algorithm.
+///
+/// This algorithm is optimized in the way it proceeds directly with
+/// the rgb values inspite of the pixel attribute. The
+/// algorithm is independant from the image dimension. But, we have to
+/// compute one time the histogram. In fact, we move a recurrent cost
+/// to a fix cost in the complexity. This version is adapted to
+/// image with small quantification.
+
+/// APLATISSEMENT DES KMEAN3D
+
+# include <limits.h>
+# include <iostream>
+
+# include <mln/accu/stat/histo3d_rgb.hh>
+
+# include <mln/algebra/vec.hh>
+
+# include <mln/core/concept/image.hh>
+# include <mln/core/contract.hh>
+# include <mln/core/image/image2d.hh>
+# include <mln/core/macros.hh>
+
+# include <mln/data/compute.hh>
+# include <mln/data/fill.hh>
+# include <mln/data/transform.hh>
+
+# include <mln/debug/println.hh>
+
+# include <mln/io/ppm/save.hh>
+# include <mln/io/pgm/save.hh>
+
+# include <mln/labeling/colorize.hh>
+# include <mln/labeling/mean_values.hh>
+
+# include <mln/literal/zero.hh>
+# include <mln/literal/one.hh>
+
+# include <mln/math/min.hh>
+# include <mln/math/sqr.hh>
+
+# include <mln/norm/l2.hh>
+
+# include <mln/opt/at.hh>
+
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
+
+# include <mln/trait/value_.hh>
+
+# include <mln/util/array.hh>
+
+# include <mln/value/int_u.hh>
+# include <mln/value/rgb8.hh>
+# include <mln/value/label_8.hh>
+
+
+//--------------------------------------------------------------------------
+// CODE APLATI
+//--------------------------------------------------------------------------
+
+
+namespace mln
+{
+
+ namespace clustering
+ {
+
+ template <typename T, unsigned n, typename I>
+ inline
+ image2d<value::label_8>
+ kmean_rgb(const Image<I>& point,
+ const unsigned k_center,
+ const unsigned watch_dog,
+ const unsigned n_times);
+
+ } // end of namespace mln::clustering
+
+ namespace clustering
+ {
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ //--------------------------------------------------------------------------
+ // Internal.
+ //--------------------------------------------------------------------------
+
+ namespace internal
+ {
+
+ //------------------------------------------------------------------------
+ // Debugging tools
+ //------------------------------------------------------------------------
+
+ /*
+ template <typename T, unsigned n>
+ inline
+ void kmean3d_a<T,n>::build_label_dbg()
+ {
+ trace::entering("mln::clustering::kmean3d_a::build_label_dbg");
+
+ mln_piter(t_point_img) pi(_point.domain());
+ mln_piter(t_label_dbg) po(_label_dbg.domain());
+
+ for_all_2(pi, po)
+ {
+ t_value val = _point(pi);
+ t_label grp = _group(point3d(val.blue(), val.red(), val.green()));
+
+ // As label zero has got a particular semantic, the first label is one
+ _label_dbg(po) = ++grp;
+ }
+
+ trace::exiting("mln::clustering::kmean3d_a::build_label_dbg");
+ }
+
+ template <typename T, unsigned n>
+ inline
+ void kmean3d_a<T,n>::build_mean_dbg()
+ {
+ trace::entering("mln::clustering::kmean3d_a::build_mean_dbg");
+
+ mln_piter(t_mean_dbg) p(_mean_dbg.domain());
+
+ for_all(p)
+ {
+ _mean_dbg(p).red() = static_cast<unsigned>(_mean[_label_dbg(p)][0]);
+ _mean_dbg(p).green() = static_cast<unsigned>(_mean[_label_dbg(p)][1]);
+ _mean_dbg(p).blue() = static_cast<unsigned>(_mean[_label_dbg(p)][2]);
+ }
+
+ trace::exiting("mln::clustering::kmean3d_a::build_mean_dbg");
+ }
+
+
+ template <typename T, unsigned n>
+ inline
+ void kmean3d_a<T,n>::build_all_dbg()
+ {
+ trace::entering("mln::clustering::kmean3d_a::build_all_dbg");
+ build_label_dbg();
+ //build_mean_dbg();
+ _mean_dbg = labeling::mean_values(_point, _label_dbg, _k_center);
+ _color_dbg = labeling::colorize(value::rgb8(), _label_dbg);
+
+ trace::exiting("mln::clustering::kmean3d_a::build_all_dbg");
+ }
+
+ template <typename T, unsigned n>
+ inline
+ void kmean3d_a<T,n>::update_cnv()
+ {
+ trace::entering("mln::clustering::kmean3d_a::update_cnv");
+
+ _variance_cnv[_current_launching](point1d(_current_step))
+ = _within_variance;
+
+ mln_eiter(t_mean_img) l(_mean);
+
+ for_all(l)
+ {
+ _mean_cnv[l.index_()][_current_launching](point1d(_current_step))
+ = _mean[l.index_()];
+ }
+
+ trace::exiting("mln::clustering::kmean3d_a::update_cnv");
+ }
+
+ template <typename T, unsigned n>
+ inline
+ void kmean3d_a<T,n>::finalize_cnv()
+ {
+ trace::entering("mln::clustering::kmean3d_a::finalize_cnv");
+
+ // saturate the curv with the within variance
+ for (unsigned i = _current_step; i < _watch_dog; ++i)
+ _variance_cnv[_current_launching](point1d(i)) = _within_variance;
+
+ for (unsigned i = _current_step; i < _watch_dog; ++i)
+ {
+ mln_eiter(t_mean_img) l(_mean);
+
+ for_all(l)
+ {
+ _mean_cnv[l.index_()][_current_launching](point1d(i))
+ = _mean[l.index_()];
+ }
+ }
+
+ trace::exiting("mln::clustering::kmean3d_a::finalize_cnv");
+ }
+
+
+
+
+ //--------------------------------------------------------------------------
+ // Printing temporary results
+ //--------------------------------------------------------------------------
+
+ template <typename T, unsigned n>
+ inline
+ void kmean3d_a<T,n>::print_mean()
+ {
+ trace::entering("mln::clustering::kmean3d_a::print_mean");
+
+ mln_eiter(t_mean_img) l(_mean);
+
+ for_all(l)
+ {
+ std::cout << "mean(" << l.index_();
+ std::cout << ") = [r=" << _mean[l.index_()][0];
+ std::cout << ", g=" << _mean[l.index_()][1];
+ std::cout << ", b=" << _mean[l.index_()][2];
+ std::cout << "]" << std::endl;
+ }
+
+ trace::exiting("mln::clustering::kmean3d_a::print_mean");
+ }
+
+ template <typename T, unsigned n>
+ inline
+ void kmean3d_a<T,n>::print_number()
+ {
+ trace::entering("mln::clustering::kmean3d_a::print_number");
+
+ mln_eiter(t_number_img) l(_number);
+
+ for_all(l)
+ {
+ std::cout << "number(" << l.index_();
+ std::cout << ") = " << _number[l.index_()];
+ std::cout << std::endl;
+ }
+
+ trace::exiting("mln::clustering::kmean3d_a::print_number");
+ }
+
+ template <typename T, unsigned n>
+ inline
+ void kmean3d_a<T,n>::print_variance()
+ {
+ trace::entering("mln::clustering::kmean3d_a::print_variance");
+
+ mln_eiter(t_variance_img) l(_number);
+
+ for_all(l)
+ {
+ std::cout << "variance(" << l.index_();
+ std::cout << ") = " << _variance[l.index_()];
+ std::cout << std::endl;
+ }
+
+ trace::exiting("mln::clustering::kmean3d_a::print_variance");
+ }
+
+ template <typename T, unsigned n>
+ inline
+ void kmean3d_a<T,n>::print_histo()
+ {
+ trace::entering("mln::clustering::kmean3d_a::print_histo");
+
+ mln_piter(t_histo_img) rgb(_histo.domain());
+
+ for_all(rgb)
+ {
+ if (0 < _histo(rgb))
+ {
+ std::cout << "histo(r=" << rgb.row();
+ std::cout << ", g=" << rgb.col();
+ std::cout << ", b=" << rgb.sli();
+ std::cout << ")= " << _histo(rgb);
+ std::cout << std::endl;
+ }
+ }
+
+ trace::exiting("mln::clustering::kmean3d_a::print_histo");
+ }
+
+ template <typename T, unsigned n>
+ inline
+ void kmean3d_a<T,n>::print_group()
+ {
+ trace::entering("mln::clustering::kmean3d_a::print_group");
+
+ mln_piter(t_group_img) rgb(_group.domain());
+
+ for_all(rgb)
+ {
+ if (0 < _histo(rgb))
+ {
+ std::cout << "group(r=" << rgb.row();
+ std::cout << ", g=" << rgb.col();
+ std::cout << ", b=" << rgb.sli();
+ std::cout << ")= " << _group(rgb);
+ std::cout << std::endl;
+ }
+ }
+
+ trace::exiting("mln::clustering::kmean3d_a::print_group");
+ }
+
+ template <typename T, unsigned n>
+ inline
+ void kmean3d_a<T,n>::print_distance()
+ {
+ trace::entering("mln::clustering::kmean3d_a::print_distance");
+
+ mln_eiter(t_distance_img) l(_distance);
+
+ for_all(l)
+ {
+ mln_piter(t_distance_val) rgb(_distance[l.index_()].domain());
+
+ for_all(rgb)
+ {
+ if (0 < _histo(rgb))
+ {
+ std::cout << "distance(l=" << l.index_();
+ std::cout << ",r=" << rgb.row();
+ std::cout << ", g=" << rgb.col();
+ std::cout << ", b=" << rgb.sli();
+ std::cout << ")= " << _distance[l.index_()](rgb);
+ std::cout << std::endl;
+ }
+ }
+ }
+
+ trace::exiting("mln::clustering::kmean3d_a::print_distance");
+ }
+
+ template <typename T, unsigned n>
+ inline
+ void kmean3d_a<T,n>::print_point()
+ {
+ trace::entering("mln::clustering::kmean3d_a::print_point");
+
+ mln_piter(t_point_img) p(_point.domain());
+
+ for_all(p)
+ {
+ std::cout << "point(r=" << p.row();
+ std::cout << ", c=" << p.col();
+ std::cout << ")= " << _point(p);
+ std::cout << std::endl;
+ }
+
+ trace::exiting("mln::clustering::kmean3d_a::print_point");
+ }
+
+
+
+ template <typename T, unsigned n>
+ inline
+ void rgb_rand_init(t_mean_img mean)
+ {
+ typedef value::rgb<n> t_value;
+ typedef mln_trait_value_comp(t_value,0) t_value_comp0;
+ typedef mln_trait_value_comp(t_value,1) t_value_comp1;
+ typedef mln_trait_value_comp(t_value,2) t_value_comp2;
+ typedef algebra::vec<3,T> t_result3d;
+ typedef util::array<t_result3d> t_mean_img;
+
+ t_value_comp0 min_comp0 = mln_min(t_value_comp0);
+ t_value_comp0 max_comp0 = mln_max(t_value_comp0);
+ t_value_comp1 min_comp1 = mln_min(t_value_comp1);
+ t_value_comp1 max_comp1 = mln_max(t_value_comp1);
+ t_value_comp2 min_comp2 = mln_min(t_value_comp2);
+ t_value_comp2 max_comp2 = mln_max(t_value_comp2);
+ mln_eiter(t_mean_img) l(mean);
+
+ for_all(l)
+ {
+ mean[l.index_()][0] = (rand() % (max_comp0 - min_comp0)) + min_comp0;
+ mean[l.index_()][1] = (rand() % (max_comp1 - min_comp1)) + min_comp1;
+ mean[l.index_()][2] = (rand() % (max_comp2 - min_comp2)) + min_comp2;
+ }
+
+ return mean;
+ }
+
+ */
+
+ } // end of namespace mln::clustering::internal
+
+
+ //--------------------------------------------------------------------------
+ // Impl.
+ //--------------------------------------------------------------------------
+
+ namespace impl
+ {
+
+ //------------------------------------------------------------------------
+ // kmean_image2d_rgb(const t_point_img& point,
+ // const unsigned k_center,
+ // const unsigned watch_dog = 10,
+ // const unsigned n_times = 10)
+ //------------------------------------------------------------------------
+
+ template <unsigned n>
+ struct rgbn_to_lbl8 : Function_v2v< rgbn_to_lbl8<n> >
+ {
+ typedef value::rgb<n> argument;
+ typedef value::label_8 result;
+ typedef value::label_8 t_label;
+ typedef image3d<t_label> t_group_img;
+
+ t_group_img _group;
+
+ rgbn_to_lbl8(t_group_img group) : _group(group) {}
+
+ result operator()(const argument& c) const
+ {
+ value::label_8 tmp = opt::at(_group, c.blue(), c.red(), c.green());
+
+ // FIXME WHY DO WE NOT USE +1
+ return ++tmp;
+ }
+ };
+
+ template <typename T, unsigned n>
+ struct rgb_to_dist : Function_v2v< rgb_to_dist<T,n> >
+ {
+ typedef value::rgb<n> argument;
+ typedef T result;
+ typedef T t_result1d;
+ typedef algebra::vec<3,T> t_result3d;
+ typedef image3d<unsigned> t_histo_img;
+
+ t_result3d _mean;
+ t_histo_img _histo;
+
+ rgb_to_dist(t_result3d mean, t_histo_img histo) : _mean(mean),
+ _histo(histo) {}
+
+ result operator()(const argument& c) const
+ {
+ t_result1d diff2_row = math::sqr(c.row() - _mean[0]);
+ t_result1d diff2_col = math::sqr(c.col() - _mean[1]);
+ t_result1d diff2_sli = math::sqr(c.sli() - _mean[2]);
+ t_result1d tmp = _histo(c)*(diff2_row + diff2_col + diff2_sli);
+
+ return tmp;
+ }
+ };
+
+ template <typename T, unsigned n>
+ inline
+ image2d<value::label_8>
+ kmean_image2d_rgb(const image2d< value::rgb<n> >& point,
+ const unsigned k_center,
+ const unsigned watch_dog = 10,
+ const unsigned n_times = 10)
+ {
+ trace::entering("mln::clustering::impl::kmean_image2d_rgb");
+ trace::quiet = true;
+ // BEGIN TYPEDEF
+ typedef value::rgb<8> t_rgb;
+ typedef value::label<8> t_label;
+ typedef value::rgb<n> t_value;
+ typedef mln_trait_value_comp(t_value,0) t_value_comp0;
+ typedef mln_trait_value_comp(t_value,1) t_value_comp1;
+ typedef mln_trait_value_comp(t_value,2) t_value_comp2;
+ typedef T t_result1d;
+ typedef algebra::vec<3,T> t_result3d;
+
+ typedef image2d<t_value> t_point_img;
+ typedef image3d<unsigned> t_histo_img;
+ typedef util::array<t_result1d> t_number_img;
+ typedef util::array<t_result3d> t_mean_img;
+ typedef util::array<t_result1d> t_variance_img;
+
+ typedef image3d<t_label> t_group_img;
+ typedef image3d<t_result1d> t_distance_val;
+ typedef util::array<t_distance_val> t_distance_img;
+
+ typedef image2d<t_label> t_label_dbg;
+ typedef image2d<t_rgb> t_color_dbg;
+ typedef image2d<t_value> t_mean_dbg;
+
+ typedef image1d<t_result3d> t_mean_val;
+ typedef util::array<t_mean_val> t_mean_set;
+ typedef util::array<t_mean_set> t_mean_cnv;
+ typedef image1d<t_result1d> t_variance_val;
+ typedef util::array<t_variance_val> t_variance_cnv;
+ // END TYPEDEF
+
+ // BEGIN INITIALISATION
+ mln_precondition(point.is_valid());
+
+ static const unsigned _N_TRIES = 3;
+
+ typedef accu::meta::stat::histo3d_rgb t_histo3d_rgb;
+
+ t_result1d _within_variance;
+
+ unsigned _k_center = k_center;
+ unsigned _watch_dog = watch_dog;
+ unsigned _n_times = n_times;
+ t_point_img _point = point;
+
+ // HISTOGRAM INIT
+ t_histo_img _histo = data::compute(t_histo3d_rgb(),
+ _point);
+
+ // CENTER STATS INIT
+ t_number_img _number;
+ t_mean_img _mean;
+ t_variance_img _variance;
+
+ for (unsigned i = 0; i < _k_center; ++i)
+ {
+ _number.append(literal::zero);
+ _mean.append(literal::zero);
+ _variance.append(literal::zero);
+ }
+
+
+ unsigned _current_step = 0;
+ unsigned _current_launching = 0;
+ bool _is_number_valid = false;
+
+ unsigned _launching_min;
+ t_result1d _variance_min;
+ t_mean_img _mean_min;
+
+
+
+ t_group_img _group;
+ t_distance_img _distance;
+
+
+ t_label_dbg _label_dbg;
+ t_color_dbg _color_dbg;
+ t_mean_dbg _mean_dbg;
+
+
+ t_mean_cnv _mean_cnv;
+ t_variance_cnv _variance_cnv;
+
+
+
+
+ _group.init_(box3d(point3d(mln_min(t_value_comp2),
+ mln_min(t_value_comp0),
+ mln_min(t_value_comp1)),
+ point3d(mln_max(t_value_comp2),
+ mln_max(t_value_comp0),
+ mln_max(t_value_comp1))));
+
+ for (unsigned i = 0; i < _k_center; ++i)
+ {
+ t_distance_val img(box3d(point3d(mln_min(t_value_comp2),
+ mln_min(t_value_comp0),
+ mln_min(t_value_comp1)),
+ point3d(mln_max(t_value_comp2),
+ mln_max(t_value_comp0),
+ mln_max(t_value_comp1))));
+
+ _distance.append(img);
+ }
+
+ // Debugging, calibrating and testing
+ initialize(_label_dbg, _point);
+ initialize(_color_dbg, _point);
+ initialize(_mean_dbg, _point);
+
+ // Observing the convergence
+
+ for (unsigned i = 0; i < _n_times; ++i)
+ {
+ t_variance_val img(box1d(point1d(0), point1d(_watch_dog-1)));
+
+ data::fill(img, literal::zero);
+
+ _variance_cnv.append(img);
+ }
+
+ for (unsigned i = 0; i < _k_center; ++i)
+ {
+ t_mean_set mean_set;
+
+ for (unsigned j = 0; j < _n_times; ++j)
+ {
+ t_mean_val img(box1d(point1d(0), point1d(_watch_dog-1)));
+
+ data::fill(img, literal::zero);
+
+ mean_set.append(img);
+ }
+
+ _mean_cnv.append(mean_set);
+ }
+ // END INITIALISATION
+
+ // BEGIN LOOP N TIMES
+ {
+ unsigned tries = 0;
+ _variance_min = mln_max(t_result1d);
+ _current_launching = 0;
+
+ while (_current_launching < _n_times)
+ {
+ // BEGIN LAUNCH ONE TIME
+ trace::quiet = false;
+ trace::entering("Launch one time");
+ trace::quiet = true;
+ {
+ t_result1d old_variance = mln_max(t_result1d);
+ _within_variance = mln_max(t_result1d);
+ _current_step = 0;
+
+ // BEGIN INIT_MEAN
+ trace::quiet = false;
+ trace::entering("init mean");
+ trace::quiet = true;
+ {
+ t_value_comp0 min_comp0 = mln_min(t_value_comp0);
+ t_value_comp0 max_comp0 = mln_max(t_value_comp0);
+ t_value_comp1 min_comp1 = mln_min(t_value_comp1);
+ t_value_comp1 max_comp1 = mln_max(t_value_comp1);
+ t_value_comp2 min_comp2 = mln_min(t_value_comp2);
+ t_value_comp2 max_comp2 = mln_max(t_value_comp2);
+ mln_eiter(t_mean_img) l(_mean);
+
+ for_all(l)
+ {
+ _mean[l.index_()][0]=(rand()%(max_comp0-min_comp0))+min_comp0;
+ _mean[l.index_()][1]=(rand()%(max_comp1-min_comp1))+min_comp1;
+ _mean[l.index_()][2]=(rand()%(max_comp2-min_comp2))+min_comp2;
+ }
+ }
+ trace::quiet = false;
+ trace::exiting("init mean");
+ trace::quiet = true;
+ // END INIT MEAN
+
+
+ // UPDATE DISTANCE
+ trace::quiet = false;
+ trace::entering("update distance");
+ trace::quiet = true;
+
+ for (unsigned i = 0; i < _k_center; ++i)
+ {
+
+ // _distance[i] = data::transform(_histo,
+ // rgb_to_dist<T,n>(_mean[i],
+ // _histo));
+
+ mln_piter(t_distance_val) d(_distance[i].domain());
+
+ for_all(d)
+ {
+ t_result1d diff2_row = math::sqr(d.row() - _mean[i][0]);
+ t_result1d diff2_col = math::sqr(d.col() - _mean[i][1]);
+ t_result1d diff2_sli = math::sqr(d.sli() - _mean[i][2]);
+ _distance[i](d) = _histo(d)*
+ (diff2_row + diff2_col + diff2_sli);
+ }
+ }
+
+ trace::quiet = false;
+ trace::exiting("update distance");
+ trace::quiet = true;
+ // END UPDATE DISTANCE
+
+ do
+ {
+ old_variance = _within_variance;
+
+ // BEGIN UPDATE GROUP
+ trace::quiet = false;
+ trace::entering("update group");
+ trace::quiet = true;
+ {
+ mln_piter(t_group_img) rgb(_group.domain());
+
+ for_all(rgb)
+ {
+ mln_eiter(t_distance_img) l(_distance);
+ t_result1d min = mln_max(t_result1d);
+ t_label label = mln_max(t_label);
+
+ for_all(l)
+ {
+ if (min > _distance[l.index_()](rgb))
+ {
+ min = _distance[l.index_()](rgb);
+ label = l.index_();
+ }
+ }
+
+ _group(rgb) = label;
+ }
+
+ }
+ trace::quiet = false;
+ trace::exiting("update group");
+ trace::quiet = true;
+ // END UPDATE GROUP
+
+ // BEGIN UPDATE MEAN
+ trace::quiet = false;
+ trace::entering("update mean");
+ trace::quiet = true;
+ {
+ mln_eiter(t_number_img) en(_number);
+ mln_eiter(t_mean_img) em(_mean);
+
+ for_all_2(en,em)
+ {
+ _number[en.index_()] = literal::zero;
+ _mean[em.index_()] = literal::zero;
+ }
+
+ mln_piter(t_group_img) rgb(_group.domain());
+
+ for_all(rgb)
+ {
+ _mean[_group(rgb)][0] += rgb.row() * _histo(rgb);
+ _mean[_group(rgb)][1] += rgb.col() * _histo(rgb);
+ _mean[_group(rgb)][2] += rgb.sli() * _histo(rgb);
+ _number(_group(rgb)) += _histo(rgb);
+ }
+
+ mln_eiter(t_mean_img) l(_mean);
+
+ for_all(l)
+ {
+ _is_number_valid = (0 != _number[l.index_()]);
+
+ if (!_is_number_valid)
+ break;
+
+ _mean[l.index_()] /= _number[l.index_()];
+ }
+ }
+ trace::quiet = false;
+ trace::exiting("update mean");
+ trace::quiet = true;
+ // END UPDATE MEAN
+
+
+ // Stopping Nan propagation
+ if (!_is_number_valid)
+ break;
+
+ // UPDATE DISTANCE
+ trace::quiet = false;
+ trace::entering("update distance");
+ trace::quiet = true;
+
+ for (unsigned i = 0; i < _k_center; ++i)
+ {
+ mln_piter(t_distance_val) d(_distance[i].domain());
+
+ for_all(d)
+ {
+ // the square distance
+ t_result1d diff2_row = math::sqr(d.row() - _mean[i][0]);
+ t_result1d diff2_col = math::sqr(d.col() - _mean[i][1]);
+ t_result1d diff2_sli = math::sqr(d.sli() - _mean[i][2]);
+ _distance[i](d) = _histo(d)*
+ (diff2_row + diff2_col + diff2_sli);
+ }
+ }
+ trace::quiet = false;
+ trace::exiting("update distance");
+ trace::quiet = true;
+ // END UPDATE DISTANCE
+
+ // BEGIN UPDATE VARIANCE
+ trace::quiet = false;
+ trace::entering("update variance");
+ trace::quiet = true;
+ {
+ _within_variance = literal::zero;
+ mln_eiter(t_variance_img) l(_variance);
+
+ for_all(l)
+ {
+ _variance[l.index_()] = literal::zero;
+
+ mln_piter(t_group_img) rgb(_group.domain());
+
+ for_all(rgb)
+ {
+ if (l.index_() == _group(rgb))
+ _variance[l.index_()] += _distance[l.index_()](rgb);
+ }
+
+ _within_variance += _variance[l.index_()];
+ }
+
+ }
+ trace::quiet = false;
+ trace::exiting("update variance");
+ trace::quiet = true;
+ // END UPDATE VARIANCE
+
+ //update_cnv();
+
+ ++_current_step;
+ }
+ while (_current_step < _watch_dog &&
+ _within_variance < old_variance);
+
+ //finalize_cnv();
+ //build_all_dbg();
+ }
+ trace::quiet = false;
+ trace::exiting("Launch one time");
+ trace::quiet = true;
+ // END LAUNCH ONE TIME
+
+ if ((_is_number_valid && (_current_step < _watch_dog))||
+ _N_TRIES < tries)
+ {
+ if (_within_variance < _variance_min)
+ {
+ _variance_min = _within_variance;
+ _mean_min = _mean;
+ _launching_min = _current_launching;
+ }
+
+ // Reinitialize the number of echecs possible
+ tries = 0;
+
+ //std::cout << "_current_launching : " << _current_launching
+ // << std::endl;
+
+ //std::cout << "within_variance[" << _current_launching << "] = "
+ // << _within_variance << std::endl;
+
+ ++_current_launching;
+ }
+ else
+ ++tries;
+ }
+
+ //Debugging code
+ //build_all_dbg();
+
+ }
+ // END LOOP N TIMES
+
+ // BEGIN BUILD LABEL IMAGE
+ _label_dbg = data::transform(_point, rgbn_to_lbl8<n>(_group));
+
+// {
+// mln_piter(t_point_img) pi(_point.domain());
+// mln_piter(t_label_dbg) po(_label_dbg.domain());
+
+// for_all_2(pi, po)
+// {
+// t_value val = _point(pi);
+// t_label grp = _group(point3d(val.blue(),val.red(),val.green()));
+
+// _label_dbg(po) = ++grp;
+// }
+// }
+
+ // END BUILD LABEL IMAGE
+ trace::quiet = false;
+ trace::exiting("mln::clustering::impl::kmean_image2d_rgb");
+
+ return _label_dbg;
+
+ }
+
+ } // end of namespace mln::clustering::impl
+
+
+
+
+
+ //--------------------------------------------------------------------------
+ // Internal.
+ //--------------------------------------------------------------------------
+
+ namespace internal
+ {
+
+ template <typename T, unsigned n>
+ inline
+ image2d<value::label_8>
+ kmean_rgb_dispatch(const image2d< value::rgb<n> >& img,
+ const unsigned k_center,
+ const unsigned watch_dog,
+ const unsigned n_times)
+ {
+ return impl::kmean_image2d_rgb<T,n>(img, k_center, watch_dog, n_times);
+ }
+
+
+ template <typename T, unsigned n, typename I>
+ inline
+ image2d< value::label_8>
+ kmean_rgb_dispatch(const Image<I>& img,
+ const unsigned k_center,
+ const unsigned watch_dog,
+ const unsigned n_times)
+ {
+ return kmean_rgb_dispatch<T,n>(exact(img),k_center,watch_dog,n_times);
+ }
+
+
+ } // end of namespace mln::clustering::internal
+
+
+ //--------------------------------------------------------------------------
+ // Facade.
+ //--------------------------------------------------------------------------
+
+ template <typename T, unsigned n, typename I>
+ inline
+ image2d<value::label_8>
+ kmean_rgb(const Image<I>& point,
+ const unsigned k_center,
+ const unsigned watch_dog,
+ const unsigned n_times)
+ {
+ trace::entering("mln::clustering::kmean_rgb");
+
+ image2d<value::label_8> tmp = internal::kmean_rgb_dispatch<T,n>(point,
+ k_center,
+ watch_dog,
+ n_times);
+ trace::exiting("mln::clustering::kmean_rgb");
+
+ return tmp;
+ }
+
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::clustering
+
+} // end of namespace mln
+
+#endif // ! MLN_CLUSTERING_KMEAN_RGB_HH
diff --git a/scribo/sandbox/green/mln/display/display_histo.hh b/scribo/sandbox/green/mln/display/display_histo.hh
new file mode 100644
index 0000000..ef47182
--- /dev/null
+++ b/scribo/sandbox/green/mln/display/display_histo.hh
@@ -0,0 +1,180 @@
+// 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)
+//
+// 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.
+
+#ifndef MLN_DISPLAY_DISPLAY_HISTO_HH
+# define MLN_DISPLAY_DISPLAY_HISTO_HH
+
+# include <mln/accu/math/sum.hh>
+# include <mln/algebra/vec.hh>
+# include <mln/data/stretch.hh>
+# include <mln/display/project_histo.hh>
+# include <mln/fun/v2v/log.hh>
+# include <mln/value/int_u8.hh>
+# include <mln/value/rgb8.hh>
+# include <mln/value/label_8.hh>
+# include <mln/util/array.hh>
+
+
+/// \file
+///
+/// \brief Allow the complete visualization of a 3d histogram by projection.
+///
+/// The 3d histogram is projected in red/green space by accumulating around the
+/// the blue dimension (green and blue composantes are being correlated). In
+/// fact, we sum in along the blue direction. Then, we stretch value to feet
+/// pgm format.
+
+
+namespace mln
+{
+
+ namespace display
+ {
+
+ // Forward declaration.
+ image2d<value::int_u8>
+ display_histo3d_unsigned(const image3d<unsigned>& histo);
+
+ template <unsigned n>
+ image2d< value::int_u<n> >
+ display2_histo3d_unsigned(const image3d<unsigned>& histo,
+ const value::int_u<n> ambiguous_color);
+
+ template <unsigned n>
+ image2d<value::label_8>
+ display2_histo3d_unsigned(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label,
+ const value::label_8 ambiguous_label);
+
+ template <unsigned n>
+ image2d< value::rgb<n> >
+ display3_histo3d_unsigned(const image3d<unsigned>& histo,
+ const value::rgb<n> ambiguous_color);
+
+ template <unsigned n>
+ image2d< value::rgb8 >
+ display3_histo3d_unsigned(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label,
+ const util::array< algebra::vec<3,float> >& pal,
+ const value::rgb8 ambiguous_color);
+
+#ifndef MLN_INCLUDE_ONLY
+
+ /// \brief Allow the visualization of a 3d histogram by projection.
+ ///
+ /// The 3d histogram is projected in red/green space by
+ /// accumulating around the the blue dimension (green and blue
+ /// composantes are being correlated). In fact, we sum along
+ /// the blue direction. Then, we stretch value to feet pgm
+ /// format.
+ /// Direction r = 1
+ /// Direction g = 2
+ /// Direction b = 0
+ ///
+ /// \parameter[in] histo the histogram in 3d.
+ /// \result return a equivalent 2d image.
+
+ // FIXME : display_shape [in int_u8]
+ image2d<value::int_u8>
+ display_histo3d_unsigned(const image3d<unsigned>& histo)
+ {
+ typedef accu::math::sum<unsigned,unsigned> t_sum;
+ typedef value::int_u8 t_int_u8;
+ typedef fun::v2v::log<float> t_log;
+
+ image2d<unsigned> proj = project_histo<t_sum,0>(histo);
+ image2d<t_int_u8> proj_int = data::stretch(t_int_u8(),
+ data::transform(proj,
+ t_log()));
+ return proj_int;
+ }
+
+ // FIXME : display_color [in int_un]
+ template <unsigned n>
+ image2d< value::int_u<n> >
+ display2_histo3d_unsigned(const image3d<unsigned>& histo,
+ const value::int_u<n> ambiguous_color)
+ {
+ image2d< value::int_u<n> > proj = project2_histo<n,0>(histo,
+ ambiguous_color);
+
+ return proj;
+ }
+
+ // FIXME : display_label [in label]
+ template <unsigned n>
+ image2d<value::label_8>
+ display2_histo3d_unsigned(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label,
+ const value::label_8 ambiguous_label)
+ {
+ image2d<value::label_8> proj = project2_histo<n,0>(histo,
+ label,
+ ambiguous_label);
+
+ return proj;
+ }
+
+ // FIXME : display_color [in color]
+ template <unsigned n>
+ image2d< value::rgb<n> >
+ display3_histo3d_unsigned(const image3d<unsigned>& histo,
+ const value::rgb<n> ambiguous_color)
+ {
+ image2d< value::rgb<n> > proj = project3_histo<n,0>(histo,
+ ambiguous_color);
+
+ return proj;
+ }
+
+
+ // FIXME : display_label [in color]
+ template <unsigned n>
+ image2d< value::rgb8 >
+ display3_histo3d_unsigned(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label,
+ const util::array<algebra::vec<3,float> >& pal,
+ const value::rgb8 ambiguous_color)
+ {
+ image2d< value::rgb8 > proj = project3_histo<n,0>(histo,
+ label,
+ pal,
+ ambiguous_color);
+
+ return proj;
+ }
+
+
+#endif // ! MLN_INCLUDE_ONLY
+
+
+ } // end of namespace mln::transform
+
+} // end of namespace mln
+
+
+#endif // ! MLN_DISPLAY_DISPLAY_HISTO_HH
diff --git a/scribo/sandbox/green/mln/display/project_histo.hh b/scribo/sandbox/green/mln/display/project_histo.hh
new file mode 100644
index 0000000..30bcd6d
--- /dev/null
+++ b/scribo/sandbox/green/mln/display/project_histo.hh
@@ -0,0 +1,536 @@
+// 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)
+//
+// 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.
+
+#ifndef MLN_DISPLAY_PROJECT_HISTO_HH
+# define MLN_DISPLAY_PROJECT_HISTO_HH
+
+# include <mln/core/image/image2d.hh>
+# include <mln/core/image/image3d.hh>
+# include <mln/core/image/dmorph/unproject_image.hh>
+# include <mln/fun/v2v/projection.hh>
+
+# include <mln/accu/image/init.hh>
+# include <mln/accu/image/take.hh>
+# include <mln/accu/image/to_result.hh>
+
+# include <mln/algebra/vec.hh>
+
+# include <mln/opt/at.hh>
+
+# include <mln/value/int_u8.hh>
+# include <mln/value/rgb8.hh>
+# include <mln/value/label_8.hh>
+
+# include <mln/util/array.hh>
+
+/// \file
+///
+/// \brief Allow the visualization of 3d histogram.
+/// The 3d histogram is projected in 2d such as the data in that direction
+/// are accumulated to the two others.
+
+namespace mln
+{
+
+ namespace display
+ {
+
+ // Forward declaration.
+ template <typename A, unsigned direction, typename V>
+ image2d<mln_result(A)>
+ project_histo(const image3d<V>& histo);
+
+ template <typename A, unsigned n, unsigned direction, typename V>
+ image2d<mln_result(A)>
+ project2_histo(const image3d<V>& histo,
+ const value::int_u<n>& ambiguous_color);
+
+ template <unsigned n, unsigned direction, typename V>
+ image2d<V>
+ project2_histo(const image3d<unsigned>& histo,
+ const image3d<V>& label);
+
+ template <unsigned n, unsigned direction>
+ image2d< value::rgb<n> >
+ project3_histo(const image3d<unsigned>& histo,
+ const value::rgb<n> ambiguous_color);
+
+ template <unsigned n, unsigned direction>
+ image2d< value::rgb8 >
+ project3_histo(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label,
+ const util::array<algebra::vec<3, float> >& pal,
+ const value::rgb8 ambiguous_color);
+ // FIXME ==> palette must be 1d-image not an array !!
+
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ /// \brief Allow the visualization of 3d histogram.
+ ///
+ /// The 3d histogram is projected in 2d such as the data in that direction
+ /// are accumulated to the two others.
+ ///
+ /// Parameter A is the type of accumulator, for instance, accu::math::sum.
+ /// Parameter direction is the way of the projection, for instance blue one.
+ /// Parameter V is the value we use to accumulate information.
+ ///
+ /// \prameter[in] the histogram 3d.
+ /// \result the 2d projection of the 3d histogram.
+
+ template <typename A, unsigned direction, typename V>
+ image2d<mln_result(A)>
+ project_histo(const image3d<V>& histo)
+ {
+ typedef fun::v2v::projection<point3d,direction> t_projection;
+
+ image2d<A> histo_accu(histo.nrows(), histo.ncols());
+
+ accu::image::init(histo_accu);
+
+ accu::image::take(unproject(histo_accu,
+ histo.domain(),
+ t_projection()).rw(),
+ histo);
+
+ return accu::image::to_result(histo_accu);
+ }
+
+ // 0 ==> blue
+ // 1 ==> red
+ // 2 ==> green
+
+ // mln::opt::at(histo, blue, red, green)
+
+ template <unsigned n, unsigned direction>
+ image2d< value::int_u<n> >
+ project2_histo(const image3d<unsigned>& histo,
+ const value::int_u<n>& ambiguous_color)
+ {
+ image2d< value::int_u<n> > result;
+
+ if (0 == direction) // blue
+ {
+ image2d< value::int_u<n> > arg_max(histo.nrows(), histo.ncols());
+
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
+ {
+ unsigned max = 0; // minimum as possible
+ def::coord pos = -1;
+
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ {
+ if (max < opt::at(histo,blue,red,green))
+ {
+ max = opt::at(histo,blue,red,green);
+ pos = blue;
+ }
+ }
+
+ if (-1 == pos)
+ opt::at(arg_max,red,green) = ambiguous_color;
+ else
+ opt::at(arg_max,red,green) = pos;
+ }
+
+ result = arg_max;
+ }
+ else if (1 == direction) // red
+ {
+ image2d< value::int_u<n> > arg_max(histo.ncols(), histo.nslices());
+
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
+ {
+ if (max < opt::at(histo,blue,red,green))
+ {
+ max = opt::at(histo,blue,red,green);
+ pos = red;
+ }
+ }
+
+ if (-1 == pos)
+ opt::at(arg_max,green,blue) = ambiguous_color;
+ else
+ opt::at(arg_max,green,blue) = pos;
+ }
+
+ result = arg_max;
+ }
+ else // 2 == direction // green
+ {
+ image2d< value::int_u<n> > arg_max(histo.nrows(), histo.nslices());
+
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ {
+ if (max < opt::at(histo,blue,red,green))
+ {
+ max = opt::at(histo,blue,red,green);
+ pos = green;
+ }
+ }
+
+ if (-1 == pos)
+ opt::at(arg_max,red,blue) = ambiguous_color;
+ else
+ opt::at(arg_max,red,blue) = pos;
+ }
+
+ result = arg_max;
+ }
+
+ return result;
+ }
+
+ template <unsigned n, unsigned direction>
+ image2d<value::label_8>
+ project2_histo(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label,
+ const value::label_8 ambiguous_label)
+ {
+ image2d<value::label_8> result;
+
+ if (0 == direction) // blue
+ {
+ image2d<value::label_8> arg_max(histo.nrows(), histo.ncols());
+
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
+ {
+ unsigned max = 0; // minimum as possible
+ def::coord pos = -1;
+
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ {
+ if (max < opt::at(histo,blue,red,green))
+ {
+ max = opt::at(histo,blue,red,green);
+ pos = blue;
+ }
+ }
+
+ if (-1 == pos)
+ opt::at(arg_max,red,green) = ambiguous_label;
+ else
+ opt::at(arg_max,red,green) = opt::at(label, pos, red, green);
+ }
+
+ result = arg_max;
+ }
+ else if (1 == direction) // red
+ {
+ image2d<value::label_8> arg_max(histo.ncols(), histo.nslices());
+
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
+ {
+ if (max < opt::at(histo,blue,red,green))
+ {
+ max = opt::at(histo,blue,red,green);
+ pos = red;
+ }
+ }
+
+ if (-1 == pos)
+ opt::at(arg_max,green,blue) = ambiguous_label;
+ else
+ opt::at(arg_max,green,blue) = opt::at(label, blue, pos, green);
+ }
+
+ result = arg_max;
+ }
+ else // 2 == direction // green
+ {
+ image2d<value::label_8> arg_max(histo.nrows(), histo.nslices());
+
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ {
+ if (max < opt::at(histo,blue,red,green))
+ {
+ max = opt::at(histo,blue,red,green);
+ pos = green;
+ }
+ }
+
+ if (-1 == pos)
+ opt::at(arg_max,red,blue) = ambiguous_label;
+ else
+ opt::at(arg_max,red,blue) = opt::at(label, blue, red, pos);
+ }
+
+ result = arg_max;
+ }
+
+ return result;
+ }
+
+
+
+
+ // FIXME ... determine the color of each class.
+ // FIXME la palette est supposée en 8 bits
+ template <unsigned n, unsigned direction>
+ image2d< value::rgb8 >
+ project3_histo(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label,
+ const util::array<algebra::vec<3,float> >& pal,
+ const value::rgb8 ambiguous_color)
+ {
+ image2d< value::rgb8 > result;
+
+ if (0 == direction) // blue
+ {
+ image2d< value::rgb8 > arg_max(histo.nrows(), histo.ncols());
+
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
+ {
+ unsigned max = 0; // minimum as possible
+ def::coord pos = -1;
+
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ {
+ if (max < opt::at(histo,blue,red,green))
+ {
+ max = opt::at(histo,blue,red,green);
+ pos = blue;
+ }
+ }
+
+ if (-1 == pos)
+ opt::at(arg_max,red,green) = ambiguous_color;
+ else
+ {
+ value::int_u8 r = pal[opt::at(label,pos,red,green)][0];
+ value::int_u8 g = pal[opt::at(label,pos,red,green)][1];
+ value::int_u8 b = pal[opt::at(label,pos,red,green)][2];
+ value::rgb8 color(r,g,b);
+
+ opt::at(arg_max,red,green) = color;
+ }
+ }
+
+ result = arg_max;
+ }
+ else if (1 == direction) // red
+ {
+ image2d< value::rgb8 > arg_max(histo.ncols(), histo.nslices());
+
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
+ {
+ if (max < opt::at(histo,blue,red,green))
+ {
+ max = opt::at(histo,blue,red,green);
+ pos = red;
+ }
+ }
+
+ if (-1 == pos)
+ opt::at(arg_max,green,blue) = ambiguous_color;
+ else
+ {
+ value::int_u8 r = pal[opt::at(label,blue,pos,green)][0];
+ value::int_u8 g = pal[opt::at(label,blue,pos,green)][1];
+ value::int_u8 b = pal[opt::at(label,blue,pos,green)][2];
+ value::rgb8 color(r,g,b);
+
+ opt::at(arg_max,green,blue) = color;
+ }
+ }
+
+ result = arg_max;
+ }
+ else // 2 == direction // green
+ {
+ image2d< value::rgb8 > arg_max(histo.nrows(), histo.nslices());
+
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ {
+ if (max < opt::at(histo,blue,red,green))
+ {
+ max = opt::at(histo,blue,red,green);
+ pos = green;
+ }
+ }
+
+ if (-1 == pos)
+ opt::at(arg_max,red,blue) = ambiguous_color;
+ else
+ {
+ value::int_u8 r = pal[opt::at(label,blue,red,pos)][0];
+ value::int_u8 g = pal[opt::at(label,blue,red,pos)][1];
+ value::int_u8 b = pal[opt::at(label,blue,red,pos)][2];
+ value::rgb8 color(r,g,b);
+
+ opt::at(arg_max,red,blue) = color;
+ }
+ }
+
+ result = arg_max;
+ }
+
+ return result;
+ }
+
+
+ template <unsigned n, unsigned direction>
+ image2d< value::rgb<n> >
+ project3_histo(const image3d<unsigned>& histo,
+ const value::rgb<n> ambiguous_color)
+ {
+ image2d< value::rgb<n> > result;
+
+ if (0 == direction) // blue
+ {
+ image2d< value::rgb<n> > arg_max(histo.nrows(), histo.ncols());
+
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
+ {
+ unsigned max = 0; // minimum as possible
+ def::coord pos = -1;
+
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ {
+ if (max < opt::at(histo,blue,red,green))
+ {
+ max = opt::at(histo,blue,red,green);
+ pos = blue;
+ }
+ }
+
+ if (-1 == pos)
+ opt::at(arg_max,red,green) = ambiguous_color;
+ else
+ opt::at(arg_max,red,green) = value::rgb<n>(red,green,pos);
+ }
+
+ result = arg_max;
+ }
+ else if (1 == direction) // red
+ {
+ image2d< value::rgb<n> > arg_max(histo.ncols(), histo.nslices());
+
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
+ {
+ if (max < opt::at(histo,blue,red,green))
+ {
+ max = opt::at(histo,blue,red,green);
+ pos = red;
+ }
+ }
+
+ if (-1 == pos)
+ opt::at(arg_max,green,blue) = ambiguous_color;
+ else
+ opt::at(arg_max,green,blue) = value::rgb<n>(pos,green,blue);;
+ }
+
+ result = arg_max;
+ }
+ else // 2 == direction // green
+ {
+ image2d< value::rgb<n> > arg_max(histo.nrows(), histo.nslices());
+
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ {
+ if (max < opt::at(histo,blue,red,green))
+ {
+ max = opt::at(histo,blue,red,green);
+ pos = green;
+ }
+ }
+
+ if (-1 == pos)
+ opt::at(arg_max,red,blue) = ambiguous_color;
+ else
+ opt::at(arg_max,red,blue) = value::rgb<n>(red,pos,blue);
+ }
+
+ result = arg_max;
+ }
+
+ return result;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+
+ } // end of namespace mln::transform
+
+} // end of namespace mln
+
+
+#endif // ! MLN_DISPLAY_PROJECT_HISTO_HH
diff --git a/scribo/sandbox/green/mln/fun/p2b/achromatic.hh b/scribo/sandbox/green/mln/fun/p2b/achromatic.hh
new file mode 100644
index 0000000..1f45b2d
--- /dev/null
+++ b/scribo/sandbox/green/mln/fun/p2b/achromatic.hh
@@ -0,0 +1,112 @@
+// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (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.
+
+#ifndef MLN_FUN_P2B_ACHROMATIC_HH
+# define MLN_FUN_P2B_ACHROMATIC_HH
+
+/// \file
+///
+/// In the vectorial image context (as RGB, HSL, HSV), compare one component
+/// to a specific value.
+
+# include <mln/core/alias/point2d.hh>
+# include <mln/core/concept/function.hh>
+# include <mln/trait/value/comp.hh>
+
+
+namespace mln
+{
+
+ namespace fun
+ {
+
+ namespace p2b
+ {
+ /// \brief Functor that compare the i-th component of a value.
+ // V is for the type of the value received
+ // i is the ith component to select
+ template <typename T_rgb>
+ struct achromatic : public Function_v2b< achromatic<T_rgb> >
+ {
+ typedef bool result;
+ bool operator()(const point2d& p) const;
+
+ achromatic(const image2d<T_rgb>& img, const float threshold);
+
+ const float threshold_;
+ const image2d<T_rgb>& img_;
+ };
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <typename T_rgb>
+ achromatic<T_rgb>::achromatic(const image2d<T_rgb>& img,
+ const float threshold)
+ : threshold_(threshold), img_(img)
+ {
+ }
+
+ template <typename T_rgb>
+ bool achromatic<T_rgb>::operator()(const point2d& p) const
+ {
+ typedef typename T_rgb::red_t t_red;
+ typedef typename T_rgb::green_t t_green;
+ typedef typename T_rgb::blue_t t_blue;
+
+ const T_rgb rgb = img_(p);
+
+ // To obtain red between 0 and 1
+ const float max_red = mln_max(t_red);
+ const float min_red = mln_min(t_red);
+ const float red = (rgb.red() - min_red)/(max_red - min_red);
+
+ // To obtain green between 0 and 1
+ const float max_green = mln_max(t_green);
+ const float min_green = mln_min(t_green);
+ const float green = (rgb.green()-min_green)/(max_green-min_green);
+
+ // To obtain blue between 0 and 1
+ const float max_blue = mln_max(t_blue);
+ const float min_blue = mln_min(t_blue);
+ const float blue = (rgb.blue()-min_blue)/(max_blue-min_blue);
+
+ bool result = (threshold_ > math::abs(red - green) &&
+ threshold_ > math::abs(red - blue) &&
+ threshold_ > math::abs(green - blue));
+
+ return result;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::fun::p2b
+
+ } // end of namespace mln::fun
+
+} // end of namespace mln
+
+
+#endif // ! MLN_FUN_P2B_ACHROMATIC_HH
diff --git a/scribo/sandbox/green/mln/fun/p2b/component_equals.hh b/scribo/sandbox/green/mln/fun/p2b/component_equals.hh
new file mode 100644
index 0000000..2a4c62c
--- /dev/null
+++ b/scribo/sandbox/green/mln/fun/p2b/component_equals.hh
@@ -0,0 +1,99 @@
+// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (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.
+
+#ifndef MLN_FUN_P2B_COMPONENT_EQUALS_HH
+# define MLN_FUN_P2B_COMPONENT_EQUALS_HH
+
+/// \file
+///
+/// In the vectorial image context (as RGB, HSL, HSV), compare one component
+/// to a specific value.
+
+# include <mln/core/alias/point2d.hh>
+# include <mln/core/concept/function.hh>
+# include <mln/trait/value/comp.hh>
+
+
+namespace mln
+{
+
+ namespace fun
+ {
+
+ namespace p2b
+ {
+
+ /// \brief Functor that compare the i-th component of a value.
+ // V is for the type of the value received
+ // i is the ith component to select
+ template <typename I, unsigned i>
+ struct component_equals : public Function_v2b< component_equals<I,i> >
+ {
+ typedef bool result;
+ bool operator()(const point2d& p) const;
+
+ component_equals(const I& img,
+ const mln_trait_value_comp(mln_value(I),i)& ref);
+
+ const mln_trait_value_comp(mln_value(I),i) _ref;
+ const I& _img;
+ };
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <typename I, unsigned i>
+ inline
+ component_equals<I,i>::
+ component_equals(const I& img,
+ const mln_trait_value_comp(mln_value(I),i)& ref)
+ : _ref(ref), _img(img)
+ {
+ }
+
+ template <typename I, unsigned i>
+ inline
+ bool
+ component_equals<I,i>::operator()(const point2d& p) const
+ {
+ typedef mln_value(I) t_value;
+ typedef mln_trait_value_comp(t_value,i) mln_value_comp;
+
+ t_value v = _img(p);
+ mln_value_comp c = trait::value::internal::comp<t_value,i>::on(v);
+
+ return (c == _ref);
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::fun::p2b
+
+ } // end of namespace mln::fun
+
+} // end of namespace mln
+
+
+#endif // ! MLN_FUN_P2B_COMPONENT_EQUALS_HH
diff --git a/scribo/sandbox/green/mln/fun/v2v/achromatism.hh b/scribo/sandbox/green/mln/fun/v2v/achromatism.hh
new file mode 100644
index 0000000..72b545c
--- /dev/null
+++ b/scribo/sandbox/green/mln/fun/v2v/achromatism.hh
@@ -0,0 +1,64 @@
+// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (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.
+
+#ifndef MLN_FUN_V2V_ACHROMATISM_HH
+# define MLN_FUN_V2V_ACHROMATISM_HH
+
+# include <mln/value/rgb8.hh>
+
+namespace mln
+{
+
+ namespace fun
+ {
+
+ namespace v2v
+ {
+
+ struct achromatism : public Function_v2v< achromatism >
+ {
+ typedef float result;
+
+ float operator()(const value::rgb8 rgb) const;
+ };
+
+# ifndef MLN_INCLUDE_ONLY
+
+ float achromatism::operator()(const value::rgb8 rgb) const
+ {
+ return (math::abs(rgb.red() - rgb.green())
+ + math::abs(rgb.red() - rgb.blue())
+ + math::abs(rgb.green() - rgb.blue()))/3.0;
+ }
+
+# endif // !MLN_INCLUDE_ONLY
+
+ } // end of namespace fun::v2v
+
+ } // end of namespace fun
+
+} // end of namespace mln
+
+#endif // ! MLN_FUN_V2V_ACHROMATISM_HH
diff --git a/scribo/sandbox/green/mln/fun/v2v/hue_concentration.hh b/scribo/sandbox/green/mln/fun/v2v/hue_concentration.hh
new file mode 100644
index 0000000..84d26c8
--- /dev/null
+++ b/scribo/sandbox/green/mln/fun/v2v/hue_concentration.hh
@@ -0,0 +1,100 @@
+// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (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.
+
+#ifndef MLN_FUN_V2V_HUE_CONCENTRATION_HH
+# define MLN_FUN_V2V_HUE_CONCENTRATION_HH
+
+# include <mln/core/image/image1d.hh>
+# include <mln/math/abs.hh>
+# include <mln/opt/at.hh>
+# include <mln/value/hsv.hh>
+# include <mln/value/rgb8.hh>
+
+namespace mln
+{
+
+ namespace fun
+ {
+
+ namespace v2v
+ {
+
+ unsigned peak_histo(const mln::image1d<unsigned>& hue_histo);
+
+ struct hue_concentration : public Function_v2v< hue_concentration >
+ {
+ typedef float result;
+
+ float operator()(const float hue) const;
+
+ hue_concentration(const mln::image1d<unsigned>& hue_histo)
+ {
+ peak = peak_histo(hue_histo);
+ }
+
+ unsigned peak;
+ };
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ unsigned peak_histo(const mln::image1d<unsigned>& hue_histo)
+ {
+ mln_precondition(hue_histo.is_valid());
+
+ // Find the peak of the histogram
+ unsigned v_max = mln::opt::at(hue_histo, 0);
+ short p_max = 0;
+
+ mln_piter_(mln::image1d<unsigned>) p(hue_histo.domain());
+
+ for_all(p)
+ {
+ if (v_max < hue_histo(p))
+ {
+ v_max = hue_histo(p);
+ p_max = p.ind();
+ }
+ }
+
+ return p_max;
+ }
+
+
+ float hue_concentration::operator()(float hue) const
+ {
+ return mln::math::abs(peak - hue);
+ }
+
+# endif // !MLN_INCLUDE_ONLY
+
+ } // end of namespace fun::v2v
+
+ } // end of namespace fun
+
+} // end of namespace mln
+
+#endif // ! MLN_FUN_V2V_HUE_CONCENTRATION_HH
diff --git a/milena/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh b/scribo/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh
copy to scribo/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/log.hh b/scribo/sandbox/green/mln/fun/v2v/log.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/log.hh
copy to scribo/sandbox/green/mln/fun/v2v/log.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/rg_to_rgb.hh b/scribo/sandbox/green/mln/fun/v2v/rg_to_rgb.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rg_to_rgb.hh
copy to scribo/sandbox/green/mln/fun/v2v/rg_to_rgb.hh
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh b/scribo/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh
new file mode 100644
index 0000000..0f63c8c
--- /dev/null
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh
@@ -0,0 +1,71 @@
+// 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)
+//
+// 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.
+
+#ifndef MLN_FUN_V2V_RGB8_TO_INT_U8_HH
+# define MLN_FUN_V2V_RGB8_TO_INT_U8_HH
+
+# include <mln/value/int_u8.hh>
+# include <mln/value/rgb8.hh>
+# include <mln/core/contract.hh>
+
+/// \file
+///
+/// \brief Convert rgb8 color value to int_u8 grey value
+
+namespace mln
+{
+
+ namespace fun
+ {
+
+ namespace v2v
+ {
+
+ /// \brief Convert rgb8 color value to int_u8 grey value
+ ///
+ /// \ingroup modfunv2v
+
+ struct rgb8_to_int_u8 : Function_v2v<rgb8_to_int_u8>
+ {
+ typedef value::rgb8 argument;
+ typedef value::int_u8 result;
+
+ result operator()(const argument& c) const
+ {
+ result res((c.red() + c.green() + c.blue()) / 3);
+
+ return res;
+ }
+ };
+
+ }
+
+ }
+
+}
+
+#endif // ! MLN_FUN_V2V_RGB8_TO_INT_U8_HH
diff --git a/milena/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh b/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
copy to scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb_to_achromatism_map.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_achromatism_map.hh
new file mode 100644
index 0000000..6de63ec
--- /dev/null
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb_to_achromatism_map.hh
@@ -0,0 +1,77 @@
+// 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)
+//
+// 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.
+
+#ifndef MLN_FUN_V2V_RGB_TO_ACHROMATISM_MAP_HH
+# define MLN_FUN_V2V_RGB_TO_ACHROMATISM_MAP_HH
+
+# include <mln/math/abs.hh>
+# include <mln/math/max.hh>
+
+# include <mln/value/rgb.hh>
+
+
+/// \file
+///
+/// \brief Convert rgb value to achromatism map.
+
+namespace mln
+{
+
+ namespace fun
+ {
+
+ namespace v2v
+ {
+
+ /// \brief Convert rgb value to achromatism map.
+ ///
+ /// \ingroup modfunv2v
+
+ template <unsigned n>
+ struct rgb_to_achromatism_map :
+ Function_v2v< rgb_to_achromatism_map<n> >
+ {
+ typedef value::rgb<n> argument;
+ typedef value::int_u<n> result;
+
+ result operator()(const argument& v) const
+ {
+ result max = math::max(math::max(v.red(),v.green()),v.blue());
+ result min = math::min(math::min(v.red(),v.green()),v.blue());
+ result ret = max - min;
+
+ return ret;
+ }
+ };
+
+ } // end of namespace mln::fun::v2v
+
+ } // end of namespace mln::fun
+
+} // end of namespace mln
+
+#endif // ! MLN_FUN_V2V_RGB_TO_ACHROMATISM_MAP_HH
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh
new file mode 100644
index 0000000..3dd8eb0
--- /dev/null
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh
@@ -0,0 +1,149 @@
+// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (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.
+
+#ifndef MLN_FUN_V2V_RGB_TO_HSV_HH
+# define MLN_FUN_V2V_RGB_TO_HSV_HH
+
+#include <mln/math/max.hh>
+#include <mln/math/min.hh>
+
+#include <mln/trait/promote.hh>
+
+#include <mln/value/hsv.hh>
+#include <mln/value/rgb.hh>
+
+namespace mln
+{
+
+ namespace value
+ {
+ template <typename H, typename S, typename V> class hsv_;
+ typedef hsv_<float, float, float> hsv_f;
+ typedef hsv_<double, double, double> hsv_d;
+ template <unsigned n> struct rgb;
+ }
+
+ namespace fun
+ {
+
+ namespace v2v
+ {
+
+ template <typename T_hsv>
+ struct f_rgb_to_hsv_ : public Function_v2v< f_rgb_to_hsv_<T_hsv> >
+ {
+ typedef T_hsv result;
+
+
+ /// HSV implementation from millet.2008.phd.pdf p67
+ template <typename T_rgb>
+ T_hsv operator()(const T_rgb& rgb) const;
+
+ };
+
+ typedef f_rgb_to_hsv_<value::hsv_f> f_rgb_to_hsv_f_t;
+
+ extern f_rgb_to_hsv_f_t f_rgb_to_hsv_f;
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ /// Global variables.
+ /// \{
+ f_rgb_to_hsv_f_t f_rgb_to_hsv_f;
+ /// \}
+
+
+ template <typename T_hsv>
+ template <typename T_rgb>
+ inline
+ T_hsv
+ f_rgb_to_hsv_<T_hsv>::operator()(const T_rgb& rgb) const
+ {
+ typedef typename T_rgb::red_t t_red;
+ typedef typename T_rgb::green_t t_green;
+ typedef typename T_rgb::blue_t t_blue;
+ typedef typename T_hsv::h_type t_hue;
+ typedef typename T_hsv::s_type t_sat;
+ typedef typename T_hsv::v_type t_val;
+ typedef mln_trait_promote(t_hue, t_sat) t_max_hue_sat;
+ typedef mln_trait_promote(t_max_hue_sat, t_val) t_max_hsv;
+
+ // To obtain red between 0 and 1
+ const t_max_hsv max_red = mln_max(t_red);
+ const t_max_hsv min_red = mln_min(t_red);
+ const t_max_hsv red = (rgb.red() - min_red)/(max_red - min_red);
+
+ // To obtain green between 0 and 1
+ const t_max_hsv max_green = mln_max(t_green);
+ const t_max_hsv min_green = mln_min(t_green);
+ const t_max_hsv green =(rgb.green()-min_green)/(max_green-min_green);
+
+ // To obtain blue between 0 and 1
+ const t_max_hsv max_blue = mln_max(t_blue);
+ const t_max_hsv min_blue = mln_min(t_blue);
+ const t_max_hsv blue = (rgb.blue()-min_blue)/(max_blue-min_blue);
+
+ const t_max_hsv max = math::max(red, math::max(green, blue));
+ const t_max_hsv min = math::min(red, math::min(green, blue));
+ const t_max_hsv max_minus_min = max-min;
+ const t_max_hsv s = 0.03;
+
+ // Locals.
+ T_hsv hsv;
+
+ // SPECIFIC CASE WHEN PIXEL IS ACHROMATIC
+ if (s > math::abs(red - blue) &&
+ s > math::abs(blue - red) &&
+ s > math::abs(red - green))
+ {
+ hsv.val() = (red + green + blue)/3.0;
+ hsv.sat() = 0.0;
+ hsv.hue() = -1.0;
+ }
+ else
+ {
+ hsv.val() = max;
+ hsv.sat() = max_minus_min / max;
+ if (max == red)
+ hsv.hue() = 60 * ((green - blue) / max_minus_min);
+ else if (max == green)
+ hsv.hue() = 60 * (2 + (blue - red) / max_minus_min);
+ else // (max == blue)
+ hsv.hue() = 60 * (4 + (red - green) / max_minus_min);
+ }
+ return hsv;
+ }
+
+
+# endif // !MLN_INCLUDE_ONLY
+
+ } // end of namespace fun::v2v
+
+ } // end of namespace fun
+
+} // end of namespace mln
+
+#endif // ! MLN_FUN_V2V_RGB_TO_HSV_HH
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh
new file mode 100644
index 0000000..8b228e0
--- /dev/null
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh
@@ -0,0 +1,96 @@
+// 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)
+//
+// 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.
+
+#ifndef MLN_FUN_V2V_RGB_TO_HUE_MAP_HH
+# define MLN_FUN_V2V_RGB_TO_HUE_MAP_HH
+
+# include <mln/math/abs.hh>
+# include <mln/math/max.hh>
+
+# include <mln/value/rgb.hh>
+
+
+/// \file
+///
+/// \brief Convert rgb value to hue map.
+
+namespace mln
+{
+
+ namespace fun
+ {
+
+ namespace v2v
+ {
+
+ /// \brief Convert rgb value to hue map.
+ ///
+ /// \ingroup modfunv2v
+
+ template <unsigned n>
+ struct rgb_to_hue_map :
+ Function_v2v< rgb_to_hue_map<n> >
+ {
+ typedef value::rgb<n> argument;
+ typedef value::int_u<n> result;
+
+ result operator()(const argument& v) const
+ {
+ const float max = math::max(math::max(v.red(), v.green()), v.blue());
+ const float min = math::min(math::min(v.red(), v.green()), v.blue());
+ const float diff = max - min;
+ float hue = 0;
+
+ if (0 != diff)
+ {
+ if (v.red() == max)
+ {
+ hue = 60 * ((v.green() - v.blue()) / diff);
+
+ if (0 < hue)
+ hue = 360.0 + hue;
+ }
+ else if (v.green() == max)
+ hue = 60 * (2 + (v.blue() - v.red()) / diff);
+ else // (v.blue() == max)
+ hue = 60 * (4 + (v.red() - v.green()) / diff);
+ }
+
+ const result ret = (hue/360.0) * (mln_max(result) - mln_min(result))
+ + mln_min(result);
+
+ return ret;
+ }
+ };
+
+ } // end of namespace mln::fun::v2v
+
+ } // end of namespace mln::fun
+
+} // end of namespace mln
+
+#endif // ! MLN_FUN_V2V_RGB_TO_HUE_MAP_HH
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
new file mode 100644
index 0000000..d4c1e46
--- /dev/null
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
@@ -0,0 +1,111 @@
+// 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.
+
+#ifndef MLN_FUN_V2V_RGB_TO_RG_HH
+# define MLN_FUN_V2V_RGB_TO_RG_HH
+
+# include <mln/value/rg.hh>
+# include <mln/value/rgb.hh>
+# include <mln/core/contract.hh>
+
+/// \file
+///
+/// \brief Convert a rgb value to a rg value.
+///
+/// This source implements the conversion between rgb space and rg space.
+///
+/// The following sample is a typical use of the rgb/rg conversion function.
+///
+/// #include <mln/accu/stat/histo2d.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.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()
+/// {
+/// 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;
+/// }
+
+namespace mln
+{
+
+ namespace fun
+ {
+
+ namespace v2v
+ {
+
+ /// \brief Convert a rgb value to a rg value.
+ ///
+ /// 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> >
+ {
+ typedef value::rg<n> result;
+ typedef value::rgb<n> argument;
+
+ /// \brief Convert rgb value to rg value.
+ ///
+ /// \param[in] v the rgb value to convert.
+ ///
+ /// 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);
+ }
+ };
+
+ } // end of namespace mln::fun::v2v
+
+ } // end of namespace mln::fun
+
+} // end of namespace mln
+
+#endif // ! MLN_FUN_V2V_RGB_TO_RG_HH
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb_to_saturation_map.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_saturation_map.hh
new file mode 100644
index 0000000..a8847a0
--- /dev/null
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb_to_saturation_map.hh
@@ -0,0 +1,83 @@
+// 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)
+//
+// 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.
+
+#ifndef MLN_FUN_V2V_RGB_TO_SATURATION_MAP_HH
+# define MLN_FUN_V2V_RGB_TO_SATURATION_MAP_HH
+
+# include <mln/math/abs.hh>
+# include <mln/math/max.hh>
+
+# include <mln/value/rgb.hh>
+
+
+/// \file
+///
+/// \brief Convert rgb value to saturation map.
+
+namespace mln
+{
+
+ namespace fun
+ {
+
+ namespace v2v
+ {
+
+ /// \brief Convert rgb value to saturation map.
+ ///
+ /// \ingroup modfunv2v
+
+ template <unsigned n>
+ struct rgb_to_saturation_map :
+ Function_v2v< rgb_to_saturation_map<n> >
+ {
+ typedef value::rgb<n> argument;
+ typedef value::int_u<n> result;
+
+ result operator()(const argument& v) const
+ {
+ const float max = math::max(math::max(v.red(), v.green()), v.blue());
+ const float min = math::min(math::min(v.red(), v.green()), v.blue());
+ float sat = 0.0;
+
+ if (0 != max)
+ sat = (1 - (float)min/max);
+
+ const result ret = sat * (mln_max(result) - mln_min(result))
+ + mln_min(result);
+
+ return ret;
+ }
+ };
+
+ } // end of namespace mln::fun::v2v
+
+ } // end of namespace mln::fun
+
+} // end of namespace mln
+
+#endif // ! MLN_FUN_V2V_RGB_TO_SATURATION_MAP_HH
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb_to_value_map.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_value_map.hh
new file mode 100644
index 0000000..12ac1db
--- /dev/null
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb_to_value_map.hh
@@ -0,0 +1,75 @@
+// 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)
+//
+// 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.
+
+#ifndef MLN_FUN_V2V_RGB_TO_VALUE_MAP_HH
+# define MLN_FUN_V2V_RGB_TO_VALUE_MAP_HH
+
+# include <mln/math/abs.hh>
+# include <mln/math/max.hh>
+
+# include <mln/value/rgb.hh>
+
+
+/// \file
+///
+/// \brief Convert rgb value to value map.
+
+namespace mln
+{
+
+ namespace fun
+ {
+
+ namespace v2v
+ {
+
+ /// \brief Convert rgb value to value map.
+ ///
+ /// \ingroup modfunv2v
+
+ template <unsigned n>
+ struct rgb_to_value_map :
+ Function_v2v< rgb_to_value_map<n> >
+ {
+ typedef value::rgb<n> argument;
+ typedef value::int_u<n> result;
+
+ result operator()(const argument& v) const
+ {
+ const result ret = math::max(math::max(v.red(), v.green()), v.blue());
+
+ return ret;
+ }
+ };
+
+ } // end of namespace mln::fun::v2v
+
+ } // end of namespace mln::fun
+
+} // end of namespace mln
+
+#endif // ! MLN_FUN_V2V_RGB_TO_VALUE_MAP_HH
diff --git a/scribo/sandbox/green/mln/img_path.hh b/scribo/sandbox/green/mln/img_path.hh
new file mode 100644
index 0000000..d205e1f
--- /dev/null
+++ b/scribo/sandbox/green/mln/img_path.hh
@@ -0,0 +1,239 @@
+// 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)
+//
+// 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.
+
+#ifndef MLN_IMG_PATH_HH
+# define MLN_IMG_PATH_HH
+
+# define IMG_PATH "/home/green/git/img"
+# define RET_PATH "/home/green/git/result"
+
+# define INIM_IMG_PATH IMG_PATH"/inim"
+# define INIM_BG_IMG_PATH INIM_IMG_PATH"/bg"
+# define INIM_FG_IMG_PATH INIM_IMG_PATH"/fg"
+# define INIM_IN_IMG_PATH INIM_IMG_PATH"/in"
+
+# define OLENA_IMG_PATH IMG_PATH"/olena"
+
+# define ICDAR_IMG_PATH IMG_PATH"/icdar"
+# define ICDAR_100P_IMG_PATH ICDAR_IMG_PATH"/100p"
+# define ICDAR_100P_PPM_IMG_PATH ICDAR_100P_IMG_PATH"/ppm"
+# define ICDAR_100P_PGM_IMG_PATH ICDAR_100P_IMG_PATH"/pgm"
+# define ICDAR_100P_PBM_IMG_PATH ICDAR_100P_IMG_PATH"/pbm"
+# define ICDAR_100P_THICK_IMG_PATH ICDAR_100P_IMG_PATH"/gradient_thick"
+# define ICDAR_100P_THIN_IMG_PATH ICDAR_100P_IMG_PATH"/gradient_thin"
+
+# define ICDAR_50P_IMG_PATH ICDAR_IMG_PATH"/50p"
+# define ICDAR_50P_PPM_IMG_PATH ICDAR_50P_IMG_PATH"/ppm"
+# define ICDAR_50P_PGM_IMG_PATH ICDAR_50P_IMG_PATH"/pgm"
+# define ICDAR_50P_PBM_IMG_PATH ICDAR_50P_IMG_PATH"/pbm"
+
+# define ICDAR_20P_IMG_PATH ICDAR_IMG_PATH"/20p"
+# define ICDAR_20P_TEXT_ONLY_IMG_PATH ICDAR_20P_IMG_PATH"/text-only"
+# define ICDAR_20P_TEXT_COLOR_IMG_PATH ICDAR_20P_IMG_PATH"/text-color"
+# define ICDAR_20P_TEXT_PHOTO_IMG_PATH ICDAR_20P_IMG_PATH"/text-photo"
+# define ICDAR_20P_GMP30_IMG_PATH ICDAR_20P_IMG_PATH"/gimp-pal-30"
+# define ICDAR_20P_MGK30_IMG_PATH ICDAR_20P_IMG_PATH"/magick-pal-30"
+# define ICDAR_20P_GMP20_IMG_PATH ICDAR_20P_IMG_PATH"/gimp-pal-20"
+# define ICDAR_20P_MGK20_IMG_PATH ICDAR_20P_IMG_PATH"/magick-pal-20"
+# define ICDAR_20P_GMP10_IMG_PATH ICDAR_20P_IMG_PATH"/gimp-pal-10"
+# define ICDAR_20P_MGK10_IMG_PATH ICDAR_20P_IMG_PATH"/magick-pal-10"
+# define ICDAR_20P_INPUT_IMG_PATH ICDAR_20P_IMG_PATH"/ppm"
+# define ICDAR_20P_CROP_IMG_PATH ICDAR_20P_IMG_PATH"/crop"
+# define ICDAR_20P_PGM_IMG_PATH ICDAR_20P_IMG_PATH"/pgm"
+# define ICDAR_20P_PPM_IMG_PATH ICDAR_20P_IMG_PATH"/ppm"
+# define ICDAR_20P_PBM_IMG_PATH ICDAR_20P_IMG_PATH"/pbm"
+
+# define AFP_IMG_PATH IMG_PATH"/afp"
+# define AFP_GMP30_IMG_PATH AFP_IMG_PATH"/gimp-pal-30"
+# define AFP_GMP20_IMG_PATH AFP_IMG_PATH"/gimp-pal-20"
+# define AFP_GMP10_IMG_PATH AFP_IMG_PATH"/gimp-pal-10"
+# define AFP_MGK30_IMG_PATH AFP_IMG_PATH"/magick-pal-30"
+# define AFP_MGK20_IMG_PATH AFP_IMG_PATH"/magick-pal-20"
+# define AFP_MGK10_IMG_PATH AFP_IMG_PATH"/magick-pal-10"
+# define AFP_INPUT_IMG_PATH AFP_IMG_PATH"/ppm"
+# define AFP_PPM_IMG_PATH AFP_IMG_PATH"/ppm"
+# define AFP_JPG_IMG_PATH AFP_IMG_PATH"/jpg"
+
+# define ANNOTATING_1_IMG_PATH IMG_PATH"/annotating-1"
+# define ANNOTATING_1_BILL_IMG_PATH ANNOTATING_1_IMG_PATH"/bill"
+# define ANNOTATING_1_FAX_IMG_PATH ANNOTATING_1_IMG_PATH"/fax"
+# define ANNOTATING_1_HANDWRITTEN_IMG_PATH ANNOTATING_1_IMG_PATH"/handwritten"
+# define ANNOTATING_1_LOGO_IMG_PATH ANNOTATING_1_IMG_PATH"/logo"
+# define ANNOTATING_1_MAP_IMG_PATH ANNOTATING_1_IMG_PATH"/map"
+# define ANNOTATING_1_SCREENSHOT_IMG_PATH ANNOTATING_1_IMG_PATH"/screenshot"
+# define ANNOTATING_1_SLIDE_IMG_PATH ANNOTATING_1_IMG_PATH"/slide"
+# define ANNOTATING_1_TYPED_IMG_PATH ANNOTATING_1_IMG_PATH"/typed"
+# define ANNOTATING_1_PHOTO_IMG_PATH ANNOTATING_1_IMG_PATH"/photo"
+
+# define ANNOTATING_2_IMG_PATH IMG_PATH"/annotating-2"
+# define ANNOTATING_2_BILL_IMG_PATH ANNOTATING_2_IMG_PATH"/bill"
+# define ANNOTATING_2_FAX_IMG_PATH ANNOTATING_2_IMG_PATH"/fax"
+# define ANNOTATING_2_HANDWRITTEN_IMG_PATH ANNOTATING_2_IMG_PATH"/handwritten"
+# define ANNOTATING_2_LOGO_IMG_PATH ANNOTATING_2_IMG_PATH"/logo"
+# define ANNOTATING_2_MAP_IMG_PATH ANNOTATING_2_IMG_PATH"/map"
+# define ANNOTATING_2_SCREENSHOT_IMG_PATH ANNOTATING_2_IMG_PATH"/screenshot"
+# define ANNOTATING_2_SLIDE_IMG_PATH ANNOTATING_2_IMG_PATH"/slide"
+# define ANNOTATING_2_TYPED_IMG_PATH ANNOTATING_2_IMG_PATH"/typed"
+# define ANNOTATING_2_PHOTO_IMG_PATH ANNOTATING_2_IMG_PATH"/photo"
+
+// result directories
+# define ANNOTATING_RET_PATH RET_PATH"/annotating"
+
+# define ANNOTATING_ICDAR_RET_PATH ANNOTATING_RET_PATH"/icdar"
+
+# define ANNOTATING_ICDAR_INPUT_RET_PATH ANNOTATING_ICDAR_RET_PATH"/input"
+# define ANNOTATING_ICDAR_H_INPUT_RET_PATH ANNOTATING_ICDAR_INPUT_RET_PATH"/h"
+# define ANNOTATING_ICDAR_S_INPUT_RET_PATH ANNOTATING_ICDAR_INPUT_RET_PATH"/s"
+# define ANNOTATING_ICDAR_V_INPUT_RET_PATH ANNOTATING_ICDAR_INPUT_RET_PATH"/v"
+# define ANNOTATING_ICDAR_R_INPUT_RET_PATH ANNOTATING_ICDAR_INPUT_RET_PATH"/r"
+# define ANNOTATING_ICDAR_G_INPUT_RET_PATH ANNOTATING_ICDAR_INPUT_RET_PATH"/g"
+# define ANNOTATING_ICDAR_B_INPUT_RET_PATH ANNOTATING_ICDAR_INPUT_RET_PATH"/b"
+
+# define ANNOTATING_ICDAR_GMP30_RET_PATH ANNOTATING_ICDAR_RET_PATH"/gimp-pal-30"
+# define ANNOTATING_ICDAR_H_GMP30_RET_PATH ANNOTATING_ICDAR_GMP30_RET_PATH"/h"
+# define ANNOTATING_ICDAR_S_GMP30_RET_PATH ANNOTATING_ICDAR_GMP30_RET_PATH"/s"
+# define ANNOTATING_ICDAR_V_GMP30_RET_PATH ANNOTATING_ICDAR_GMP30_RET_PATH"/v"
+# define ANNOTATING_ICDAR_R_GMP30_RET_PATH ANNOTATING_ICDAR_GMP30_RET_PATH"/r"
+# define ANNOTATING_ICDAR_G_GMP30_RET_PATH ANNOTATING_ICDAR_GMP30_RET_PATH"/g"
+# define ANNOTATING_ICDAR_B_GMP30_RET_PATH ANNOTATING_ICDAR_GMP30_RET_PATH"/b"
+
+# define ANNOTATING_ICDAR_GMP20_RET_PATH ANNOTATING_ICDAR_RET_PATH"/gimp-pal-20"
+# define ANNOTATING_ICDAR_H_GMP20_RET_PATH ANNOTATING_ICDAR_GMP20_RET_PATH"/h"
+# define ANNOTATING_ICDAR_S_GMP20_RET_PATH ANNOTATING_ICDAR_GMP20_RET_PATH"/s"
+# define ANNOTATING_ICDAR_V_GMP20_RET_PATH ANNOTATING_ICDAR_GMP20_RET_PATH"/v"
+# define ANNOTATING_ICDAR_R_GMP20_RET_PATH ANNOTATING_ICDAR_GMP20_RET_PATH"/r"
+# define ANNOTATING_ICDAR_G_GMP20_RET_PATH ANNOTATING_ICDAR_GMP20_RET_PATH"/g"
+# define ANNOTATING_ICDAR_B_GMP20_RET_PATH ANNOTATING_ICDAR_GMP20_RET_PATH"/b"
+
+# define ANNOTATING_ICDAR_GMP10_RET_PATH ANNOTATING_ICDAR_RET_PATH"/gimp-pal-10"
+# define ANNOTATING_ICDAR_H_GMP10_RET_PATH ANNOTATING_ICDAR_GMP10_RET_PATH"/h"
+# define ANNOTATING_ICDAR_S_GMP10_RET_PATH ANNOTATING_ICDAR_GMP10_RET_PATH"/s"
+# define ANNOTATING_ICDAR_V_GMP10_RET_PATH ANNOTATING_ICDAR_GMP10_RET_PATH"/v"
+# define ANNOTATING_ICDAR_R_GMP10_RET_PATH ANNOTATING_ICDAR_GMP10_RET_PATH"/r"
+# define ANNOTATING_ICDAR_G_GMP10_RET_PATH ANNOTATING_ICDAR_GMP10_RET_PATH"/g"
+# define ANNOTATING_ICDAR_B_GMP10_RET_PATH ANNOTATING_ICDAR_GMP10_RET_PATH"/b"
+
+# define ANNOTATING_ICDAR_MGK30_RET_PATH ANNOTATING_ICDAR_RET_PATH"/magick-pal-30"
+# define ANNOTATING_ICDAR_H_MGK30_RET_PATH ANNOTATING_ICDAR_MGK30_RET_PATH"/h"
+# define ANNOTATING_ICDAR_S_MGK30_RET_PATH ANNOTATING_ICDAR_MGK30_RET_PATH"/s"
+# define ANNOTATING_ICDAR_V_MGK30_RET_PATH ANNOTATING_ICDAR_MGK30_RET_PATH"/v"
+# define ANNOTATING_ICDAR_R_MGK30_RET_PATH ANNOTATING_ICDAR_MGK30_RET_PATH"/r"
+# define ANNOTATING_ICDAR_G_MGK30_RET_PATH ANNOTATING_ICDAR_MGK30_RET_PATH"/g"
+# define ANNOTATING_ICDAR_B_MGK30_RET_PATH ANNOTATING_ICDAR_MGK30_RET_PATH"/b"
+
+# define ANNOTATING_ICDAR_MGK20_RET_PATH ANNOTATING_ICDAR_RET_PATH"/magick-pal-20"
+# define ANNOTATING_ICDAR_H_MGK20_RET_PATH ANNOTATING_ICDAR_MGK20_RET_PATH"/h"
+# define ANNOTATING_ICDAR_S_MGK20_RET_PATH ANNOTATING_ICDAR_MGK20_RET_PATH"/s"
+# define ANNOTATING_ICDAR_V_MGK20_RET_PATH ANNOTATING_ICDAR_MGK20_RET_PATH"/v"
+# define ANNOTATING_ICDAR_R_MGK20_RET_PATH ANNOTATING_ICDAR_MGK20_RET_PATH"/r"
+# define ANNOTATING_ICDAR_G_MGK20_RET_PATH ANNOTATING_ICDAR_MGK20_RET_PATH"/g"
+# define ANNOTATING_ICDAR_B_MGK20_RET_PATH ANNOTATING_ICDAR_MGK20_RET_PATH"/b"
+
+# define ANNOTATING_ICDAR_MGK10_RET_PATH ANNOTATING_ICDAR_RET_PATH"/magick-pal-10"
+# define ANNOTATING_ICDAR_H_MGK10_RET_PATH ANNOTATING_ICDAR_MGK10_RET_PATH"/h"
+# define ANNOTATING_ICDAR_S_MGK10_RET_PATH ANNOTATING_ICDAR_MGK10_RET_PATH"/s"
+# define ANNOTATING_ICDAR_V_MGK10_RET_PATH ANNOTATING_ICDAR_MGK10_RET_PATH"/v"
+# define ANNOTATING_ICDAR_R_MGK10_RET_PATH ANNOTATING_ICDAR_MGK10_RET_PATH"/r"
+# define ANNOTATING_ICDAR_G_MGK10_RET_PATH ANNOTATING_ICDAR_MGK10_RET_PATH"/g"
+# define ANNOTATING_ICDAR_B_MGK10_RET_PATH ANNOTATING_ICDAR_MGK10_RET_PATH"/b"
+
+
+
+
+# define ANNOTATING_AFP_RET_PATH ANNOTATING_RET_PATH"/afp"
+
+# define ANNOTATING_AFP_INPUT_RET_PATH ANNOTATING_AFP_RET_PATH"/input"
+# define ANNOTATING_AFP_H_INPUT_RET_PATH ANNOTATING_AFP_INPUT_RET_PATH"/h"
+# define ANNOTATING_AFP_S_INPUT_RET_PATH ANNOTATING_AFP_INPUT_RET_PATH"/s"
+# define ANNOTATING_AFP_V_INPUT_RET_PATH ANNOTATING_AFP_INPUT_RET_PATH"/v"
+# define ANNOTATING_AFP_R_INPUT_RET_PATH ANNOTATING_AFP_INPUT_RET_PATH"/r"
+# define ANNOTATING_AFP_G_INPUT_RET_PATH ANNOTATING_AFP_INPUT_RET_PATH"/g"
+# define ANNOTATING_AFP_B_INPUT_RET_PATH ANNOTATING_AFP_INPUT_RET_PATH"/b"
+
+# define ANNOTATING_AFP_GMP30_RET_PATH ANNOTATING_AFP_RET_PATH"/gimp-pal-30"
+# define ANNOTATING_AFP_H_GMP30_RET_PATH ANNOTATING_AFP_GMP30_RET_PATH"/h"
+# define ANNOTATING_AFP_S_GMP30_RET_PATH ANNOTATING_AFP_GMP30_RET_PATH"/s"
+# define ANNOTATING_AFP_V_GMP30_RET_PATH ANNOTATING_AFP_GMP30_RET_PATH"/v"
+# define ANNOTATING_AFP_R_GMP30_RET_PATH ANNOTATING_AFP_GMP30_RET_PATH"/r"
+# define ANNOTATING_AFP_G_GMP30_RET_PATH ANNOTATING_AFP_GMP30_RET_PATH"/g"
+# define ANNOTATING_AFP_B_GMP30_RET_PATH ANNOTATING_AFP_GMP30_RET_PATH"/b"
+
+# define ANNOTATING_AFP_GMP20_RET_PATH ANNOTATING_AFP_RET_PATH"/gimp-pal-20"
+# define ANNOTATING_AFP_H_GMP20_RET_PATH ANNOTATING_AFP_GMP20_RET_PATH"/h"
+# define ANNOTATING_AFP_S_GMP20_RET_PATH ANNOTATING_AFP_GMP20_RET_PATH"/s"
+# define ANNOTATING_AFP_V_GMP20_RET_PATH ANNOTATING_AFP_GMP20_RET_PATH"/v"
+# define ANNOTATING_AFP_R_GMP20_RET_PATH ANNOTATING_AFP_GMP20_RET_PATH"/r"
+# define ANNOTATING_AFP_G_GMP20_RET_PATH ANNOTATING_AFP_GMP20_RET_PATH"/g"
+# define ANNOTATING_AFP_B_GMP20_RET_PATH ANNOTATING_AFP_GMP20_RET_PATH"/b"
+
+# define ANNOTATING_AFP_GMP10_RET_PATH ANNOTATING_AFP_RET_PATH"/gimp-pal-10"
+# define ANNOTATING_AFP_H_GMP10_RET_PATH ANNOTATING_AFP_GMP10_RET_PATH"/h"
+# define ANNOTATING_AFP_S_GMP10_RET_PATH ANNOTATING_AFP_GMP10_RET_PATH"/s"
+# define ANNOTATING_AFP_V_GMP10_RET_PATH ANNOTATING_AFP_GMP10_RET_PATH"/v"
+# define ANNOTATING_AFP_R_GMP10_RET_PATH ANNOTATING_AFP_GMP10_RET_PATH"/r"
+# define ANNOTATING_AFP_G_GMP10_RET_PATH ANNOTATING_AFP_GMP10_RET_PATH"/g"
+# define ANNOTATING_AFP_B_GMP10_RET_PATH ANNOTATING_AFP_GMP10_RET_PATH"/b"
+
+# define ANNOTATING_AFP_MGK30_RET_PATH ANNOTATING_AFP_RET_PATH"/magick-pal-30"
+# define ANNOTATING_AFP_H_MGK30_RET_PATH ANNOTATING_AFP_MGK30_RET_PATH"/h"
+# define ANNOTATING_AFP_S_MGK30_RET_PATH ANNOTATING_AFP_MGK30_RET_PATH"/s"
+# define ANNOTATING_AFP_V_MGK30_RET_PATH ANNOTATING_AFP_MGK30_RET_PATH"/v"
+# define ANNOTATING_AFP_R_MGK30_RET_PATH ANNOTATING_AFP_MGK30_RET_PATH"/r"
+# define ANNOTATING_AFP_G_MGK30_RET_PATH ANNOTATING_AFP_MGK30_RET_PATH"/g"
+# define ANNOTATING_AFP_B_MGK30_RET_PATH ANNOTATING_AFP_MGK30_RET_PATH"/b"
+
+# define ANNOTATING_AFP_MGK20_RET_PATH ANNOTATING_AFP_RET_PATH"/magick-pal-20"
+# define ANNOTATING_AFP_H_MGK20_RET_PATH ANNOTATING_AFP_MGK20_RET_PATH"/h"
+# define ANNOTATING_AFP_S_MGK20_RET_PATH ANNOTATING_AFP_MGK20_RET_PATH"/s"
+# define ANNOTATING_AFP_V_MGK20_RET_PATH ANNOTATING_AFP_MGK20_RET_PATH"/v"
+# define ANNOTATING_AFP_R_MGK20_RET_PATH ANNOTATING_AFP_MGK20_RET_PATH"/r"
+# define ANNOTATING_AFP_G_MGK20_RET_PATH ANNOTATING_AFP_MGK20_RET_PATH"/g"
+# define ANNOTATING_AFP_B_MGK20_RET_PATH ANNOTATING_AFP_MGK20_RET_PATH"/b"
+
+# define ANNOTATING_AFP_MGK10_RET_PATH ANNOTATING_AFP_RET_PATH"/magick-pal-10"
+# define ANNOTATING_AFP_H_MGK10_RET_PATH ANNOTATING_AFP_MGK10_RET_PATH"/h"
+# define ANNOTATING_AFP_S_MGK10_RET_PATH ANNOTATING_AFP_MGK10_RET_PATH"/s"
+# define ANNOTATING_AFP_V_MGK10_RET_PATH ANNOTATING_AFP_MGK10_RET_PATH"/v"
+# define ANNOTATING_AFP_R_MGK10_RET_PATH ANNOTATING_AFP_MGK10_RET_PATH"/r"
+# define ANNOTATING_AFP_G_MGK10_RET_PATH ANNOTATING_AFP_MGK10_RET_PATH"/g"
+# define ANNOTATING_AFP_B_MGK10_RET_PATH ANNOTATING_AFP_MGK10_RET_PATH"/b"
+
+
+# define ANNOTATING_BILL_RET_PATH ANNOTATING_RET_PATH"/bill"
+# define ANNOTATING_FAX_RET_PATH ANNOTATING_RET_PATH"/fax"
+# define ANNOTATING_HANDWRITTEN_RET_PATH ANNOTATING_RET_PATH"/handwritten"
+# define ANNOTATING_LOGO_RET_PATH ANNOTATING_RET_PATH"/logo"
+# define ANNOTATING_MAP_RET_PATH ANNOTATING_RET_PATH"/map"
+# define ANNOTATING_SCREENSHOT_RET_PATH ANNOTATING_RET_PATH"/screenshot"
+# define ANNOTATING_SLIDE_RET_PATH ANNOTATING_RET_PATH"/slide"
+# define ANNOTATING_TYPED_RET_PATH ANNOTATING_RET_PATH"/typed"
+# define ANNOTATING_PHOTO_RET_PATH ANNOTATING_RET_PATH"/photo"
+
+# define ANNOTATING_ICDAR_ACHROMATISM_RET_PATH ANNOTATING_ICDAR_RET_PATH"/achromatism"
+
+
+#endif // ! MLN_IMG_PATH_HH
diff --git a/scribo/sandbox/green/mln/io/plot/save_image_sh.hh b/scribo/sandbox/green/mln/io/plot/save_image_sh.hh
new file mode 100644
index 0000000..137f78d
--- /dev/null
+++ b/scribo/sandbox/green/mln/io/plot/save_image_sh.hh
@@ -0,0 +1,1056 @@
+// 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.
+
+#ifndef MLN_IO_PLOT_SAVE_IMAGE_SH_HH
+# define MLN_IO_PLOT_SAVE_IMAGE_SH_HH
+
+/// \file
+///
+/// \brief Define some functions to export to gnuplot format as a script shell.
+///
+/// Theses routines are dedicated to image visualization. The aim is to display
+/// image whatever the value used as pixel. The behaviour of gnuplot is more
+/// like xv than imageMagick. A Gnuplot script shell file is a text dump file
+/// with a preambule to let gnuplot interpret data. As a script shell, you can
+/// launch it (don't forget the permissions), and every thing is packed in it.
+/// The script file call gnuplot in batch mode, the result window persists and
+/// that's all.
+///
+
+# include <fstream>
+# include <string>
+
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
+
+# include <mln/core/macros.hh>
+# include <mln/core/contract.hh>
+# include <mln/core/image/image1d.hh>
+# include <mln/core/image/image2d.hh>
+# include <mln/core/image/image3d.hh>
+
+# include <mln/geom/min_ind.hh>
+# include <mln/geom/max_ind.hh>
+# include <mln/geom/min_row.hh>
+# include <mln/geom/max_row.hh>
+# include <mln/geom/min_col.hh>
+# include <mln/geom/max_col.hh>
+
+# include <mln/trait/value_.hh>
+
+# include <mln/value/int_u.hh>
+# include <mln/value/int_s.hh>
+# include <mln/value/rgb.hh>
+# include <mln/value/hsl.hh>
+# include <mln/value/hsi.hh>
+
+# include <mln/util/array.hh>
+
+
+namespace mln
+{
+
+ namespace io
+ {
+
+ namespace plot
+ {
+
+ /// \brief Save an image as a gnuplot script shell.
+ ///
+ /// Every thing is save. The image could be 1d, 2d or 3d. The value of
+ /// the pixels could be int_u<n>, int_s<n>, float, double, hsl_f, hsl_d,
+ /// hsi_f, hsi_d and rgb<n>.
+ ///
+ /// \param[in] img the image which contains the data 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 Image<I>& img, const std::string& filename);
+
+ /// \brief Save a 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< image1d<I> >& stack,
+ const std::string& filename);
+
+ template <typename I>
+ bool save_image_sh(const util::array< util::array< image1d<I> > >& stack,
+ const std::string& filename);
+
+ } // end of namespace mln::io::plot
+
+ } // end of namespace mln::io
+
+
+ namespace io
+ {
+
+ namespace plot
+ {
+
+#ifndef MLN_INCLUDE_ONLY
+
+ //------------------------------------------------------------------------
+ // Impl.
+ //------------------------------------------------------------------------
+
+ namespace impl
+ {
+
+
+ //----------------------------------------------------------------------
+ // save_image_sh_array_array_image1d(const array<array<image1d<I>>>&,
+ // const string&)
+ //----------------------------------------------------------------------
+
+ template <typename I>
+ inline
+ bool save_image_sh_array_array_image1d(const util::array< util::array<
+ image1d<I> > >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d");
+
+ mln_precondition(!stack.is_empty());
+ mln_precondition(!stack[0].is_empty());
+ mln_precondition(stack[0][0].is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_ind = geom::min_ind(stack[0][0]);
+ unsigned max_ind = geom::max_ind(stack[0][0]);
+
+ if (result)
+ {
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set xrange [" << min_ind;
+ out << ":" << max_ind;
+ out << "]" << std::endl;
+ out << "plot '-' with line";
+
+ for (unsigned i = 1; i < stack.size(); ++i)
+ {
+ for (unsigned j = 1; j < stack[i].size(); ++j)
+ {
+
+ out << ",\\" << std::endl;
+ out << " '-' with line";
+ }
+ }
+
+ out << std::endl;
+
+ mln_eiter(util::array< util::array< image1d<I> > >) e0(stack);
+
+ for_all (e0)
+ {
+ mln_eiter(util::array< image1d<I> >) e1(stack[e0.index_()]);
+
+ for_all (e1)
+ {
+ mln_piter(image1d< I >)
+ p(stack[e0.index_()][e1.index_()].domain());
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.ind() << " ";
+ out << stack[e0.index_()][e1.index_()](p) << std::endl;;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ }
+ }
+
+ out << "EOF" << std::endl;
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d");
+
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_array_array_image1d_vec3(
+ // const array<array<image1d<vec<3,T>>>>&,
+ // const string&)
+ //----------------------------------------------------------------------
+
+ template <typename T>
+ inline
+ bool save_image_sh_array_array_image1d_vec3(
+ const util::array<util::array<image1d<algebra::vec<3,T> > > >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d_vec3");
+
+ typedef algebra::vec<3,T> t_val;
+ typedef image1d<t_val> t_img;
+ typedef util::array<t_img> t_array;
+ typedef util::array<t_array> t_stack;
+
+ mln_precondition(!stack.is_empty());
+ mln_precondition(!stack[0].is_empty());
+ mln_precondition(stack[0][0].is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_ind = geom::min_ind(stack[0][0]);
+ unsigned max_ind = geom::max_ind(stack[0][0]);
+
+ if (result)
+ {
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set xrange [" << min_ind;
+ out << ":" << max_ind;
+ out << "]" << std::endl;
+ out << "splot '-' with line palette";
+
+ for (unsigned i = 1; i < stack.size(); ++i)
+ {
+ for (unsigned j = 1; j < stack[i].size(); ++j)
+ {
+
+ out << ",\\" << std::endl;
+ out << " '-' with line palette";
+ }
+ }
+
+ out << std::endl;
+
+ mln_eiter(t_stack) e0(stack);
+
+ for_all (e0)
+ {
+ mln_eiter(t_array) e1(stack[e0.index_()]);
+
+ for_all (e1)
+ {
+ mln_piter(t_img) p(stack[e0.index_()][e1.index_()].domain());
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.ind() << " ";
+ out << stack[e0.index_()][e1.index_()](p)[0] << " ";
+ out << stack[e0.index_()][e1.index_()](p)[1] << " ";
+ out << stack[e0.index_()][e1.index_()](p)[2] << std::endl;;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ }
+ }
+
+ out << "EOF" << std::endl;
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d_vec3");
+
+ return result;
+ }
+
+
+ //----------------------------------------------------------------------
+ // save_image_sh_array_array_image1d_vec2(
+ // const array<array<image1d<vec<2,T>>>>&,
+ // const string&)
+ //----------------------------------------------------------------------
+
+ template <typename T>
+ inline
+ bool save_image_sh_array_array_image1d_vec2(
+ const util::array<util::array<image1d<algebra::vec<2,T> > > >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d_vec2");
+
+ typedef algebra::vec<2,T> t_val;
+ typedef image1d<t_val> t_img;
+ typedef util::array<t_img> t_array;
+ typedef util::array<t_array> t_stack;
+
+ mln_precondition(!stack.is_empty());
+ mln_precondition(!stack[0].is_empty());
+ mln_precondition(stack[0][0].is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_ind = geom::min_ind(stack[0][0]);
+ unsigned max_ind = geom::max_ind(stack[0][0]);
+
+ if (result)
+ {
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set xrange [" << min_ind;
+ out << ":" << max_ind;
+ out << "]" << std::endl;
+ out << "splot '-' with line";
+
+ for (unsigned i = 1; i < stack.size(); ++i)
+ {
+ for (unsigned j = 1; j < stack[i].size(); ++j)
+ {
+
+ out << ",\\" << std::endl;
+ out << " '-' with line";
+ }
+ }
+
+ out << std::endl;
+
+ mln_eiter(t_stack) e0(stack);
+
+ for_all (e0)
+ {
+ mln_eiter(t_array) e1(stack[e0.index_()]);
+
+ for_all (e1)
+ {
+ mln_piter(t_img) p(stack[e0.index_()][e1.index_()].domain());
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.ind() << " ";
+ out << stack[e0.index_()][e1.index_()](p)[0] << " ";
+ out << stack[e0.index_()][e1.index_()](p)[1] << std::endl;;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ }
+ }
+
+ out << "EOF" << std::endl;
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d_vec2");
+
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_array_image1d(const array<image1d<I>>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <typename I>
+ inline
+ bool save_image_sh_array_image1d(const util::array< image1d<I> >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_array_image1d");
+ mln_precondition(!stack.is_empty());
+ mln_precondition(stack[0].is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_ind = geom::min_ind(stack[0]);
+ unsigned max_ind = geom::max_ind(stack[0]);
+
+ if (result)
+ {
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set xrange [" << min_ind;
+ out << ":" << max_ind;
+ out << "]" << std::endl;
+ out << "plot '-' with line";
+
+ for (unsigned i = 1; i < stack.size(); ++i)
+ {
+
+ out << ",\\" << std::endl;
+ out << " '-' with line";
+ }
+
+ out << std::endl;
+
+ mln_eiter(util::array< image1d<I> >) e(stack);
+
+ for_all (e)
+ {
+ mln_piter(image1d< I >) p(stack[e.index_()].domain());
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.ind() << " ";
+ out << stack[e.index_()](p) << std::endl;;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ }
+
+ out << "EOF" << std::endl;
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_array_image1d");
+ return result;
+ }
+
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image2d_rgb(const image2d<rgb<n>>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <unsigned n>
+ inline
+ bool save_image_sh_image2d_rgb(const image2d<value::rgb<n> >& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image2d_rgb");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_row = geom::min_row(img);
+ unsigned max_row = geom::max_row(img);
+ unsigned min_col = geom::min_col(img);
+ unsigned max_col = geom::max_col(img);
+
+ if (result)
+ {
+ mln_piter(image2d< value::rgb<n> >) p(img.domain());
+
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, r, g, b) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set xrange [" << min_col;
+ out << ":" << max_col;
+ out << "]" << std::endl;
+ out << "set yrange [-" << max_row;
+ out << ":" << min_row;
+ out << "]" << std::endl;
+ out << "plot '-' using 2:(-\\$1):3:4:5 with rgbimage" << std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.row() << " ";
+ out << p.col() << " ";
+ out << img(p).red() << " ";
+ out << img(p).green() << " ";
+ out << img(p).blue() << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image2d_rgb");
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image2d_hsl(const image2d<hsl_<T,T,T>>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <typename T>
+ inline
+ bool save_image_sh_image2d_hsl(const image2d<value::hsl_<T,T,T> >& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image2d_hsl");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_row = geom::min_row(img);
+ unsigned max_row = geom::max_row(img);
+ unsigned min_col = geom::min_col(img);
+ unsigned max_col = geom::max_col(img);
+
+ typedef mln::value::hsl_<T,T,T> hsl;
+
+ if (result)
+ {
+ mln_piter(image2d< hsl >) p(img.domain());
+
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "q(l,s) = (l < 0.5)? (l*(1+s)):(l+s-(l*s))" << std::endl;
+ out << "p(l,s) = (2.0 * l - q(l,s))" << std::endl;
+ out << "n(x) = (x < 0)?(x+1):(x > 1)?(x-1) : (x)"<< std::endl;
+ out << std::endl;
+ out << "c(p,q,t) = (t <(1.0/6.0))?(p+(q-p)*6.0*t):\\"<< std::endl;
+ out << " (t <(1.0/2.0))?(q) :\\" << std::endl;
+ out << " (t<(2.0/3.0))?(p+(q-p)*6.0*((2.0/3.0)-t)):\\" << std::endl;
+ out << " (p)" << std::endl;
+ out << std::endl;
+ out << "r(h,s,l) = c(p(l,s),q(l,s),n(h/360.0+1.0/3.0))"<< std::endl;
+ out << "g(h,s,l) = c(p(l,s),q(l,s),n(h/360.0))" << std::endl;
+ out << "b(h,s,l) = c(p(l,s),q(l,s),n(h/360.0-1.0/3.0))"<< std::endl;
+ out << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set palette gray" << std::endl;
+ out << "set xrange [" << min_col;
+ out << ":" << max_col;
+ out << "]" << std::endl;
+ out << "set yrange [-" << max_row;
+ out << ":" << min_row;
+ out << "]" << std::endl;
+ out << "plot '-' using 2:(-\\$1):\\" << std::endl;
+ out << " (r(\\$3,\\$4,\\$5)):\\" << std::endl;
+ out << " (g(\\$3,\\$4,\\$5)):\\" << std::endl;
+ out << " (b(\\$3,\\$4,\\$5)) with rgbimage" << std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.row() << " ";
+ out << p.col() << " ";
+ out << img(p).hue() << " ";
+ out << img(p).sat() << " ";
+ out << img(p).lum() << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image2d_hsl");
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image2d_hsi(const image2d<hsi_<T,T,T>>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <typename T>
+ inline
+ bool save_image_sh_image2d_hsi(const image2d<value::hsi_<T,T,T> >& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image2d_hsi");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_row = geom::min_row(img);
+ unsigned max_row = geom::max_row(img);
+ unsigned min_col = geom::min_col(img);
+ unsigned max_col = geom::max_col(img);
+
+ typedef mln::value::hsi_<T,T,T> hsi;
+
+ if (result)
+ {
+ mln_piter(image2d< hsi >) p(img.domain());
+
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "teta(h) = (h/180.0) * pi" << std::endl;
+ out << "alpha(s,h) = s*cos(teta(h))" << std::endl;
+ out << "beta(s,h) = s*sin(teta(h))" << std::endl;
+ out << "n(x) = (x < 0)?(x+1) : (x > 1)?(x-1):(x)"<< std::endl;
+ out << std::endl;
+ out << "c(p,q,t) = (t <(1.0/6.0))?(p+(q-p)*6.0*t):\\"<< std::endl;
+ out << " (t <(1.0/2.0))?(q) :\\" << std::endl;
+ out << " (t <(2.0/3.0))?(p+(q-p)*6.0*((2.0/3.0)-t)):\\"<< std::endl;
+ out << " (p)" << std::endl;
+ out << std::endl;
+ out << "r(h,s,i) = (sqrt(3.0)/3.0) * i \\" << std::endl;
+ out << " + (2.0/(sqrt(6.0))) * beta(s,h)" << std::endl;
+ out << "g(h,s,i) = (sqrt(3.0)/3.0) * i \\" << std::endl;
+ out << " + (2.0/(sqrt(2.0))) * alpha(s,h)\\" << std::endl;
+ out << " - (1.0/(sqrt(6.0))) * beta(s,h)" << std::endl;
+ out << "b(h,s,i) = (sqrt(3.0)/3.0) * i \\" << std::endl;
+ out << " - (2.0/(sqrt(2.0))) * alpha(s,h) \\"<< std::endl;
+ out << " - (1.0/(sqrt(6.0))) * beta(s,h)" << std::endl;
+ out << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set palette gray" << std::endl;
+ out << "set xrange [" << min_col;
+ out << ":" << max_col;
+ out << "]" << std::endl;
+ out << "set yrange [-" << max_row;
+ out << ":" << min_row;
+ out << "]" << std::endl;
+ out << "plot '-' using 2:(-\\$1):\\" << std::endl;
+ out << " (r(\\$3,\\$4,\\$5)):\\" << std::endl;
+ out << " (g(\\$3,\\$4,\\$5)):\\" << std::endl;
+ out << " (b(\\$3,\\$4,\\$5)) with rgbimage" << std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.row() << " ";
+ out << p.col() << " ";
+ out << img(p).hue() << " ";
+ out << img(p).sat() << " ";
+ out << img(p).inty() << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image2d_hsi");
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image2d(const image2d<I>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <typename I>
+ inline
+ bool save_image_sh_image2d(const image2d<I>& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image2d");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_row = geom::min_row(img);
+ unsigned max_row = geom::max_row(img);
+ unsigned min_col = geom::min_col(img);
+ unsigned max_col = geom::max_col(img);
+
+ if (result)
+ {
+ mln_piter(image2d<I>) p(img.domain());
+
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set palette gray" << std::endl;
+ out << "set xrange [" << min_col;
+ out << ":" << max_col;
+ out << "]" << std::endl;
+ out << "set yrange [-" << max_row;
+ out << ":" << min_row;
+ out << "]" << std::endl;
+ out << "plot '-' using 2:(-\\$1):3 with image" <<std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.row() << " ";
+ out << p.col() << " ";
+ out << img(p) << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:"<< filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image2d");
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image1d(const image1d<I>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <typename I>
+ inline
+ bool save_image_sh_image1d(const image1d<I>& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image1d");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+
+ if (result)
+ {
+ mln_piter(image1d<I>) p(img.domain());
+
+ // Output data prelude (terminal X11, impulse).
+ out << "#!/bin/sh" << std::endl;
+ out << "##########################" << std::endl;
+ out << "# Two columns = (x, val) #" << std::endl;
+ out << "##########################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "plot '-' with impulse" << std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.ind() << " ";
+ out << img(p) << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:"<< filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image1d");
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image3d(const image3d<I>&, const string&)
+ //----------------------------------------------------------------------
+
+
+ template <typename I>
+ inline
+ bool save_image_sh_image3d(const image3d<I>& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image3d");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+
+ if (result)
+ {
+ mln_piter(image3d<I>) p(img.domain());
+
+ // Output data prelude (terminal X11, pointtype 0).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, z, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "splot '-' with points palette pointtype 7" << std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.row() << " ";
+ out << p.col() << " ";
+ out << p.sli() << " ";
+ out << img(p) << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:"<< filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image3d");
+ return result;
+ }
+
+ } // end of namespace impl
+
+
+ //------------------------------------------------------------------------
+ // Internal.
+ //------------------------------------------------------------------------
+
+ namespace internal
+ {
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const util::array< image1d<I> >& stack,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_array_image1d(stack, filename);
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const util::array<
+ util::array <image1d<I> > >& stack,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_array_array_image1d(stack, filename);
+ }
+
+ template <typename T>
+ inline
+ bool save_image_sh_dispatch(
+ const util::array<util::array<image1d<algebra::vec<3,T> > > >& stack,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_array_array_image1d_vec3(stack, filename);
+ }
+
+ template <typename T>
+ inline
+ bool save_image_sh_dispatch(
+ const util::array<util::array<image1d<algebra::vec<2,T> > > >& stack,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_array_array_image1d_vec2(stack, filename);
+ }
+
+ template <unsigned n>
+ inline
+ bool save_image_sh_dispatch(const image2d<value::rgb<n> >& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image2d_rgb(img, filename);
+ }
+
+ template <typename T>
+ inline
+ bool save_image_sh_dispatch(const image2d<value::hsl_<T,T,T> >& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image2d_hsl(img, filename);
+ }
+
+ template <typename T>
+ inline
+ bool save_image_sh_dispatch(const image2d<value::hsi_<T,T,T> >& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image2d_hsi(img, filename);
+ }
+
+
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const image2d<I>& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image2d(img, filename);
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const image1d<I>& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image1d(img, filename);
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const image3d<I>& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image3d(img, filename);
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const Image<I>& img,
+ const std::string& filename)
+ {
+ return save_image_sh_dispatch(exact(img), filename);
+ }
+
+ } // end of namespace mln::io::plot::internal
+
+ //------------------------------------------------------------------------
+ // Facade.
+ //------------------------------------------------------------------------
+
+ template <typename I>
+ inline
+ bool save_image_sh(const Image<I>& img, const std::string& filename)
+ {
+ trace::entering("mln::io::plot::save_image_sh");
+
+ bool result = internal::save_image_sh_dispatch(img, filename);
+
+ trace::exiting("mln::io::plot::save_image_sh");
+ return result;
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh(const util::array< image1d<I> >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::save_image_sh");
+
+ bool result = internal::save_image_sh_dispatch(stack, filename);
+
+ trace::exiting("mln::io::plot::save_image_sh");
+ return result;
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh(const util::array< util::array< image1d<I> > >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::save_image_sh");
+
+ bool result = internal::save_image_sh_dispatch(stack, filename);
+
+ trace::exiting("mln::io::plot::save_image_sh");
+ return result;
+ }
+
+
+#endif // ! MLN_INCLUDE_ONLY
+
+
+ } // end of namespace mln::io::plot
+
+ } // end of namespace mln::io
+
+} // end of namespace mln
+
+#endif // ! MLN_IO_PLOT_SAVE_IMAGE_SH_HH
diff --git a/scribo/sandbox/green/mln/math/ceil.hh b/scribo/sandbox/green/mln/math/ceil.hh
new file mode 100644
index 0000000..6fc08c8
--- /dev/null
+++ b/scribo/sandbox/green/mln/math/ceil.hh
@@ -0,0 +1,64 @@
+// Copyright (C) 2007, 2008, 2009, 2010
+// EPITA Research and Development Laboratory (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.
+
+#ifndef MLN_MATH_CEIL_HH
+# define MLN_MATH_CEIL_HH
+
+/*! \file
+ *
+ * \brief Define the ceil (ceil) routine.
+ */
+
+# include <cmath>
+
+
+namespace mln
+{
+
+ namespace math
+ {
+
+ template <typename T>
+ T ceil(const T& v);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <typename T>
+ inline
+ T ceil(const T& v)
+ {
+ return std::ceil(v);
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::math
+
+} // end of namespace mln
+
+
+#endif // ! MLN_MATH_FLOOR_HH
diff --git a/scribo/sandbox/green/mln/math/floor.hh b/scribo/sandbox/green/mln/math/floor.hh
new file mode 100644
index 0000000..97e63bd
--- /dev/null
+++ b/scribo/sandbox/green/mln/math/floor.hh
@@ -0,0 +1,64 @@
+// Copyright (C) 2007, 2008, 2009, 2010
+// EPITA Research and Development Laboratory (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.
+
+#ifndef MLN_MATH_FLOOR_HH
+# define MLN_MATH_FLOOR_HH
+
+/*! \file
+ *
+ * \brief Define the floor (floor) routine.
+ */
+
+# include <cmath>
+
+
+namespace mln
+{
+
+ namespace math
+ {
+
+ template <typename T>
+ T floor(const T& v);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <typename T>
+ inline
+ T floor(const T& v)
+ {
+ return std::floor(v);
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::math
+
+} // end of namespace mln
+
+
+#endif // ! MLN_MATH_FLOOR_HH
diff --git a/scribo/sandbox/green/mln/value/hsv.hh b/scribo/sandbox/green/mln/value/hsv.hh
new file mode 100644
index 0000000..69948d9
--- /dev/null
+++ b/scribo/sandbox/green/mln/value/hsv.hh
@@ -0,0 +1,424 @@
+// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (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.
+
+#ifndef MLN_VALUE_HSV_HH
+# define MLN_VALUE_HSV_HH
+
+#include <mln/value/ops.hh>
+
+#include <mln/value/concept/vectorial.hh>
+#include <mln/value/int_u.hh>
+// #include <mln/algebra/vec.hh>
+
+// Used in from_to
+// #include <mln/fun/v2v/rgb_to_hsv.hh>
+
+
+namespace mln
+{
+
+ // Forward declarations.
+ namespace value
+ {
+
+ template <typename H, typename S, typename V>
+ class hsv_;
+
+ }
+
+
+/*
+ namespace convert
+ {
+
+ namespace over_load
+ {
+
+ // rgb to hsv_
+ void
+ from_to_(const value::rgb<16>& from, value::hsv_<float,float,float>& to);
+
+ // rgb to hsv_
+ void
+ from_to_(const value::rgb<8>& from, value::hsv_<float,float,float>& to);
+
+ } // end of namespace mln::convert::over_load
+
+ } // end of namespace mln::convert
+*/
+
+
+ namespace trait
+ {
+
+ template <typename H, typename S, typename V>
+ struct set_precise_binary_< op::plus, mln::value::hsv_<H,S,V>,
+ mln::value::hsv_<H,S,V> >
+ {
+ typedef mln::value::hsv_<H,S,V> ret;
+ };
+
+ template <typename H, typename S, typename V>
+ struct set_precise_binary_< op::minus, mln::value::hsv_<H,S,V>,
+ mln::value::hsv_<H,S,V> >
+ {
+ typedef mln::value::hsv_<H,S,V> ret;
+ };
+
+ template <typename H, typename S, typename V, typename S2>
+ struct set_precise_binary_< op::times, mln::value::hsv_<H,S,V>,
+ mln::value::scalar_<S2> >
+ {
+ typedef mln::value::hsv_<H,S,V> ret;
+ };
+
+ template <typename H, typename S, typename V, typename S2>
+ struct set_precise_binary_< op::div, mln::value::hsv_<H,S,V>,
+ mln::value::scalar_<S2> >
+ {
+ typedef mln::value::hsv_<H,S,V> ret;
+ };
+
+
+ // FIXME : Is there any way more generic? a way to factor
+ // set_precise_binary_< op::div, mln::value::hsv_<H,S,V>, mln::value::scalar_<S> >
+ // and
+ // set_precise_binary_< op::div, mln::value::hsv_<H,S,V>, mln::value::int_u<m> >
+ // as for op::times.
+
+ template <typename H, typename S, typename V, unsigned m>
+ struct set_precise_binary_< op::times, mln::value::hsv_<H,S,V>,
+ mln::value::int_u<m> >
+ {
+ typedef mln::value::hsv_<H,S,V> ret;
+ };
+
+ template <typename H, typename S, typename V, unsigned m>
+ struct set_precise_binary_< op::div, mln::value::hsv_<H,S,V>,
+ mln::value::int_u<m> >
+ {
+ typedef mln::value::hsv_<H,S,V> ret;
+ };
+
+ template <typename H, typename S, typename V>
+ struct value_< mln::value::hsv_<H,S,V> >
+ {
+ enum {
+ dim = 3,
+ nbits = (sizeof (H) + sizeof (S) + sizeof (V)) * 8,
+ card = mln_value_card_from_(nbits)
+ };
+
+ typedef trait::value::nature::vectorial nature;
+ typedef trait::value::kind::color kind;
+ typedef mln_value_quant_from_(card) quant;
+
+ typedef void comp;
+ typedef H comp_0;
+ typedef S comp_1;
+ typedef V comp_2;
+
+ template <typename VAL>
+ static comp_0 get_comp_0(const VAL& v) { return v.hue(); }
+
+ template <typename VAL>
+ static comp_1 get_comp_1(const VAL& v) { return v.sat(); }
+
+ template <typename VAL>
+ static comp_2 get_comp_2(const VAL& v) { return v.val(); }
+
+ typedef mln::value::hsv_<H,S,V> sum;
+ };
+
+ } // end of namespace trait
+
+
+ namespace value
+ {
+
+ template <typename E>
+ struct HSV : Object<E>
+ {
+ };
+
+ template <typename H, typename S, typename V>
+ class hsv_ : public HSV< hsv_<H,S,V> >
+ {
+ public:
+
+ typedef H h_type;
+ typedef S s_type;
+ typedef V v_type;
+
+ /// Constructor without argument.
+ hsv_()
+ {
+ }
+
+ hsv_(const literal::zero_t&)
+ : hue_(0),
+ sat_(0),
+ val_(0)
+ {
+ }
+
+ /// Constructor from component values.
+ hsv_(const H& hue, const S& sat, const V& val)
+ : hue_(hue),
+ sat_(sat),
+ val_(val)
+ {
+ }
+
+ /// Read-only access to the hue component.
+ const H& hue() const;
+ const S& sat() const;
+ const V& val() const;
+
+ /// Read-write access to the hue component.
+ H& hue();
+ S& sat();
+ V& val();
+
+ private:
+ //FIXME: Don't we want to store these values in a vector?
+ H hue_;
+ S sat_;
+ V val_;
+ };
+
+
+ typedef hsv_<float, float, float> hsv_f;
+ typedef hsv_<double, double, double> hsv_d;
+
+
+ /// Print an hsv \p c into the output stream \p ostr.
+ ///
+ /// \param[in,out] ostr An output stream.
+ /// \param[in] c An rgb.
+ ///
+ /// \return The modified output stream \p ostr.
+ template <typename H, typename S, typename V>
+ std::ostream& operator<<(std::ostream& ostr, const hsv_<H,S,V>& c);
+
+
+ /// Addition.
+ /// {
+ template <typename H, typename S, typename V>
+ hsv_<H,S,V>
+ operator+(const hsv_<H,S,V>& lhs, const hsv_<H,S,V>& rhs);
+ /// \}
+
+ /// Subtraction.
+ /// \{
+ template <typename H, typename S, typename V>
+ hsv_<H,S,V>
+ operator-(const hsv_<H,S,V>& lhs, const hsv_<H,S,V>& rhs);
+ /// \}
+
+ /// Product.
+ /// \{
+ template <typename H, typename S, typename V, typename S2>
+ hsv_<H,S,V>
+ operator*(const hsv_<H,S,V>& lhs, const mln::value::scalar_<S2>& s);
+ /// \}
+
+ /// Division.
+ /// \{
+ template <typename H, typename S, typename V, typename S2>
+ hsv_<H,S,V>
+ operator/(const hsv_<H,S,V>& lhs, const mln::value::scalar_<S2>& s);
+ /// \}
+
+ /// Comparison.
+ /// \{
+ template <typename H, typename S, typename V>
+ bool
+ operator==(const hsv_<H,S,V>& lhs, const hsv_<H,S,V>& rhs);
+ /// \}
+
+ } // end of namespace mln::value
+
+
+
+ // More forward declarations
+ namespace fun
+ {
+ namespace v2v
+ {
+
+ template <typename T_hsv>
+ struct f_rgb_to_hsv_;
+
+ typedef f_rgb_to_hsv_<value::hsv_f> f_rgb_to_hsv_f_t;
+
+ extern f_rgb_to_hsv_f_t f_rgb_to_hsv_f;
+
+ }
+
+ }
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ namespace value
+ {
+
+ template <typename H, typename S, typename V>
+ const H&
+ hsv_<H,S,V>::hue() const
+ {
+ return this->hue_;
+ }
+
+ template <typename H, typename S, typename V>
+ const S&
+ hsv_<H,S,V>::sat() const
+ {
+ return this->sat_;
+ }
+
+ template <typename H, typename S, typename V>
+ const V&
+ hsv_<H,S,V>::val() const
+ {
+ return this->val_;
+ }
+
+ template <typename H, typename S, typename V>
+ H&
+ hsv_<H,S,V>::hue()
+ {
+ return this->hue_;
+ }
+
+ template <typename H, typename S, typename V>
+ S&
+ hsv_<H,S,V>::sat()
+ {
+ return this->sat_;
+ }
+
+ template <typename H, typename S, typename V>
+ V&
+ hsv_<H,S,V>::val()
+ {
+ return this->val_;
+ }
+
+
+ template <typename H, typename S, typename V>
+ inline
+ std::ostream& operator<<(std::ostream& ostr, const hsv_<H,S,V>& v)
+ {
+ return ostr << '(' << debug::format(v.hue())
+ << ',' << debug::format(v.sat())
+ << ',' << debug::format(v.val())
+ << ')';
+ }
+
+
+ template <typename H, typename S, typename V>
+ hsv_<H,S,V>
+ operator+(const hsv_<H,S,V>& lhs, const hsv_<H,S,V>& rhs)
+ {
+ return hsv_<H,S,V>(lhs.hue() + rhs.hue(),
+ lhs.sat() + rhs.sat(),
+ lhs.val() + rhs.val());
+ }
+
+
+ template <typename H, typename S, typename V>
+ hsv_<H,S,V>
+ operator-(const hsv_<H,S,V>& lhs, const hsv_<H,S,V>& rhs)
+ {
+ return hsv_<H,S,V>(lhs.hue() - rhs.hue(),
+ lhs.sat() - rhs.sat(),
+ lhs.val() - rhs.val());
+ }
+
+
+ template <typename H, typename S, typename V, typename S2>
+ hsv_<H,S,V>
+ operator*(const hsv_<H,S,V>& lhs, const mln::value::scalar_<S2>& s)
+ {
+ return hsv_<H,S,V>(lhs.hue() * s,
+ lhs.sat() * s,
+ lhs.val() * s);
+ }
+
+
+ template <typename H, typename S, typename V, typename S2>
+ hsv_<H,S,V>
+ operator/(const hsv_<H,S,V>& lhs, const mln::value::scalar_<S2>& s)
+ {
+ return hsv_<H,S,V>(lhs.hue() / s,
+ lhs.sat() / s,
+ lhs.val() / s);
+ }
+
+ template <typename H, typename S, typename V>
+ bool
+ operator==(const hsv_<H,S,V>& lhs, const hsv_<H,S,V>& rhs)
+ {
+ return lhs.hue() == rhs.hue()
+ && lhs.sat() == rhs.sat()
+ && lhs.val() == rhs.val();
+ }
+
+ } // end of namespace mln::value
+
+/*
+ namespace convert
+ {
+
+ namespace over_load
+ {
+
+ inline
+ void
+ from_to_(const value::rgb<16>& from, value::hsv_<float,float,float>& to)
+ {
+ to = fun::v2v::f_rgb_to_hsv_f(from);
+ }
+
+ inline
+ void
+ from_to_(const value::rgb<8>& from, value::hsv_<float,float,float>& to)
+ {
+ to = fun::v2v::f_rgb_to_hsv_f(from);
+ }
+
+ } // end of namespace mln::convert::over_load
+
+ } // end of namespace mln::convert
+*/
+
+# endif // ! MLN_INCLUDE_ONLY
+
+
+} // end of namespace mln
+
+#endif // ! MLN_VALUE_HSV_HH
diff --git a/scribo/sandbox/green/mln/value/rg.hh b/scribo/sandbox/green/mln/value/rg.hh
new file mode 100644
index 0000000..d083ffd
--- /dev/null
+++ b/scribo/sandbox/green/mln/value/rg.hh
@@ -0,0 +1,175 @@
+// 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.
+
+#ifndef MLN_VALUE_RG_HH
+# define MLN_VALUE_RG_HH
+
+/// \file
+///
+/// \brief Define the red/green vectorial image type.
+///
+/// This source implements the red/green (RG) vectorial image type. It
+/// is a partial copy of the rgb type. This type doesn't manage
+/// anykind of interaction. Its purpose is limited to store a couple
+/// of values. Do not use it outside this purpose, i can't garantie
+/// the behaviour.
+///
+/// The following sample is a typical use of the rg type.
+///
+/// #include <mln/accu/stat/histo2d.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.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()
+/// {
+/// 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;
+/// }
+
+
+# include <mln/algebra/vec.hh>
+# include <mln/value/concept/vectorial.hh>
+# include <mln/value/int_u.hh>
+# include <mln/value/rgb8.hh>
+# include <mln/trait/value_.hh>
+
+
+namespace mln
+{
+
+ namespace value
+ {
+
+ // Forward declaration.
+ template <unsigned n> struct rg;
+
+ } // end of namespace mln::value
+
+ namespace trait
+ {
+
+ template <unsigned n>
+ struct value_< mln::value::rg<n> >
+ {
+ enum {
+ dim = 2,
+ nbits = dim * n,
+ card = mln_value_card_from_(nbits)
+ };
+
+ typedef trait::value::nature::vectorial nature;
+ typedef trait::value::kind::color kind;
+ typedef trait::value::quant::high quant;
+
+ typedef void comp;
+ typedef mln::value::int_u<n> comp_0;
+ typedef mln::value::int_u<n> comp_1;
+
+ static comp_0 get_comp_0(const mln::value::rg<n>& v){return v.red(); }
+ static comp_1 get_comp_1(const mln::value::rg<n>& v){return v.green();}
+
+ typedef algebra::vec<dim, float> sum;
+
+ static const char* name()
+ {
+ static std::string s = std::string("rg").append(1, 8 + '0');
+ return s.c_str();
+ }
+ };
+
+ } // end of namespace mln::trait
+
+ namespace value
+ {
+
+ /// \brief Define the red/green vectorial image type.
+ ///
+ /// Param n defines the quantification used for red/green space.
+
+ template <unsigned n>
+ struct rg :public mln::value::Vectorial< rg<n> >,
+ public internal::value_like_<
+ algebra::vec< 2, int_u<n> >, // Equivalent.
+ algebra::vec< 2, int_u<n> >, // Encoding.
+ algebra::vec< 2, int >, // Interoperation.
+ rg<n> > // Exact.
+ {
+ typedef int_u<n> t_red;
+ typedef int_u<n> t_green;
+
+ int_u<n> red() const {return this->v_[0];}
+ int_u<n>& red() {return this->v_[0];}
+ int_u<n> green() const {return this->v_[1];}
+ int_u<n>& green() {return this->v_[1];}
+
+ /// Constructors
+ /// \{
+ /// \brief Create a rg value.
+ ///
+ /// Two constructors exist, the first one do nothing and the second one
+ /// initializes the red/green components from a rgb value.
+ rg(){}
+ rg(const rgb8& val){this->v_[0] = val.red(); this->v_[1] = val.green();}
+ /// \}
+
+ /// \brief Affect a rg value to this object.
+ /// \param[in] rhs the value to affect to this object.
+ ///
+ /// If the two objects are different, then then copy the
+ /// underline array of values.
+
+ rg operator=(const rg& rhs)
+ {
+ if (&rhs != this)
+ this->v_ = rhs.v_;
+
+ return *this;
+ }
+ };
+
+ } // end of namespace mln::value
+
+} // end of namespace mln
+
+#endif // ! MLN_VALUE_RG_HH
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
new file mode 100644
index 0000000..77f9015
--- /dev/null
+++ b/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
@@ -0,0 +1,153 @@
+#
+# Generic Makefile
+#
+
+#########
+# TOOLS #
+#########
+
+#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
+CP= cp
+
+SOURCE_PATTERN= green/tests
+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)/
+else
+# Case where make is done from source directory.
+SOURCE_DIR= $(PWD)/
+BUILD__DIR= $(subst $(SOURCE_PATTERN),$(BUILD__PATTERN),$(PWD))
+endif
+
+SRC= $(notdir $(wildcard $(SOURCE_DIR)/*.cc))
+OLD= $(notdir $(wildcard $(SOURCE_DIR)/*~))
+OBJ= $(patsubst %.cc,%.o,$(SRC))
+SOURCE_MAKEFILE=Makefile.am
+BUILD__MAKEFILE=Makefile
+TARGET_FILE= $(notdir $(PWD))
+SOURCE_FILES= $(notdir $(wildcard $(SOURCE_DIR)/*.*))
+BUILD__FILES= $(filter-out $(SRC) $(SOURCE_MAKEFILE), $(SOURCE_FILES))
+
+BUILD__F_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__FILES))
+SOURCE_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_FILES))
+
+BUILD__M_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__MAKEFILE))
+SOURCE_M_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_MAKEFILE))
+
+TARGET_F_PATH= $(addprefix $(BUILD__DIR)/,$(TARGET_FILE))
+OBJ_F_PATH= $(addprefix $(BUILD__DIR)/,$(OBJ))
+SRC_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SRC))
+OLD_F_PATH= $(addprefix $(SOURCE_DIR)/,$(OLD))
+
+#############
+# BOOTSTRAP #
+#############
+
+
+bootstrap: $(BUILD__DIR) $(BUILD__F_PATH) $(BUILD__M_PATH)
+
+# Create, if nessary, the destination directory
+$(BUILD__DIR):
+ $(MKDIR) $(BUILD__DIR)
+
+# Copy, if nessary, all the files, except the Makefile.am
+$(BUILD__F_PATH): $(SOURCE_F_PATH)
+ $(CP) $(addprefix $(SOURCE_DIR),$(@F)) $@
+
+# Copy if nessary, the Makefile.am into Makefile
+$(BUILD__M_PATH): $(SOURCE_M_PATH)
+ $(CP) $(SOURCE_M_PATH) $(BUILD__M_PATH)
+
+
+#######
+# ALL #
+#######
+
+# We assume that the call is done from the build directory.
+# With the directive vpath, hidden files are found in the source directory.
+
+all: $(TARGET_F_PATH)
+
+
+$(TARGET_F_PATH): $(OBJ_F_PATH)
+ $(LINK.cc) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+$(OBJ_F_PATH):$(SRC_F_PATH)
+ $(COMPILE.cc) $(OUTPUT_OPTION) $<
+
+
+#########
+# CLEAN #
+#########
+
+# Force every time the deletion
+clean: clean_target clean_obj clean_dst clean_old #clean_make
+
+
+clean_target:
+ -@$(RM) $(TARGET_F_PATH) &> /dev/null
+
+clean_obj:
+ -@$(RM) $(OBJ_F_PATH) &> /dev/null
+
+clean_dst:
+ -@$(RM) $(BUILD_F_PATH) &> /dev/null
+
+clean_make:
+ -@$(RM) $(BUILD_M_PATH) &> /dev/null
+
+clean_old:
+ -@$(RM) $(OLD_F_PATH) &> /dev/null
+
+
+#########
+# PRINT #
+#########
+
+print: print_tools print_bootstrap
+
+print_tools:
+ @$(ECHO) "HOME = $(HOME)"
+ @$(ECHO) "INCLUDES = $(INCLUDES)"
+ @$(ECHO) "CXXFLAGS = $(CXXFLAGS)"
+ @$(ECHO) "ECHO = $(ECHO)"
+ @$(ECHO) "RM = $(RM)"
+ @$(ECHO) "MKDIR = $(MKDIR)"
+ @$(ECHO) "CP = $(CP)"
+ @$(ECHO)
+
+print_bootstrap:
+ @$(ECHO) "PWD = $(PWD)"
+ @$(ECHO) "SOURCE_PATTERN = $(SOURCE_PATTERN)"
+ @$(ECHO) "BUILD__PATTERN = $(BUILD__PATTERN)"
+ @$(ECHO) "SOURCE_DIR = $(SOURCE_DIR)"
+ @$(ECHO) "BUILD__DIR = $(BUILD__DIR)"
+ @$(ECHO) "SOURCE_MAKEFILE = $(SOURCE_MAKEFILE)"
+ @$(ECHO) "BUILD__MAKEFILE = $(BUILD__MAKEFILE)"
+ @$(ECHO) "TARGET_FILE = $(TARGET_FILE)"
+ @$(ECHO) "SOURCE_FILES = $(SOURCE_FILES)"
+ @$(ECHO) "SOURCE_F_PATH = $(SOURCE_F_PATH)"
+ @$(ECHO) "BUILD__FILES = $(BUILD__FILES)"
+ @$(ECHO) "BUILD__F_PATH = $(BUILD__F_PATH)"
+ @$(ECHO) "BUILD__M_PATH = $(BUILD__M_PATH)"
+ @$(ECHO) "SOURCE_M_PATH = $(SOURCE_M_PATH)"
+ @$(ECHO) "SRC = $(SRC)"
+ @$(ECHO) "OBJ = $(OBJ)"
+ @$(ECHO) "OLD = $(OLD)"
+ @$(ECHO) "SRC_F_PATH = $(SRC_F_PATH)"
+ @$(ECHO) "OBJ_F_PATH = $(OBJ_F_PATH)"
+ @$(ECHO) "OLD_F_PATH = $(OLD_F_PATH)"
+ @$(ECHO)
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
new file mode 100644
index 0000000..5a5c4c4
--- /dev/null
+++ b/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
@@ -0,0 +1,21 @@
+/// TEST HISTO1D
+
+#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/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::stat::histo1d(), img);
+
+ return 0;
+}
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
new file mode 100644
index 0000000..a96b2e9
--- /dev/null
+++ b/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
@@ -0,0 +1,153 @@
+#
+# Generic Makefile
+#
+
+#########
+# TOOLS #
+#########
+
+#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
+CP= cp
+
+SOURCE_PATTERN= green/use
+BUILD__PATTERN= green/build/use
+
+
+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)/
+else
+# Case where make is done from source directory.
+SOURCE_DIR= $(PWD)/
+BUILD__DIR= $(subst $(SOURCE_PATTERN),$(BUILD__PATTERN),$(PWD))
+endif
+
+SRC= $(notdir $(wildcard $(SOURCE_DIR)/*.cc))
+OLD= $(notdir $(wildcard $(SOURCE_DIR)/*~))
+OBJ= $(patsubst %.cc,%.o,$(SRC))
+SOURCE_MAKEFILE=Makefile.am
+BUILD__MAKEFILE=Makefile
+TARGET_FILE= $(notdir $(PWD))
+SOURCE_FILES= $(notdir $(wildcard $(SOURCE_DIR)/*.*))
+BUILD__FILES= $(filter-out $(SRC) $(SOURCE_MAKEFILE), $(SOURCE_FILES))
+
+BUILD__F_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__FILES))
+SOURCE_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_FILES))
+
+BUILD__M_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__MAKEFILE))
+SOURCE_M_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_MAKEFILE))
+
+TARGET_F_PATH= $(addprefix $(BUILD__DIR)/,$(TARGET_FILE))
+OBJ_F_PATH= $(addprefix $(BUILD__DIR)/,$(OBJ))
+SRC_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SRC))
+OLD_F_PATH= $(addprefix $(SOURCE_DIR)/,$(OLD))
+
+#############
+# BOOTSTRAP #
+#############
+
+
+bootstrap: $(BUILD__DIR) $(BUILD__F_PATH) $(BUILD__M_PATH)
+
+# Create, if nessary, the destination directory
+$(BUILD__DIR):
+ $(MKDIR) $(BUILD__DIR)
+
+# Copy, if nessary, all the files, except the Makefile.am
+$(BUILD__F_PATH): $(SOURCE_F_PATH)
+ $(CP) $(addprefix $(SOURCE_DIR),$(@F)) $@
+
+# Copy if nessary, the Makefile.am into Makefile
+$(BUILD__M_PATH): $(SOURCE_M_PATH)
+ $(CP) $(SOURCE_M_PATH) $(BUILD__M_PATH)
+
+
+#######
+# ALL #
+#######
+
+# We assume that the call is done from the build directory.
+# With the directive vpath, hidden files are found in the source directory.
+
+all: $(TARGET_F_PATH)
+
+
+$(TARGET_F_PATH): $(OBJ_F_PATH)
+ $(LINK.cc) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+$(OBJ_F_PATH):$(SRC_F_PATH)
+ $(COMPILE.cc) $(OUTPUT_OPTION) $<
+
+
+#########
+# CLEAN #
+#########
+
+# Force every time the deletion
+clean: clean_target clean_obj clean_dst clean_old #clean_make
+
+
+clean_target:
+ -@$(RM) $(TARGET_F_PATH) &> /dev/null
+
+clean_obj:
+ -@$(RM) $(OBJ_F_PATH) &> /dev/null
+
+clean_dst:
+ -@$(RM) $(BUILD_F_PATH) &> /dev/null
+
+clean_make:
+ -@$(RM) $(BUILD_M_PATH) &> /dev/null
+
+clean_old:
+ -@$(RM) $(OLD_F_PATH) &> /dev/null
+
+
+#########
+# PRINT #
+#########
+
+print: print_tools print_bootstrap
+
+print_tools:
+ @$(ECHO) "HOME = $(HOME)"
+ @$(ECHO) "INCLUDES = $(INCLUDES)"
+ @$(ECHO) "CXXFLAGS = $(CXXFLAGS)"
+ @$(ECHO) "ECHO = $(ECHO)"
+ @$(ECHO) "RM = $(RM)"
+ @$(ECHO) "MKDIR = $(MKDIR)"
+ @$(ECHO) "CP = $(CP)"
+ @$(ECHO)
+
+print_bootstrap:
+ @$(ECHO) "PWD = $(PWD)"
+ @$(ECHO) "SOURCE_PATTERN = $(SOURCE_PATTERN)"
+ @$(ECHO) "BUILD__PATTERN = $(BUILD__PATTERN)"
+ @$(ECHO) "SOURCE_DIR = $(SOURCE_DIR)"
+ @$(ECHO) "BUILD__DIR = $(BUILD__DIR)"
+ @$(ECHO) "SOURCE_MAKEFILE = $(SOURCE_MAKEFILE)"
+ @$(ECHO) "BUILD__MAKEFILE = $(BUILD__MAKEFILE)"
+ @$(ECHO) "TARGET_FILE = $(TARGET_FILE)"
+ @$(ECHO) "SOURCE_FILES = $(SOURCE_FILES)"
+ @$(ECHO) "SOURCE_F_PATH = $(SOURCE_F_PATH)"
+ @$(ECHO) "BUILD__FILES = $(BUILD__FILES)"
+ @$(ECHO) "BUILD__F_PATH = $(BUILD__F_PATH)"
+ @$(ECHO) "BUILD__M_PATH = $(BUILD__M_PATH)"
+ @$(ECHO) "SOURCE_M_PATH = $(SOURCE_M_PATH)"
+ @$(ECHO) "SRC = $(SRC)"
+ @$(ECHO) "OBJ = $(OBJ)"
+ @$(ECHO) "OLD = $(OLD)"
+ @$(ECHO) "SRC_F_PATH = $(SRC_F_PATH)"
+ @$(ECHO) "OBJ_F_PATH = $(OBJ_F_PATH)"
+ @$(ECHO) "OLD_F_PATH = $(OLD_F_PATH)"
+ @$(ECHO)
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
new file mode 100644
index 0000000..1c6176b
--- /dev/null
+++ b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
@@ -0,0 +1,24 @@
+/// \file
+///
+/// \brief Minimal code for building 1d image histogram version.
+///
+
+#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/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::stat::histo1d(), img);
+
+ return 0;
+}
diff --git a/scribo/sandbox/green/use/accu/stat/histo2d/Makefile.am b/scribo/sandbox/green/use/accu/stat/histo2d/Makefile.am
new file mode 100644
index 0000000..a96b2e9
--- /dev/null
+++ b/scribo/sandbox/green/use/accu/stat/histo2d/Makefile.am
@@ -0,0 +1,153 @@
+#
+# Generic Makefile
+#
+
+#########
+# TOOLS #
+#########
+
+#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
+CP= cp
+
+SOURCE_PATTERN= green/use
+BUILD__PATTERN= green/build/use
+
+
+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)/
+else
+# Case where make is done from source directory.
+SOURCE_DIR= $(PWD)/
+BUILD__DIR= $(subst $(SOURCE_PATTERN),$(BUILD__PATTERN),$(PWD))
+endif
+
+SRC= $(notdir $(wildcard $(SOURCE_DIR)/*.cc))
+OLD= $(notdir $(wildcard $(SOURCE_DIR)/*~))
+OBJ= $(patsubst %.cc,%.o,$(SRC))
+SOURCE_MAKEFILE=Makefile.am
+BUILD__MAKEFILE=Makefile
+TARGET_FILE= $(notdir $(PWD))
+SOURCE_FILES= $(notdir $(wildcard $(SOURCE_DIR)/*.*))
+BUILD__FILES= $(filter-out $(SRC) $(SOURCE_MAKEFILE), $(SOURCE_FILES))
+
+BUILD__F_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__FILES))
+SOURCE_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_FILES))
+
+BUILD__M_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__MAKEFILE))
+SOURCE_M_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_MAKEFILE))
+
+TARGET_F_PATH= $(addprefix $(BUILD__DIR)/,$(TARGET_FILE))
+OBJ_F_PATH= $(addprefix $(BUILD__DIR)/,$(OBJ))
+SRC_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SRC))
+OLD_F_PATH= $(addprefix $(SOURCE_DIR)/,$(OLD))
+
+#############
+# BOOTSTRAP #
+#############
+
+
+bootstrap: $(BUILD__DIR) $(BUILD__F_PATH) $(BUILD__M_PATH)
+
+# Create, if nessary, the destination directory
+$(BUILD__DIR):
+ $(MKDIR) $(BUILD__DIR)
+
+# Copy, if nessary, all the files, except the Makefile.am
+$(BUILD__F_PATH): $(SOURCE_F_PATH)
+ $(CP) $(addprefix $(SOURCE_DIR),$(@F)) $@
+
+# Copy if nessary, the Makefile.am into Makefile
+$(BUILD__M_PATH): $(SOURCE_M_PATH)
+ $(CP) $(SOURCE_M_PATH) $(BUILD__M_PATH)
+
+
+#######
+# ALL #
+#######
+
+# We assume that the call is done from the build directory.
+# With the directive vpath, hidden files are found in the source directory.
+
+all: $(TARGET_F_PATH)
+
+
+$(TARGET_F_PATH): $(OBJ_F_PATH)
+ $(LINK.cc) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+$(OBJ_F_PATH):$(SRC_F_PATH)
+ $(COMPILE.cc) $(OUTPUT_OPTION) $<
+
+
+#########
+# CLEAN #
+#########
+
+# Force every time the deletion
+clean: clean_target clean_obj clean_dst clean_old #clean_make
+
+
+clean_target:
+ -@$(RM) $(TARGET_F_PATH) &> /dev/null
+
+clean_obj:
+ -@$(RM) $(OBJ_F_PATH) &> /dev/null
+
+clean_dst:
+ -@$(RM) $(BUILD_F_PATH) &> /dev/null
+
+clean_make:
+ -@$(RM) $(BUILD_M_PATH) &> /dev/null
+
+clean_old:
+ -@$(RM) $(OLD_F_PATH) &> /dev/null
+
+
+#########
+# PRINT #
+#########
+
+print: print_tools print_bootstrap
+
+print_tools:
+ @$(ECHO) "HOME = $(HOME)"
+ @$(ECHO) "INCLUDES = $(INCLUDES)"
+ @$(ECHO) "CXXFLAGS = $(CXXFLAGS)"
+ @$(ECHO) "ECHO = $(ECHO)"
+ @$(ECHO) "RM = $(RM)"
+ @$(ECHO) "MKDIR = $(MKDIR)"
+ @$(ECHO) "CP = $(CP)"
+ @$(ECHO)
+
+print_bootstrap:
+ @$(ECHO) "PWD = $(PWD)"
+ @$(ECHO) "SOURCE_PATTERN = $(SOURCE_PATTERN)"
+ @$(ECHO) "BUILD__PATTERN = $(BUILD__PATTERN)"
+ @$(ECHO) "SOURCE_DIR = $(SOURCE_DIR)"
+ @$(ECHO) "BUILD__DIR = $(BUILD__DIR)"
+ @$(ECHO) "SOURCE_MAKEFILE = $(SOURCE_MAKEFILE)"
+ @$(ECHO) "BUILD__MAKEFILE = $(BUILD__MAKEFILE)"
+ @$(ECHO) "TARGET_FILE = $(TARGET_FILE)"
+ @$(ECHO) "SOURCE_FILES = $(SOURCE_FILES)"
+ @$(ECHO) "SOURCE_F_PATH = $(SOURCE_F_PATH)"
+ @$(ECHO) "BUILD__FILES = $(BUILD__FILES)"
+ @$(ECHO) "BUILD__F_PATH = $(BUILD__F_PATH)"
+ @$(ECHO) "BUILD__M_PATH = $(BUILD__M_PATH)"
+ @$(ECHO) "SOURCE_M_PATH = $(SOURCE_M_PATH)"
+ @$(ECHO) "SRC = $(SRC)"
+ @$(ECHO) "OBJ = $(OBJ)"
+ @$(ECHO) "OLD = $(OLD)"
+ @$(ECHO) "SRC_F_PATH = $(SRC_F_PATH)"
+ @$(ECHO) "OBJ_F_PATH = $(OBJ_F_PATH)"
+ @$(ECHO) "OLD_F_PATH = $(OLD_F_PATH)"
+ @$(ECHO)
diff --git a/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc b/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
new file mode 100644
index 0000000..6369b5a
--- /dev/null
+++ b/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
@@ -0,0 +1,33 @@
+/// \file
+///
+/// \brief Minimal code for building 2d image histogram version.
+///
+
+#include <mln/accu/stat/histo2d.hh>
+#include <mln/core/image/image2d.hh>
+#include <mln/data/compute.hh>
+#include <mln/data/transform.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()
+{
+ 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
24 Jun '10
* mln/accu/stat/histo1d.hh: New header file.
* mln/accu/stat/histo2d.hh: New header file.
* mln/accu/stat/histo3d_hsl.hh: New header file.
* mln/accu/stat/histo3d_rgb.hh: New header file.
* mln/clustering/k_mean.hh: New header file.
* mln/clustering/kmean1d.hh: New header file.
* mln/clustering/kmean2d.hh: New header file.
* mln/clustering/kmean3d.hh: New header file.
* mln/clustering/kmean_rgb.hh: New header file.
* mln/display/display_histo.hh: New header file.
* mln/display/project_histo.hh: New header file.
* mln/fun/p2b/achromatic.hh: New header file.
* mln/fun/p2b/component_equals.hh: New header file.
* mln/fun/v2v/achromatism.hh: New header file.
* mln/fun/v2v/hue_concentration.hh: New header file.
* mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
* mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
* mln/fun/v2v/log.hh: New header file.
* mln/fun/v2v/rg_to_rgb.hh: New header file.
* mln/fun/v2v/rgb8_to_int_u8: New header file.
* mln/fun/v2v/rgb_to_achromastism_map.hh: New header file.
* mln/fun/v2v/rgb_to_hsv.hh: New header file.
* mln/fun/v2v/rgb_to_hue_map.hh: New header file.
* mln/fun/v2v/rgb_to_saturation_map.hh: New header file.
* mln/fun/v2v/rgb_to_value_map.hh: New header file.
* mln/img_path.hh: New header file.
* mln/io/plot/save_image_sh.hh: New header file.
* mln/math/cell.hh: New header file.
* mln/math/floor.hh: New header file.
* tests/accu/stat/histo1d/Makefile.am: New makefile.
* tests/accu/stat/histo1d/histo1d.cc: New source.
* tests/accu/stat/histo2d/Makefile.am: New makefile.
* tests/accu/stat/histo2d/histo2d.cc: New source.
---
scribo/sandbox/green/ChangeLog | 9 +
scribo/sandbox/green/README | 223 ++++++++++++++++++--
scribo/sandbox/green/mln/accu/stat/histo1d.hh | 1 -
scribo/sandbox/green/mln/accu/stat/histo2d.hh | 9 +-
scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh | 1 +
scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh | 2 +
.../sandbox/green/use/accu/stat/histo1d/histo1d.cc | 2 -
7 files changed, 224 insertions(+), 23 deletions(-)
diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog
index 7bb6646..b557ccf 100644
--- a/scribo/sandbox/green/ChangeLog
+++ b/scribo/sandbox/green/ChangeLog
@@ -159,6 +159,15 @@
2010-06-21 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+ Save histogram library.
+
+ * 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>
+
Simple integration test.
* README: New text file.
diff --git a/scribo/sandbox/green/README b/scribo/sandbox/green/README
index 4eb71b7..3efe50d 100644
--- a/scribo/sandbox/green/README
+++ b/scribo/sandbox/green/README
@@ -1,32 +1,219 @@
-Le travail est classé dans deux répertoires ok et ko.
-Le répertoire ok correspond aux sources qui ont été reprises et retestées.
-Le répertoire ko correspond aux sources qui ont été juste transférées.
+I ARBORESCENCE
+--------------
-La première brique logicielle importante sur laquelle s'appuie mes travaux est
-la création d'histogrammes sous forme d'image.
+bench ==> Comparaison d'algorithmes d'un point de vue temps d'exécution.
+bug ==> Bug rencontrés dans milena et archivés sous forme de programme.
+build ==> Répertoire d'exécution, non sauvé dans git.
+demo ==> Première version d'un algorithme pour voir son comportement.
+doc ==> Documentation tex ou code minimal pour de petits exemples.
+exp ==> Version avancée des algorithmes pour traitées les bases de données.
+mln ==> Partie mise en librairie milena des différents travaux.
+tests ==> Tests unitaires sur certains algorithmes.
+tools ==> Découpage de certains algorithmes pour mieux les tester séparément.
+use ==> Test de compilation, code minimal pour compiler un élément.
+II COMPILATION
+--------------
-CREATION DES HISTOGRAMMES
--------------------------
+L'unité minimale de code choisie est le répertoire.
+Donc aller dans le répertoire qui nous interesse,
+par exemple, green/demo/annotating/hsv et lancé le make
-ko/mln/accu/stat/histo1d.hh: histogramme image valeur scalaire.
-ko/mln/accu/stat/histo2d.hh: histogramme image valeur vectorielle 2d.
-ko/mln/accu/stat/histo3d_hsl.hh: histogramme image valeur vectorielle 3d (HSL).
-ko/mln/accu/stat/histo3d_rgb.hh: histogramme image valeur vectorielle 3d (RGB).
+#:~/git/olena/scribo/sandbox/green$cd demo/annotating/hsv
+#:~/git/olena/scribo/sandbox/green/demo/annotating/hsv$ make -f Makefile.am
+Cette opération créé dans build le répertoire de compilation
+green/build/demo/annotating/hsv. Dans ce répertoire aura été copié un
+Makefile et tous les fichiers qui ne sont pas des sources. Par
+exemple, des fichiers de calibration comme gaussian.sh (pour vérifier
+la mire du filtre de gaussienne) ou de la documentation à la sauvette
+sous forme de fichiers textes jetés à la va vite dans le répertoire
+pour ne pas perdre l'information recherchée. En l'occurence, ici, il
+n'y a rien à copier. Rendons-nous dans le répertoire de compilation et lançons
+le makefile.
+#:~/git/olena/scribo/sandbox/green/demo/annotating/hsv$
+cd ../../../build/demo/annotating/hsv
+#:~/git/olena/scribo/sandbox/green/build/demo/annotating/hsv$ make clean all
-ok/mln/accu/histo/histo1d.hh: histogramme image valeur scalaire entière.
-ok/mln/accu/histo/histo2d.hh: histogramme image valeur vectorielle 2d entière.
-ok/mln/accu/histo/histo3d.hh: histogramme image valeur vectorielle 3d entière.
+L'exécutable est généré par le makefile, il porte le nom du
+répertoire. Si il y a besoin de mettre à jour le makefile, le faire
+dans le répertoire des sources en éditant Makefile.am, puis en
+régénérant le Makefile dans le répertoire d'exécution par la commande
+make -f Makefile.am depuis le répertoire source.
-SAUVEGARDE DES HISTOGRAMMES
----------------------------
+III MAKEFILE
+------------
+Les makefiles utilisés sont tous les mêmes avec quelques variables
+dont le contenu change dans leur partie en-tête.
+Pour chaque répertoire, le makefile doit savoir si le chemin courant
+est un répertoire de compilation ou un répertoire de source. Pour les
+identifier, il a recours à un pattern qui malheureusemnt fait
+intervenir le nom de la branche de développement (bench,demo,bug,exp ...).
+SOURCE_PATTERN= green/demo
+BUILD__PATTERN= green/build/demo
-VISUALISATION DES HISTOGRAMMES
-------------------------------
\ No newline at end of file
+Si un makefile ne fonctionne pas, il faut vérifier ceci en premier
+lieu. Ici, le makefile doit être situé dans la branche démo.
+
+Autre élément à savoir, la compilation nécessite d'inclure la
+librairie milena, ainsi que les développements propres en vu de leur
+intégration futur dans milena, ceci est fait par un jeu d'INCLUDES1
+et INCLUDES2.
+
+INCLUDES1= -I$(HOME)/git/olena/scribo/sandbox/green
+INCLUDES2= -I$(HOME)/git/olena/milena
+INCLUDES= $(INCLUDES1) $(INCLUDES2)
+
+Suivant l'allure du compte où l'on exécute les makefiles, il faut
+revoir le chemin pour trouver des deux répertoires.
+
+Enfin, les options de compilations ne sont pas toujours les mêmes. Les
+trois lignes possibles sont toutes présentes et seule celle qui est
+utilisée n'est pas commentée. Typiquement, dans la branche de
+développement démo où les perfomances ne sont pas le problème, on
+compilera avec tout le matériel pour utiliser gdb et sans
+optimisation. A l'inverse, dans la branche d'expérimentation, où le
+code a déjà été testé, on cherche à aller vite car on exécute ce code
+sur de nombreuses images. Dans cette optique, pas de débugage, pas de
+traçage, optimisation conséquente.
+
+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)
+
+Une dernière dernière information, dans le cadre des développements
+exp, et tools, on utilise la librairie boost soit pour la
+virtualisation du filesystem, soit pour le formatage des fichiers text
+(réalisation de colonnes, mettre des entiers sur un certain nombre de
+caractères). Une ligne de chargement des librairies peut apparaitre donc.
+
+LOADLIBES= -lboost_filesystem
+
+On retrouvera les includes suivantes dans les sources:
+
+#include <boost/format.hpp>
+#include <boost/filesystem.hpp>
+
+
+IV CHEMINS DES IMAGES
+---------------------
+
+Toutes les images ont toujours été locales sur mon ordinateur. La
+politique a toujours été d'utiliser un fichier img_path pour coder les
+chemins des images. Les chemins étant plutôt long, j'ai toujours eu
+tendance à faire en sorte qu'ils soient compilés en dur (sauf pour la
+partie développement tools qui est vraiment voué à donner des
+exécutables indépendants et génériques). Le fichier mln/img_path.hh
+code la position de toutes les images dans mon arborescence. Il faudra
+donc veiller à changer tous les chemins pour les adapter au compte
+dans lequel on voudra reprendre le code. Dans le code, les références
+aux positions des images sont faites via des macros.
+
+Toutes les images sont située dans git/img. En règle générale, je ne
+traite que des images au format .pgm, .pbm et .ppm. Il m'arrive
+fréquemment de dumper des images au format .sh (gnuplot shell
+image). Pour la branche tools, nous avons utilisé les dumps de milena
+comme format de transfert d'un utilitaire à un autre. Les images sont
+classées suivant leur provenance. Nous avons tout d'abord la base
+OLENA (copie des images de tests milena), la base INIM (très peu
+utilisée voire jamais), la base ICDAR (très utilisée, surtout dans
+exp), la base AFP (très utilisée dans exp) et les bases ANNOTATING1 et
+ANNOTATING2 (pas très utilisées ni l'une, ni l'autre).
+
+La plus part du temps, sauver les résultats dans le répertoire
+d'exécution courant est largement suffisant. Parfois, il est
+nécessaire de sauvegarder de grosses quantités d'informations et de
+les classer comme dans la branche de développement exp. C'est pour
+cela, qu'un certain nombre de macros définissent des endroits pour
+sauvegarder les résultats lors d'expérimentation de grande ampleur sur
+toute la base ICDAR ou AFP.
+
+
+V GNUPLOT SCRIPT SHELL IMAGE FORMAT
+-----------------------------------
+
+J'abrège le nom du format par gnuplot shell format. En fait, c'est un
+format d'image particulier qui a besoin de gnuplot pour être lu. Il
+est donc compatible avec aucun viewer si ce n'est gnuplot, mais a la
+caractéristique d'afficher tous les points de manière visible. Par
+ailleurs, comme il s'agit d'un script gnuplot il permet d'insérer très
+facilement une fonction pour visualiser les données autrement (par
+exemple, changer d'espace: HSL, HSV). Le fichier tire son nom de la
+façon dont il fonctionne. C'est un script shell qui fait un appel à
+gnuplot et lui passe le jeu de données directement à partir de ce même
+fichier, pas besoin de faire appel à un autre fichier. Une fois
+généré, le fichier doit être modifié pour avoir les permissions
+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
+
+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.
+L'intérêt est ensuite de pouvoir filtrer directement ces histogrammes
+par les algorithmes de milena, ou encore d'étudier les valeurs
+caractéristiques par d'autres accumulateurs. Les codes réellement
+utilisés sont histo1d et histo3d RGB. Tous les autres codes sont très
+expérimentaux. Notemment, le code HSL demande de quantifier l'espace
+de comptage puisqu'il est décrit sous la forme de triplets de float
+(les autres sont inférés). Néanmoins, le code est à conserver car il
+contient une séquence d'appels pour les routines permettant de
+considérer la dimension de la teinte comme circulaire.
+
+* mln/accu/stat/histo1d.hh: Accumulateur histogramme image1d.
+* use/accu/stat/histo1d: Code minimal utilisant un histogramme 1d.
+
+* mln/accu/stat/histo2d.hh: Accumulateur histogramme image2d.
+* mln/value/rg.hh: Définition du type vectoriel 2d rouge/vert (RG).
+* mln/fun/v2v/rgb_to_rg.hh: Transformation de l'espace RGB vers l'espace RG.
+* 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.
+
+* use/accu/stat/histo3_rgb: Code minimal utilisant un histogramme 3d RGB.
+* use/accu/stat/histo3_hsl: Code minimal utilisant un histogramme 3d HSL.
+
+
+
+* tests/accu/stat/histo1d
+
+
+
+
+* tests/accu/stat/histo2d
+
+
+
+* use/accu/stat/histo3d_rgb
+* tests/accu/stat/histo3d_rgb
+
+* use/accu/stat/histo3d_hsl
+* tests/accu/stat/histo3d_hsl
+
+
+c) La visualisation des histogrammes 3d
+
+* demo/accu/stat/histo2d
+
+* mln/display/dispay_histo.hh
+* mln/displayproject_histo.hh
diff --git a/scribo/sandbox/green/mln/accu/stat/histo1d.hh b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
index fae94c8..7677d3b 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo1d.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
@@ -328,7 +328,6 @@ namespace mln
# endif // ! MLN_INCLUDE_ONLY
-
} // end of namespace mln::accu::stat
} // end of namespace mln::accu
diff --git a/scribo/sandbox/green/mln/accu/stat/histo2d.hh b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
index 11a1bb3..ee4d145 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo2d.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
@@ -80,7 +80,7 @@
# include <mln/core/alias/point2d.hh>
# include <mln/core/alias/box2d.hh>
-#include <mln/literal/zero.hh>
+# include <mln/literal/zero.hh>
# include <mln/trait/value/comp.hh>
@@ -182,6 +182,7 @@ namespace mln
histo2d();
/// \}
+
/// Manipulators.
/// \{
/// \brief Initialize the histogram with zero value.
@@ -191,13 +192,15 @@ namespace mln
/// density.
void init();
+
/// \brief Update the histogram with the RG pixel t.
- /// \param[in] t a graylevel pixel of type V.
+ /// \param[in] t a R/G 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.
///
@@ -269,6 +272,8 @@ namespace mln
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)
diff --git a/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
index 35d78e2..a8888cd 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
@@ -168,6 +168,7 @@ namespace mln
/// \ingroup modaccuvalues
template <unsigned q, typename V>
struct histo3d_hsl :
+
public mln::accu::internal::base<image3d<unsigned>, histo3d_hsl<q,V> >
{
typedef V argument;
diff --git a/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
index 6a48024..2fb6084 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
@@ -179,6 +179,7 @@ namespace mln
histo3d_rgb();
/// \}
+
/// Manipulators.
/// \{
/// \brief Initialize the histogram with zero value.
@@ -242,6 +243,7 @@ namespace mln
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;
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
index af39d94..ec80ff1 100644
--- a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
@@ -36,8 +36,6 @@
#include <mln/io/pgm/load.hh>
#include <mln/value/int_u8.hh>
-
-
int main()
{
typedef mln::value::int_u8 t_int_u8;
--
1.5.6.5
1
0
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Olena, a generic and efficient image processing platform".
The branch exp/green has been updated
via b6f36911eb58513cfceafe871dc5a3cdfd1791bc (commit)
via 2fa459f44c6c7c938c48f4dd53a3210e885be1ac (commit)
via d26549180bf35357fa14783fb99d60108896009f (commit)
via 6e896e2214587d64f2d54a877c41b7cb1451c612 (commit)
via de3450dd6da34b7380382928582f8e8dd6f8f0d6 (commit)
via 9895c32ead3335ff6037eee9c900bc910cb4d74f (commit)
from 9ea8474bbe3fbdcfdeba74a7cf2ea602687768ab (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
b6f3691 Define documentation files.
2fa459f Adjust commit to supress build files
d265491 Define gnuplot shell export format.
6e896e2 COMMIT URGENCE FIN DE JOURNEE
de3450d Define accumulator which computes histogram view as image.
9895c32 COMMIT URGENCE FIN JOURNEE
-----------------------------------------------------------------------
Summary of changes:
scribo/sandbox/green/ChangeLog | 108 ++
scribo/sandbox/green/README | 32 -
scribo/sandbox/green/README.green | 288 ++++++
scribo/sandbox/green/README.img | 124 +++
scribo/sandbox/green/README.result | 143 +++
.../green/{ok/test/accu/histo => }/gaussian.sh | 0
.../histo2d => scribo/sandbox/green}/gaussian2d.sh | 0
scribo/sandbox/green/mln/accu/stat/histo1d.hh | 338 ++++++
scribo/sandbox/green/mln/accu/stat/histo2d.hh | 341 ++++++
scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh | 387 +++++++
scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh | 343 ++++++
.../sandbox/green/mln/clustering/k_mean.hh | 0
.../sandbox/green/mln/clustering/kmean1d.hh | 0
.../sandbox/green/mln/clustering/kmean2d.hh | 0
.../sandbox/green/mln/clustering/kmean3d.hh | 0
.../sandbox/green/mln/clustering/kmean_rgb.hh | 0
.../sandbox/green/mln/display/display_histo.hh | 0
.../sandbox/green/mln/display/project_histo.hh | 0
.../sandbox/green/mln/fun/p2b/achromatic.hh | 0
.../sandbox/green/mln/fun/p2b/component_equals.hh | 0
.../sandbox/green/mln/fun/v2v/achromatism.hh | 0
.../sandbox/green/mln/fun/v2v/hue_concentration.hh | 0
.../green/mln/fun/v2v/int_u16_to_int_u14.hh | 0
.../sandbox/green/mln/fun/v2v/log.hh | 0
.../sandbox/green/mln/fun/v2v/rg_to_rgb.hh | 0
.../sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh | 0
scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh | 119 +++
.../green/mln/fun/v2v/rgb_to_achromatism_map.hh | 0
.../sandbox/green/mln/fun/v2v/rgb_to_hsv.hh | 0
.../sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh | 0
scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh | 109 ++
.../green/mln/fun/v2v/rgb_to_saturation_map.hh | 0
.../sandbox/green/mln/fun/v2v/rgb_to_value_map.hh | 0
scribo/sandbox/green/{ok => }/mln/img_path.hh | 0
scribo/sandbox/green/mln/io/plot/save_image_sh.hh | 1090 ++++++++++++++++++++
{milena => scribo}/sandbox/green/mln/math/ceil.hh | 0
{milena => scribo}/sandbox/green/mln/math/floor.hh | 0
{milena => scribo}/sandbox/green/mln/value/hsv.hh | 0
scribo/sandbox/green/mln/value/rg.hh | 175 ++++
scribo/sandbox/green/ok/mln/accu/histo/histo1d.hh | 334 ------
scribo/sandbox/green/ok/mln/accu/histo/histo2d.hh | 346 -------
scribo/sandbox/green/ok/mln/accu/histo/histo3d.hh | 349 -------
scribo/sandbox/green/ok/test/accu/histo/histo1d | Bin 802920 -> 0 bytes
scribo/sandbox/green/ok/test/accu/histo/histo1d.cc | 726 -------------
scribo/sandbox/green/test_labelling.cc | 336 ++++++
.../green/tests/accu/stat/histo1d/Makefile.am | 153 +++
.../green/tests/accu/stat/histo1d/histo1d.cc | 507 +++++++++
.../green/tests/accu/stat/histo3d_hsl/Makefile.am | 153 +++
.../tests/accu/stat/histo3d_hsl/histo3d_hsl.cc | 391 +++++++
.../green/tests/accu/stat/histo3d_rgb/Makefile.am | 153 +++
.../tests/accu/stat/histo3d_rgb/histo3d_rgb.cc | 397 +++++++
.../green/tests/clustering/k_mean/Makefile.am | 0
.../green/tests/clustering/k_mean/k_mean.cc | 0
.../green/tests/clustering/kmean1d/Makefile.am | 0
.../green/tests/clustering/kmean1d/kmean1d.cc | 0
.../green/tests/io/plot/save_image_sh/Makefile.am | 153 +++
.../tests/io/plot/save_image_sh/save_image_sh.cc | 774 ++++++++++++++
.../green/use/accu/stat/histo1d/Makefile.am | 153 +++
.../sandbox/green/use/accu/stat/histo1d/histo1d.cc | 51 +
.../green/use/accu/stat/histo2d/Makefile.am | 153 +++
.../sandbox/green/use/accu/stat/histo2d/histo2d.cc | 58 +
.../green/use/accu/stat/histo3d_hsl/Makefile.am | 153 +++
.../green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc | 59 ++
.../green/use/accu/stat/histo3d_rgb/Makefile.am | 153 +++
.../green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc | 57 +
.../green/use/fun/v2v/rgb8_to_rgbn/Makefile.am | 153 +++
.../green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc | 57 +
.../green/use/fun/v2v/rgb_to_rg/Makefile.am | 153 +++
.../green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc | 58 +
.../green/use/io/plot/save_image_sh/Makefile.am | 153 +++
.../use/io/plot/save_image_sh/save_image_sh.cc | 53 +
scribo/sandbox/green/use/value/rg/Makefile.am | 153 +++
scribo/sandbox/green/use/value/rg/rg.cc | 58 +
73 files changed, 8257 insertions(+), 1787 deletions(-)
delete mode 100644 scribo/sandbox/green/README
create mode 100644 scribo/sandbox/green/README.green
create mode 100644 scribo/sandbox/green/README.img
create mode 100644 scribo/sandbox/green/README.result
rename scribo/sandbox/green/{ok/test/accu/histo => }/gaussian.sh (100%)
copy {milena/sandbox/green/tests/accu/stat/histo2d => scribo/sandbox/green}/gaussian2d.sh (100%)
create mode 100644 scribo/sandbox/green/mln/accu/stat/histo1d.hh
create mode 100644 scribo/sandbox/green/mln/accu/stat/histo2d.hh
create mode 100644 scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
create mode 100644 scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
copy {milena => scribo}/sandbox/green/mln/clustering/k_mean.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/kmean1d.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/kmean2d.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/kmean3d.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/kmean_rgb.hh (100%)
copy {milena => scribo}/sandbox/green/mln/display/display_histo.hh (100%)
copy {milena => scribo}/sandbox/green/mln/display/project_histo.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/p2b/achromatic.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/p2b/component_equals.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/achromatism.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/hue_concentration.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/log.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rg_to_rgb.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh (100%)
create mode 100644 scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb_to_achromatism_map.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh (100%)
create mode 100644 scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb_to_saturation_map.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb_to_value_map.hh (100%)
rename scribo/sandbox/green/{ok => }/mln/img_path.hh (100%)
create mode 100644 scribo/sandbox/green/mln/io/plot/save_image_sh.hh
copy {milena => scribo}/sandbox/green/mln/math/ceil.hh (100%)
copy {milena => scribo}/sandbox/green/mln/math/floor.hh (100%)
copy {milena => scribo}/sandbox/green/mln/value/hsv.hh (100%)
create mode 100644 scribo/sandbox/green/mln/value/rg.hh
delete mode 100644 scribo/sandbox/green/ok/mln/accu/histo/histo1d.hh
delete mode 100644 scribo/sandbox/green/ok/mln/accu/histo/histo2d.hh
delete mode 100644 scribo/sandbox/green/ok/mln/accu/histo/histo3d.hh
delete mode 100755 scribo/sandbox/green/ok/test/accu/histo/histo1d
delete mode 100644 scribo/sandbox/green/ok/test/accu/histo/histo1d.cc
create mode 100644 scribo/sandbox/green/test_labelling.cc
create mode 100644 scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
create mode 100644 scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
create mode 100644 scribo/sandbox/green/tests/accu/stat/histo3d_hsl/Makefile.am
create mode 100644 scribo/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
create mode 100644 scribo/sandbox/green/tests/accu/stat/histo3d_rgb/Makefile.am
create mode 100644 scribo/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
copy {milena => scribo}/sandbox/green/tests/clustering/k_mean/Makefile.am (100%)
copy {milena => scribo}/sandbox/green/tests/clustering/k_mean/k_mean.cc (100%)
copy {milena => scribo}/sandbox/green/tests/clustering/kmean1d/Makefile.am (100%)
copy {milena => scribo}/sandbox/green/tests/clustering/kmean1d/kmean1d.cc (100%)
create mode 100644 scribo/sandbox/green/tests/io/plot/save_image_sh/Makefile.am
create mode 100644 scribo/sandbox/green/tests/io/plot/save_image_sh/save_image_sh.cc
create mode 100644 scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
create mode 100644 scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
create mode 100644 scribo/sandbox/green/use/accu/stat/histo2d/Makefile.am
create mode 100644 scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
create mode 100644 scribo/sandbox/green/use/accu/stat/histo3d_hsl/Makefile.am
create mode 100644 scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc
create mode 100644 scribo/sandbox/green/use/accu/stat/histo3d_rgb/Makefile.am
create mode 100644 scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc
create mode 100644 scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/Makefile.am
create mode 100644 scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc
create mode 100644 scribo/sandbox/green/use/fun/v2v/rgb_to_rg/Makefile.am
create mode 100644 scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc
create mode 100644 scribo/sandbox/green/use/io/plot/save_image_sh/Makefile.am
create mode 100644 scribo/sandbox/green/use/io/plot/save_image_sh/save_image_sh.cc
create mode 100644 scribo/sandbox/green/use/value/rg/Makefile.am
create mode 100644 scribo/sandbox/green/use/value/rg/rg.cc
hooks/post-receive
--
Olena, a generic and efficient image processing platform
1
0
---
scribo/sandbox/green/ko/mln/accu/stat/histo1d.hh | 348 ----------
scribo/sandbox/green/ko/mln/accu/stat/histo2d.hh | 346 ----------
.../sandbox/green/ko/mln/accu/stat/histo3d_hsl.hh | 380 ----------
.../sandbox/green/ko/mln/accu/stat/histo3d_rgb.hh | 349 ----------
scribo/sandbox/green/ok/mln/accu/histo/histo1d.hh | 334 ---------
scribo/sandbox/green/ok/mln/accu/histo/histo2d.hh | 346 ----------
scribo/sandbox/green/ok/mln/accu/histo/histo3d.hh | 349 ----------
scribo/sandbox/green/ok/mln/img_path.hh | 239 -------
.../sandbox/green/ok/test/accu/histo/gaussian.sh | 12 -
scribo/sandbox/green/ok/test/accu/histo/histo1d | Bin 808312 -> 0 bytes
scribo/sandbox/green/ok/test/accu/histo/histo1d.cc | 726 --------------------
11 files changed, 0 insertions(+), 3429 deletions(-)
delete mode 100644 scribo/sandbox/green/ko/mln/accu/stat/histo1d.hh
delete mode 100644 scribo/sandbox/green/ko/mln/accu/stat/histo2d.hh
delete mode 100644 scribo/sandbox/green/ko/mln/accu/stat/histo3d_hsl.hh
delete mode 100644 scribo/sandbox/green/ko/mln/accu/stat/histo3d_rgb.hh
delete mode 100644 scribo/sandbox/green/ok/mln/accu/histo/histo1d.hh
delete mode 100644 scribo/sandbox/green/ok/mln/accu/histo/histo2d.hh
delete mode 100644 scribo/sandbox/green/ok/mln/accu/histo/histo3d.hh
delete mode 100644 scribo/sandbox/green/ok/mln/img_path.hh
delete mode 100755 scribo/sandbox/green/ok/test/accu/histo/gaussian.sh
delete mode 100755 scribo/sandbox/green/ok/test/accu/histo/histo1d
delete mode 100644 scribo/sandbox/green/ok/test/accu/histo/histo1d.cc
diff --git a/scribo/sandbox/green/ko/mln/accu/stat/histo1d.hh b/scribo/sandbox/green/ko/mln/accu/stat/histo1d.hh
deleted file mode 100644
index 807f3bd..0000000
--- a/scribo/sandbox/green/ko/mln/accu/stat/histo1d.hh
+++ /dev/null
@@ -1,348 +0,0 @@
-// 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)
-//
-// 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.
-
-#ifndef MLN_ACCU_STAT_HISTO1D_HH
-#define MLN_ACCU_STAT_HISTO1D_HH
-
-/// \file
-///
-/// \brief Define a histogram as an accumulator which returns an image1d .
-///
-/// This source implements the discrete histogram version. The number of beans
-/// is infer from the number of graylevels. A typical int_u8 image has got
-/// 256 bins. An int_u<14> image has got 16384 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/core/image/image2d.hh>
-/// #include <mln/io/pgm/load.hh>
-/// #include <mln/accu/stat/histo1d.hh>
-/// #include <mln/data/compute.hh>
-///
-/// #define OLENA_LENA "/usr/local/share/olena/images/lena.pgm"
-///
-/// void test()
-/// {
-/// typedef mln::value::int_u8 int_u8;
-/// mln::image2d<int_u8> img_ref;
-/// mln::image1d<unsigned> img_res;
-///
-/// mln::io::pgm::load(img_ref, OLENA_LENA);
-/// img_res = mln::data::compute(mln::accu::meta::stat::histo1d(), img_ref);
-/// }
-
-
-#include <iostream>
-
-#include <mln/accu/internal/base.hh>
-
-#include <mln/core/macros.hh>
-#include <mln/core/image/image1d.hh>
-#include <mln/core/concept/meta_accumulator.hh>
-
-#include <mln/trait/value/comp.hh>
-
-#include <mln/arith/plus.hh>
-
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
-
-#include <mln/value/ops.hh>
-
-namespace mln
-{
-
- namespace accu
- {
-
- namespace stat
- {
-
- // Forward declaration
- template <typename V>
- struct histo1d;
-
- } // end of namespace mln::accu::stat
-
-
- namespace meta
- {
-
- namespace stat
- {
-
- struct histo1d : public Meta_Accumulator<histo1d>
- {
- template <typename V>
- struct with
- {
- typedef accu::stat::histo1d<V> ret;
- };
- };
-
- } // end of namespace mln::accu::meta::stat
-
- } // end of namespace mln::accu::meta
-
- } // end of namespace mln::accu
-
- namespace trait
- {
-
- template <typename V>
- struct accumulator_< mln::accu::stat::histo1d<V> >
- {
- typedef accumulator::has_untake::no has_untake;
- typedef accumulator::has_set_value::no has_set_value;
- typedef accumulator::has_stop::no has_stop;
- typedef accumulator::when_pix::use_v when_pix;
- };
-
- template <typename V>
- struct set_precise_binary_<op::eq,
- accu::stat::histo1d<V>,
- accu::stat::histo1d<V> >
- {
- typedef bool ret;
- };
-
- } // end of namespace mln::trait
-
- namespace accu
- {
-
- namespace stat
- {
-
- /// \brief Define an histogram which returns an image1d .
- ///
- /// Param V defines the space in which we count the values.
- /// For instance, this histogram works with image2d<int_u8> or with
- /// image1d<int_u<14> >. The histogram count the occurrence of each value.
- /// The number of bins depends of the graylevel values, for 8 bits there
- /// is 256 bins, for 14 bits there is 16384 bins. Note that over
- /// quantification works too (up to 14 bits).
- ///
- /// \ingroup modaccuvalues
-
- template <typename V>
- struct histo1d :
- public mln::accu::internal::base<image1d<unsigned>, histo1d<V> >
- {
- typedef V argument;
- typedef image1d<unsigned> result;
- typedef result q_result;
-
- /// Constructors
- /// \{
- /// \brief Initialize the size of the resulting image1d.
- ///
- /// Initialize the size the resulting image from the theorical dynamic
- /// of the graylevel values (Use V to manage it).
- histo1d();
- /// \}
-
-
- /// 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
- /// density.
- void init();
-
-
- /// \brief Update the histogram with the graylevel of the 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 histo1d<V>& other);
- /// \}
-
- /// Accessors.
- /// \{
- /// \brief Return the histogram as an image1d.
- ///
- /// This is the machinery to communicate with data compute interface.
- /// The end user should'nt use it.
- result to_result() const;
- operator result () const;
- /// \}
-
- /// \brief Check whethever this accumulator is able to return a result.
- ///
- /// Depends if the resulting image1d is valid. We can assume it is quite
- /// always the case.
- bool is_valid() const;
-
- protected:
- 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 histograms.
-
- template <typename V>
- bool operator==(const histo1d<V>& histo1, const histo1d<V>& histo2);
-
-#ifndef MLN_INCLUDE_ONLY
-
- template <typename V>
- inline
- histo1d<V>::histo1d()
- {
- trace::entering("mln::accu::stat::histo1d<V>::histo1d");
- typedef mln_trait_value_comp(V,0) comp;
- typedef point<grid::tick, V> v_point1d;
- typedef box<v_point1d> v_box1d;
-
- // comp keep a trace of the dimension of the theorical image.
- // mln_min(comp) --> 0
- // mln_max(comp) --> 2^(n-1) [127 for n=7][255 for n=8] ...
-
- count_.init_(box1d(point1d(mln_min(comp)),
- point1d(mln_max(comp))));
-
- // std::cout << "min : " << mln_min(comp) << std::endl;
- // std::cout << "max : " << mln_max(comp) << std::endl;
-
- trace::exiting("mln::accu::stat::histo1d<V>::histo1d");
- }
-
- template <typename V>
- inline
- void histo1d<V>::init()
- {
- trace::entering("mln::accu::stat::histo1d<V>::init");
-
- data::fill(count_, 0);
- trace::exiting("mln::accu::stat::histo1d<V>::init");
- }
-
- template <typename V>
- inline
- void histo1d<V>::take(const argument& t)
- {
- trace::entering("mln::accu::stat::histo1d<V>::take");
-
- // Just convert a graylevel value (int_u8 like) to a position for an
- // iterator on the resulting image.
- ++count_(point1d(t));
-
- trace::exiting("mln::accu::stat::histo1d<V>::take");
- }
-
-
- template <typename V>
- inline
- void histo1d<V>::take(const histo1d<V>& other)
- {
- trace::entering("mln::accu::stat::histo1d<V>::take");
-
- count_ += other.count_;
-
- trace::exiting("mln::accu::stat::histo1d<V>::take");
- }
-
- template <typename V>
- inline
- typename histo1d<V>::result histo1d<V>::to_result() const
- {
- trace::entering("mln::accu::stat::histo1d<V>::to_result");
-
- trace::exiting("mln::accu::stat::histo1d<V>::to_result");
- return count_;
- }
-
- template <typename V>
- inline
- histo1d<V>::operator result() const
- {
- trace::entering("mln::accu::stat::histo1d<V>::operator result");
-
- trace::exiting("mln::accu::stat::histo1d<V>::operator result");
- return count_;
- }
-
- template <typename V>
- inline
- bool histo1d<V>::is_valid() const
- {
- trace::entering("mln::accu::stat::histo1d<V>::is_valid");
- bool result = count_.is_valid();
-
- trace::exiting("mln::accu::stat::histo1d<V>::is_valid");
- return result;
- }
-
- template <typename V>
- bool operator==(const histo1d<V>& histo1, const histo1d<V>& histo2)
- {
- trace::entering("mln::accu::stat::operator==");
-
- bool result = true;
- const image1d<unsigned>& res1 = histo1.to_result();
- const image1d<unsigned>& res2 = histo2.to_result();
-
- mln_precondition(res1.is_valid());
- mln_precondition(res2.is_valid());
-
- mln_piter(image1d<unsigned>) p1(res1.domain());
- mln_piter(image1d<unsigned>) p2(res2.domain());
-
- for_all_2(p1, p2)
- result &= (res1(p1) == res2(p2));
-
- trace::exiting("mln::accu::stat::operator==");
- return result;
- }
-
-#endif // ! MLN_INCLUDE_ONLY
-
-
- } // end of namespace mln::accu::stat
-
- } // end of namespace mln::accu
-
-} // end of namespace mln
-
-#endif // ! MLN_ACCU_STAT_HISTO1D_HH
diff --git a/scribo/sandbox/green/ko/mln/accu/stat/histo2d.hh b/scribo/sandbox/green/ko/mln/accu/stat/histo2d.hh
deleted file mode 100644
index fbe9a42..0000000
--- a/scribo/sandbox/green/ko/mln/accu/stat/histo2d.hh
+++ /dev/null
@@ -1,346 +0,0 @@
-// 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)
-//
-// 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.
-
-#ifndef MLN_ACCU_STAT_HISTO2D_HH
-# define MLN_ACCU_STAT_HISTO2D_HH
-
-/// \file
-///
-/// \brief Define a histogram as an accumulator which returns an image1d .
-///
-/// 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/data/compute.hh>
-///
-/// #define OLENA_LENA ""/usr/local/share/olena/images/lena.ppm"
-///
-/// void test()
-/// {
-/// typedef mln::value::rgb<7> rgb7;
-/// mln::image2d<rgb7> img_ref;
-/// mln::image3d<unsigned> img_res;
-///
-/// mln::io::ppm::load(img_ref, OLENA_LENA);
-/// img_res=mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_ref);
-/// }
-
-
-# include <iostream>
-
-# include <mln/accu/internal/base.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/arith/plus.hh>
-
-# include <mln/trace/entering.hh>
-# include <mln/trace/exiting.hh>
-
-# include <mln/value/ops.hh>
-
-namespace mln
-{
-
- namespace accu
- {
-
- namespace stat
- {
-
- // Forward declaration
- template <typename V>
- struct histo2d;
-
- } // end of namespace mln::accu::stat
-
- namespace meta
- {
-
- namespace stat
- {
-
- struct histo2d : public Meta_Accumulator<histo2d>
- {
- template <typename V>
- struct with
- {
- typedef accu::stat::histo2d<V> ret;
- };
- };
-
- } // end of namespace mln::accu::meta::stat
-
- } // end of namespace mln::accu::meta
-
- } // end of namespace mln::accu
-
-
- namespace trait
- {
-
- template <typename V>
- struct accumulator_< mln::accu::stat::histo2d<V> >
- {
- typedef accumulator::has_untake::no has_untake;
- typedef accumulator::has_set_value::no has_set_value;
- typedef accumulator::has_stop::no has_stop;
- typedef accumulator::when_pix::use_v when_pix;
- };
-
- template <typename V>
- struct set_precise_binary_<op::eq,
- accu::stat::histo2d<V>,
- accu::stat::histo2d<V> >
- {
- typedef bool ret;
- };
-
- } // end of namespace mln::trait
-
- namespace accu
- {
-
- namespace stat
- {
-
- /// \brief Define an histogram 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
- /// quantification works too.
- ///
- /// \ingroup modaccuvalues
-
- template <typename V>
- struct histo2d :
- public mln::accu::internal::base<image2d<unsigned>, histo2d<V> >
- {
- typedef V argument;
- typedef image2d<unsigned> result;
- typedef result q_result;
-
- /// Constructors
- /// \{
- /// \brief Initialize the size of the resulting image1d.
- ///
- /// Initialize the size the resulting image from the theorical dynamic
- /// of the greylevel values (Use V to manage it).
- histo2d();
- /// \}
-
-
- /// 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
- /// density.
- void init();
-
-
- /// \brief Update the histogram with the RGB pixel t.
- /// \param[in] t a greylevel 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.
- void take(const histo2d<V>& other);
- /// \}
-
- /// Accessors.
- /// \{
- /// \brief Return the histogram as an image1d.
- ///
- /// This is the machinery to communicate with data compute interface.
- /// The end user should'nt use it.
- result to_result() const;
- operator result () const;
- /// \}
-
- /// \brief Check whethever this accumulator is able to return a result.
- ///
- /// Depends if the resulting image1d is valid. We can assume it is quite
- /// always the case.
- bool is_valid() const;
-
- protected:
- 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.
-
- template <typename V>
- bool operator==(const histo2d<V>& histo1,
- const histo2d<V>& histo2);
-
-#ifndef MLN_INCLUDE_ONLY
-
- template <typename V>
- inline
- histo2d<V>::histo2d()
- {
- trace::entering("mln::accu::stat::histo2d::histo2d");
- typedef mln_trait_value_comp(V,0) comp0;
- typedef mln_trait_value_comp(V,1) comp1;
-
- // comp keep a trace of the dimension of the theorical image.
- // mln_min(comp) --> 0
- // mln_max(comp) --> 2^(n-1) [127 for n=7][255 for n=8] ...
-
- count_.init_(box2d(point2d(mln_min(comp0),
- mln_min(comp1)),
- point2d(mln_max(comp0),
- mln_max(comp1))));
-
- trace::exiting("mln::accu::stat::histo2d::histo2d");
- }
-
- 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");
- }
-
- 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");
- }
-
-
- template <typename V>
- 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_;
- }
-
- template <typename V>
- inline
- histo2d<V>::operator result() const
- {
- trace::entering("mln::accu::stat::histo2d::operator result");
-
- trace::exiting("mln::accu::stat::histo2d::operator result");
- return count_;
- }
-
- template <typename V>
- 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;
- }
-
- template <typename V>
- bool operator==(const histo2d<V>& histo1,
- const histo2d<V>& histo2)
- {
- trace::entering("mln::accu::stat::operator==");
-
- bool result = true;
- const image2d<unsigned>& res1 = histo1.to_result();
- const image2d<unsigned>& res2 = histo2.to_result();
-
- mln_precondition(res1.is_valid());
- mln_precondition(res2.is_valid());
-
- mln_piter(image2d<unsigned>) p1(res1.domain());
- mln_piter(image2d<unsigned>) p2(res2.domain());
-
- for_all_2(p1, p2)
- result &= (res1(p1) == res2(p2));
-
- trace::exiting("mln::accu::stat::operator==");
- return result;
- }
-
-#endif // ! MLN_INCLUDE_ONLY
-
-
- } // end of namespace mln::accu::stat
-
- } // end of namespace mln::accu
-
-} // end of namespace mln
-
-#endif // ! MLN_ACCU_STAT_HISTO2D_HH
diff --git a/scribo/sandbox/green/ko/mln/accu/stat/histo3d_hsl.hh b/scribo/sandbox/green/ko/mln/accu/stat/histo3d_hsl.hh
deleted file mode 100644
index c84aaa4..0000000
--- a/scribo/sandbox/green/ko/mln/accu/stat/histo3d_hsl.hh
+++ /dev/null
@@ -1,380 +0,0 @@
-// 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)
-//
-// 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.
-
-#ifndef 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 .
-///
-/// 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/core/image/image2d.hh>
-/// #include <mln/io/pgm/load.hh>
-/// #include <mln/accu/stat/histo1d.hh>
-/// #include <mln/data/compute.hh>
-/// #include <mln/io/plot/save_histo_sh.hh>
-///
-/// #define OLENA_LENA "/usr/local/share/olena/images/lena.pgm"
-///
-/// void test()
-/// {
-/// typedef mln::value::int_u8 int_u8;
-/// mln::image2d<int_u8> img_ref;
-/// mln::image1d<unsigned> img_res;
-///
-/// mln::io::pgm::load(img_ref, OLENA_LENA);
-/// img_res = mln::data::compute(mln::accu::stat::histo1d<int_u8>(), img_ref);
-/// }
-
-
-#include <iostream>
-
-#include <mln/accu/internal/base.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/value/int_u.hh>
-#include <mln/trait/value/comp.hh>
-
-#include <mln/arith/plus.hh>
-
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
-
-#include <mln/value/ops.hh>
-
-// make hue cyclic
-#include <mln/fun/p2p/fold.hh>
-#include <mln/core/image/dmorph/transformed_image.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 trait
- {
-
- template <unsigned q, typename V>
- struct accumulator_< mln::accu::stat::histo3d_hsl<q,V> >
- {
- typedef accumulator::has_untake::no has_untake;
- typedef accumulator::has_set_value::no has_set_value;
- typedef accumulator::has_stop::no has_stop;
- typedef accumulator::when_pix::use_v when_pix;
- };
-
- template <unsigned q, typename V>
- 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 .
- ///
- /// 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.
- ///
- /// \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 :
- public mln::accu::internal::base<image3d<unsigned>, histo3d_hsl<q,V> >
- {
- typedef V argument;
- typedef image3d<unsigned> result;
- typedef result q_result;
-
- /// Constructors
- /// \{
- /// \brief Initialize the size of the resulting image1d.
- ///
- /// Initialize the size the resulting image from the theorical dynamic
- /// of the greylevel values (Use V to manage it).
- 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
- /// density.
- void init();
-
-
- /// \brief Update the histogram with the RGB pixel t.
- /// \param[in] t a greylevel 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.
- void take(const histo3d_hsl<q,V>& other);
- /// \}
-
- /// Accessors.
- /// \{
- /// \brief Return the histogram as an image1d.
- ///
- /// This is the machinery to communicate with data compute interface.
- /// The end user should'nt use it.
- result to_result() const;
- operator result () const;
- /// \}
-
- /// \brief Check whethever this accumulator is able to return a result.
- ///
- /// Depends if the resulting image1d is valid. We can assume it is quite
- /// always the case.
- bool is_valid() const;
-
- protected:
- const float min_hue;
- const float max_hue;
- float step_hue;
- const float min_lum;
- const float max_lum;
- float step_lum;
- const float min_sat;
- const float max_sat;
- float step_sat;
- 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.
-
- template <unsigned q, typename V>
- bool operator==(const histo3d_hsl<q,V>& histo1,
- const histo3d_hsl<q,V>& histo2);
-
-#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)
- {
- 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.
-
- count_.init_(box3d(point3d(mln_min(value::int_u<q>),
- mln_min(value::int_u<q>),
- mln_min(value::int_u<q>)),
- point3d(mln_max(value::int_u<q>),
- mln_max(value::int_u<q>),
- mln_max(value::int_u<q>))));
-
- // Make the hue domain cyclic
- fun::p2p::fold<point3d,1,0,0> fold_(count_.domain());
- transform_domain(count_, fold_);
-
- step_hue = (max_hue - min_hue)/q;
- 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");
- }
-
- 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");
- }
-
- 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
- // 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;
- /*
-
- std::cout << "H : " << t.hue() << std::endl;
- std::cout << "L : " << t.lum() << std::endl;
- std::cout << "S : " << t.sat() << std::endl;
-
- std::cout << "step_hue : " << step_hue << std::endl;
- std::cout << "step_lum : " << step_lum << std::endl;
- std::cout << "step_sat : " << step_sat << std::endl;
-
- std::cout << "X : " << x << std::endl;
- std::cout << "Y : " << y << std::endl;
- 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,
- const histo3d_hsl<q,V>& histo2)
- {
- trace::entering("mln::accu::stat::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());
-
- mln_piter(image3d<unsigned>) p1(res1.domain());
- mln_piter(image3d<unsigned>) p2(res2.domain());
-
- for_all_2(p1, p2)
- result &= (res1(p1) == res2(p2));
-
- trace::exiting("mln::accu::stat::operator==");
- return result;
- }
-
-#endif // ! MLN_INCLUDE_ONLY
-
-
- } // end of namespace mln::accu::stat
-
- } // end of namespace mln::accu
-
-} // end of namespace mln
-
-#endif // ! MLN_ACCU_STAT_HISTO3D_RGB_HH
diff --git a/scribo/sandbox/green/ko/mln/accu/stat/histo3d_rgb.hh b/scribo/sandbox/green/ko/mln/accu/stat/histo3d_rgb.hh
deleted file mode 100644
index 48c49da..0000000
--- a/scribo/sandbox/green/ko/mln/accu/stat/histo3d_rgb.hh
+++ /dev/null
@@ -1,349 +0,0 @@
-// 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)
-//
-// 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.
-
-#ifndef 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 .
-///
-/// 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/data/compute.hh>
-///
-/// #define OLENA_LENA ""/usr/local/share/olena/images/lena.ppm"
-///
-/// void test()
-/// {
-/// typedef mln::value::rgb<7> rgb7;
-/// mln::image2d<rgb7> img_ref;
-/// mln::image3d<unsigned> img_res;
-///
-/// mln::io::ppm::load(img_ref, OLENA_LENA);
-/// img_res=mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_ref);
-/// }
-
-
-#include <iostream>
-
-#include <mln/accu/internal/base.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/arith/plus.hh>
-
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
-
-#include <mln/value/ops.hh>
-
-namespace mln
-{
-
- namespace accu
- {
-
- namespace stat
- {
-
- // Forward declaration
- template <typename V>
- struct histo3d_rgb;
-
- } // end of namespace mln::accu::stat
-
- namespace meta
- {
-
- namespace stat
- {
-
- struct histo3d_rgb : public Meta_Accumulator<histo3d_rgb>
- {
- template <typename V>
- struct with
- {
- typedef accu::stat::histo3d_rgb<V> ret;
- };
- };
-
- } // end of namespace mln::accu::meta::stat
-
- } // end of namespace mln::accu::meta
-
- } // end of namespace mln::accu
-
-
- namespace trait
- {
-
- template <typename V>
- struct accumulator_< mln::accu::stat::histo3d_rgb<V> >
- {
- typedef accumulator::has_untake::no has_untake;
- typedef accumulator::has_set_value::no has_set_value;
- typedef accumulator::has_stop::no has_stop;
- typedef accumulator::when_pix::use_v when_pix;
- };
-
- template <typename V>
- struct set_precise_binary_<op::eq,
- accu::stat::histo3d_rgb<V>,
- accu::stat::histo3d_rgb<V> >
- {
- typedef bool ret;
- };
-
- } // end of namespace mln::trait
-
- namespace accu
- {
-
- namespace stat
- {
-
- /// \brief Define an histogram 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
- /// quantification works too.
- ///
- /// \ingroup modaccuvalues
-
- template <typename V>
- struct histo3d_rgb :
- public mln::accu::internal::base<image3d<unsigned>, histo3d_rgb<V> >
- {
- typedef V argument;
- typedef image3d<unsigned> result;
- typedef result q_result;
-
- /// Constructors
- /// \{
- /// \brief Initialize the size of the resulting image1d.
- ///
- /// Initialize the size the resulting image from the theorical dynamic
- /// of the greylevel values (Use V to manage it).
- histo3d_rgb();
- /// \}
-
-
- /// 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
- /// density.
- void init();
-
-
- /// \brief Update the histogram with the RGB pixel t.
- /// \param[in] t a greylevel 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.
- void take(const histo3d_rgb<V>& other);
- /// \}
-
- /// Accessors.
- /// \{
- /// \brief Return the histogram as an image1d.
- ///
- /// This is the machinery to communicate with data compute interface.
- /// The end user should'nt use it.
- result to_result() const;
- operator result () const;
- /// \}
-
- /// \brief Check whethever this accumulator is able to return a result.
- ///
- /// Depends if the resulting image1d is valid. We can assume it is quite
- /// always the case.
- bool is_valid() const;
-
- protected:
- 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.
-
- template <typename V>
- bool operator==(const histo3d_rgb<V>& histo1,
- const histo3d_rgb<V>& histo2);
-
-#ifndef MLN_INCLUDE_ONLY
-
- template <typename V>
- inline
- histo3d_rgb<V>::histo3d_rgb()
- {
- trace::entering("mln::accu::stat::histo3d_rgb<V>::histo3d_rgb");
- typedef mln_trait_value_comp(V,0) comp0;
- typedef mln_trait_value_comp(V,1) comp1;
- typedef mln_trait_value_comp(V,2) comp2;
-
- // comp keep a trace of the dimension of the theorical image.
- // mln_min(comp) --> 0
- // mln_max(comp) --> 2^(n-1) [127 for n=7][255 for n=8] ...
-
- count_.init_(box3d(point3d(mln_min(comp0),
- mln_min(comp1),
- mln_min(comp2)),
- point3d(mln_max(comp0),
- mln_max(comp1),
- mln_max(comp2))));
-
- trace::exiting("mln::accu::stat::histo3d_rgb<V>::histo3d_rgb");
- }
-
- 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");
- }
-
- 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");
- }
-
-
- template <typename V>
- 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_;
- }
-
- template <typename V>
- 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_;
- }
-
- template <typename V>
- 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;
- }
-
- template <typename V>
- bool operator==(const histo3d_rgb<V>& histo1,
- const histo3d_rgb<V>& histo2)
- {
- trace::entering("mln::accu::stat::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());
-
- mln_piter(image3d<unsigned>) p1(res1.domain());
- mln_piter(image3d<unsigned>) p2(res2.domain());
-
- for_all_2(p1, p2)
- result &= (res1(p1) == res2(p2));
-
- trace::exiting("mln::accu::stat::operator==");
- return result;
- }
-
-#endif // ! MLN_INCLUDE_ONLY
-
-
- } // end of namespace mln::accu::stat
-
- } // end of namespace mln::accu
-
-} // end of namespace mln
-
-#endif // ! MLN_ACCU_STAT_HISTO3D_RGB_HH
diff --git a/scribo/sandbox/green/ok/mln/accu/histo/histo1d.hh b/scribo/sandbox/green/ok/mln/accu/histo/histo1d.hh
deleted file mode 100644
index 139cf39..0000000
--- a/scribo/sandbox/green/ok/mln/accu/histo/histo1d.hh
+++ /dev/null
@@ -1,334 +0,0 @@
-// Copyright (C) 2007,2008,2009,2010 EPITA Research and Development
-// Laboratory (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.
-
-#ifndef MLN_ACCU_HISTO_HISTO1D_HH
-#define MLN_ACCU_HISTO_HISTO1D_HH
-
-/// \file
-///
-/// \brief Define a histogram as accumulator which returns an image1d.
-///
-/// This source implements the discrete histogram version. It was
-/// created for images which the values are derived from integer
-/// type. The number of beans is directly infered from the cardinality
-/// of the image value. So the int_u8 image has got 256 bins, the
-/// int_u<14> image has got 16384 bins. But, this code doesn't work
-/// for that quantification because of the coord limitation (signed
-/// short, as it is defined in mln/core/def/coord.hh).
-///
-/// The following sample is a typical use of the histogram.
-///
-/// #include <mln/accu/histo/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/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);
-///
-/// return 0;
-/// }
-
-
-#include <iostream>
-
-#include <mln/accu/internal/base.hh>
-
-#include <mln/core/macros.hh>
-#include <mln/core/image/image1d.hh>
-#include <mln/core/concept/meta_accumulator.hh>
-
-#include <mln/trait/value/comp.hh>
-
-#include <mln/arith/plus.hh>
-
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
-
-#include <mln/value/ops.hh>
-
-namespace mln
-{
-
- namespace accu
- {
-
- namespace histo
- {
-
- // Forward declaration
- template <typename V>
- struct histo1d;
-
- } // end of namespace mln::accu::histo
-
-
- namespace meta
- {
-
- namespace histo
- {
-
- struct histo1d : public Meta_Accumulator<histo1d>
- {
- template <typename V>
- struct with
- {
- typedef accu::histo::histo1d<V> ret;
- };
- };
-
- } // end of namespace mln::accu::meta::histo
-
- } // end of namespace mln::accu::meta
-
- } // end of namespace mln::accu
-
- namespace trait
- {
-
- template <typename V>
- struct accumulator_< mln::accu::histo::histo1d<V> >
- {
- typedef accumulator::has_untake::no has_untake;
- typedef accumulator::has_set_value::no has_set_value;
- typedef accumulator::has_stop::no has_stop;
- typedef accumulator::when_pix::use_v when_pix;
- };
-
- template <typename V>
- struct set_precise_binary_<op::eq,
- accu::histo::histo1d<V>,
- accu::histo::histo1d<V> >
- {
- typedef bool ret;
- };
-
- } // end of namespace mln::trait
-
- namespace accu
- {
-
- namespace histo
- {
-
- /// \brief Define an histogram which returns an image1d .
- ///
- /// Param V defines the space in which we count the values.
- /// For instance, this histogram works with image2d<int_u8> or with
- /// image1d<int_u<14> >. The histogram count the occurrence of each value.
- /// The number of bins depends of the graylevel values, for 8 bits there
- /// is 256 bins, for 14 bits there is 16384 bins. Note that over
- /// quantification works too (up to 14 bits).
- ///
- /// \ingroup modaccuvalues
-
- template <typename V>
- struct histo1d :
- public mln::accu::internal::base< image1d<unsigned>,histo1d<V> >
- {
- typedef V argument;
- typedef image1d<unsigned> result;
- typedef result q_result;
-
- /// Constructors
- /// \{
- /// \brief Initialize the size of the resulting image1d.
- ///
- /// Initialize the size the resulting image from the theorical dynamic
- /// of the graylevel values (Use V to manage it).
- histo1d();
- /// \}
-
-
- /// 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
- /// density.
- void init();
-
-
- /// \brief Update the histogram with the graylevel of the 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 histo1d<V>& other);
- /// \}
-
- /// Accessors.
- /// \{
- /// \brief Return the histogram as an image1d.
- ///
- /// This is the machinery to communicate with data compute interface.
- /// The end user should'nt use it.
- result to_result() const;
- operator result () const;
- /// \}
-
- /// \brief Check whethever this accumulator is able to return a result.
- ///
- /// Depends if the resulting image1d is valid. We can assume it is quite
- /// always the case.
- bool is_valid() const;
-
- protected:
- 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 histograms.
-
- template <typename V>
- bool operator==(const histo1d<V>& histo1, const histo1d<V>& histo2);
-
-#ifndef MLN_INCLUDE_ONLY
-
- template <typename V>
- inline
- histo1d<V>::histo1d()
- {
- trace::entering("mln::accu::histo::histo1d::cstor");
- typedef mln_trait_value_comp(V,0) comp;
- typedef point<grid::tick, V> v_point1d;
- typedef box<v_point1d> v_box1d;
-
- // comp keep a trace of the dimension of the theorical image.
- // mln_min(comp) --> 0
- // mln_max(comp) --> 2^(n-1) [127 for n=7][255 for n=8] ...
-
- count_.init_(box1d(point1d(mln_min(comp)),
- point1d(mln_max(comp))));
-
- // std::cout << "min : " << mln_min(comp) << std::endl;
- // std::cout << "max : " << mln_max(comp) << std::endl;
-
- trace::exiting("mln::accu::histo::histo1d::cstor");
- }
-
- template <typename V>
- inline
- void histo1d<V>::init()
- {
- data::fill(count_, 0);
- }
-
- template <typename V>
- inline
- void histo1d<V>::take(const argument& t)
- {
- // Just convert a graylevel value (int_u8 like) to a position for an
- // iterator on the resulting image.
- ++count_(point1d(t));
- }
-
-
- template <typename V>
- inline
- void histo1d<V>::take(const histo1d<V>& other)
- {
- count_ += other.count_;
- }
-
- template <typename V>
- inline
- typename histo1d<V>::result histo1d<V>::to_result() const
- {
- return count_;
- }
-
- template <typename V>
- inline
- histo1d<V>::operator result() const
- {
- return count_;
- }
-
- template <typename V>
- inline
- bool histo1d<V>::is_valid() const
- {
- bool result = count_.is_valid();
-
- return result;
- }
-
- template <typename V>
- bool operator==(const histo1d<V>& histo1, const histo1d<V>& histo2)
- {
- trace::entering("mln::accu::histo::histo1d::operator==");
-
- bool result = true;
- const image1d<unsigned>& res1 = histo1.to_result();
- const image1d<unsigned>& res2 = histo2.to_result();
-
- mln_precondition(res1.is_valid());
- mln_precondition(res2.is_valid());
-
- mln_piter(image1d<unsigned>) p1(res1.domain());
- mln_piter(image1d<unsigned>) p2(res2.domain());
-
- for_all_2(p1, p2)
- result &= (res1(p1) == res2(p2));
-
- trace::exiting("mln::accu::histo::histo1d::operator==");
- return result;
- }
-
-#endif // ! MLN_INCLUDE_ONLY
-
-
- } // end of namespace mln::accu::histo
-
- } // end of namespace mln::accu
-
-} // end of namespace mln
-
-#endif // ! MLN_ACCU_HISTO_HISTO1D_HH
diff --git a/scribo/sandbox/green/ok/mln/accu/histo/histo2d.hh b/scribo/sandbox/green/ok/mln/accu/histo/histo2d.hh
deleted file mode 100644
index fbe9a42..0000000
--- a/scribo/sandbox/green/ok/mln/accu/histo/histo2d.hh
+++ /dev/null
@@ -1,346 +0,0 @@
-// 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)
-//
-// 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.
-
-#ifndef MLN_ACCU_STAT_HISTO2D_HH
-# define MLN_ACCU_STAT_HISTO2D_HH
-
-/// \file
-///
-/// \brief Define a histogram as an accumulator which returns an image1d .
-///
-/// 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/data/compute.hh>
-///
-/// #define OLENA_LENA ""/usr/local/share/olena/images/lena.ppm"
-///
-/// void test()
-/// {
-/// typedef mln::value::rgb<7> rgb7;
-/// mln::image2d<rgb7> img_ref;
-/// mln::image3d<unsigned> img_res;
-///
-/// mln::io::ppm::load(img_ref, OLENA_LENA);
-/// img_res=mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_ref);
-/// }
-
-
-# include <iostream>
-
-# include <mln/accu/internal/base.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/arith/plus.hh>
-
-# include <mln/trace/entering.hh>
-# include <mln/trace/exiting.hh>
-
-# include <mln/value/ops.hh>
-
-namespace mln
-{
-
- namespace accu
- {
-
- namespace stat
- {
-
- // Forward declaration
- template <typename V>
- struct histo2d;
-
- } // end of namespace mln::accu::stat
-
- namespace meta
- {
-
- namespace stat
- {
-
- struct histo2d : public Meta_Accumulator<histo2d>
- {
- template <typename V>
- struct with
- {
- typedef accu::stat::histo2d<V> ret;
- };
- };
-
- } // end of namespace mln::accu::meta::stat
-
- } // end of namespace mln::accu::meta
-
- } // end of namespace mln::accu
-
-
- namespace trait
- {
-
- template <typename V>
- struct accumulator_< mln::accu::stat::histo2d<V> >
- {
- typedef accumulator::has_untake::no has_untake;
- typedef accumulator::has_set_value::no has_set_value;
- typedef accumulator::has_stop::no has_stop;
- typedef accumulator::when_pix::use_v when_pix;
- };
-
- template <typename V>
- struct set_precise_binary_<op::eq,
- accu::stat::histo2d<V>,
- accu::stat::histo2d<V> >
- {
- typedef bool ret;
- };
-
- } // end of namespace mln::trait
-
- namespace accu
- {
-
- namespace stat
- {
-
- /// \brief Define an histogram 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
- /// quantification works too.
- ///
- /// \ingroup modaccuvalues
-
- template <typename V>
- struct histo2d :
- public mln::accu::internal::base<image2d<unsigned>, histo2d<V> >
- {
- typedef V argument;
- typedef image2d<unsigned> result;
- typedef result q_result;
-
- /// Constructors
- /// \{
- /// \brief Initialize the size of the resulting image1d.
- ///
- /// Initialize the size the resulting image from the theorical dynamic
- /// of the greylevel values (Use V to manage it).
- histo2d();
- /// \}
-
-
- /// 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
- /// density.
- void init();
-
-
- /// \brief Update the histogram with the RGB pixel t.
- /// \param[in] t a greylevel 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.
- void take(const histo2d<V>& other);
- /// \}
-
- /// Accessors.
- /// \{
- /// \brief Return the histogram as an image1d.
- ///
- /// This is the machinery to communicate with data compute interface.
- /// The end user should'nt use it.
- result to_result() const;
- operator result () const;
- /// \}
-
- /// \brief Check whethever this accumulator is able to return a result.
- ///
- /// Depends if the resulting image1d is valid. We can assume it is quite
- /// always the case.
- bool is_valid() const;
-
- protected:
- 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.
-
- template <typename V>
- bool operator==(const histo2d<V>& histo1,
- const histo2d<V>& histo2);
-
-#ifndef MLN_INCLUDE_ONLY
-
- template <typename V>
- inline
- histo2d<V>::histo2d()
- {
- trace::entering("mln::accu::stat::histo2d::histo2d");
- typedef mln_trait_value_comp(V,0) comp0;
- typedef mln_trait_value_comp(V,1) comp1;
-
- // comp keep a trace of the dimension of the theorical image.
- // mln_min(comp) --> 0
- // mln_max(comp) --> 2^(n-1) [127 for n=7][255 for n=8] ...
-
- count_.init_(box2d(point2d(mln_min(comp0),
- mln_min(comp1)),
- point2d(mln_max(comp0),
- mln_max(comp1))));
-
- trace::exiting("mln::accu::stat::histo2d::histo2d");
- }
-
- 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");
- }
-
- 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");
- }
-
-
- template <typename V>
- 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_;
- }
-
- template <typename V>
- inline
- histo2d<V>::operator result() const
- {
- trace::entering("mln::accu::stat::histo2d::operator result");
-
- trace::exiting("mln::accu::stat::histo2d::operator result");
- return count_;
- }
-
- template <typename V>
- 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;
- }
-
- template <typename V>
- bool operator==(const histo2d<V>& histo1,
- const histo2d<V>& histo2)
- {
- trace::entering("mln::accu::stat::operator==");
-
- bool result = true;
- const image2d<unsigned>& res1 = histo1.to_result();
- const image2d<unsigned>& res2 = histo2.to_result();
-
- mln_precondition(res1.is_valid());
- mln_precondition(res2.is_valid());
-
- mln_piter(image2d<unsigned>) p1(res1.domain());
- mln_piter(image2d<unsigned>) p2(res2.domain());
-
- for_all_2(p1, p2)
- result &= (res1(p1) == res2(p2));
-
- trace::exiting("mln::accu::stat::operator==");
- return result;
- }
-
-#endif // ! MLN_INCLUDE_ONLY
-
-
- } // end of namespace mln::accu::stat
-
- } // end of namespace mln::accu
-
-} // end of namespace mln
-
-#endif // ! MLN_ACCU_STAT_HISTO2D_HH
diff --git a/scribo/sandbox/green/ok/mln/accu/histo/histo3d.hh b/scribo/sandbox/green/ok/mln/accu/histo/histo3d.hh
deleted file mode 100644
index 48c49da..0000000
--- a/scribo/sandbox/green/ok/mln/accu/histo/histo3d.hh
+++ /dev/null
@@ -1,349 +0,0 @@
-// 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)
-//
-// 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.
-
-#ifndef 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 .
-///
-/// 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/data/compute.hh>
-///
-/// #define OLENA_LENA ""/usr/local/share/olena/images/lena.ppm"
-///
-/// void test()
-/// {
-/// typedef mln::value::rgb<7> rgb7;
-/// mln::image2d<rgb7> img_ref;
-/// mln::image3d<unsigned> img_res;
-///
-/// mln::io::ppm::load(img_ref, OLENA_LENA);
-/// img_res=mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_ref);
-/// }
-
-
-#include <iostream>
-
-#include <mln/accu/internal/base.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/arith/plus.hh>
-
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
-
-#include <mln/value/ops.hh>
-
-namespace mln
-{
-
- namespace accu
- {
-
- namespace stat
- {
-
- // Forward declaration
- template <typename V>
- struct histo3d_rgb;
-
- } // end of namespace mln::accu::stat
-
- namespace meta
- {
-
- namespace stat
- {
-
- struct histo3d_rgb : public Meta_Accumulator<histo3d_rgb>
- {
- template <typename V>
- struct with
- {
- typedef accu::stat::histo3d_rgb<V> ret;
- };
- };
-
- } // end of namespace mln::accu::meta::stat
-
- } // end of namespace mln::accu::meta
-
- } // end of namespace mln::accu
-
-
- namespace trait
- {
-
- template <typename V>
- struct accumulator_< mln::accu::stat::histo3d_rgb<V> >
- {
- typedef accumulator::has_untake::no has_untake;
- typedef accumulator::has_set_value::no has_set_value;
- typedef accumulator::has_stop::no has_stop;
- typedef accumulator::when_pix::use_v when_pix;
- };
-
- template <typename V>
- struct set_precise_binary_<op::eq,
- accu::stat::histo3d_rgb<V>,
- accu::stat::histo3d_rgb<V> >
- {
- typedef bool ret;
- };
-
- } // end of namespace mln::trait
-
- namespace accu
- {
-
- namespace stat
- {
-
- /// \brief Define an histogram 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
- /// quantification works too.
- ///
- /// \ingroup modaccuvalues
-
- template <typename V>
- struct histo3d_rgb :
- public mln::accu::internal::base<image3d<unsigned>, histo3d_rgb<V> >
- {
- typedef V argument;
- typedef image3d<unsigned> result;
- typedef result q_result;
-
- /// Constructors
- /// \{
- /// \brief Initialize the size of the resulting image1d.
- ///
- /// Initialize the size the resulting image from the theorical dynamic
- /// of the greylevel values (Use V to manage it).
- histo3d_rgb();
- /// \}
-
-
- /// 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
- /// density.
- void init();
-
-
- /// \brief Update the histogram with the RGB pixel t.
- /// \param[in] t a greylevel 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.
- void take(const histo3d_rgb<V>& other);
- /// \}
-
- /// Accessors.
- /// \{
- /// \brief Return the histogram as an image1d.
- ///
- /// This is the machinery to communicate with data compute interface.
- /// The end user should'nt use it.
- result to_result() const;
- operator result () const;
- /// \}
-
- /// \brief Check whethever this accumulator is able to return a result.
- ///
- /// Depends if the resulting image1d is valid. We can assume it is quite
- /// always the case.
- bool is_valid() const;
-
- protected:
- 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.
-
- template <typename V>
- bool operator==(const histo3d_rgb<V>& histo1,
- const histo3d_rgb<V>& histo2);
-
-#ifndef MLN_INCLUDE_ONLY
-
- template <typename V>
- inline
- histo3d_rgb<V>::histo3d_rgb()
- {
- trace::entering("mln::accu::stat::histo3d_rgb<V>::histo3d_rgb");
- typedef mln_trait_value_comp(V,0) comp0;
- typedef mln_trait_value_comp(V,1) comp1;
- typedef mln_trait_value_comp(V,2) comp2;
-
- // comp keep a trace of the dimension of the theorical image.
- // mln_min(comp) --> 0
- // mln_max(comp) --> 2^(n-1) [127 for n=7][255 for n=8] ...
-
- count_.init_(box3d(point3d(mln_min(comp0),
- mln_min(comp1),
- mln_min(comp2)),
- point3d(mln_max(comp0),
- mln_max(comp1),
- mln_max(comp2))));
-
- trace::exiting("mln::accu::stat::histo3d_rgb<V>::histo3d_rgb");
- }
-
- 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");
- }
-
- 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");
- }
-
-
- template <typename V>
- 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_;
- }
-
- template <typename V>
- 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_;
- }
-
- template <typename V>
- 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;
- }
-
- template <typename V>
- bool operator==(const histo3d_rgb<V>& histo1,
- const histo3d_rgb<V>& histo2)
- {
- trace::entering("mln::accu::stat::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());
-
- mln_piter(image3d<unsigned>) p1(res1.domain());
- mln_piter(image3d<unsigned>) p2(res2.domain());
-
- for_all_2(p1, p2)
- result &= (res1(p1) == res2(p2));
-
- trace::exiting("mln::accu::stat::operator==");
- return result;
- }
-
-#endif // ! MLN_INCLUDE_ONLY
-
-
- } // end of namespace mln::accu::stat
-
- } // end of namespace mln::accu
-
-} // end of namespace mln
-
-#endif // ! MLN_ACCU_STAT_HISTO3D_RGB_HH
diff --git a/scribo/sandbox/green/ok/mln/img_path.hh b/scribo/sandbox/green/ok/mln/img_path.hh
deleted file mode 100644
index d205e1f..0000000
--- a/scribo/sandbox/green/ok/mln/img_path.hh
+++ /dev/null
@@ -1,239 +0,0 @@
-// 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)
-//
-// 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.
-
-#ifndef MLN_IMG_PATH_HH
-# define MLN_IMG_PATH_HH
-
-# define IMG_PATH "/home/green/git/img"
-# define RET_PATH "/home/green/git/result"
-
-# define INIM_IMG_PATH IMG_PATH"/inim"
-# define INIM_BG_IMG_PATH INIM_IMG_PATH"/bg"
-# define INIM_FG_IMG_PATH INIM_IMG_PATH"/fg"
-# define INIM_IN_IMG_PATH INIM_IMG_PATH"/in"
-
-# define OLENA_IMG_PATH IMG_PATH"/olena"
-
-# define ICDAR_IMG_PATH IMG_PATH"/icdar"
-# define ICDAR_100P_IMG_PATH ICDAR_IMG_PATH"/100p"
-# define ICDAR_100P_PPM_IMG_PATH ICDAR_100P_IMG_PATH"/ppm"
-# define ICDAR_100P_PGM_IMG_PATH ICDAR_100P_IMG_PATH"/pgm"
-# define ICDAR_100P_PBM_IMG_PATH ICDAR_100P_IMG_PATH"/pbm"
-# define ICDAR_100P_THICK_IMG_PATH ICDAR_100P_IMG_PATH"/gradient_thick"
-# define ICDAR_100P_THIN_IMG_PATH ICDAR_100P_IMG_PATH"/gradient_thin"
-
-# define ICDAR_50P_IMG_PATH ICDAR_IMG_PATH"/50p"
-# define ICDAR_50P_PPM_IMG_PATH ICDAR_50P_IMG_PATH"/ppm"
-# define ICDAR_50P_PGM_IMG_PATH ICDAR_50P_IMG_PATH"/pgm"
-# define ICDAR_50P_PBM_IMG_PATH ICDAR_50P_IMG_PATH"/pbm"
-
-# define ICDAR_20P_IMG_PATH ICDAR_IMG_PATH"/20p"
-# define ICDAR_20P_TEXT_ONLY_IMG_PATH ICDAR_20P_IMG_PATH"/text-only"
-# define ICDAR_20P_TEXT_COLOR_IMG_PATH ICDAR_20P_IMG_PATH"/text-color"
-# define ICDAR_20P_TEXT_PHOTO_IMG_PATH ICDAR_20P_IMG_PATH"/text-photo"
-# define ICDAR_20P_GMP30_IMG_PATH ICDAR_20P_IMG_PATH"/gimp-pal-30"
-# define ICDAR_20P_MGK30_IMG_PATH ICDAR_20P_IMG_PATH"/magick-pal-30"
-# define ICDAR_20P_GMP20_IMG_PATH ICDAR_20P_IMG_PATH"/gimp-pal-20"
-# define ICDAR_20P_MGK20_IMG_PATH ICDAR_20P_IMG_PATH"/magick-pal-20"
-# define ICDAR_20P_GMP10_IMG_PATH ICDAR_20P_IMG_PATH"/gimp-pal-10"
-# define ICDAR_20P_MGK10_IMG_PATH ICDAR_20P_IMG_PATH"/magick-pal-10"
-# define ICDAR_20P_INPUT_IMG_PATH ICDAR_20P_IMG_PATH"/ppm"
-# define ICDAR_20P_CROP_IMG_PATH ICDAR_20P_IMG_PATH"/crop"
-# define ICDAR_20P_PGM_IMG_PATH ICDAR_20P_IMG_PATH"/pgm"
-# define ICDAR_20P_PPM_IMG_PATH ICDAR_20P_IMG_PATH"/ppm"
-# define ICDAR_20P_PBM_IMG_PATH ICDAR_20P_IMG_PATH"/pbm"
-
-# define AFP_IMG_PATH IMG_PATH"/afp"
-# define AFP_GMP30_IMG_PATH AFP_IMG_PATH"/gimp-pal-30"
-# define AFP_GMP20_IMG_PATH AFP_IMG_PATH"/gimp-pal-20"
-# define AFP_GMP10_IMG_PATH AFP_IMG_PATH"/gimp-pal-10"
-# define AFP_MGK30_IMG_PATH AFP_IMG_PATH"/magick-pal-30"
-# define AFP_MGK20_IMG_PATH AFP_IMG_PATH"/magick-pal-20"
-# define AFP_MGK10_IMG_PATH AFP_IMG_PATH"/magick-pal-10"
-# define AFP_INPUT_IMG_PATH AFP_IMG_PATH"/ppm"
-# define AFP_PPM_IMG_PATH AFP_IMG_PATH"/ppm"
-# define AFP_JPG_IMG_PATH AFP_IMG_PATH"/jpg"
-
-# define ANNOTATING_1_IMG_PATH IMG_PATH"/annotating-1"
-# define ANNOTATING_1_BILL_IMG_PATH ANNOTATING_1_IMG_PATH"/bill"
-# define ANNOTATING_1_FAX_IMG_PATH ANNOTATING_1_IMG_PATH"/fax"
-# define ANNOTATING_1_HANDWRITTEN_IMG_PATH ANNOTATING_1_IMG_PATH"/handwritten"
-# define ANNOTATING_1_LOGO_IMG_PATH ANNOTATING_1_IMG_PATH"/logo"
-# define ANNOTATING_1_MAP_IMG_PATH ANNOTATING_1_IMG_PATH"/map"
-# define ANNOTATING_1_SCREENSHOT_IMG_PATH ANNOTATING_1_IMG_PATH"/screenshot"
-# define ANNOTATING_1_SLIDE_IMG_PATH ANNOTATING_1_IMG_PATH"/slide"
-# define ANNOTATING_1_TYPED_IMG_PATH ANNOTATING_1_IMG_PATH"/typed"
-# define ANNOTATING_1_PHOTO_IMG_PATH ANNOTATING_1_IMG_PATH"/photo"
-
-# define ANNOTATING_2_IMG_PATH IMG_PATH"/annotating-2"
-# define ANNOTATING_2_BILL_IMG_PATH ANNOTATING_2_IMG_PATH"/bill"
-# define ANNOTATING_2_FAX_IMG_PATH ANNOTATING_2_IMG_PATH"/fax"
-# define ANNOTATING_2_HANDWRITTEN_IMG_PATH ANNOTATING_2_IMG_PATH"/handwritten"
-# define ANNOTATING_2_LOGO_IMG_PATH ANNOTATING_2_IMG_PATH"/logo"
-# define ANNOTATING_2_MAP_IMG_PATH ANNOTATING_2_IMG_PATH"/map"
-# define ANNOTATING_2_SCREENSHOT_IMG_PATH ANNOTATING_2_IMG_PATH"/screenshot"
-# define ANNOTATING_2_SLIDE_IMG_PATH ANNOTATING_2_IMG_PATH"/slide"
-# define ANNOTATING_2_TYPED_IMG_PATH ANNOTATING_2_IMG_PATH"/typed"
-# define ANNOTATING_2_PHOTO_IMG_PATH ANNOTATING_2_IMG_PATH"/photo"
-
-// result directories
-# define ANNOTATING_RET_PATH RET_PATH"/annotating"
-
-# define ANNOTATING_ICDAR_RET_PATH ANNOTATING_RET_PATH"/icdar"
-
-# define ANNOTATING_ICDAR_INPUT_RET_PATH ANNOTATING_ICDAR_RET_PATH"/input"
-# define ANNOTATING_ICDAR_H_INPUT_RET_PATH ANNOTATING_ICDAR_INPUT_RET_PATH"/h"
-# define ANNOTATING_ICDAR_S_INPUT_RET_PATH ANNOTATING_ICDAR_INPUT_RET_PATH"/s"
-# define ANNOTATING_ICDAR_V_INPUT_RET_PATH ANNOTATING_ICDAR_INPUT_RET_PATH"/v"
-# define ANNOTATING_ICDAR_R_INPUT_RET_PATH ANNOTATING_ICDAR_INPUT_RET_PATH"/r"
-# define ANNOTATING_ICDAR_G_INPUT_RET_PATH ANNOTATING_ICDAR_INPUT_RET_PATH"/g"
-# define ANNOTATING_ICDAR_B_INPUT_RET_PATH ANNOTATING_ICDAR_INPUT_RET_PATH"/b"
-
-# define ANNOTATING_ICDAR_GMP30_RET_PATH ANNOTATING_ICDAR_RET_PATH"/gimp-pal-30"
-# define ANNOTATING_ICDAR_H_GMP30_RET_PATH ANNOTATING_ICDAR_GMP30_RET_PATH"/h"
-# define ANNOTATING_ICDAR_S_GMP30_RET_PATH ANNOTATING_ICDAR_GMP30_RET_PATH"/s"
-# define ANNOTATING_ICDAR_V_GMP30_RET_PATH ANNOTATING_ICDAR_GMP30_RET_PATH"/v"
-# define ANNOTATING_ICDAR_R_GMP30_RET_PATH ANNOTATING_ICDAR_GMP30_RET_PATH"/r"
-# define ANNOTATING_ICDAR_G_GMP30_RET_PATH ANNOTATING_ICDAR_GMP30_RET_PATH"/g"
-# define ANNOTATING_ICDAR_B_GMP30_RET_PATH ANNOTATING_ICDAR_GMP30_RET_PATH"/b"
-
-# define ANNOTATING_ICDAR_GMP20_RET_PATH ANNOTATING_ICDAR_RET_PATH"/gimp-pal-20"
-# define ANNOTATING_ICDAR_H_GMP20_RET_PATH ANNOTATING_ICDAR_GMP20_RET_PATH"/h"
-# define ANNOTATING_ICDAR_S_GMP20_RET_PATH ANNOTATING_ICDAR_GMP20_RET_PATH"/s"
-# define ANNOTATING_ICDAR_V_GMP20_RET_PATH ANNOTATING_ICDAR_GMP20_RET_PATH"/v"
-# define ANNOTATING_ICDAR_R_GMP20_RET_PATH ANNOTATING_ICDAR_GMP20_RET_PATH"/r"
-# define ANNOTATING_ICDAR_G_GMP20_RET_PATH ANNOTATING_ICDAR_GMP20_RET_PATH"/g"
-# define ANNOTATING_ICDAR_B_GMP20_RET_PATH ANNOTATING_ICDAR_GMP20_RET_PATH"/b"
-
-# define ANNOTATING_ICDAR_GMP10_RET_PATH ANNOTATING_ICDAR_RET_PATH"/gimp-pal-10"
-# define ANNOTATING_ICDAR_H_GMP10_RET_PATH ANNOTATING_ICDAR_GMP10_RET_PATH"/h"
-# define ANNOTATING_ICDAR_S_GMP10_RET_PATH ANNOTATING_ICDAR_GMP10_RET_PATH"/s"
-# define ANNOTATING_ICDAR_V_GMP10_RET_PATH ANNOTATING_ICDAR_GMP10_RET_PATH"/v"
-# define ANNOTATING_ICDAR_R_GMP10_RET_PATH ANNOTATING_ICDAR_GMP10_RET_PATH"/r"
-# define ANNOTATING_ICDAR_G_GMP10_RET_PATH ANNOTATING_ICDAR_GMP10_RET_PATH"/g"
-# define ANNOTATING_ICDAR_B_GMP10_RET_PATH ANNOTATING_ICDAR_GMP10_RET_PATH"/b"
-
-# define ANNOTATING_ICDAR_MGK30_RET_PATH ANNOTATING_ICDAR_RET_PATH"/magick-pal-30"
-# define ANNOTATING_ICDAR_H_MGK30_RET_PATH ANNOTATING_ICDAR_MGK30_RET_PATH"/h"
-# define ANNOTATING_ICDAR_S_MGK30_RET_PATH ANNOTATING_ICDAR_MGK30_RET_PATH"/s"
-# define ANNOTATING_ICDAR_V_MGK30_RET_PATH ANNOTATING_ICDAR_MGK30_RET_PATH"/v"
-# define ANNOTATING_ICDAR_R_MGK30_RET_PATH ANNOTATING_ICDAR_MGK30_RET_PATH"/r"
-# define ANNOTATING_ICDAR_G_MGK30_RET_PATH ANNOTATING_ICDAR_MGK30_RET_PATH"/g"
-# define ANNOTATING_ICDAR_B_MGK30_RET_PATH ANNOTATING_ICDAR_MGK30_RET_PATH"/b"
-
-# define ANNOTATING_ICDAR_MGK20_RET_PATH ANNOTATING_ICDAR_RET_PATH"/magick-pal-20"
-# define ANNOTATING_ICDAR_H_MGK20_RET_PATH ANNOTATING_ICDAR_MGK20_RET_PATH"/h"
-# define ANNOTATING_ICDAR_S_MGK20_RET_PATH ANNOTATING_ICDAR_MGK20_RET_PATH"/s"
-# define ANNOTATING_ICDAR_V_MGK20_RET_PATH ANNOTATING_ICDAR_MGK20_RET_PATH"/v"
-# define ANNOTATING_ICDAR_R_MGK20_RET_PATH ANNOTATING_ICDAR_MGK20_RET_PATH"/r"
-# define ANNOTATING_ICDAR_G_MGK20_RET_PATH ANNOTATING_ICDAR_MGK20_RET_PATH"/g"
-# define ANNOTATING_ICDAR_B_MGK20_RET_PATH ANNOTATING_ICDAR_MGK20_RET_PATH"/b"
-
-# define ANNOTATING_ICDAR_MGK10_RET_PATH ANNOTATING_ICDAR_RET_PATH"/magick-pal-10"
-# define ANNOTATING_ICDAR_H_MGK10_RET_PATH ANNOTATING_ICDAR_MGK10_RET_PATH"/h"
-# define ANNOTATING_ICDAR_S_MGK10_RET_PATH ANNOTATING_ICDAR_MGK10_RET_PATH"/s"
-# define ANNOTATING_ICDAR_V_MGK10_RET_PATH ANNOTATING_ICDAR_MGK10_RET_PATH"/v"
-# define ANNOTATING_ICDAR_R_MGK10_RET_PATH ANNOTATING_ICDAR_MGK10_RET_PATH"/r"
-# define ANNOTATING_ICDAR_G_MGK10_RET_PATH ANNOTATING_ICDAR_MGK10_RET_PATH"/g"
-# define ANNOTATING_ICDAR_B_MGK10_RET_PATH ANNOTATING_ICDAR_MGK10_RET_PATH"/b"
-
-
-
-
-# define ANNOTATING_AFP_RET_PATH ANNOTATING_RET_PATH"/afp"
-
-# define ANNOTATING_AFP_INPUT_RET_PATH ANNOTATING_AFP_RET_PATH"/input"
-# define ANNOTATING_AFP_H_INPUT_RET_PATH ANNOTATING_AFP_INPUT_RET_PATH"/h"
-# define ANNOTATING_AFP_S_INPUT_RET_PATH ANNOTATING_AFP_INPUT_RET_PATH"/s"
-# define ANNOTATING_AFP_V_INPUT_RET_PATH ANNOTATING_AFP_INPUT_RET_PATH"/v"
-# define ANNOTATING_AFP_R_INPUT_RET_PATH ANNOTATING_AFP_INPUT_RET_PATH"/r"
-# define ANNOTATING_AFP_G_INPUT_RET_PATH ANNOTATING_AFP_INPUT_RET_PATH"/g"
-# define ANNOTATING_AFP_B_INPUT_RET_PATH ANNOTATING_AFP_INPUT_RET_PATH"/b"
-
-# define ANNOTATING_AFP_GMP30_RET_PATH ANNOTATING_AFP_RET_PATH"/gimp-pal-30"
-# define ANNOTATING_AFP_H_GMP30_RET_PATH ANNOTATING_AFP_GMP30_RET_PATH"/h"
-# define ANNOTATING_AFP_S_GMP30_RET_PATH ANNOTATING_AFP_GMP30_RET_PATH"/s"
-# define ANNOTATING_AFP_V_GMP30_RET_PATH ANNOTATING_AFP_GMP30_RET_PATH"/v"
-# define ANNOTATING_AFP_R_GMP30_RET_PATH ANNOTATING_AFP_GMP30_RET_PATH"/r"
-# define ANNOTATING_AFP_G_GMP30_RET_PATH ANNOTATING_AFP_GMP30_RET_PATH"/g"
-# define ANNOTATING_AFP_B_GMP30_RET_PATH ANNOTATING_AFP_GMP30_RET_PATH"/b"
-
-# define ANNOTATING_AFP_GMP20_RET_PATH ANNOTATING_AFP_RET_PATH"/gimp-pal-20"
-# define ANNOTATING_AFP_H_GMP20_RET_PATH ANNOTATING_AFP_GMP20_RET_PATH"/h"
-# define ANNOTATING_AFP_S_GMP20_RET_PATH ANNOTATING_AFP_GMP20_RET_PATH"/s"
-# define ANNOTATING_AFP_V_GMP20_RET_PATH ANNOTATING_AFP_GMP20_RET_PATH"/v"
-# define ANNOTATING_AFP_R_GMP20_RET_PATH ANNOTATING_AFP_GMP20_RET_PATH"/r"
-# define ANNOTATING_AFP_G_GMP20_RET_PATH ANNOTATING_AFP_GMP20_RET_PATH"/g"
-# define ANNOTATING_AFP_B_GMP20_RET_PATH ANNOTATING_AFP_GMP20_RET_PATH"/b"
-
-# define ANNOTATING_AFP_GMP10_RET_PATH ANNOTATING_AFP_RET_PATH"/gimp-pal-10"
-# define ANNOTATING_AFP_H_GMP10_RET_PATH ANNOTATING_AFP_GMP10_RET_PATH"/h"
-# define ANNOTATING_AFP_S_GMP10_RET_PATH ANNOTATING_AFP_GMP10_RET_PATH"/s"
-# define ANNOTATING_AFP_V_GMP10_RET_PATH ANNOTATING_AFP_GMP10_RET_PATH"/v"
-# define ANNOTATING_AFP_R_GMP10_RET_PATH ANNOTATING_AFP_GMP10_RET_PATH"/r"
-# define ANNOTATING_AFP_G_GMP10_RET_PATH ANNOTATING_AFP_GMP10_RET_PATH"/g"
-# define ANNOTATING_AFP_B_GMP10_RET_PATH ANNOTATING_AFP_GMP10_RET_PATH"/b"
-
-# define ANNOTATING_AFP_MGK30_RET_PATH ANNOTATING_AFP_RET_PATH"/magick-pal-30"
-# define ANNOTATING_AFP_H_MGK30_RET_PATH ANNOTATING_AFP_MGK30_RET_PATH"/h"
-# define ANNOTATING_AFP_S_MGK30_RET_PATH ANNOTATING_AFP_MGK30_RET_PATH"/s"
-# define ANNOTATING_AFP_V_MGK30_RET_PATH ANNOTATING_AFP_MGK30_RET_PATH"/v"
-# define ANNOTATING_AFP_R_MGK30_RET_PATH ANNOTATING_AFP_MGK30_RET_PATH"/r"
-# define ANNOTATING_AFP_G_MGK30_RET_PATH ANNOTATING_AFP_MGK30_RET_PATH"/g"
-# define ANNOTATING_AFP_B_MGK30_RET_PATH ANNOTATING_AFP_MGK30_RET_PATH"/b"
-
-# define ANNOTATING_AFP_MGK20_RET_PATH ANNOTATING_AFP_RET_PATH"/magick-pal-20"
-# define ANNOTATING_AFP_H_MGK20_RET_PATH ANNOTATING_AFP_MGK20_RET_PATH"/h"
-# define ANNOTATING_AFP_S_MGK20_RET_PATH ANNOTATING_AFP_MGK20_RET_PATH"/s"
-# define ANNOTATING_AFP_V_MGK20_RET_PATH ANNOTATING_AFP_MGK20_RET_PATH"/v"
-# define ANNOTATING_AFP_R_MGK20_RET_PATH ANNOTATING_AFP_MGK20_RET_PATH"/r"
-# define ANNOTATING_AFP_G_MGK20_RET_PATH ANNOTATING_AFP_MGK20_RET_PATH"/g"
-# define ANNOTATING_AFP_B_MGK20_RET_PATH ANNOTATING_AFP_MGK20_RET_PATH"/b"
-
-# define ANNOTATING_AFP_MGK10_RET_PATH ANNOTATING_AFP_RET_PATH"/magick-pal-10"
-# define ANNOTATING_AFP_H_MGK10_RET_PATH ANNOTATING_AFP_MGK10_RET_PATH"/h"
-# define ANNOTATING_AFP_S_MGK10_RET_PATH ANNOTATING_AFP_MGK10_RET_PATH"/s"
-# define ANNOTATING_AFP_V_MGK10_RET_PATH ANNOTATING_AFP_MGK10_RET_PATH"/v"
-# define ANNOTATING_AFP_R_MGK10_RET_PATH ANNOTATING_AFP_MGK10_RET_PATH"/r"
-# define ANNOTATING_AFP_G_MGK10_RET_PATH ANNOTATING_AFP_MGK10_RET_PATH"/g"
-# define ANNOTATING_AFP_B_MGK10_RET_PATH ANNOTATING_AFP_MGK10_RET_PATH"/b"
-
-
-# define ANNOTATING_BILL_RET_PATH ANNOTATING_RET_PATH"/bill"
-# define ANNOTATING_FAX_RET_PATH ANNOTATING_RET_PATH"/fax"
-# define ANNOTATING_HANDWRITTEN_RET_PATH ANNOTATING_RET_PATH"/handwritten"
-# define ANNOTATING_LOGO_RET_PATH ANNOTATING_RET_PATH"/logo"
-# define ANNOTATING_MAP_RET_PATH ANNOTATING_RET_PATH"/map"
-# define ANNOTATING_SCREENSHOT_RET_PATH ANNOTATING_RET_PATH"/screenshot"
-# define ANNOTATING_SLIDE_RET_PATH ANNOTATING_RET_PATH"/slide"
-# define ANNOTATING_TYPED_RET_PATH ANNOTATING_RET_PATH"/typed"
-# define ANNOTATING_PHOTO_RET_PATH ANNOTATING_RET_PATH"/photo"
-
-# define ANNOTATING_ICDAR_ACHROMATISM_RET_PATH ANNOTATING_ICDAR_RET_PATH"/achromatism"
-
-
-#endif // ! MLN_IMG_PATH_HH
diff --git a/scribo/sandbox/green/ok/test/accu/histo/gaussian.sh b/scribo/sandbox/green/ok/test/accu/histo/gaussian.sh
deleted file mode 100755
index 4d2164a..0000000
--- a/scribo/sandbox/green/ok/test/accu/histo/gaussian.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-############
-# gaussian #
-############
-
-gnuplot <<EOF
-set terminal x11 persist 1
-square(x)=x*x
-gaussian(x,mean,sigma)=exp(-0.5*square((x-mean)/sigma))/(sigma*sqrt(2*pi))
-plot [-20:20] gaussian(x,0,6)
-EOF
diff --git a/scribo/sandbox/green/ok/test/accu/histo/histo1d b/scribo/sandbox/green/ok/test/accu/histo/histo1d
deleted file mode 100755
index b277232943e4d2dba3f588f8a5de24cd17e73c04..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 808312
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%0A{PsCyGO_nuj6
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	Xsiw$-?w-TpI#vJF|XnaFQ|BU1k7
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�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↰GWiElXR~4aQGvf4|0UHc!qS=(*M}`
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
XYm(~HHk}+_JwX3S8HW6B7~TH?w(8uT
diff --git a/scribo/sandbox/green/ok/test/accu/histo/histo1d.cc b/scribo/sandbox/green/ok/test/accu/histo/histo1d.cc
deleted file mode 100644
index 3d542cd..0000000
--- a/scribo/sandbox/green/ok/test/accu/histo/histo1d.cc
+++ /dev/null
@@ -1,726 +0,0 @@
-/// TEST HISTO1D
-
-#include <mln/accu/histo/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/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);
-
- return 0;
-}
-
-// #include <mln/img_path.hh>
-
-// #include <mln/io/plot/save_histo_sh.hh>
-// #include <mln/accu/stat/histo1d.hh>
-// #include <mln/fun/v2v/int_u16_to_int_u14.hh>
-
-// #include <mln/io/pgm/load.hh>
-// #include <mln/io/pgm/save.hh>
-// #include <mln/io/ppm/save.hh>
-// #include <mln/io/plot/save.hh>
-
-// #include <mln/data/compute.hh>
-// #include <mln/data/transform.hh>
-// #include <mln/data/fill.hh>
-
-// #include <mln/value/int_u8.hh>
-// #include <mln/value/int_u16.hh>
-// #include <mln/value/int_u.hh>
-// #include <mln/value/label_8.hh>
-// #include <mln/value/rgb8.hh>
-
-// #include <mln/core/alias/neighb1d.hh>
-// #include <mln/core/alias/box1d.hh>
-// #include <mln/core/alias/point1d.hh>
-
-// #include <mln/core/routine/initialize.hh>
-// #include <mln/core/contract.hh>
-// #include <mln/core/grids.hh>
-
-// #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/morpho/watershed/flooding.hh>
-// #include <mln/morpho/elementary/dilation.hh>
-// #include <mln/morpho/elementary/closing.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>
-
-// #include <mln/make/w_window1d.hh>
-
-// #include <mln/math/sqr.hh>
-// #include <mln/math/pi.hh>
-// #include <mln/math/abs.hh>
-
-// #include <mln/core/image/dmorph/image_if.hh>
-// #include <mln/pw/value.hh>
-
-// //------------------------------------------------------------------------------
-// // TEST IN 8 BITS
-// //------------------------------------------------------------------------------
-
-
-// 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);
-
-// 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;
-// }
-
-// double count_histo(mln::image1d<unsigned> img)
-// {
-// mln_precondition(img.is_valid());
-
-// double result = 0.0;
-// mln_piter_(mln::image1d<unsigned>) p(img.domain());
-
-// for_all(p)
-// result += img(p);
-
-// return result;
-// }
-
-// double mean_histo(mln::image1d<unsigned> img)
-// {
-// mln_precondition(img.is_valid());
-
-// double count = 0.0;
-// double sum = 0.0;
-// double result = 0.0;
-// mln_piter_(mln::image1d<unsigned>) p(img.domain());
-
-// for_all(p)
-// {
-// count += img(p);
-// sum += p[0] * img(p);
-// }
-
-// result = sum / count;
-
-// return result;
-// }
-
-
-// double var_histo(mln::image1d<unsigned> img)
-// {
-// mln_precondition(img.is_valid());
-
-// 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)
-// {
-// count += img(p);
-// sum += p[0] * img(p);
-// sum2 += p[0] * p[0] * img(p);
-// }
-
-// result = sum2 / count - (sum / count) * (sum / count);
-
-// return result;
-// }
-
-// double var_histo2(mln::image1d<unsigned> img)
-// {
-// mln_precondition(img.is_valid());
-
-// 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)
-// {
-// result += img(p) * (p[0] - mean) * (p[0] - mean);
-// }
-
-// result /= count;
-
-// return result;
-// }
-
-// 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);
-// // img_res = mln::data::compute(mln::accu::stat::histo1d<int_u8>(), 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 );
-// mln_assertion(0.0001 > abs(var_ref - var_res));
-
-// std::cout << "(08 bits) test integration : ok" << std::endl;
-// }
-
-// double gaussian_distribution(double x, double mean, double sigma)
-// {
-// double num = exp(-0.5*mln::math::sqr((x - mean)/sigma));
-// double denom = sigma*mln::math::sqrt(2*mln::math::pi);
-// double result = num/denom;
-
-// return result;
-// }
-
-// /// To calibrate with gnuplot (see gaussian.sh)
-// /// square(x) = x*x
-// /// gaussian(x,mean,sigma)=exp(-0.5*square((x-mean)/sigma))/(sigma*sqrt(2*pi))
-// /// plot [-20:20] gaussian(x,0,6.0)
-
-// void gaussian_filter(double ws[], unsigned size, double sigma)
-// {
-// int h = size/2;
-
-// for (int i = -h; i <= h; ++i)
-// {
-// ws[i+h] = gaussian_distribution(i, 0.0, sigma);
-// }
-
-// double sum = 0.0;
-
-// for (unsigned i = 0; i < size; ++i)
-// sum += ws[i];
-
-// for (unsigned i = 0; i < size; ++i)
-// ws[i] /= sum;
-// }
-
-// /// The aim of this function is to rebuild an label image2d from the segmenting
-// /// image of the histogram (label) and the original image (input).
-// /// label_image2d / for each grey tone, associate its label.
-
-// mln::image2d<mln::value::label_8>
-// build_8bits(const mln::image2d<mln::value::int_u8>& input,
-// const mln::image1d<mln::value::label_8>& label)
-// {
-// mln::trace::entering("build_8bits");
-// mln_precondition(label.is_valid());
-// mln_precondition(input.is_valid());
-
-// mln::image2d<mln::value::label_8> output;
-
-// mln::initialize(output, input);
-
-// mln_piter_(mln::image2d<mln::value::int_u8>) pi(input.domain());
-// mln_piter_(mln::image2d<mln::value::label_8>) po(output.domain());
-
-// for_all_2(pi, po)
-// {
-// mln::value::int_u8 val = input(pi);
-// unsigned grp = label(mln::point1d(val));
-
-// output(po) = grp;
-// }
-
-// mln::trace::exiting("build_8bits");
-// return output;
-// }
-
-
-// void test_8bits_classifying()
-// {
-// typedef mln::value::int_u8 int_u8;
-// typedef mln::value::label_8 label_8;
-// typedef mln::value::rgb8 rgb8;
-// typedef mln::accu::stat::mean<double> mean;
-
-// mln::image2d<int_u8> img_ref;
-// mln::image2d<int_u8> img_out;
-// mln::image2d<rgb8> img_rgb;
-// mln::image1d<unsigned> img_res;
-// mln::image1d<double> img_smooth;
-// mln::image1d<label_8> labels;
-// label_8 nlabels;
-
-// //-----------------------------------------------------
-// // Loading the scribo image and computing its histogram
-// //-----------------------------------------------------
-
-// std::cout << "(08 bits) LOADING HISTOGRAM" << std::endl;
-
-// // mln::io::pgm::load(img_ref, OLENA_IMG_PATH"/lena.pgm");
-// mln::io::pgm::load(img_ref, SCRIBO_IMG_PATH"/mp00082c_50p_8bits.pgm");
-// img_res = mln::data::compute(mln::accu::stat::histo1d<int_u8>(), img_ref);
-// mln::io::plot::save_histo_sh(img_res, "histo0_8bits.sh");
-
-
-// //-----------------------------------------------------
-// // Smoothing the histogram with a gaussian filter
-// //-----------------------------------------------------
-
-// std::cout << "(08 bits) SMOOTHING HISTOGRAM" << std::endl;
-
-// double ws[41];
-// gaussian_filter(ws, 41, 6.0);
-// img_smooth = mln::linear::convolve(img_res, mln::make::w_window1d(ws));
-// mln::io::plot::save_histo_sh(img_smooth, "histo1_8bits.sh");
-
-
-// //-----------------------------------------------------
-// // Segmenting the histogram with the watershed method
-// //-----------------------------------------------------
-
-// std::cout << "SEGMENTING HISTOGRAM" << std::endl;
-
-// /*
-// labels = mln::labeling::regional_maxima(img_smooth, mln::c2(), nlabels);
-// std::cout << "N labels : " << nlabels << std::endl;
-// mln::io::plot::save_histo_sh(labels, "histo2_8bits.sh");
-// */
-
-
-// labels = mln::morpho::watershed::flooding(img_smooth, mln::c2(), nlabels);
-// std::cout << "N labels : " << nlabels << std::endl;
-// mln::io::plot::save_histo_sh(labels, "histo2_8bits.sh");
-
-
-// //-----------------------------------------------------
-// // Rebuilding the image with the mean of each region
-// //-----------------------------------------------------
-
-// std::cout << "(08 bits) BUILDING OUTPUT" << std::endl;
-
-// mln::image2d<label_8>img_label = build_8bits(img_ref, labels);
-
-// std::cout << "(08 bits) COLORING OUTPUT" << std::endl;
-
-// img_out = mln::labeling::mean_values(img_ref, img_label, nlabels);
-// img_rgb = mln::labeling::colorize(rgb8(), img_label);
-
-// mln::io::pgm::save(img_out, "out_8bits.pgm");
-// mln::io::ppm::save(img_rgb, "color_8bits.pgm");
-
-// //labels = mln::morpho::elementary::dilation(labels, mln::c2());
-// //mln::io::plot::save_histo_sh(labels, "histo3.sh");
-// //mln::io::plot::save(labels, "labelized.data");
-// }
-
-// //------------------------------------------------------------------------------
-// // TEST IN 15 BITS
-// //------------------------------------------------------------------------------
-
-// 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.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;
-// }
-
-// /// The aim of this function is to rebuild an label image2d from the segmenting
-// /// image of the histogram (label) and the original image (input).
-// /// label_image2d / for each grey tone, associate its label.
-
-// mln::image2d<mln::value::label_8>
-// build_14bits(const mln::image2d<mln::value::int_u<14> >& input,
-// const mln::image1d<mln::value::label_8>& label)
-// {
-// mln::trace::entering("build_14bits");
-// mln_precondition(label.is_valid());
-// mln_precondition(input.is_valid());
-
-// mln::image2d<mln::value::label_8> output;
-
-// mln::initialize(output, input);
-
-// mln_piter_(mln::image2d<mln::value::int_u<14> >) pi(input.domain());
-// mln_piter_(mln::image2d<mln::value::label_8>) po(output.domain());
-
-// for_all_2(pi, po)
-// {
-// mln::value::int_u<14> val = input(pi);
-// unsigned grp = label(mln::point1d(val));
-
-// output(po) = grp;
-// }
-
-// mln::trace::exiting("build_14bits");
-// return output;
-// }
-
-
-// void test_14bits_classifying()
-// {
-// typedef mln::value::int_u16 int_u16;
-// typedef mln::value::int_u<14> int_u14;
-// typedef mln::value::label_8 label_8;
-// typedef mln::value::rgb8 rgb8;
-// typedef mln::accu::stat::mean<double> mean;
-
-// mln::image2d<int_u16> img_fst;
-// mln::image2d<int_u14> img_ref;
-// mln::image2d<int_u14> img_out;
-// mln::image2d<rgb8> img_rgb;
-// mln::image1d<unsigned> img_res;
-// mln::image1d<double> img_smooth;
-// mln::image1d<label_8> labels;
-// label_8 nlabels;
-
-// //-----------------------------------------------------
-// // Loading the scribo image and computing its histogram
-// //-----------------------------------------------------
-
-// std::cout << "(14 bits) LOADING HISTOGRAM" << std::endl;
-
-// //mln::io::pgm::load(img_fst, OLENA_IMG_PATH"/lena_16.pgm");
-// mln::io::pgm::load(img_fst, SCRIBO_IMG_PATH"/mp00082c_50p_16bits.pgm");
-// img_ref = mln::data::transform(img_fst, mln::fun::v2v::int_u16_to_int_u14());
-// img_res = mln::data::compute(mln::accu::stat::histo1d<int_u14>(), img_ref);
-// mln::io::plot::save_histo_sh(img_res, "histo0_14bits.sh");
-
-
-// //-----------------------------------------------------
-// // Smoothing the histogram with a gaussian filter
-// //-----------------------------------------------------
-
-// std::cout << "(14 bits) SMOOTHING HISTOGRAM" << std::endl;
-
-// double ws[401];
-// gaussian_filter(ws, 401, 50.0);
-// img_smooth = mln::linear::convolve(img_res, mln::make::w_window1d(ws));
-// mln::io::plot::save_histo_sh(img_smooth, "histo1_14bits.sh");
-
-
-// //-----------------------------------------------------
-// // Segmenting the histogram with the watershed method
-// //-----------------------------------------------------
-
-// std::cout << "(14 bits) SEGMENTING HISTOGRAM" << std::endl;
-
-// /*
-// labels = mln::labeling::regional_maxima(img_smooth, mln::c2(), nlabels);
-// std::cout << "N labels : " << nlabels << std::endl;
-// mln::io::plot::save_histo_sh(labels, "histo2.sh");
-// */
-
-
-// labels = mln::morpho::watershed::flooding(img_smooth, mln::c2(), nlabels);
-// std::cout << "N labels : " << nlabels << std::endl;
-// mln::io::plot::save_histo_sh(labels, "histo2_14bits.sh");
-
-
-// //-----------------------------------------------------
-// // Rebuilding the image with the mean of each region
-// //-----------------------------------------------------
-
-// std::cout << "(14 bits) BUILDING OUTPUT" << std::endl;
-
-// mln::image2d<label_8>img_label = build_14bits(img_ref, labels);
-
-// std::cout << "(14 bits) COLORING OUTPUT" << std::endl;
-
-// img_out = mln::labeling::mean_values(img_ref, img_label, nlabels);
-// img_rgb = mln::labeling::colorize(rgb8(), img_label);
-
-// mln::io::pgm::save(img_out, "out_14bits.pgm");
-// mln::io::ppm::save(img_rgb, "color_14bits.pgm");
-
-// //labels = mln::morpho::elementary::dilation(labels, mln::c2());
-// //mln::io::plot::save_histo_sh(labels, "histo3.sh");
-// //mln::io::plot::save(labels, "labelized.data");
-// }
-
-// int main()
-// {
-// 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();
-
-// //test_8bits_classifying();
-
-// // PROBLEME AVEC LES COORDONNEES PAR DEFAUT QUI SONT EN SIGNED SHORT
-// // SEE mln/core/def/coord.hh
-// /*
-// test_14bits_instantiation_without_argument();
-// test_14bits_initialization();
-// test_14bits_take_argument();
-// test_14bits_take_other();
-// test_14bits_operator_equal();
-// test_14bits_integration();
-// */
-// //test_14bits_classifying();
-
-// return 0;
-// }
--
1.5.6.5
1
0
* README.green: New index for source files in scribo/sandbox/green.
* README.img: New index for image database.
* README.result: New index for histogram database.
---
scribo/sandbox/green/ChangeLog | 11 ++-
scribo/sandbox/green/{README => README.green} | 58 ++++++++--
scribo/sandbox/green/README.img | 124 +++++++++++++++++++++
scribo/sandbox/green/README.result | 143 +++++++++++++++++++++++++
4 files changed, 324 insertions(+), 12 deletions(-)
rename scribo/sandbox/green/{README => README.green} (89%)
create mode 100644 scribo/sandbox/green/README.img
create mode 100644 scribo/sandbox/green/README.result
diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog
index dc5284e..7e5b4bb 100644
--- a/scribo/sandbox/green/ChangeLog
+++ b/scribo/sandbox/green/ChangeLog
@@ -1,4 +1,13 @@
-2010-06-23 green <jacquelet(a)lrde.epita.fr>
+2010-06-24 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Define documentation files.
+
+ * README: Delete this file and replace it by README.green.
+ * README.green: New index for source files in scribo/sandbox/green.
+ * README.img: New index for image database.
+ * README.result: New index for histogram database.
+
+2010-06-23 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
Define gnuplot shell export format.
diff --git a/scribo/sandbox/green/README b/scribo/sandbox/green/README.green
similarity index 89%
rename from scribo/sandbox/green/README
rename to scribo/sandbox/green/README.green
index 03106d3..3f3c9a9 100644
--- a/scribo/sandbox/green/README
+++ b/scribo/sandbox/green/README.green
@@ -227,26 +227,62 @@ n'importe quel algorithme type huffman (tous les archiveurs en possède un).
-VI MLN
------
+VIII VISUALISATION HISTOGRAMMES 3D
+----------------------------------
-a) La sauvegarde des images au format gnuplot shell
+==> to do
-* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
-to do ...
+* demo/accu/stat/histo2d
+* mln/display/dispay_histo.hh
+* mln/display/project_histo.hh
+IX KMEANS
+---------
+
+Ce travail m'avait été demandé par théo. Je le laisse inachevé, quelque part
+perdu pendant l'optimisation du code et sa transformation en canevas.
+
+* mln/clustering/k_mean.hh: Première implémentation avec matrices et vecteurs.
+* mln/clustering/kmean1d.hh: Implémentation 1d avec des images.
+* mln/clustering/kmean2d.hh: Implémentation 2d avec des images.
+* mln/clustering/kmean3d.hh: Implémentation 3d avec des images.
+* mln/clustering/kmean_rgb.hh: Impl. 3d aplatie et en cours de mise en canevas.
+
+* tests/clustering/k_mean: Tests unitaires sur la permière version.
+* tests/clustering/kmean1d: Tests unitaire sur la version 1d.
+
+* demo/clustering/kmean1d: Utilisation de la version 1d.
+* demo/clustering/kmean2d: Utilisation de la version 2d.
+* demo/clustering/kmean3d: Utilisation de la version 3d.
+* demo/clustering/kmean_rgb: Utilisation de la version aplatie.
+
+* bench/clustering/distance: Comparaison algorithmes d'évaluation des distances.
+
+==> to do
+
+X REGIONAL MAXIMA
+-----------------
+
+==> to do
+
+
+XI ANNOTATING
+-------------
+
+==> to do
+
+
+a) La sauvegarde des images au format gnuplot shell
+
+* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
+
+to do ...
-VII VISUALISATION HISTOGRAMMES 3D
----------------------------------
-c) La visualisation des histogrammes 3d
-* demo/accu/stat/histo2d
-* mln/display/dispay_histo.hh
-* mln/displayproject_histo.hh
diff --git a/scribo/sandbox/green/README.img b/scribo/sandbox/green/README.img
new file mode 100644
index 0000000..c606a93
--- /dev/null
+++ b/scribo/sandbox/green/README.img
@@ -0,0 +1,124 @@
+I DESCRIPTION DES BASES D'IMAGES
+--------------------------------
+
+img ==> Répertoire des bases d'images
+img/afp ==> Extrait de la base AFP (50 photos avec texte)
+img/annotating-1 ==> Base diversifiée internet trop faible qualité
+img/annotating-2 ==> Base diversifiée internet meilleur qualité
+img/icdar ==> Base ICDAR en 20p/50p/100p (+quelques ajouts)
+img/inim ==> Base complète du cours inim
+img/olena ==> Images de tests d'olena (+quelques ajouts)
+
+
+II DESCRIPTION DE CHAQUE BASE
+-----------------------------
+
+A) BASE AFP
+
+img/afp/magick-pal-30-gen.sh ==> Génération base AFP 30 couleurs (imageMagick)
+img/afp/magick-pal-20-gen.sh ==> Génération base AFP 20 couleurs (imageMagick)
+img/afp/magick-pal-10-gen.sh ==> Génération base AFP 10 couleurs (imageMagick)
+
+img/afp/gimp-pal-30-gen.sh ==> Génération base AFP 30 couleurs (Gimp)
+img/afp/gimp-pal-20-gen.sh ==> Génération base AFP 20 couleurs (Gimp)
+img/afp/gimp-pal-10-gen.sh ==> Génération base AFP 10 couleurs (Gimp)
+
+Ne pas oublier le script de réduction des couleurs pour Gimp.
+
+$ more ~/.gimp-2.6/scripts/reduce-color.scm
+(define (reduce-color filein fileout nbcol)
+ (let* ((image (car (gimp-file-load RUN-NONINTERACTIVE filein filein)))
+ (drawable (car (gimp-image-get-active-layer image)))
+ )
+ (gimp-image-convert-indexed image NO-DITHER MAKE-PALETTE nbcol FALSE FALSE "")
+ (gimp-image-convert-rgb image)
+ (gimp-file-save RUN-NONINTERACTIVE image drawable fileout fileout)
+ (gimp-image-delete image)
+ ))
+
+img/afp/magick-pal-30 ==> Base AFP 30 couleurs (imageMagick)
+img/afp/magick-pal-20 ==> Base AFP 20 couleurs (imageMagick)
+img/afp/magick-pal-10 ==> Base AFP 10 couleurs (imageMagick)
+
+img/afp/gimp-pal-30 ==> Base AFP 30 couleurs (Gimp)
+img/afp/gimp-pal-20 ==> Base AFP 20 couleurs (Gimp)
+img/afp/gimp-pal-10 ==> Base AFP 10 couleurs (Gimp)
+
+img/afp/ppm ==> Base AFP originale convertie en ppm
+img/afp/jpg ==> Base AFP originale
+
+
+B) BASE ANNOTATING-1
+
+img/annotating-1/screenshot ==> Fond d'écran, capture d'écran
+img/annotating-1/slide ==> Transparents commerciaux ou conférences
+img/annotating-1/handwritten ==> Ecritures manuscrites
+img/annotating-1/map ==> Cartes marines, de régions, de villes
+img/annotating-1/photo ==> Photo AFP
+img/annotating-1/logo ==> Logos de toute sorte, de toute taille
+img/annotating-1/typed ==> Documents textuels impimés
+img/annotating-1/fax ==> Faxs
+img/annotating-1/bill ==> Factures téléphones, eau ...
+
+
+C) BASE ANNOTATING-2
+
+img/annotating-2/slide ==> Transparents commerciaux ou conférences
+img/annotating-2/handwritten ==> Ecritures manuscrites
+img/annotating-2/logo ==> Logos de toute sorte, de toute taille
+img/annotating-2/typed ==> Documents textuels impimés
+img/annotating-1/bill ==> Factures téléphones, eau ...
+
+
+D) BASE ICDAR
+
+img/icdar/100p/pbm ==> Base ICDAR 100% en noir & blanc
+img/icdar/100p/pgm ==> Base ICDAR 100% en niveaux de gris
+img/icdar/100p/ppm ==> Base ICDAR 100% en couleur
+img/icdar/100p/gradient-thin ==> Masques de gradient thin sur base ICDAR 100%
+img/icdar/100p/gradient-thick ==> Masques de gradient thick sur base ICDAR 100%
+
+img/icdar/50p/pbm ==> Base ICDAR 50% en noir & blanc
+img/icdar/50p/pgm ==> Base ICDAR 50% en niveaux de gris
+img/icdar/50p/ppm ==> Base ICDAR 50% en couleur
+
+img/icdar/20p/pbm ==> Base ICDAR 20% en noir & blanc
+img/icdar/20p/pgm ==> Base ICDAR 20% en niveaux de gris
+img/icdar/20p/ppm ==> Base ICDAR 20% en couleur
+
+img/icdar/20p/crop ==> Plein de crops sur la base ICDAR 20% (couleur)
+
+img/icdar/magick-pal-30-gen.sh => Génération base ICDAR 30 couleurs(imageMagick)
+img/icdar/magick-pal-20-gen.sh => Génération base ICDAR 20 couleurs(imageMagick)
+img/icdar/magick-pal-10-gen.sh => Génération base ICDAR 10 couleurs(imageMagick)
+
+img/icdar/gimp-pal-30-gen.sh ==> Génération base ICDAR 30 couleurs (Gimp)
+img/icdar/gimp-pal-20-gen.sh ==> Génération base ICDAR 20 couleurs (Gimp)
+img/icdar/gimp-pal-10-gen.sh ==> Génération base ICDAR 10 couleurs (Gimp)
+
+img/icdar/20p/magick-pal-30 ==> Base ICDAR 20% en noir & blanc
+img/icdar/20p/magick-pal-20 ==> Base ICDAR 20% en niveaux de gris
+img/icdar/20p/magick-pal-10 ==> Base ICDAR 20% en couleur
+
+img/icdar/20p/gimp-pal-30 ==> Base ICDAR 20% en noir & blanc
+img/icdar/20p/gimp-pal-20 ==> Base ICDAR 20% en niveaux de gris
+img/icdar/20p/gimp-pal-10 ==> Base ICDAR 20% en couleur
+
+img/icdar/20p/text-only ==> Images ICDAR avec textes uniquement
+img/icdar/20p/text-color ==> Images ICDAR avec textes et couleurs
+img/icdar/20p/text-photo ==> Images ICDAR avec textes et photos
+
+
+E) BASE INIM
+
+img/inim/bg ==> Arrière plan (ppm)
+img/inim/fg ==> Avant plan (ppm)
+img/inim/in ==> Images d'entrées (ppm)
+
+
+F) BASE OLENA
+
+Des images générales provenant d'Olena et d'autres pour tester, pour debugger
+dans différents formats.
+
+
diff --git a/scribo/sandbox/green/README.result b/scribo/sandbox/green/README.result
new file mode 100644
index 0000000..4038a5b
--- /dev/null
+++ b/scribo/sandbox/green/README.result
@@ -0,0 +1,143 @@
+I DESCRIPTION DES BASES D'IMAGES
+--------------------------------
+
+result ==> Répertoire des bases d'images
+result/annotating/afp ==> Analyse de la base AFP
+result/annotating/icdar ==> Analyse de la base ICDAR
+
+
+II DESCRIPTION DES TYPES D'IMAGES
+---------------------------------
+
+Les deux bases d'images contiennent toutes les deux la même
+structure. Les résultats sont donc générés sur les images d'origine
+(input) et les images dont on a réduit le nombre de couleurs à
+30/20/10 soit par gimp, soit par imageMagick.
+
+result/annotating/afp/input ==> Résultats base originale AFP
+result/annotating/afp/magick-pal-30 ==> Résultats AFP 30 couleurs (imageMagick)
+result/annotating/afp/magick-pal-20 ==> Résultats AFP 20 couleurs (imageMagick)
+result/annotating/afp/magick-pal-10 ==> Résultats AFP 10 couleurs (imageMagick)
+result/annotating/afp/gimp-pal-30 ==> Résultats AFP 30 couleurs (Gimp)
+result/annotating/afp/gimp-pal-20 ==> Résultats AFP 20 couleurs (Gimp)
+result/annotating/afp/gimp-pal-10 ==> Résultats AFP 10 couleurs (Gimp)
+
+result/annotating/icdar/input ==> Résultats base originale ICDAR
+result/annotating/icdar/magick-pal-30 => Résultats ICDAR 30 clrs (imageMagick)
+result/annotating/icdar/magick-pal-20 => Résultats ICDAR 20 clrs (imageMagick)
+result/annotating/icdar/magick-pal-10 => Résultats ICDAR 10 clrs (imageMagick)
+result/annotating/icdar/gimp-pal-30 ==> Résultats ICDAR 30 couleurs (Gimp)
+result/annotating/icdar/gimp-pal-20 ==> Résultats ICDAR 20 couleurs (Gimp)
+result/annotating/icdar/gimp-pal-10 ==> Résultats ICDAR 10 couleurs (Gimp)
+
+
+II DESCRIPTION DES COMPOSANTES COULEURS
+---------------------------------------
+
+Pour chaque type d'image, on extraira ensuite les différents composantes
+rouge (r), verte (v), bleue (b), teinte (h), saturation (s) et valeur (v).
+
+result/annotating/afp/input/r ==> comp. rouge base AFP
+result/annotating/afp/input/g ==> comp. verte base AFP
+result/annotating/afp/input/b ==> comp. bleue base AFP
+result/annotating/afp/input/h ==> comp. teinte base AFP
+result/annotating/afp/input/s ==> comp. saturation base AFP
+result/annotating/afp/input/v ==> comp. valeur base AFP
+
+result/annotating/afp/magick-pal-30/r ==> comp. rouge AFP 30 clr.(imageMagick)
+result/annotating/afp/magick-pal-30/g ==> comp. verte AFP 30 clr.(imageMagick)
+result/annotating/afp/magick-pal-30/b ==> comp. bleue AFP 30 clr.(imageMagick)
+result/annotating/afp/magick-pal-30/h ==> comp. teinte AFP 30 c.(imageMagick)
+result/annotating/afp/magick-pal-30/s ==> comp. sat. AFP 30 clr.(imageMagick)
+result/annotating/afp/magick-pal-30/v ==> comp. val. AFP 30 clr.(imageMagick)
+
+result/annotating/afp/magick-pal-20/r ==> comp. rouge AFP 20 clr.(imageMagick)
+result/annotating/afp/magick-pal-20/g ==> comp. verte AFP 20 clr.(imageMagick)
+result/annotating/afp/magick-pal-20/b ==> comp. bleue AFP 20 clr.(imageMagick)
+result/annotating/afp/magick-pal-20/h ==> comp. teinte AFP 20 c.(imageMagick)
+result/annotating/afp/magick-pal-20/s ==> comp. sat. AFP 20 clr.(imageMagick)
+result/annotating/afp/magick-pal-20/v ==> comp. val. AFP 20 clr.(imageMagick)
+
+result/annotating/afp/magick-pal-10/r ==> comp. rouge AFP 10 clr.(imageMagick)
+result/annotating/afp/magick-pal-10/g ==> comp. verte AFP 10 clr.(imageMagick)
+result/annotating/afp/magick-pal-10/b ==> comp. bleue AFP 10 clr.(imageMagick)
+result/annotating/afp/magick-pal-10/h ==> comp. teinte AFP 10 c.(imageMagick)
+result/annotating/afp/magick-pal-10/s ==> comp. sat. AFP 10 clr.(imageMagick)
+result/annotating/afp/magick-pal-10/v ==> comp. val. AFP 10 clr.(imageMagick)
+
+result/annotating/afp/gimp-pal-30/r ==> comp. rouge AFP 30 clr.(Gimp)
+result/annotating/afp/gimp-pal-30/g ==> comp. verte AFP 30 clr.(Gimp)
+result/annotating/afp/gimp-pal-30/b ==> comp. bleue AFP 30 clr.(Gimp)
+result/annotating/afp/gimp-pal-30/h ==> comp. teinte AFP 30 clr.(Gimp)
+result/annotating/afp/gimp-pal-30/s ==> comp. saturation AFP 30 clr.(Gimp)
+result/annotating/afp/gimp-pal-30/v ==> comp. valeur AFP 30 clr.(Gimp)
+
+result/annotating/afp/gimp-pal-20/r ==> comp. rouge AFP 20 clr.(Gimp)
+result/annotating/afp/gimp-pal-20/g ==> comp. verte AFP 20 clr.(Gimp)
+result/annotating/afp/gimp-pal-20/b ==> comp. bleue AFP 20 clr.(Gimp)
+result/annotating/afp/gimp-pal-20/h ==> comp. teinte AFP 20 clr.(Gimp)
+result/annotating/afp/gimp-pal-20/s ==> comp. saturation AFP 20 clr.(Gimp)
+result/annotating/afp/gimp-pal-20/v ==> comp. valeur AFP 20 clr.(Gimp)
+
+result/annotating/icdar/input/r ==> comp. rouge base ICDAR
+result/annotating/icdar/input/g ==> comp. verte base ICDAR
+result/annotating/icdar/input/b ==> comp. bleue base ICDAR
+result/annotating/icdar/input/h ==> comp. teinte base ICDAR
+result/annotating/icdar/input/s ==> comp. saturation base ICDAR
+result/annotating/icdar/input/v ==> comp. valeur base ICDAR
+
+result/annotating/icdar/magick-pal-30/r => comp. rouge ICDAR 30 c.(imageMagick)
+result/annotating/icdar/magick-pal-30/g => comp. verte ICDAR 30 c.(imageMagick)
+result/annotating/icdar/magick-pal-30/b => comp. bleue ICDAR 30 c.(imageMagick)
+result/annotating/icdar/magick-pal-30/h => comp. teinte ICDAR 30 c.(imageMagick)
+result/annotating/icdar/magick-pal-30/s => comp. sat. ICDAR 30 c.(imageMagick)
+result/annotating/icdar/magick-pal-30/v => comp. val. ICDAR 30 c.(imageMagick)
+
+result/annotating/icdar/magick-pal-20/r => comp. rouge ICDAR 20 c.(imageMagick)
+result/annotating/icdar/magick-pal-20/g => comp. verte ICDAR 20 c.(imageMagick)
+result/annotating/icdar/magick-pal-20/b => comp. bleue ICDAR 20 c.(imageMagick)
+result/annotating/icdar/magick-pal-20/h => comp. teinte ICDAR 20 c.(imageMagick)
+result/annotating/icdar/magick-pal-20/s => comp. sat. ICDAR 20 c.(imageMagick)
+result/annotating/icdar/magick-pal-20/v => comp. val. ICDAR 20 c.(imageMagick)
+
+result/annotating/icdar/magick-pal-10/r => comp. rouge ICDAR 10 c.(imageMagick)
+result/annotating/icdar/magick-pal-10/g => comp. verte ICDAR 10 c.(imageMagick)
+result/annotating/icdar/magick-pal-10/b => comp. bleue ICDAR 10 c.(imageMagick)
+result/annotating/icdar/magick-pal-10/h => comp. teinte ICDAR 10 c.(imageMagick)
+result/annotating/icdar/magick-pal-10/s => comp. sat. ICDAR 10 c.(imageMagick)
+result/annotating/icdar/magick-pal-10/v => comp. val. ICDAR 10 c.(imageMagick)
+
+result/annotating/icdar/gimp-pal-30/r => comp. rouge ICDAR 30 c.(Gimp)
+result/annotating/icdar/gimp-pal-30/g => comp. verte ICDAR 30 c.(Gimp)
+result/annotating/icdar/gimp-pal-30/b => comp. bleue ICDAR 30 c.(Gimp)
+result/annotating/icdar/gimp-pal-30/h => comp. teinte ICDAR 30 c.(Gimp)
+result/annotating/icdar/gimp-pal-30/s => comp. saturation ICDAR 30 c.(Gimp)
+result/annotating/icdar/gimp-pal-30/v => comp. valeur ICDAR 30 c.(Gimp)
+
+result/annotating/icdar/gimp-pal-20/r => comp. rouge ICDAR 20 c.(Gimp)
+result/annotating/icdar/gimp-pal-20/g => comp. verte ICDAR 20 c.(Gimp)
+result/annotating/icdar/gimp-pal-20/b => comp. bleue ICDAR 20 c.(Gimp)
+result/annotating/icdar/gimp-pal-20/h => comp. teinte ICDAR 20 c.(Gimp)
+result/annotating/icdar/gimp-pal-20/s => comp. saturation ICDAR 20 c.(Gimp)
+result/annotating/icdar/gimp-pal-20/v => comp. valeur ICDAR 20 c.(Gimp)
+
+result/annotating/icdar/gimp-pal-10/r => comp. rouge ICDAR 10 c.(Gimp)
+result/annotating/icdar/gimp-pal-10/g => comp. verte ICDAR 10 c.(Gimp)
+result/annotating/icdar/gimp-pal-10/b => comp. bleue ICDAR 10 c.(Gimp)
+result/annotating/icdar/gimp-pal-10/h => comp. teinte ICDAR 10 c.(Gimp)
+result/annotating/icdar/gimp-pal-10/s => comp. saturation ICDAR 10 c.(Gimp)
+result/annotating/icdar/gimp-pal-10/v => comp. valeur ICDAR 10 c.(Gimp)
+
+
+III DESCRIPTION DES TYPES DE RESULTAT
+-------------------------------------
+
+Pour chaque composante et pour chaque image de la base, on obtient une
+image en niveau de gris correspondant à la composante (pgm) et son
+histogramme normalisé (gnuplot shell). L'histogramme normalisé est un
+histogramme dont l'aire vaut 1 (c'est une densité en fait, autrement
+dit chaque fréquence a été divisée par la somme des fréquences). Un
+script add_range.sh, a permis de rajouter les bornes des axes pour la
+visualisation pour chacun des histogrammes générés. Cette
+représentation des histogrammes des composantes sous forme de densité
+permet de comparer visuellement les images des différentes classes.
--
1.5.6.5
1
0
* README.green: New index for source files in scribo/sandbox/green.
* README.img: New index for image database.
* README.result: New index for histogram database.
---
scribo/sandbox/green/ChangeLog | 11 ++-
scribo/sandbox/green/{README => README.green} | 58 ++++++++--
scribo/sandbox/green/README.img | 124 +++++++++++++++++++++
scribo/sandbox/green/README.result | 143 +++++++++++++++++++++++++
4 files changed, 324 insertions(+), 12 deletions(-)
rename scribo/sandbox/green/{README => README.green} (89%)
create mode 100644 scribo/sandbox/green/README.img
create mode 100644 scribo/sandbox/green/README.result
diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog
index 5a7ceaa..7bb6646 100644
--- a/scribo/sandbox/green/ChangeLog
+++ b/scribo/sandbox/green/ChangeLog
@@ -1,4 +1,13 @@
-2010-06-23 green <jacquelet(a)lrde.epita.fr>
+2010-06-24 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Define documentation files.
+
+ * README: Delete this file and replace it by README.green.
+ * README.green: New index for source files in scribo/sandbox/green.
+ * README.img: New index for image database.
+ * README.result: New index for histogram database.
+
+2010-06-23 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
Define gnuplot shell export format.
diff --git a/scribo/sandbox/green/README b/scribo/sandbox/green/README.green
similarity index 89%
rename from scribo/sandbox/green/README
rename to scribo/sandbox/green/README.green
index 03106d3..3f3c9a9 100644
--- a/scribo/sandbox/green/README
+++ b/scribo/sandbox/green/README.green
@@ -227,26 +227,62 @@ n'importe quel algorithme type huffman (tous les archiveurs en possède un).
-VI MLN
------
+VIII VISUALISATION HISTOGRAMMES 3D
+----------------------------------
-a) La sauvegarde des images au format gnuplot shell
+==> to do
-* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
-to do ...
+* demo/accu/stat/histo2d
+* mln/display/dispay_histo.hh
+* mln/display/project_histo.hh
+IX KMEANS
+---------
+
+Ce travail m'avait été demandé par théo. Je le laisse inachevé, quelque part
+perdu pendant l'optimisation du code et sa transformation en canevas.
+
+* mln/clustering/k_mean.hh: Première implémentation avec matrices et vecteurs.
+* mln/clustering/kmean1d.hh: Implémentation 1d avec des images.
+* mln/clustering/kmean2d.hh: Implémentation 2d avec des images.
+* mln/clustering/kmean3d.hh: Implémentation 3d avec des images.
+* mln/clustering/kmean_rgb.hh: Impl. 3d aplatie et en cours de mise en canevas.
+
+* tests/clustering/k_mean: Tests unitaires sur la permière version.
+* tests/clustering/kmean1d: Tests unitaire sur la version 1d.
+
+* demo/clustering/kmean1d: Utilisation de la version 1d.
+* demo/clustering/kmean2d: Utilisation de la version 2d.
+* demo/clustering/kmean3d: Utilisation de la version 3d.
+* demo/clustering/kmean_rgb: Utilisation de la version aplatie.
+
+* bench/clustering/distance: Comparaison algorithmes d'évaluation des distances.
+
+==> to do
+
+X REGIONAL MAXIMA
+-----------------
+
+==> to do
+
+
+XI ANNOTATING
+-------------
+
+==> to do
+
+
+a) La sauvegarde des images au format gnuplot shell
+
+* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
+
+to do ...
-VII VISUALISATION HISTOGRAMMES 3D
----------------------------------
-c) La visualisation des histogrammes 3d
-* demo/accu/stat/histo2d
-* mln/display/dispay_histo.hh
-* mln/displayproject_histo.hh
diff --git a/scribo/sandbox/green/README.img b/scribo/sandbox/green/README.img
new file mode 100644
index 0000000..c606a93
--- /dev/null
+++ b/scribo/sandbox/green/README.img
@@ -0,0 +1,124 @@
+I DESCRIPTION DES BASES D'IMAGES
+--------------------------------
+
+img ==> Répertoire des bases d'images
+img/afp ==> Extrait de la base AFP (50 photos avec texte)
+img/annotating-1 ==> Base diversifiée internet trop faible qualité
+img/annotating-2 ==> Base diversifiée internet meilleur qualité
+img/icdar ==> Base ICDAR en 20p/50p/100p (+quelques ajouts)
+img/inim ==> Base complète du cours inim
+img/olena ==> Images de tests d'olena (+quelques ajouts)
+
+
+II DESCRIPTION DE CHAQUE BASE
+-----------------------------
+
+A) BASE AFP
+
+img/afp/magick-pal-30-gen.sh ==> Génération base AFP 30 couleurs (imageMagick)
+img/afp/magick-pal-20-gen.sh ==> Génération base AFP 20 couleurs (imageMagick)
+img/afp/magick-pal-10-gen.sh ==> Génération base AFP 10 couleurs (imageMagick)
+
+img/afp/gimp-pal-30-gen.sh ==> Génération base AFP 30 couleurs (Gimp)
+img/afp/gimp-pal-20-gen.sh ==> Génération base AFP 20 couleurs (Gimp)
+img/afp/gimp-pal-10-gen.sh ==> Génération base AFP 10 couleurs (Gimp)
+
+Ne pas oublier le script de réduction des couleurs pour Gimp.
+
+$ more ~/.gimp-2.6/scripts/reduce-color.scm
+(define (reduce-color filein fileout nbcol)
+ (let* ((image (car (gimp-file-load RUN-NONINTERACTIVE filein filein)))
+ (drawable (car (gimp-image-get-active-layer image)))
+ )
+ (gimp-image-convert-indexed image NO-DITHER MAKE-PALETTE nbcol FALSE FALSE "")
+ (gimp-image-convert-rgb image)
+ (gimp-file-save RUN-NONINTERACTIVE image drawable fileout fileout)
+ (gimp-image-delete image)
+ ))
+
+img/afp/magick-pal-30 ==> Base AFP 30 couleurs (imageMagick)
+img/afp/magick-pal-20 ==> Base AFP 20 couleurs (imageMagick)
+img/afp/magick-pal-10 ==> Base AFP 10 couleurs (imageMagick)
+
+img/afp/gimp-pal-30 ==> Base AFP 30 couleurs (Gimp)
+img/afp/gimp-pal-20 ==> Base AFP 20 couleurs (Gimp)
+img/afp/gimp-pal-10 ==> Base AFP 10 couleurs (Gimp)
+
+img/afp/ppm ==> Base AFP originale convertie en ppm
+img/afp/jpg ==> Base AFP originale
+
+
+B) BASE ANNOTATING-1
+
+img/annotating-1/screenshot ==> Fond d'écran, capture d'écran
+img/annotating-1/slide ==> Transparents commerciaux ou conférences
+img/annotating-1/handwritten ==> Ecritures manuscrites
+img/annotating-1/map ==> Cartes marines, de régions, de villes
+img/annotating-1/photo ==> Photo AFP
+img/annotating-1/logo ==> Logos de toute sorte, de toute taille
+img/annotating-1/typed ==> Documents textuels impimés
+img/annotating-1/fax ==> Faxs
+img/annotating-1/bill ==> Factures téléphones, eau ...
+
+
+C) BASE ANNOTATING-2
+
+img/annotating-2/slide ==> Transparents commerciaux ou conférences
+img/annotating-2/handwritten ==> Ecritures manuscrites
+img/annotating-2/logo ==> Logos de toute sorte, de toute taille
+img/annotating-2/typed ==> Documents textuels impimés
+img/annotating-1/bill ==> Factures téléphones, eau ...
+
+
+D) BASE ICDAR
+
+img/icdar/100p/pbm ==> Base ICDAR 100% en noir & blanc
+img/icdar/100p/pgm ==> Base ICDAR 100% en niveaux de gris
+img/icdar/100p/ppm ==> Base ICDAR 100% en couleur
+img/icdar/100p/gradient-thin ==> Masques de gradient thin sur base ICDAR 100%
+img/icdar/100p/gradient-thick ==> Masques de gradient thick sur base ICDAR 100%
+
+img/icdar/50p/pbm ==> Base ICDAR 50% en noir & blanc
+img/icdar/50p/pgm ==> Base ICDAR 50% en niveaux de gris
+img/icdar/50p/ppm ==> Base ICDAR 50% en couleur
+
+img/icdar/20p/pbm ==> Base ICDAR 20% en noir & blanc
+img/icdar/20p/pgm ==> Base ICDAR 20% en niveaux de gris
+img/icdar/20p/ppm ==> Base ICDAR 20% en couleur
+
+img/icdar/20p/crop ==> Plein de crops sur la base ICDAR 20% (couleur)
+
+img/icdar/magick-pal-30-gen.sh => Génération base ICDAR 30 couleurs(imageMagick)
+img/icdar/magick-pal-20-gen.sh => Génération base ICDAR 20 couleurs(imageMagick)
+img/icdar/magick-pal-10-gen.sh => Génération base ICDAR 10 couleurs(imageMagick)
+
+img/icdar/gimp-pal-30-gen.sh ==> Génération base ICDAR 30 couleurs (Gimp)
+img/icdar/gimp-pal-20-gen.sh ==> Génération base ICDAR 20 couleurs (Gimp)
+img/icdar/gimp-pal-10-gen.sh ==> Génération base ICDAR 10 couleurs (Gimp)
+
+img/icdar/20p/magick-pal-30 ==> Base ICDAR 20% en noir & blanc
+img/icdar/20p/magick-pal-20 ==> Base ICDAR 20% en niveaux de gris
+img/icdar/20p/magick-pal-10 ==> Base ICDAR 20% en couleur
+
+img/icdar/20p/gimp-pal-30 ==> Base ICDAR 20% en noir & blanc
+img/icdar/20p/gimp-pal-20 ==> Base ICDAR 20% en niveaux de gris
+img/icdar/20p/gimp-pal-10 ==> Base ICDAR 20% en couleur
+
+img/icdar/20p/text-only ==> Images ICDAR avec textes uniquement
+img/icdar/20p/text-color ==> Images ICDAR avec textes et couleurs
+img/icdar/20p/text-photo ==> Images ICDAR avec textes et photos
+
+
+E) BASE INIM
+
+img/inim/bg ==> Arrière plan (ppm)
+img/inim/fg ==> Avant plan (ppm)
+img/inim/in ==> Images d'entrées (ppm)
+
+
+F) BASE OLENA
+
+Des images générales provenant d'Olena et d'autres pour tester, pour debugger
+dans différents formats.
+
+
diff --git a/scribo/sandbox/green/README.result b/scribo/sandbox/green/README.result
new file mode 100644
index 0000000..4038a5b
--- /dev/null
+++ b/scribo/sandbox/green/README.result
@@ -0,0 +1,143 @@
+I DESCRIPTION DES BASES D'IMAGES
+--------------------------------
+
+result ==> Répertoire des bases d'images
+result/annotating/afp ==> Analyse de la base AFP
+result/annotating/icdar ==> Analyse de la base ICDAR
+
+
+II DESCRIPTION DES TYPES D'IMAGES
+---------------------------------
+
+Les deux bases d'images contiennent toutes les deux la même
+structure. Les résultats sont donc générés sur les images d'origine
+(input) et les images dont on a réduit le nombre de couleurs à
+30/20/10 soit par gimp, soit par imageMagick.
+
+result/annotating/afp/input ==> Résultats base originale AFP
+result/annotating/afp/magick-pal-30 ==> Résultats AFP 30 couleurs (imageMagick)
+result/annotating/afp/magick-pal-20 ==> Résultats AFP 20 couleurs (imageMagick)
+result/annotating/afp/magick-pal-10 ==> Résultats AFP 10 couleurs (imageMagick)
+result/annotating/afp/gimp-pal-30 ==> Résultats AFP 30 couleurs (Gimp)
+result/annotating/afp/gimp-pal-20 ==> Résultats AFP 20 couleurs (Gimp)
+result/annotating/afp/gimp-pal-10 ==> Résultats AFP 10 couleurs (Gimp)
+
+result/annotating/icdar/input ==> Résultats base originale ICDAR
+result/annotating/icdar/magick-pal-30 => Résultats ICDAR 30 clrs (imageMagick)
+result/annotating/icdar/magick-pal-20 => Résultats ICDAR 20 clrs (imageMagick)
+result/annotating/icdar/magick-pal-10 => Résultats ICDAR 10 clrs (imageMagick)
+result/annotating/icdar/gimp-pal-30 ==> Résultats ICDAR 30 couleurs (Gimp)
+result/annotating/icdar/gimp-pal-20 ==> Résultats ICDAR 20 couleurs (Gimp)
+result/annotating/icdar/gimp-pal-10 ==> Résultats ICDAR 10 couleurs (Gimp)
+
+
+II DESCRIPTION DES COMPOSANTES COULEURS
+---------------------------------------
+
+Pour chaque type d'image, on extraira ensuite les différents composantes
+rouge (r), verte (v), bleue (b), teinte (h), saturation (s) et valeur (v).
+
+result/annotating/afp/input/r ==> comp. rouge base AFP
+result/annotating/afp/input/g ==> comp. verte base AFP
+result/annotating/afp/input/b ==> comp. bleue base AFP
+result/annotating/afp/input/h ==> comp. teinte base AFP
+result/annotating/afp/input/s ==> comp. saturation base AFP
+result/annotating/afp/input/v ==> comp. valeur base AFP
+
+result/annotating/afp/magick-pal-30/r ==> comp. rouge AFP 30 clr.(imageMagick)
+result/annotating/afp/magick-pal-30/g ==> comp. verte AFP 30 clr.(imageMagick)
+result/annotating/afp/magick-pal-30/b ==> comp. bleue AFP 30 clr.(imageMagick)
+result/annotating/afp/magick-pal-30/h ==> comp. teinte AFP 30 c.(imageMagick)
+result/annotating/afp/magick-pal-30/s ==> comp. sat. AFP 30 clr.(imageMagick)
+result/annotating/afp/magick-pal-30/v ==> comp. val. AFP 30 clr.(imageMagick)
+
+result/annotating/afp/magick-pal-20/r ==> comp. rouge AFP 20 clr.(imageMagick)
+result/annotating/afp/magick-pal-20/g ==> comp. verte AFP 20 clr.(imageMagick)
+result/annotating/afp/magick-pal-20/b ==> comp. bleue AFP 20 clr.(imageMagick)
+result/annotating/afp/magick-pal-20/h ==> comp. teinte AFP 20 c.(imageMagick)
+result/annotating/afp/magick-pal-20/s ==> comp. sat. AFP 20 clr.(imageMagick)
+result/annotating/afp/magick-pal-20/v ==> comp. val. AFP 20 clr.(imageMagick)
+
+result/annotating/afp/magick-pal-10/r ==> comp. rouge AFP 10 clr.(imageMagick)
+result/annotating/afp/magick-pal-10/g ==> comp. verte AFP 10 clr.(imageMagick)
+result/annotating/afp/magick-pal-10/b ==> comp. bleue AFP 10 clr.(imageMagick)
+result/annotating/afp/magick-pal-10/h ==> comp. teinte AFP 10 c.(imageMagick)
+result/annotating/afp/magick-pal-10/s ==> comp. sat. AFP 10 clr.(imageMagick)
+result/annotating/afp/magick-pal-10/v ==> comp. val. AFP 10 clr.(imageMagick)
+
+result/annotating/afp/gimp-pal-30/r ==> comp. rouge AFP 30 clr.(Gimp)
+result/annotating/afp/gimp-pal-30/g ==> comp. verte AFP 30 clr.(Gimp)
+result/annotating/afp/gimp-pal-30/b ==> comp. bleue AFP 30 clr.(Gimp)
+result/annotating/afp/gimp-pal-30/h ==> comp. teinte AFP 30 clr.(Gimp)
+result/annotating/afp/gimp-pal-30/s ==> comp. saturation AFP 30 clr.(Gimp)
+result/annotating/afp/gimp-pal-30/v ==> comp. valeur AFP 30 clr.(Gimp)
+
+result/annotating/afp/gimp-pal-20/r ==> comp. rouge AFP 20 clr.(Gimp)
+result/annotating/afp/gimp-pal-20/g ==> comp. verte AFP 20 clr.(Gimp)
+result/annotating/afp/gimp-pal-20/b ==> comp. bleue AFP 20 clr.(Gimp)
+result/annotating/afp/gimp-pal-20/h ==> comp. teinte AFP 20 clr.(Gimp)
+result/annotating/afp/gimp-pal-20/s ==> comp. saturation AFP 20 clr.(Gimp)
+result/annotating/afp/gimp-pal-20/v ==> comp. valeur AFP 20 clr.(Gimp)
+
+result/annotating/icdar/input/r ==> comp. rouge base ICDAR
+result/annotating/icdar/input/g ==> comp. verte base ICDAR
+result/annotating/icdar/input/b ==> comp. bleue base ICDAR
+result/annotating/icdar/input/h ==> comp. teinte base ICDAR
+result/annotating/icdar/input/s ==> comp. saturation base ICDAR
+result/annotating/icdar/input/v ==> comp. valeur base ICDAR
+
+result/annotating/icdar/magick-pal-30/r => comp. rouge ICDAR 30 c.(imageMagick)
+result/annotating/icdar/magick-pal-30/g => comp. verte ICDAR 30 c.(imageMagick)
+result/annotating/icdar/magick-pal-30/b => comp. bleue ICDAR 30 c.(imageMagick)
+result/annotating/icdar/magick-pal-30/h => comp. teinte ICDAR 30 c.(imageMagick)
+result/annotating/icdar/magick-pal-30/s => comp. sat. ICDAR 30 c.(imageMagick)
+result/annotating/icdar/magick-pal-30/v => comp. val. ICDAR 30 c.(imageMagick)
+
+result/annotating/icdar/magick-pal-20/r => comp. rouge ICDAR 20 c.(imageMagick)
+result/annotating/icdar/magick-pal-20/g => comp. verte ICDAR 20 c.(imageMagick)
+result/annotating/icdar/magick-pal-20/b => comp. bleue ICDAR 20 c.(imageMagick)
+result/annotating/icdar/magick-pal-20/h => comp. teinte ICDAR 20 c.(imageMagick)
+result/annotating/icdar/magick-pal-20/s => comp. sat. ICDAR 20 c.(imageMagick)
+result/annotating/icdar/magick-pal-20/v => comp. val. ICDAR 20 c.(imageMagick)
+
+result/annotating/icdar/magick-pal-10/r => comp. rouge ICDAR 10 c.(imageMagick)
+result/annotating/icdar/magick-pal-10/g => comp. verte ICDAR 10 c.(imageMagick)
+result/annotating/icdar/magick-pal-10/b => comp. bleue ICDAR 10 c.(imageMagick)
+result/annotating/icdar/magick-pal-10/h => comp. teinte ICDAR 10 c.(imageMagick)
+result/annotating/icdar/magick-pal-10/s => comp. sat. ICDAR 10 c.(imageMagick)
+result/annotating/icdar/magick-pal-10/v => comp. val. ICDAR 10 c.(imageMagick)
+
+result/annotating/icdar/gimp-pal-30/r => comp. rouge ICDAR 30 c.(Gimp)
+result/annotating/icdar/gimp-pal-30/g => comp. verte ICDAR 30 c.(Gimp)
+result/annotating/icdar/gimp-pal-30/b => comp. bleue ICDAR 30 c.(Gimp)
+result/annotating/icdar/gimp-pal-30/h => comp. teinte ICDAR 30 c.(Gimp)
+result/annotating/icdar/gimp-pal-30/s => comp. saturation ICDAR 30 c.(Gimp)
+result/annotating/icdar/gimp-pal-30/v => comp. valeur ICDAR 30 c.(Gimp)
+
+result/annotating/icdar/gimp-pal-20/r => comp. rouge ICDAR 20 c.(Gimp)
+result/annotating/icdar/gimp-pal-20/g => comp. verte ICDAR 20 c.(Gimp)
+result/annotating/icdar/gimp-pal-20/b => comp. bleue ICDAR 20 c.(Gimp)
+result/annotating/icdar/gimp-pal-20/h => comp. teinte ICDAR 20 c.(Gimp)
+result/annotating/icdar/gimp-pal-20/s => comp. saturation ICDAR 20 c.(Gimp)
+result/annotating/icdar/gimp-pal-20/v => comp. valeur ICDAR 20 c.(Gimp)
+
+result/annotating/icdar/gimp-pal-10/r => comp. rouge ICDAR 10 c.(Gimp)
+result/annotating/icdar/gimp-pal-10/g => comp. verte ICDAR 10 c.(Gimp)
+result/annotating/icdar/gimp-pal-10/b => comp. bleue ICDAR 10 c.(Gimp)
+result/annotating/icdar/gimp-pal-10/h => comp. teinte ICDAR 10 c.(Gimp)
+result/annotating/icdar/gimp-pal-10/s => comp. saturation ICDAR 10 c.(Gimp)
+result/annotating/icdar/gimp-pal-10/v => comp. valeur ICDAR 10 c.(Gimp)
+
+
+III DESCRIPTION DES TYPES DE RESULTAT
+-------------------------------------
+
+Pour chaque composante et pour chaque image de la base, on obtient une
+image en niveau de gris correspondant à la composante (pgm) et son
+histogramme normalisé (gnuplot shell). L'histogramme normalisé est un
+histogramme dont l'aire vaut 1 (c'est une densité en fait, autrement
+dit chaque fréquence a été divisée par la somme des fréquences). Un
+script add_range.sh, a permis de rajouter les bornes des axes pour la
+visualisation pour chacun des histogrammes générés. Cette
+représentation des histogrammes des composantes sous forme de densité
+permet de comparer visuellement les images des différentes classes.
--
1.5.6.5
1
0
* README.green: New index for source files in scribo/sandbox/green.
* README.img: New index for image database.
* README.result: New index for histogram database.
---
scribo/sandbox/green/ChangeLog | 11 ++-
scribo/sandbox/green/{README => README.green} | 58 ++++++++--
scribo/sandbox/green/README.img | 124 +++++++++++++++++++++
scribo/sandbox/green/README.result | 143 +++++++++++++++++++++++++
4 files changed, 324 insertions(+), 12 deletions(-)
rename scribo/sandbox/green/{README => README.green} (89%)
create mode 100644 scribo/sandbox/green/README.img
create mode 100644 scribo/sandbox/green/README.result
diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog
index 5a7ceaa..7bb6646 100644
--- a/scribo/sandbox/green/ChangeLog
+++ b/scribo/sandbox/green/ChangeLog
@@ -1,4 +1,13 @@
-2010-06-23 green <jacquelet(a)lrde.epita.fr>
+2010-06-24 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Define documentation files.
+
+ * README: Delete this file and replace it by README.green.
+ * README.green: New index for source files in scribo/sandbox/green.
+ * README.img: New index for image database.
+ * README.result: New index for histogram database.
+
+2010-06-23 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
Define gnuplot shell export format.
diff --git a/scribo/sandbox/green/README b/scribo/sandbox/green/README.green
similarity index 89%
rename from scribo/sandbox/green/README
rename to scribo/sandbox/green/README.green
index 03106d3..3f3c9a9 100644
--- a/scribo/sandbox/green/README
+++ b/scribo/sandbox/green/README.green
@@ -227,26 +227,62 @@ n'importe quel algorithme type huffman (tous les archiveurs en possède un).
-VI MLN
------
+VIII VISUALISATION HISTOGRAMMES 3D
+----------------------------------
-a) La sauvegarde des images au format gnuplot shell
+==> to do
-* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
-to do ...
+* demo/accu/stat/histo2d
+* mln/display/dispay_histo.hh
+* mln/display/project_histo.hh
+IX KMEANS
+---------
+
+Ce travail m'avait été demandé par théo. Je le laisse inachevé, quelque part
+perdu pendant l'optimisation du code et sa transformation en canevas.
+
+* mln/clustering/k_mean.hh: Première implémentation avec matrices et vecteurs.
+* mln/clustering/kmean1d.hh: Implémentation 1d avec des images.
+* mln/clustering/kmean2d.hh: Implémentation 2d avec des images.
+* mln/clustering/kmean3d.hh: Implémentation 3d avec des images.
+* mln/clustering/kmean_rgb.hh: Impl. 3d aplatie et en cours de mise en canevas.
+
+* tests/clustering/k_mean: Tests unitaires sur la permière version.
+* tests/clustering/kmean1d: Tests unitaire sur la version 1d.
+
+* demo/clustering/kmean1d: Utilisation de la version 1d.
+* demo/clustering/kmean2d: Utilisation de la version 2d.
+* demo/clustering/kmean3d: Utilisation de la version 3d.
+* demo/clustering/kmean_rgb: Utilisation de la version aplatie.
+
+* bench/clustering/distance: Comparaison algorithmes d'évaluation des distances.
+
+==> to do
+
+X REGIONAL MAXIMA
+-----------------
+
+==> to do
+
+
+XI ANNOTATING
+-------------
+
+==> to do
+
+
+a) La sauvegarde des images au format gnuplot shell
+
+* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
+
+to do ...
-VII VISUALISATION HISTOGRAMMES 3D
----------------------------------
-c) La visualisation des histogrammes 3d
-* demo/accu/stat/histo2d
-* mln/display/dispay_histo.hh
-* mln/displayproject_histo.hh
diff --git a/scribo/sandbox/green/README.img b/scribo/sandbox/green/README.img
new file mode 100644
index 0000000..c606a93
--- /dev/null
+++ b/scribo/sandbox/green/README.img
@@ -0,0 +1,124 @@
+I DESCRIPTION DES BASES D'IMAGES
+--------------------------------
+
+img ==> Répertoire des bases d'images
+img/afp ==> Extrait de la base AFP (50 photos avec texte)
+img/annotating-1 ==> Base diversifiée internet trop faible qualité
+img/annotating-2 ==> Base diversifiée internet meilleur qualité
+img/icdar ==> Base ICDAR en 20p/50p/100p (+quelques ajouts)
+img/inim ==> Base complète du cours inim
+img/olena ==> Images de tests d'olena (+quelques ajouts)
+
+
+II DESCRIPTION DE CHAQUE BASE
+-----------------------------
+
+A) BASE AFP
+
+img/afp/magick-pal-30-gen.sh ==> Génération base AFP 30 couleurs (imageMagick)
+img/afp/magick-pal-20-gen.sh ==> Génération base AFP 20 couleurs (imageMagick)
+img/afp/magick-pal-10-gen.sh ==> Génération base AFP 10 couleurs (imageMagick)
+
+img/afp/gimp-pal-30-gen.sh ==> Génération base AFP 30 couleurs (Gimp)
+img/afp/gimp-pal-20-gen.sh ==> Génération base AFP 20 couleurs (Gimp)
+img/afp/gimp-pal-10-gen.sh ==> Génération base AFP 10 couleurs (Gimp)
+
+Ne pas oublier le script de réduction des couleurs pour Gimp.
+
+$ more ~/.gimp-2.6/scripts/reduce-color.scm
+(define (reduce-color filein fileout nbcol)
+ (let* ((image (car (gimp-file-load RUN-NONINTERACTIVE filein filein)))
+ (drawable (car (gimp-image-get-active-layer image)))
+ )
+ (gimp-image-convert-indexed image NO-DITHER MAKE-PALETTE nbcol FALSE FALSE "")
+ (gimp-image-convert-rgb image)
+ (gimp-file-save RUN-NONINTERACTIVE image drawable fileout fileout)
+ (gimp-image-delete image)
+ ))
+
+img/afp/magick-pal-30 ==> Base AFP 30 couleurs (imageMagick)
+img/afp/magick-pal-20 ==> Base AFP 20 couleurs (imageMagick)
+img/afp/magick-pal-10 ==> Base AFP 10 couleurs (imageMagick)
+
+img/afp/gimp-pal-30 ==> Base AFP 30 couleurs (Gimp)
+img/afp/gimp-pal-20 ==> Base AFP 20 couleurs (Gimp)
+img/afp/gimp-pal-10 ==> Base AFP 10 couleurs (Gimp)
+
+img/afp/ppm ==> Base AFP originale convertie en ppm
+img/afp/jpg ==> Base AFP originale
+
+
+B) BASE ANNOTATING-1
+
+img/annotating-1/screenshot ==> Fond d'écran, capture d'écran
+img/annotating-1/slide ==> Transparents commerciaux ou conférences
+img/annotating-1/handwritten ==> Ecritures manuscrites
+img/annotating-1/map ==> Cartes marines, de régions, de villes
+img/annotating-1/photo ==> Photo AFP
+img/annotating-1/logo ==> Logos de toute sorte, de toute taille
+img/annotating-1/typed ==> Documents textuels impimés
+img/annotating-1/fax ==> Faxs
+img/annotating-1/bill ==> Factures téléphones, eau ...
+
+
+C) BASE ANNOTATING-2
+
+img/annotating-2/slide ==> Transparents commerciaux ou conférences
+img/annotating-2/handwritten ==> Ecritures manuscrites
+img/annotating-2/logo ==> Logos de toute sorte, de toute taille
+img/annotating-2/typed ==> Documents textuels impimés
+img/annotating-1/bill ==> Factures téléphones, eau ...
+
+
+D) BASE ICDAR
+
+img/icdar/100p/pbm ==> Base ICDAR 100% en noir & blanc
+img/icdar/100p/pgm ==> Base ICDAR 100% en niveaux de gris
+img/icdar/100p/ppm ==> Base ICDAR 100% en couleur
+img/icdar/100p/gradient-thin ==> Masques de gradient thin sur base ICDAR 100%
+img/icdar/100p/gradient-thick ==> Masques de gradient thick sur base ICDAR 100%
+
+img/icdar/50p/pbm ==> Base ICDAR 50% en noir & blanc
+img/icdar/50p/pgm ==> Base ICDAR 50% en niveaux de gris
+img/icdar/50p/ppm ==> Base ICDAR 50% en couleur
+
+img/icdar/20p/pbm ==> Base ICDAR 20% en noir & blanc
+img/icdar/20p/pgm ==> Base ICDAR 20% en niveaux de gris
+img/icdar/20p/ppm ==> Base ICDAR 20% en couleur
+
+img/icdar/20p/crop ==> Plein de crops sur la base ICDAR 20% (couleur)
+
+img/icdar/magick-pal-30-gen.sh => Génération base ICDAR 30 couleurs(imageMagick)
+img/icdar/magick-pal-20-gen.sh => Génération base ICDAR 20 couleurs(imageMagick)
+img/icdar/magick-pal-10-gen.sh => Génération base ICDAR 10 couleurs(imageMagick)
+
+img/icdar/gimp-pal-30-gen.sh ==> Génération base ICDAR 30 couleurs (Gimp)
+img/icdar/gimp-pal-20-gen.sh ==> Génération base ICDAR 20 couleurs (Gimp)
+img/icdar/gimp-pal-10-gen.sh ==> Génération base ICDAR 10 couleurs (Gimp)
+
+img/icdar/20p/magick-pal-30 ==> Base ICDAR 20% en noir & blanc
+img/icdar/20p/magick-pal-20 ==> Base ICDAR 20% en niveaux de gris
+img/icdar/20p/magick-pal-10 ==> Base ICDAR 20% en couleur
+
+img/icdar/20p/gimp-pal-30 ==> Base ICDAR 20% en noir & blanc
+img/icdar/20p/gimp-pal-20 ==> Base ICDAR 20% en niveaux de gris
+img/icdar/20p/gimp-pal-10 ==> Base ICDAR 20% en couleur
+
+img/icdar/20p/text-only ==> Images ICDAR avec textes uniquement
+img/icdar/20p/text-color ==> Images ICDAR avec textes et couleurs
+img/icdar/20p/text-photo ==> Images ICDAR avec textes et photos
+
+
+E) BASE INIM
+
+img/inim/bg ==> Arrière plan (ppm)
+img/inim/fg ==> Avant plan (ppm)
+img/inim/in ==> Images d'entrées (ppm)
+
+
+F) BASE OLENA
+
+Des images générales provenant d'Olena et d'autres pour tester, pour debugger
+dans différents formats.
+
+
diff --git a/scribo/sandbox/green/README.result b/scribo/sandbox/green/README.result
new file mode 100644
index 0000000..4038a5b
--- /dev/null
+++ b/scribo/sandbox/green/README.result
@@ -0,0 +1,143 @@
+I DESCRIPTION DES BASES D'IMAGES
+--------------------------------
+
+result ==> Répertoire des bases d'images
+result/annotating/afp ==> Analyse de la base AFP
+result/annotating/icdar ==> Analyse de la base ICDAR
+
+
+II DESCRIPTION DES TYPES D'IMAGES
+---------------------------------
+
+Les deux bases d'images contiennent toutes les deux la même
+structure. Les résultats sont donc générés sur les images d'origine
+(input) et les images dont on a réduit le nombre de couleurs à
+30/20/10 soit par gimp, soit par imageMagick.
+
+result/annotating/afp/input ==> Résultats base originale AFP
+result/annotating/afp/magick-pal-30 ==> Résultats AFP 30 couleurs (imageMagick)
+result/annotating/afp/magick-pal-20 ==> Résultats AFP 20 couleurs (imageMagick)
+result/annotating/afp/magick-pal-10 ==> Résultats AFP 10 couleurs (imageMagick)
+result/annotating/afp/gimp-pal-30 ==> Résultats AFP 30 couleurs (Gimp)
+result/annotating/afp/gimp-pal-20 ==> Résultats AFP 20 couleurs (Gimp)
+result/annotating/afp/gimp-pal-10 ==> Résultats AFP 10 couleurs (Gimp)
+
+result/annotating/icdar/input ==> Résultats base originale ICDAR
+result/annotating/icdar/magick-pal-30 => Résultats ICDAR 30 clrs (imageMagick)
+result/annotating/icdar/magick-pal-20 => Résultats ICDAR 20 clrs (imageMagick)
+result/annotating/icdar/magick-pal-10 => Résultats ICDAR 10 clrs (imageMagick)
+result/annotating/icdar/gimp-pal-30 ==> Résultats ICDAR 30 couleurs (Gimp)
+result/annotating/icdar/gimp-pal-20 ==> Résultats ICDAR 20 couleurs (Gimp)
+result/annotating/icdar/gimp-pal-10 ==> Résultats ICDAR 10 couleurs (Gimp)
+
+
+II DESCRIPTION DES COMPOSANTES COULEURS
+---------------------------------------
+
+Pour chaque type d'image, on extraira ensuite les différents composantes
+rouge (r), verte (v), bleue (b), teinte (h), saturation (s) et valeur (v).
+
+result/annotating/afp/input/r ==> comp. rouge base AFP
+result/annotating/afp/input/g ==> comp. verte base AFP
+result/annotating/afp/input/b ==> comp. bleue base AFP
+result/annotating/afp/input/h ==> comp. teinte base AFP
+result/annotating/afp/input/s ==> comp. saturation base AFP
+result/annotating/afp/input/v ==> comp. valeur base AFP
+
+result/annotating/afp/magick-pal-30/r ==> comp. rouge AFP 30 clr.(imageMagick)
+result/annotating/afp/magick-pal-30/g ==> comp. verte AFP 30 clr.(imageMagick)
+result/annotating/afp/magick-pal-30/b ==> comp. bleue AFP 30 clr.(imageMagick)
+result/annotating/afp/magick-pal-30/h ==> comp. teinte AFP 30 c.(imageMagick)
+result/annotating/afp/magick-pal-30/s ==> comp. sat. AFP 30 clr.(imageMagick)
+result/annotating/afp/magick-pal-30/v ==> comp. val. AFP 30 clr.(imageMagick)
+
+result/annotating/afp/magick-pal-20/r ==> comp. rouge AFP 20 clr.(imageMagick)
+result/annotating/afp/magick-pal-20/g ==> comp. verte AFP 20 clr.(imageMagick)
+result/annotating/afp/magick-pal-20/b ==> comp. bleue AFP 20 clr.(imageMagick)
+result/annotating/afp/magick-pal-20/h ==> comp. teinte AFP 20 c.(imageMagick)
+result/annotating/afp/magick-pal-20/s ==> comp. sat. AFP 20 clr.(imageMagick)
+result/annotating/afp/magick-pal-20/v ==> comp. val. AFP 20 clr.(imageMagick)
+
+result/annotating/afp/magick-pal-10/r ==> comp. rouge AFP 10 clr.(imageMagick)
+result/annotating/afp/magick-pal-10/g ==> comp. verte AFP 10 clr.(imageMagick)
+result/annotating/afp/magick-pal-10/b ==> comp. bleue AFP 10 clr.(imageMagick)
+result/annotating/afp/magick-pal-10/h ==> comp. teinte AFP 10 c.(imageMagick)
+result/annotating/afp/magick-pal-10/s ==> comp. sat. AFP 10 clr.(imageMagick)
+result/annotating/afp/magick-pal-10/v ==> comp. val. AFP 10 clr.(imageMagick)
+
+result/annotating/afp/gimp-pal-30/r ==> comp. rouge AFP 30 clr.(Gimp)
+result/annotating/afp/gimp-pal-30/g ==> comp. verte AFP 30 clr.(Gimp)
+result/annotating/afp/gimp-pal-30/b ==> comp. bleue AFP 30 clr.(Gimp)
+result/annotating/afp/gimp-pal-30/h ==> comp. teinte AFP 30 clr.(Gimp)
+result/annotating/afp/gimp-pal-30/s ==> comp. saturation AFP 30 clr.(Gimp)
+result/annotating/afp/gimp-pal-30/v ==> comp. valeur AFP 30 clr.(Gimp)
+
+result/annotating/afp/gimp-pal-20/r ==> comp. rouge AFP 20 clr.(Gimp)
+result/annotating/afp/gimp-pal-20/g ==> comp. verte AFP 20 clr.(Gimp)
+result/annotating/afp/gimp-pal-20/b ==> comp. bleue AFP 20 clr.(Gimp)
+result/annotating/afp/gimp-pal-20/h ==> comp. teinte AFP 20 clr.(Gimp)
+result/annotating/afp/gimp-pal-20/s ==> comp. saturation AFP 20 clr.(Gimp)
+result/annotating/afp/gimp-pal-20/v ==> comp. valeur AFP 20 clr.(Gimp)
+
+result/annotating/icdar/input/r ==> comp. rouge base ICDAR
+result/annotating/icdar/input/g ==> comp. verte base ICDAR
+result/annotating/icdar/input/b ==> comp. bleue base ICDAR
+result/annotating/icdar/input/h ==> comp. teinte base ICDAR
+result/annotating/icdar/input/s ==> comp. saturation base ICDAR
+result/annotating/icdar/input/v ==> comp. valeur base ICDAR
+
+result/annotating/icdar/magick-pal-30/r => comp. rouge ICDAR 30 c.(imageMagick)
+result/annotating/icdar/magick-pal-30/g => comp. verte ICDAR 30 c.(imageMagick)
+result/annotating/icdar/magick-pal-30/b => comp. bleue ICDAR 30 c.(imageMagick)
+result/annotating/icdar/magick-pal-30/h => comp. teinte ICDAR 30 c.(imageMagick)
+result/annotating/icdar/magick-pal-30/s => comp. sat. ICDAR 30 c.(imageMagick)
+result/annotating/icdar/magick-pal-30/v => comp. val. ICDAR 30 c.(imageMagick)
+
+result/annotating/icdar/magick-pal-20/r => comp. rouge ICDAR 20 c.(imageMagick)
+result/annotating/icdar/magick-pal-20/g => comp. verte ICDAR 20 c.(imageMagick)
+result/annotating/icdar/magick-pal-20/b => comp. bleue ICDAR 20 c.(imageMagick)
+result/annotating/icdar/magick-pal-20/h => comp. teinte ICDAR 20 c.(imageMagick)
+result/annotating/icdar/magick-pal-20/s => comp. sat. ICDAR 20 c.(imageMagick)
+result/annotating/icdar/magick-pal-20/v => comp. val. ICDAR 20 c.(imageMagick)
+
+result/annotating/icdar/magick-pal-10/r => comp. rouge ICDAR 10 c.(imageMagick)
+result/annotating/icdar/magick-pal-10/g => comp. verte ICDAR 10 c.(imageMagick)
+result/annotating/icdar/magick-pal-10/b => comp. bleue ICDAR 10 c.(imageMagick)
+result/annotating/icdar/magick-pal-10/h => comp. teinte ICDAR 10 c.(imageMagick)
+result/annotating/icdar/magick-pal-10/s => comp. sat. ICDAR 10 c.(imageMagick)
+result/annotating/icdar/magick-pal-10/v => comp. val. ICDAR 10 c.(imageMagick)
+
+result/annotating/icdar/gimp-pal-30/r => comp. rouge ICDAR 30 c.(Gimp)
+result/annotating/icdar/gimp-pal-30/g => comp. verte ICDAR 30 c.(Gimp)
+result/annotating/icdar/gimp-pal-30/b => comp. bleue ICDAR 30 c.(Gimp)
+result/annotating/icdar/gimp-pal-30/h => comp. teinte ICDAR 30 c.(Gimp)
+result/annotating/icdar/gimp-pal-30/s => comp. saturation ICDAR 30 c.(Gimp)
+result/annotating/icdar/gimp-pal-30/v => comp. valeur ICDAR 30 c.(Gimp)
+
+result/annotating/icdar/gimp-pal-20/r => comp. rouge ICDAR 20 c.(Gimp)
+result/annotating/icdar/gimp-pal-20/g => comp. verte ICDAR 20 c.(Gimp)
+result/annotating/icdar/gimp-pal-20/b => comp. bleue ICDAR 20 c.(Gimp)
+result/annotating/icdar/gimp-pal-20/h => comp. teinte ICDAR 20 c.(Gimp)
+result/annotating/icdar/gimp-pal-20/s => comp. saturation ICDAR 20 c.(Gimp)
+result/annotating/icdar/gimp-pal-20/v => comp. valeur ICDAR 20 c.(Gimp)
+
+result/annotating/icdar/gimp-pal-10/r => comp. rouge ICDAR 10 c.(Gimp)
+result/annotating/icdar/gimp-pal-10/g => comp. verte ICDAR 10 c.(Gimp)
+result/annotating/icdar/gimp-pal-10/b => comp. bleue ICDAR 10 c.(Gimp)
+result/annotating/icdar/gimp-pal-10/h => comp. teinte ICDAR 10 c.(Gimp)
+result/annotating/icdar/gimp-pal-10/s => comp. saturation ICDAR 10 c.(Gimp)
+result/annotating/icdar/gimp-pal-10/v => comp. valeur ICDAR 10 c.(Gimp)
+
+
+III DESCRIPTION DES TYPES DE RESULTAT
+-------------------------------------
+
+Pour chaque composante et pour chaque image de la base, on obtient une
+image en niveau de gris correspondant à la composante (pgm) et son
+histogramme normalisé (gnuplot shell). L'histogramme normalisé est un
+histogramme dont l'aire vaut 1 (c'est une densité en fait, autrement
+dit chaque fréquence a été divisée par la somme des fréquences). Un
+script add_range.sh, a permis de rajouter les bornes des axes pour la
+visualisation pour chacun des histogrammes générés. Cette
+représentation des histogrammes des composantes sous forme de densité
+permet de comparer visuellement les images des différentes classes.
--
1.5.6.5
1
0
23 Jun '10
* demo/viewer/browser_widget.cc,
* demo/viewer/browser_widget.hh: Improve picture browser.
* demo/viewer/step_widget.cc,
* demo/viewer/step_widget.hh: Add a "step chooser" to load
several XML files related to one picture.
---
scribo/ChangeLog | 5 +
scribo/demo/viewer/browser_widget.cc | 14 ++-
scribo/demo/viewer/browser_widget.hh | 3 +-
scribo/demo/viewer/step_widget.cc | 122 ++++++++++++++++++++
.../src/result_widget.hh => viewer/step_widget.hh} | 47 ++++----
5 files changed, 165 insertions(+), 26 deletions(-)
create mode 100644 scribo/demo/viewer/step_widget.cc
copy scribo/demo/{wizard/src/result_widget.hh => viewer/step_widget.hh} (72%)
diff --git a/scribo/ChangeLog b/scribo/ChangeLog
index 43a08c0..1a38228 100644
--- a/scribo/ChangeLog
+++ b/scribo/ChangeLog
@@ -39,8 +39,13 @@
* io/xml/save_text_lines.hh: Rename as...
* io/xml/save.hh: ...this.
+<<<<<<< HEAD:scribo/ChangeLog
* src/pbm_text_in_doc.cc: update call to io::xml::save.
+=======
+
+ * src/pbm_text_in_doc.cc: Update call to io::xml::save.
+>>>>>>> New features in Qt interface.:scribo/ChangeLog
2010-06-18 green <jacquelet(a)lrde.epita.fr>
diff --git a/scribo/demo/viewer/browser_widget.cc b/scribo/demo/viewer/browser_widget.cc
index 7316708..d69fea0 100644
--- a/scribo/demo/viewer/browser_widget.cc
+++ b/scribo/demo/viewer/browser_widget.cc
@@ -17,7 +17,7 @@
BrowserWidget::BrowserWidget(QDirModel* files, QString dir)
: files_(files),
view_(new QListView()),
- path_(new QLabel(""))
+ path_(new QLineEdit(""))
{
QLabel* title = new QLabel(tr("Images"));
title->setAlignment(Qt::AlignHCenter);
@@ -41,6 +41,8 @@ BrowserWidget::BrowserWidget(QDirModel* files, QString dir)
path_->setText(files->filePath(view_->rootIndex()));
connect(view_, SIGNAL(activated(const QModelIndex&)),
this, SLOT(activate(const QModelIndex&)));
+ connect(path_, SIGNAL(returnPressed()),
+ this, SLOT(path_return_pressed()));
QStringList files_filters;
files_filters << "*.png" << "*.jpg"
@@ -49,6 +51,16 @@ BrowserWidget::BrowserWidget(QDirModel* files, QString dir)
}
void
+BrowserWidget::path_return_pressed()
+{
+ QString path = path_->text();
+ QDir d(path);
+
+ if (d.isReadable())
+ activate(files_->index(QString(path)));
+}
+
+void
BrowserWidget::activate(const QModelIndex& index)
{
if (files_->isDir(index))
diff --git a/scribo/demo/viewer/browser_widget.hh b/scribo/demo/viewer/browser_widget.hh
index bba438b..23930cd 100644
--- a/scribo/demo/viewer/browser_widget.hh
+++ b/scribo/demo/viewer/browser_widget.hh
@@ -28,6 +28,7 @@ public:
public slots:
void activate(const QModelIndex& index);
+ void path_return_pressed();
signals:
void activated(QString filename);
@@ -35,7 +36,7 @@ signals:
private:
QDirModel* files_;
QListView* view_;
- QLabel* path_;
+ QLineEdit* path_;
};
#endif /* !BROWSER_WIDGET_HH_ */
diff --git a/scribo/demo/viewer/step_widget.cc b/scribo/demo/viewer/step_widget.cc
new file mode 100644
index 0000000..7d35543
--- /dev/null
+++ b/scribo/demo/viewer/step_widget.cc
@@ -0,0 +1,122 @@
+// Copyright (C) 2010 EPITA Research and Development Laboratory (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.
+
+# include "step_widget.hh"
+
+StepWidget::StepWidget()
+ : view_(new QListWidget())
+{
+ QLabel* title = new QLabel(tr("Steps"));
+ title->setAlignment(Qt::AlignHCenter);
+
+ QVBoxLayout* layout = new QVBoxLayout;
+
+ layout->addWidget(title);
+ layout->addWidget(view_);
+
+ view_->setSortingEnabled(true);
+
+ setLayout(layout);
+
+ connect(view_, SIGNAL(itemActivated(QListWidgetItem*)),
+ this, SLOT(activate(QListWidgetItem*)));
+}
+
+void StepWidget::activate(QListWidgetItem* item)
+{
+ QString key, value;
+
+ StepQMap::iterator iter = map_.find(item->text());
+
+ if (iter != map_.end())
+ {
+ key = iter.key();
+ value = iter.value();
+ }
+
+ emit load_xml(value);
+
+}
+
+void StepWidget::fill_steps(QString file)
+{
+ view_->clear();
+ map_.clear();
+
+ // image is loaded once
+ emit load_image(file);
+
+ int cut = file.lastIndexOf(QChar('/'));
+ QString path = file.left(cut+1);
+ QString filename = file.mid(cut+1);
+
+ cut = filename.lastIndexOf(QChar('.'));
+ QString file_with_no_ext = filename.left(cut);
+ // view_->addItem(file_with_no_ext);
+
+ QDir dir(path);
+
+ if (dir.isReadable())
+ {
+ QStringList filter;
+ filter << "*.xml";
+ QStringList xml_list = dir.entryList(filter);
+ for (int i = 0; i < xml_list.size(); ++i)
+ {
+ if (xml_list.at(i).startsWith(file_with_no_ext))
+ {
+ cut = xml_list.at(i).lastIndexOf(QChar('.'));
+ QString key = xml_list.at(i).left(cut);
+ key.replace(file_with_no_ext + QString("_"), QString(""));
+ key.replace(QRegExp("^step([0-9])"), "Step \\1");
+ key.replace(QRegExp("^Step ([0-9])_"), "Step \\1 : ");
+ key.replace("_", " ");
+ QString value = path;
+ map_.insertMulti(key, value.append(xml_list.at(i)));
+ view_->addItem(key);
+ }
+ }
+ }
+}
+
+void StepWidget::add_element(const QString& element)
+{
+ view_->addItem(element);
+}
+
+StepWidget::~StepWidget()
+{
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/scribo/demo/wizard/src/result_widget.hh b/scribo/demo/viewer/step_widget.hh
similarity index 72%
copy from scribo/demo/wizard/src/result_widget.hh
copy to scribo/demo/viewer/step_widget.hh
index 4472238..829f814 100644
--- a/scribo/demo/wizard/src/result_widget.hh
+++ b/scribo/demo/viewer/step_widget.hh
@@ -23,36 +23,35 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
-#ifndef SCRIBO_DEMO_SHARED_SRC_RESULT_WIDGET_HH
-# define SCRIBO_DEMO_SHARED_SRC_RESULT_WIDGET_HH
-# include <QtGui>
-
-namespace scribo
-{
-
- namespace demo
- {
+#ifndef STEP_WIDGET_HH_
+# define STEP_WIDGET_HH_
+# include <QtGui>
- class result_widget : public QWidget
- {
- Q_OBJECT;
-
- public:
- result_widget(QWidget *parent = 0);
- void reset();
-
- void load(const QString& filename);
+typedef QMap<QString, QString> StepQMap;
- private:
- QTextEdit *text_;
- };
+class StepWidget
+ : public QWidget
+{
+ Q_OBJECT
+public:
+ StepWidget();
+ ~StepWidget();
+ void add_element(const QString& element);
- } // end of namespace scribo::demo
+signals:
+ void load_image(QString);
+ void load_xml(QString);
-} // end of namespace scribo
+public slots:
+ void fill_steps(QString file);
+ void activate(QListWidgetItem* item);
+private:
+ QListWidget* view_;
+ StepQMap map_;
+};
-#endif // ! SCRIBO_DEMO_SHARED_SRC_RESULT_WIDGET_HH
+#endif /* !STEP_WIDGET_HH_ */
--
1.5.6.5
1
0
23 Jun '10
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Olena, a generic and efficient image processing platform".
The branch exp/scribo-z has been updated
via 966f8d64839b0d13bdc608ef7f4c4247e984391a (commit)
from f89278cf5b12300abe45d7bf8eb464c7bdb7fba7 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
966f8d6 Add extensions to ICDAR XML format.
-----------------------------------------------------------------------
Summary of changes:
scribo/ChangeLog | 11 ++-
scribo/io/xml/save.hh | 219 ++++++++++++++++++++++++++++++++++++++
scribo/io/xml/save_text_lines.hh | 159 ---------------------------
scribo/src/pbm_text_in_doc.cc | 7 +-
4 files changed, 232 insertions(+), 164 deletions(-)
create mode 100644 scribo/io/xml/save.hh
delete mode 100644 scribo/io/xml/save_text_lines.hh
hooks/post-receive
--
Olena, a generic and efficient image processing platform
1
0