last-svn-commit-47-g6ce521a Import regional maxima sources from milena green's sandbox.

* README.green: Update documentation. Implement a primary demonstrator with watershed labeling. * demo/labeling/watershed: New directory. * demo/labeling/watershed/Makefile.am: New makefile. * demo/labeling/watershed/watershed.cc: New demo source. * demo/labeling/watershed/gaussian.sh: New calibrate tools. Implement a secondary demonstrator with regional maxima labeling. * demo/labeling/regional_maxima: New directory. * demo/labeling/regional_maxima/Makefile.am: New makefile. * demo/labeling/regional_maxima/regional_maxima.cc: New demo source. * demo/labeling/regional_maxima/threshold.txt: New threshold map file. Implement the same demonstrator with directory scanning. * exp/labeling/regional_maxima: New directory. * exp/labeling/regional_maxima/Makefile.am: New makefile. * exp/labeling/regional_maxima/regional_maxima.cc: New demo source. * exp/labeling/regional_maxima/threshold.txt: New threshold map file. Implement r/g projection. * mln/display: New directory. * mln/display/display_histo.hh: New library file. * mln/display/project_histo.hh: New library file. Give minimal code for using r/w projection. * use/display/display_histo: New directory. * use/display/display_histo/Makefile.am: New Makefile. * use/display/display_histo/display_histo.cc: New source. Divide the secondary demonstrator in four binaries in order to test it. Implement the quantified RGB histogram. * tools/labeling/histo: New directory. * tools/labeling/histo/Makefile.am: new makefile. * tools/labeling/histo/histo.cc: New source. Filter the quantified RGB histogram by morphological volume attribute. * tools/labeling/opening: New directory. * tools/labeling/opening/Makefile.am: New makfile. * tools/labeling/opening/opening.cc: New source. Labeling the resulting histogram. * tools/labeling/regmax: New directory. * tools/labeling/regmax/Makefile: New directory. * tools/labeling/regmax/regmax.cc: New source. Propagate labels in the labeling histogram. * tools/labeling/iz: New directory. * tools/labeling/iz/Makefile: New directory. * tools/labeling/iz/iz.cc: New source. Import documentation directory. * doc: New directory. Import annotating search notes. * doc/annotating/class.txt: New documentation text file. * doc/annotating/syntheseMillet.txt: New documentation text file. * doc/annotating/testMillet2008: New documentation text file. Import milena learning examples. * doc/examples: New directory. * doc/examples/hello_world: New directory. * doc/examples/hello_world/Makefile.am: New makefile. * doc/examples/hello_world/hellow_world.cc: New source file. * doc/examples/hello_world/print.cc: New source file. * doc/examples/hello_milena: New directory. * doc/examples/hello_milena/Makefile.am: New makefile. * doc/examples/hello_milena/hello_milena.cc: New source file. * doc/examples/learn_milena: New directory. * doc/examples/learn_milena/Makefile.am: New makefile. * doc/examples/learn_milena/learn_milena.cc: New source file. * doc/examples/otsu: New directory. * doc/examples/otsu/Makefile.am: New makefile. * doc/examples/otsu/otsu.cc: New source file. * doc/examples/frac: New directory. * doc/examples/frac/Makefile.am: New makefile. * doc/examples/frac/frac.cc: New source file. * doc/examples/frac/frac.hh: New source file. * doc/examples/frac/sign_prod.hh: New source file. * doc/examples/frac/gcd.hh: New source file. * doc/examples/accu_color: New directory. * doc/examples/accu_color/accu_color.cc: New source file. * doc/examples/io: New directory. * doc/examples/io/Makefile.am: New makefile. * doc/examples/io/io.cc: New source file. Write down the basis of the quick tour summary documentation. * doc/quick_tour: New specific directory. * doc/quick_tour/quick_tour.tex: New documentation work. Write down 3d currently used formulaes. * doc/formulae: New specific directory. * doc/formulae/formulae.tex: New recipe of 3d formulae. --- scribo/sandbox/green/ChangeLog | 1083 ++++++++++++++++++++ scribo/sandbox/green/README.green | 346 ++++++- .../regional_maxima}/Makefile.am | 0 .../labeling/regional_maxima/regional_maxima.cc | 198 ++++ .../demo/labeling/regional_maxima/thresholds.txt | 0 .../kmean1d => labeling/watershed}/Makefile.am | 0 .../green/demo/labeling/watershed}/gaussian.sh | 0 .../green/demo/labeling/watershed/watershed.cc | 360 +++++++ .../sandbox/green/doc/annotating/class.txt | 0 .../green/doc/annotating/syntheseMillet2008.txt | 0 .../sandbox/green/doc/annotating/testMillet2008 | 0 .../green/doc/examples/accu_color/accu_color.cc | 0 .../sandbox/green/doc/examples/frac/Makefile.am | 0 .../sandbox/green/doc/examples/frac/frac.cc | 0 .../sandbox/green/doc/examples/frac/frac.hh | 0 .../sandbox/green/doc/examples/frac/gcd.hh | 0 .../sandbox/green/doc/examples/frac/sign_prod.hh | 0 .../green/doc/examples/hello_milena/Makefile.am | 0 .../doc/examples/hello_milena/hello_milena.cc | 0 .../green/doc/examples/hello_world}/Makefile.am | 0 .../green/doc/examples/hello_world/hello_world.cc | 0 .../green/doc/examples/hello_world/print.cc | 0 .../sandbox/green/doc/examples/io/Makefile.am | 0 .../sandbox/green/doc/examples/io/io.cc | 0 .../green/doc/examples/learn_milena}/Makefile.am | 0 .../doc/examples/learn_milena/learn_milena.cc | 0 .../sandbox/green/doc/examples/otsu}/Makefile.am | 0 .../sandbox/green/doc/examples/otsu/otsu.cc | 0 .../sandbox/green/doc/examples/stats}/Makefile.am | 0 .../sandbox/green/doc/examples/stats/stats.cc | 0 .../sandbox/green/doc/formulae/formulae.tex | 0 .../sandbox/green/doc/quick_tour/quick_tour.tex | 0 .../sandbox/green/exp/regional_maxima/Makefile.am | 153 +++ .../green/exp/regional_maxima/regional_maxima.cc | 196 ++++ .../green/exp}/regional_maxima/thresholds.txt | 0 scribo/sandbox/green/mln/display/display_histo.hh | 149 +++- scribo/sandbox/green/mln/display/project_histo.hh | 178 +++- .../sandbox/green/tools/labeling/histo/Makefile.am | 153 +++ scribo/sandbox/green/tools/labeling/histo/histo.cc | 204 ++++ scribo/sandbox/green/tools/labeling/iz/Makefile.am | 153 +++ scribo/sandbox/green/tools/labeling/iz/iz.cc | 495 +++++++++ .../green/tools/labeling/opening/Makefile.am | 153 +++ .../green/tools/labeling/opening/opening.cc | 174 ++++ .../green/tools/labeling/regmax/Makefile.am | 153 +++ .../sandbox/green/tools/labeling/regmax/regmax.cc | 428 ++++++++ .../histo1d => display/display_histo}/Makefile.am | 0 .../use/display/display_histo/display_histo.cc | 86 ++ 47 files changed, 4614 insertions(+), 48 deletions(-) copy scribo/sandbox/green/demo/{clustering/kmean1d => labeling/regional_maxima}/Makefile.am (100%) create mode 100644 scribo/sandbox/green/demo/labeling/regional_maxima/regional_maxima.cc copy {milena => scribo}/sandbox/green/demo/labeling/regional_maxima/thresholds.txt (100%) copy scribo/sandbox/green/demo/{clustering/kmean1d => labeling/watershed}/Makefile.am (100%) copy {milena/sandbox/green/tests/accu/stat/histo1d => scribo/sandbox/green/demo/labeling/watershed}/gaussian.sh (100%) create mode 100644 scribo/sandbox/green/demo/labeling/watershed/watershed.cc copy {milena => scribo}/sandbox/green/doc/annotating/class.txt (100%) copy {milena => scribo}/sandbox/green/doc/annotating/syntheseMillet2008.txt (100%) copy {milena => scribo}/sandbox/green/doc/annotating/testMillet2008 (100%) copy {milena => scribo}/sandbox/green/doc/examples/accu_color/accu_color.cc (100%) copy {milena => scribo}/sandbox/green/doc/examples/frac/Makefile.am (100%) copy {milena => scribo}/sandbox/green/doc/examples/frac/frac.cc (100%) copy {milena => scribo}/sandbox/green/doc/examples/frac/frac.hh (100%) copy {milena => scribo}/sandbox/green/doc/examples/frac/gcd.hh (100%) copy {milena => scribo}/sandbox/green/doc/examples/frac/sign_prod.hh (100%) copy {milena => scribo}/sandbox/green/doc/examples/hello_milena/Makefile.am (100%) copy {milena => scribo}/sandbox/green/doc/examples/hello_milena/hello_milena.cc (100%) copy {milena/sandbox/green/doc/examples/hello_milena => scribo/sandbox/green/doc/examples/hello_world}/Makefile.am (100%) copy {milena => scribo}/sandbox/green/doc/examples/hello_world/hello_world.cc (100%) copy {milena => scribo}/sandbox/green/doc/examples/hello_world/print.cc (100%) copy {milena => scribo}/sandbox/green/doc/examples/io/Makefile.am (100%) copy {milena => scribo}/sandbox/green/doc/examples/io/io.cc (100%) copy {milena/sandbox/green/doc/examples/hello_milena => scribo/sandbox/green/doc/examples/learn_milena}/Makefile.am (100%) copy {milena => scribo}/sandbox/green/doc/examples/learn_milena/learn_milena.cc (100%) copy {milena/sandbox/green/doc/examples/hello_milena => scribo/sandbox/green/doc/examples/otsu}/Makefile.am (100%) copy {milena => scribo}/sandbox/green/doc/examples/otsu/otsu.cc (100%) copy {milena/sandbox/green/doc/examples/hello_milena => scribo/sandbox/green/doc/examples/stats}/Makefile.am (100%) copy {milena => scribo}/sandbox/green/doc/examples/stats/stats.cc (100%) copy {milena => scribo}/sandbox/green/doc/formulae/formulae.tex (100%) copy {milena => scribo}/sandbox/green/doc/quick_tour/quick_tour.tex (100%) create mode 100644 scribo/sandbox/green/exp/regional_maxima/Makefile.am create mode 100644 scribo/sandbox/green/exp/regional_maxima/regional_maxima.cc copy {milena/sandbox/green/demo/labeling => scribo/sandbox/green/exp}/regional_maxima/thresholds.txt (100%) create mode 100644 scribo/sandbox/green/tools/labeling/histo/Makefile.am create mode 100644 scribo/sandbox/green/tools/labeling/histo/histo.cc create mode 100644 scribo/sandbox/green/tools/labeling/iz/Makefile.am create mode 100644 scribo/sandbox/green/tools/labeling/iz/iz.cc create mode 100644 scribo/sandbox/green/tools/labeling/opening/Makefile.am create mode 100644 scribo/sandbox/green/tools/labeling/opening/opening.cc create mode 100644 scribo/sandbox/green/tools/labeling/regmax/Makefile.am create mode 100644 scribo/sandbox/green/tools/labeling/regmax/regmax.cc copy scribo/sandbox/green/use/{accu/stat/histo1d => display/display_histo}/Makefile.am (100%) create mode 100644 scribo/sandbox/green/use/display/display_histo/display_histo.cc diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog index 9e9b7d6..5e4cb27 100644 --- a/scribo/sandbox/green/ChangeLog +++ b/scribo/sandbox/green/ChangeLog @@ -1,3 +1,1086 @@ +2010-07-07 Yann Jacquelet <jacquelet@lrde.epita.fr> + + Import regional maxima sources from milena green's sandbox. + + * README.green: Update documentation. + + Implement a primary demonstrator with watershed labeling. + + * demo/labeling/watershed: New directory. + * demo/labeling/watershed/Makefile.am: New makefile. + * demo/labeling/watershed/watershed.cc: New demo source. + * demo/labeling/watershed/gaussian.sh: New calibrate tools. + + Implement a secondary demonstrator with regional maxima labeling. + + * demo/labeling/regional_maxima: New directory. + * demo/labeling/regional_maxima/Makefile.am: New makefile. + * demo/labeling/regional_maxima/regional_maxima.cc: New demo source. + * demo/labeling/regional_maxima/threshold.txt: New threshold map file. + + Implement the same demonstrator with directory scanning. + + * exp/labeling/regional_maxima: New directory. + * exp/labeling/regional_maxima/Makefile.am: New makefile. + * exp/labeling/regional_maxima/regional_maxima.cc: New demo source. + * exp/labeling/regional_maxima/threshold.txt: New threshold map file. + + Implement r/g projection. + + * mln/display: New directory. + * mln/display/display_histo.hh: New library file. + * mln/display/project_histo.hh: New library file. + + Give minimal code for using r/w projection. + + * use/display/display_histo: New directory. + * use/display/display_histo/Makefile.am: New Makefile. + * use/display/display_histo/display_histo.cc: New source. + + Divide the secondary demonstrator in four binaries in order to test it. + + Implement the quantified RGB histogram. + + * tools/labeling/histo: New directory. + * tools/labeling/histo/Makefile.am: new makefile. + * tools/labeling/histo/histo.cc: New source. + + Filter the quantified RGB histogram by morphological volume attribute. + + * tools/labeling/opening: New directory. + * tools/labeling/opening/Makefile.am: New makfile. + * tools/labeling/opening/opening.cc: New source. + + Labeling the resulting histogram. + + * tools/labeling/regmax: New directory. + * tools/labeling/regmax/Makefile: New directory. + * tools/labeling/regmax/regmax.cc: New source. + + Propagate labels in the labeling histogram. + + * tools/labeling/iz: New directory. + * tools/labeling/iz/Makefile: New directory. + * tools/labeling/iz/iz.cc: New source. + + Import documentation directory. + + * doc: New directory. + + Import experimentation backups. + + * doc/labeling: New directory. + + * doc/labeling/cmp_methode: New directory. + * doc/labeling/cmp_method/h0_input.pgm.gz: New img file. + * doc/labeling/cmp_method/h2_mean.pgm.gz: New img file. + * doc/labeling/cmp_method/h2_merge.pgm.gz: New img file. + * doc/labeling/cmp_method/h3_mean.pgm.gz: New img file. + * doc/labeling/cmp_method/h3_merge.pgm.gz: New img file. + * doc/labeling/cmp_method/h4_mean.pgm.gz: New img file. + * doc/labeling/cmp_method/h4_merge.pgm.gz: New img file + * doc/labeling/cmp_method/h5_mean.pgm.gz: New img file. + * doc/labeling/cmp_method/h5_merge.pgm.gz: New img file. + * doc/labeling/cmp_method/i2_mean.ppm.gz: New img file. + * doc/labeling/cmp_method/i2_merge.ppm.gz: New img file. + * doc/labeling/cmp_method/i3_mean.ppm.gz: New img file. + * doc/labeling/cmp_method/i3_merge.ppm.gz: New img file. + * doc/labeling/cmp_method/i4_mean.ppm.gz: New img file. + * doc/labeling/cmp_method/i4_merge.ppm.gz: New img file + * doc/labeling/cmp_method/i5_mean.ppm.gz: New img file. + * doc/labeling/cmp_method/i5_merge.ppm.gz: New img file. + * doc/labeling/cmp_method/l2_input.pgm.gz: New img file. + * doc/labeling/cmp_method/l3_input.pgm.gz: New img file. + * doc/labeling/cmp_method/l4_input.pgm.gz: New img file. + * doc/labeling/cmp_method/l5_input.pgm.gz: New img file. + * doc/labeling/cmp_method/s2_histo.txt.gz: New txt file. + * doc/labeling/cmp_method/s3_histo.txt.gz: New txt file. + * doc/labeling/cmp_method/s4_histo.txt.gz: New txt file. + * doc/labeling/cmp_method/s5_histo.txt.gz: New txt file. + * doc/labeling/cmp_method/reponse_theo.eml.gz: New email. + * doc/labeling/cmp_method/synthese.txt.gz: New experiment doc. + + * doc/labeling/cmp_quant: New directory. + * doc/labeling/cmp_quant/h0_input.pgm.gz: New img file. + * doc/labeling/cmp_quant/h5_mean_q2.pgm.gz: New img file. + * doc/labeling/cmp_quant/h5_mean_q3.pgm.gz: New img file. + * doc/labeling/cmp_quant/h5_mean_q4.pgm.gz: New img file. + * doc/labeling/cmp_quant/h5_mean_q5.pgm.gz: New img file. + * doc/labeling/cmp_quant/h5_mean_q6.pgm.gz: New img file. + * doc/labeling/cmp_quant/h5_mean_q7.pgm.gz: New img file. + * doc/labeling/cmp_quant/h5_mean_q8.pgm.gz: New img file. + * doc/labeling/cmp_quant/h5_merge_q2.pgm.gz: New img file. + * doc/labeling/cmp_quant/h5_merge_q3.pgm.gz: New img file. + * doc/labeling/cmp_quant/h5_merge_q4.pgm.gz: New img file. + * doc/labeling/cmp_quant/h5_merge_q5.pgm.gz: New img file. + * doc/labeling/cmp_quant/h5_merge_q6.pgm.gz: New img file. + * doc/labeling/cmp_quant/h5_merge_q7.pgm.gz: New img file. + * doc/labeling/cmp_quant/h5_merge_q8.pgm.gz: New img file. + * doc/labeling/cmp_quant/i5_mean_q2.ppm.gz: New img file. + * doc/labeling/cmp_quant/i5_mean_q3.ppm.gz: New img file. + * doc/labeling/cmp_quant/i5_mean_q4.ppm.gz: New img file. + * doc/labeling/cmp_quant/i5_mean_q5.ppm.gz: New img file. + * doc/labeling/cmp_quant/i5_mean_q6.ppm.gz: New img file. + * doc/labeling/cmp_quant/i5_mean_q7.ppm.gz: New img file. + * doc/labeling/cmp_quant/i5_mean_q8.ppm.gz: New img file. + * doc/labeling/cmp_quant/i5_merge_q2.ppm.gz: New img file. + * doc/labeling/cmp_quant/i5_merge_q3.ppm.gz: New img file. + * doc/labeling/cmp_quant/i5_merge_q4.ppm.gz: New img file. + * doc/labeling/cmp_quant/i5_merge_q5.ppm.gz: New img file. + * doc/labeling/cmp_quant/i5_merge_q6.ppm.gz: New img file. + * doc/labeling/cmp_quant/i5_merge_q7.ppm.gz: New img file. + * doc/labeling/cmp_quant/i5_merge_q8.ppm.gz: New img file. + * doc/labeling/cmp_quant/l5_input_q2.pgm.gz: New img file. + * doc/labeling/cmp_quant/l5_input_q3.pgm.gz: New img file. + * doc/labeling/cmp_quant/l5_input_q4.pgm.gz: New img file. + * doc/labeling/cmp_quant/l5_input_q5.pgm.gz: New img file. + * doc/labeling/cmp_quant/l5_input_q6.pgm.gz: New img file. + * doc/labeling/cmp_quant/l5_input_q7.pgm.gz: New img file. + * doc/labeling/cmp_quant/l5_input_q8.pgm.gz: New img file. + * doc/labeling/cmp_quant/s5_histo_q2.txt.gz: New txt file. + * doc/labeling/cmp_quant/s5_histo_q3.txt.gz: New txt file. + * doc/labeling/cmp_quant/s5_histo_q4.txt.gz: New txt file. + * doc/labeling/cmp_quant/s5_histo_q5.txt.gz: New txt file. + * doc/labeling/cmp_quant/s5_histo_q6.txt.gz: New txt file. + * doc/labeling/cmp_quant/s5_histo_q7.txt.gz: New txt file. + * doc/labeling/cmp_quant/s5_histo_q8.txt.gz: New txt file. + * doc/labeling/cmp_quant/synthese.txt.gz: New experiment doc. + + * doc/labeling/mp00411c: New directory. + * doc/labeling/mp00411c/colormap_all_q4.txt.gz: New txt file. + * doc/labeling/mp00411c/colormap_all_q5.txt.gz: New txt file. + * doc/labeling/mp00411c/colormap_thick_q4.txt.gz: New txt file. + * doc/labeling/mp00411c/colormap_thick_q5.txt.gz: New txt file. + * doc/labeling/mp00411c/colormap_thin_q4.txt.gz: New txt file. + * doc/labeling/mp00411c/colormap_thin_q5.txt.gz: New txt file. + * doc/labeling/mp00411c/histo_all_q4.dump.gz: New dump file. + * doc/labeling/mp00411c/histo_all_q5.dump.gz: New dump file. + * doc/labeling/mp00411c/histo_thick_q4.dump.gz: New dump file. + * doc/labeling/mp00411c/histo_thick_q5.dump.gz: New dump file. + * doc/labeling/mp00411c/histo_thin_q4.dump.gz: New dump file. + * doc/labeling/mp00411c/histo_thin_q5.dump.gz: New dump file. + * doc/labeling/mp00411c/iz_all_q4.dump.gz: New dump file. + * doc/labeling/mp00411c/iz_all_q5.dump.gz: New dump file. + * doc/labeling/mp00411c/iz_thick_q4.dump.gz: New dump file. + * doc/labeling/mp00411c/iz_thick_q5.dump.gz: New dump file. + * doc/labeling/mp00411c/iz_thin_q4.dump.gz: New dump file. + * doc/labeling/mp00411c/iz_thin_q5.dump.gz: New dump file. + * doc/labeling/mp00411c/labeled_all_q4.dump.gz: New dump file. + * doc/labeling/mp00411c/labeled_all_q5.dump.gz: New dump file. + * doc/labeling/mp00411c/labeled_thick_q4.dump.gz: New dump file. + * doc/labeling/mp00411c/labeled_thick_q5.dump.gz: New dump file. + * doc/labeling/mp00411c/labeled_thin_q4.dump.gz: New dump file. + * doc/labeling/mp00411c/labeled_thin_q5.dump.gz: New dump file. + * doc/labeling/mp00411c/mean3_all_q4.ppm.gz: New ppm file. + * doc/labeling/mp00411c/mean3_all_q5.ppm.gz: New ppm file. + * doc/labeling/mp00411c/mean3_thick_q4.ppm.gz: New ppm file. + * doc/labeling/mp00411c/mean3_thick_q5.ppm.gz: New ppm file. + * doc/labeling/mp00411c/mean3_thin_q4.ppm.gz: New ppm file. + * doc/labeling/mp00411c/mean3_thin_q5.ppm.gz: New ppm file. + * doc/labeling/mp00411c/mean4_all_q4.ppm.gz: New ppm file. + * doc/labeling/mp00411c/mean4_all_q5.ppm.gz: New ppm file. + * doc/labeling/mp00411c/mean4_thick_q4.ppm.gz: New ppm file. + * doc/labeling/mp00411c/mean4_thick_q5.ppm.gz: New ppm file. + * doc/labeling/mp00411c/mean4_thin_q4.ppm.gz: New ppm file. + * doc/labeling/mp00411c/mean4_thin_q5.ppm.gz: New ppm file. + * doc/labeling/mp00411c/mp00411c.ppm.gz: New input file. + * doc/labeling/mp00411c/mp00411c_thin.pbm.gz: New gradient mask. + * doc/labeling/mp00411c/mp00411c_thick.pbm.gz: New gradient mask. + * doc/labeling/mp00411c/mp00411c.sh.gz: New script shell. + * doc/labeling/mp00411c/opened_all_q4.dump.gz: New dump file. + * doc/labeling/mp00411c/opened_all_q5.dump.gz: New dump file. + * doc/labeling/mp00411c/opened_thick_q4.dump.gz: New dump file. + * doc/labeling/mp00411c/opened_thick_q5.dump.gz: New dump file. + * doc/labeling/mp00411c/opened_thin_q4.dump.gz: New dump file. + * doc/labeling/mp00411c/opened_thin_q5.dump.gz: New dump file. + * doc/labeling/mp00411c/proj1_all_q4.pgm.gz: New pgm file. + * doc/labeling/mp00411c/proj1_all_q5.pgm.gz: New pgm file. + * doc/labeling/mp00411c/proj1_thick_q4.pgm.gz: New pgm file. + * doc/labeling/mp00411c/proj1_thick_q5.pgm.gz: New pgm file. + * doc/labeling/mp00411c/proj1_thin_q4.pgm.gz: New pgm file. + * doc/labeling/mp00411c/proj1_thin_q5.pgm.gz: New pgm file. + * doc/labeling/mp00411c/proj2_all_q4.pgm.gz: New pgm file. + * doc/labeling/mp00411c/proj2_all_q5.pgm.gz: New pgm file. + * doc/labeling/mp00411c/proj2_thick_q4.pgm.gz: New pgm file. + * doc/labeling/mp00411c/proj2_thick_q5.pgm.gz: New pgm file. + * doc/labeling/mp00411c/proj2_thin_q4.pgm.gz: New pgm file. + * doc/labeling/mp00411c/proj2_thin_q5.pgm.gz: New pgm file. + * doc/labeling/mp00411c/proj3_all_q4.ppm.gz: New ppm file. + * doc/labeling/mp00411c/proj3_all_q5.ppm.gz: New ppm file. + * doc/labeling/mp00411c/proj3_thick_q4.ppm.gz: New ppm file. + * doc/labeling/mp00411c/proj3_thick_q5.ppm.gz: New ppm file. + * doc/labeling/mp00411c/proj3_thin_q4.ppm.gz: New ppm file. + * doc/labeling/mp00411c/proj3_thin_q5.ppm.gz: New ppm file. + * doc/labeling/mp00411c/proj4_all_q4.ppm.gz: New ppm file. + * doc/labeling/mp00411c/proj4_all_q5.ppm.gz: New ppm file. + * doc/labeling/mp00411c/proj4_thick_q4.ppm.gz: New ppm file. + * doc/labeling/mp00411c/proj4_thick_q5.ppm.gz: New ppm file. + * doc/labeling/mp00411c/proj4_thin_q4.ppm.gz: New ppm file. + * doc/labeling/mp00411c/proj4_thin_q5.ppm.gz: New ppm file. + * doc/labeling/mp00411c/quant_q4.ppm.gz: New ppm file. + * doc/labeling/mp00411c/quant_q5.ppm.gz: New ppm file. + * doc/labeling/mp00411c/stat3_all_q4.txt.gz: New txt file. + * doc/labeling/mp00411c/stat3_all_q5.txt.gz: New txt file. + * doc/labeling/mp00411c/stat3_thick_q4.txt.gz: New txt file. + * doc/labeling/mp00411c/stat3_thick_q5.txt.gz: New txt file. + * doc/labeling/mp00411c/stat3_thin_q4.txt.gz: New txt file. + * doc/labeling/mp00411c/stat3_thin_q5.txt.gz: New txt file. + * doc/labeling/mp00411c/stat4_all_q4.txt.gz: New txt file. + * doc/labeling/mp00411c/stat4_all_q5.txt.gz: New txt file. + * doc/labeling/mp00411c/stat4_thick_q4.txt.gz: New txt file. + * doc/labeling/mp00411c/stat4_thick_q5.txt.gz: New txt file. + * doc/labeling/mp00411c/stat4_thin_q4.txt.gz: New txt file. + * doc/labeling/mp00411c/stat4_thin_q5.txt.gz: New txt file. + * doc/labeling/mp00411c/synthese.txt.gz: New txt file. + + * doc/labeling/mp00307c_bis: New directory. + * doc/labeling/mp00307c_bis/colormap_all_q4_r06f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_all_q4_r06h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_all_q4_r18f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_all_q4_r18h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_all_q4_r26f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_all_q4_r26h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_all_q5_r06f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_all_q5_r06h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_all_q5_r18f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_all_q5_r18h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_all_q5_r26f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_all_q5_r26h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thin_q4_r06f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thin_q4_r06h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thin_q4_r18f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thin_q4_r18h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thin_q4_r26f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thin_q4_r26h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thin_q5_r06f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thin_q5_r06h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thin_q5_r18f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thin_q5_r18h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thin_q5_r26f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thin_q5_r26h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thick_q4_r06f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thick_q4_r06h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thick_q4_r18f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thick_q4_r18h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thick_q4_r26f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thick_q4_r26h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thick_q5_r06f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thick_q5_r06h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thick_q5_r18f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thick_q5_r18h.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thick_q5_r26f.txt: New colormap. + * doc/labeling/mp00307c_bis/colormap_thick_q5_r26h.txt: New colormap. + * doc/labeling/mp00307c_bis/histo_all_q4.dump.gz: New histo. + * doc/labeling/mp00307c_bis/histo_all_q5.dump.gz: New histo. + * doc/labeling/mp00307c_bis/histo_all_q8.dump.gz: New histo. + * doc/labeling/mp00307c_bis/histo_thin_q4.dump.gz: New histo. + * doc/labeling/mp00307c_bis/histo_thin_q5.dump.gz: New histo. + * doc/labeling/mp00307c_bis/histo_thin_q8.dump.gz: New histo. + * doc/labeling/mp00307c_bis/histo_thick_q4.dump.gz: New histo. + * doc/labeling/mp00307c_bis/histo_thick_q5.dump.gz: New histo. + * doc/labeling/mp00307c_bis/histo_thick_q8.dump.gz: New histo. + * doc/labeling/mp00307c_bis/iz_all_q4_r06f_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r06f_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r06f_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r06h_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r06h_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r06h_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r18f_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r18f_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r18f_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r18h_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r18h_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r18h_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r26f_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r26f_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r26f_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r26h_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r26h_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q4_r26h_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r06f_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r06f_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r06f_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r06h_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r06h_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r06h_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r18f_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r18f_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r18f_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r18h_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r18h_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r18h_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r26f_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r26f_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r26f_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r26h_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r26h_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_all_q5_r26h_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r06f_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r06f_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r06f_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r06h_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r06h_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r06h_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r18f_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r18f_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r18f_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r18h_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r18h_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r18h_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r26f_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r26f_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r26f_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r26h_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r26h_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q4_r26h_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r06f_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r06f_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r06f_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r06h_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r06h_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r06h_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r18f_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r18f_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r18f_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r18h_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r18h_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r18h_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r26f_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r26f_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r26f_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r26h_i06.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r26h_i18.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thin_q5_r26h_i26.dump.gz: New lbl propag. + * doc/labeling/mp00307c_bis/iz_thick_q4_r06f_i06.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r06f_i18.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r06f_i26.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r06h_i06.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r06h_i18.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r06h_i26.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r18f_i06.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r18f_i18.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r18f_i26.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r18h_i06.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r18h_i18.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r18h_i26.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r26f_i06.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r26f_i18.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r26f_i26.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r26h_i06.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r26h_i18.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q4_r26h_i26.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r06f_i06.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r06f_i18.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r06f_i26.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r06h_i06.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r06h_i18.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r06h_i26.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r18f_i06.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r18f_i18.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r18f_i26.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r18h_i06.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r18h_i18.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r18h_i26.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r26f_i06.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r26f_i18.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r26f_i26.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r26h_i06.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r26h_i18.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/iz_thick_q5_r26h_i26.dump.gz: New lbl prop. + * doc/labeling/mp00307c_bis/labeled_all_q4_r06f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_all_q4_r06h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_all_q4_r18f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_all_q4_r18h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_all_q4_r28f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_all_q4_r28h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_all_q5_r06f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_all_q5_r06h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_all_q5_r18f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_all_q5_r18h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_all_q5_r28f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_all_q5_r28h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thin_q4_r06f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thin_q4_r06h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thin_q4_r18f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thin_q4_r18h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thin_q4_r28f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thin_q4_r28h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thin_q5_r06f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thin_q5_r06h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thin_q5_r18f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thin_q5_r18h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thin_q5_r28f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thin_q5_r28h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thick_q4_r06f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thick_q4_r06h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thick_q4_r18f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thick_q4_r18h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thick_q4_r28f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thick_q4_r28h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thick_q5_r06f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thick_q5_r06h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thick_q5_r18f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thick_q5_r18h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thick_q5_r28f.dump.gz: New histo. + * doc/labeling/mp00307c_bis/labeled_thick_q5_r28h.dump.gz: New histo. + * doc/labeling/mp00307c_bis/mean3_all_q4_r06f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_all_q4_r06h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_all_q4_r18f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_all_q4_r18h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_all_q4_r26f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_all_q4_r26h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_all_q5_r06f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_all_q5_r06h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_all_q5_r18f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_all_q5_r18h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_all_q5_r26f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_all_q5_r26h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thin_q4_r06f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thin_q4_r06h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thin_q4_r18f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thin_q4_r18h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thin_q4_r26f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thin_q4_r26h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thin_q5_r06f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thin_q5_r06h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thin_q5_r18f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thin_q5_r18h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thin_q5_r26f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thin_q5_r26h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thick_q4_r06f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thick_q4_r06h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thick_q4_r18f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thick_q4_r18h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thick_q4_r26f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thick_q4_r26h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thick_q5_r06f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thick_q5_r06h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thick_q5_r18f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thick_q5_r18h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thick_q5_r26f.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean3_thick_q5_r26h.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r06f_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r06f_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r06f_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r06h_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r06h_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r06h_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r18f_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r18f_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r18f_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r18h_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r18h_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r18h_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r26f_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r26f_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r26f_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r26h_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r26h_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q4_r26h_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r06f_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r06f_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r06f_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r06h_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r06h_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r06h_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r18f_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r18f_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r18f_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r18h_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r18h_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r18h_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r26f_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r26f_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r26f_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r26h_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r26h_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_all_q5_r26h_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r06f_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r06f_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r06f_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r06h_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r06h_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r06h_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r18f_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r18f_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r18f_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r18h_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r18h_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r18h_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r26f_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r26f_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r26f_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r26h_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r26h_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q4_r26h_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r06f_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r06f_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r06f_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r06h_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r06h_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r06h_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r18f_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r18f_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r18f_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r18h_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r18h_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r18h_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r26f_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r26f_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r26f_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r26h_i06.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r26h_i18.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thin_q5_r26h_i26.ppm.gz: New mean img. + * doc/labeling/mp00307c_bis/mean4_thick_q4_r06f_i06.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r06f_i18.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r06f_i26.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r06h_i06.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r06h_i18.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r06h_i26.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r18f_i06.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r18f_i18.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r18f_i26.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r18h_i06.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r18h_i18.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r18h_i26.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r26f_i06.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r26f_i18.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r26f_i26.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r26h_i06.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r26h_i18.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q4_r26h_i26.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r06f_i06.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r06f_i18.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r06f_i26.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r06h_i06.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r06h_i18.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r06h_i26.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r18f_i06.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r18f_i18.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r18f_i26.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r18h_i06.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r18h_i18.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r18h_i26.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r26f_i06.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r26f_i18.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r26f_i26.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r26h_i06.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r26h_i18.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mean4_thick_q5_r26h_i26.ppm.gz: New mean . + * doc/labeling/mp00307c_bis/mp00307c.ppm.gz: New input img. + * doc/labeling/mp00307c_bis/mp00307c.sh.gz: New script shell. + * doc/labeling/mp00307c_bis/mp00307c_thick.pgm.gz: New mask. + * doc/labeling/mp00307c_bis/mp00307c_thin.pgm.gz: New mask. + * doc/labeling/mp00307c_bis/opened_all_q4.dump.gz: New filtered histo. + * doc/labeling/mp00307c_bis/opened_all_q5.dump.gz: New filtered histo. + * doc/labeling/mp00307c_bis/opened_all_q8.dump.gz: New filtered histo. + * doc/labeling/mp00307c_bis/opened_thin_q4.dump.gz: New filtered histo. + * doc/labeling/mp00307c_bis/opened_thin_q5.dump.gz: New filtered histo. + * doc/labeling/mp00307c_bis/opened_thin_q8.dump.gz: New filtered histo. + * doc/labeling/mp00307c_bis/opened_thick_q4.dump.gz: New filtered histo. + * doc/labeling/mp00307c_bis/opened_thick_q5.dump.gz: New filtered histo. + * doc/labeling/mp00307c_bis/opened_thick_q8.dump.gz: New filtered histo. + * doc/labeling/mp00307c_bis/proj1_all_q4.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_all_q4.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_all_q5.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_all_q5.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_all_q8.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_all_q8.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_thin_q4.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_thin_q4.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_thin_q5.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_thin_q5.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_thin_q8.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_thin_q8.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_thick_q4.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_thick_q4.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_thick_q5.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_thick_q5.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_thick_q8.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj1_thick_q8.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_all_q4.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_all_q4.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_all_q5.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_all_q5.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_all_q8.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_all_q8.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_thin_q4.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_thin_q4.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_thin_q5.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_thin_q5.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_thin_q8.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_thin_q8.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_thick_q4.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_thick_q4.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_thick_q5.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_thick_q5.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_thick_q8.pgm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj2_thick_q8.ppm.gz: New r/g projection. + * doc/labeling/mp00307c_bis/proj3_all_q4_r06f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_all_q4_r06h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_all_q4_r18f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_all_q4_r18h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_all_q4_r26f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_all_q4_r26h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_all_q5_r06f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_all_q5_r06h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_all_q5_r18f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_all_q5_r18h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_all_q5_r26f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_all_q5_r26h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thin_q4_r06f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thin_q4_r06h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thin_q4_r18f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thin_q4_r18h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thin_q4_r26f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thin_q4_r26h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thin_q5_r06f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thin_q5_r06h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thin_q5_r18f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thin_q5_r18h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thin_q5_r26f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thin_q5_r26h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thick_q4_r06f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thick_q4_r06h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thick_q4_r18f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thick_q4_r18h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thick_q4_r26f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thick_q4_r26h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thick_q5_r06f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thick_q5_r06h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thick_q5_r18f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thick_q5_r18h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thick_q5_r26f.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj3_thick_q5_r26h.ppm.gz: New r/g proj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r06f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r06f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r06f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r06h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r06h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r06h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r18f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r18f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r18f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r18h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r18h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r18h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r26f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r26f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r26f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r26h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r26h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q4_r26h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r06f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r06f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r06f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r06h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r06h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r06h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r18f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r18f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r18f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r18h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r18h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r18h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r26f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r26f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r26f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r26h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r26h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_all_q5_r26h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r06f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r06f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r06f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r06h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r06h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r06h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r18f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r18f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r18f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r18h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r18h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r18h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r26f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r26f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r26f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r26h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r26h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q4_r26h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r06f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r06f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r06f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r06h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r06h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r06h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r18f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r18f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r18f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r18h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r18h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r18h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r26f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r26f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r26f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r26h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r26h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thin_q5_r26h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r06f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r06f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r06f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r06h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r06h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r06h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r18f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r18f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r18f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r18h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r18h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r18h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r26f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r26f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r26f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r26h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r26h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q4_r26h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r06f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r06f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r06f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r06h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r06h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r06h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r18f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r18f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r18f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r18h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r18h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r18h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r26f_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r26f_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r26f_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r26h_i06.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r26h_i18.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/proj4_thick_q5_r26h_i26.ppm.gz: New rg prj. + * doc/labeling/mp00307c_bis/quant_q4.ppm.gz: New quantified img. + * doc/labeling/mp00307c_bis/quant_q5.ppm.gz: New quantified img. + * doc/labeling/mp00307c_bis/quant_q8.ppm.gz: New quantified img. + * doc/labeling/mp00307c_bis/stats3_all_q4_r06f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_all_q4_r06h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_all_q4_r18f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_all_q4_r18h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_all_q4_r26f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_all_q4_r26h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_all_q5_r06f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_all_q5_r06h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_all_q5_r18f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_all_q5_r18h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_all_q5_r26f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_all_q5_r26h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thin_q4_r06f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thin_q4_r06h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thin_q4_r18f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thin_q4_r18h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thin_q4_r26f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thin_q4_r26h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thin_q5_r06f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thin_q5_r06h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thin_q5_r18f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thin_q5_r18h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thin_q5_r26f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thin_q5_r26h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thick_q4_r06f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thick_q4_r06h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thick_q4_r18f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thick_q4_r18h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thick_q4_r26f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thick_q4_r26h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thick_q5_r06f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thick_q5_r06h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thick_q5_r18f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thick_q5_r18h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thick_q5_r26f.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats3_thick_q5_r26h.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r06f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r06f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r06f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r06h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r06h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r06h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r18f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r18f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r18f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r18h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r18h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r18h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r26f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r26f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r26f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r26h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r26h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q4_r26h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r06f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r06f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r06f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r06h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r06h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r06h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r18f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r18f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r18f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r18h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r18h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r18h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r26f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r26f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r26f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r26h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r26h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_all_q5_r26h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r06f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r06f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r06f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r06h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r06h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r06h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r18f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r18f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r18f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r18h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r18h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r18h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r26f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r26f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r26f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r26h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r26h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q4_r26h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r06f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r06f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r06f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r06h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r06h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r06h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r18f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r18f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r18f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r18h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r18h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r18h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r26f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r26f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r26f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r26h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r26h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thin_q5_r26h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r06f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r06f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r06f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r06h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r06h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r06h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r18f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r18f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r18f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r18h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r18h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r18h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r26f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r26f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r26f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r26h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r26h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q4_r26h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r06f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r06f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r06f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r06h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r06h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r06h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r18f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r18f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r18f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r18h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r18h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r18h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r26f_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r26f_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r26f_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r26h_i06.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r26h_i18.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/stats4_thick_q5_r26h_i26.ppm.gz: New stats. + * doc/labeling/mp00307c_bis/synthese.txt.gz: New synthesis file. + + + * doc/labeling/mp00042c: New directory. + * doc/labeling/mp00042c/histo_all.dump.gz: New histo. + * doc/labeling/mp00042c/histo_thick.dump.gz: New histo. + * doc/labeling/mp00042c/histo_thin.dump.gz: New histo. + * doc/labeling/mp00042c/labeled_all.dump.gz: New labeled histo. + * doc/labeling/mp00042c/labeled_thick.dump.gz: New labeled histo. + * doc/labeling/mp00042c/labeled_thin.dump.gz: New labeled histo. + * doc/labeling/mp00042c/mean_all.dump.gz: New mean img. + * doc/labeling/mp00042c/mean_thin.dump.gz: New mean img. + * doc/labeling/mp00042c/mean_thick.dump.gz: New mean img. + * doc/labeling/mp00042c/mp00042c.ppm.gz: New input img. + * doc/labeling/mp00042c/mp00042c.sh.gz: New script shell. + * doc/labeling/mp00042c/mp00042c_thick.gz: New mask. + * doc/labeling/mp00042c/mp00042c_thin.gz: New mask. + * doc/labeling/mp00042c/opened_all.gz: New filtered histo. + * doc/labeling/mp00042c/opened_thin.gz: New filtered histo. + * doc/labeling/mp00042c/opened_thick.gz: New filtered histo. + * doc/labeling/mp00042c/pal_all.gz: New colormap. + * doc/labeling/mp00042c/pal_thin.gz: New colormap. + * doc/labeling/mp00042c/pal_thick.gz: New colormap. + * doc/labeling/mp00042c/proj1.pgm.gz: New r/g projection. + * doc/labeling/mp00042c/proj2.pgm.gz: New r/g projection. + * doc/labeling/mp00042c/proj3.ppm.gz: New r/g projection. + * doc/labeling/mp00042c/proj2_all.pgm.gz: New r/g projection + * doc/labeling/mp00042c/proj2_thin.pgm.gz: New r/g projection. + * doc/labeling/mp00042c/proj2_thick.pgm.gz: New r/g projection. + * doc/labeling/mp00042c/proj3_all.pgm.gz: New r/g projection. + * doc/labeling/mp00042c/proj3_thin.pgm.gz: New r/g projection. + * doc/labeling/mp00042c/proj3_thick.pgm.gz: New r/g projection. + * doc/labeling/mp00042c/proj_all.pgm.gz: New r/g projection. + * doc/labeling/mp00042c/proj_thick.pgm.gz: New r/g projection. + * doc/labeling/mp00042c/proj_thin.pgm.gz: New r/g projection. + * doc/labeling/mp00042c/quant.ppm.gz: New quantified img. + + * doc/labeling/mp00307c: New directory. + * doc/labeling/mp00307c/colormap_all.txt.tgz: New colormap. + * doc/labeling/mp00307c/colormap_thin.txt.tgz: New colormap. + * doc/labeling/mp00307c/colormap_thick.txt.tgz: New colormap. + * doc/labeling/mp00307c/histo_all.dump.tgz: New histo. + * doc/labeling/mp00307c/histo_thin.dump.tgz: New histo. + * doc/labeling/mp00307c/histo_thick.dump.tgz: New histo. + * doc/labeling/mp00307c/iz_all.dump.tgz: New label propagation.. + * doc/labeling/mp00307c/iz_thick.dump.tgz: New label propagation.. + * doc/labeling/mp00307c/labeled_all.dump.tgz: New label histo. + * doc/labeling/mp00307c/labeled_thin.dump.tgz: New label histo. + * doc/labeling/mp00307c/labeled_thick.dump.tgz: New label histo. + * doc/labeling/mp00307c/mean3_all.ppm.tgz: New mean img. + * doc/labeling/mp00307c/mean3_thin.ppm.tgz: New mean img. + * doc/labeling/mp00307c/mean3_thick.ppm.tgz: New mean img. + * doc/labeling/mp00307c/mean4_all.ppm.tgz: New mean img. + * doc/labeling/mp00307c/mean4_thin.ppm.tgz: New mean img. + * doc/labeling/mp00307c/mean4_thick.ppm.tgz: New mean img. + * doc/labeling/mp00307c/mp00307.ppm.tgz: New input img. + * doc/labeling/mp00307c/mp00307.sh.tgz: New script shell. + * doc/labeling/mp00307c/mp00307_thin.pbm.tgz: New mask. + * doc/labeling/mp00307c/mp00307_thick.pbm.tgz: New mask. + * doc/labeling/mp00307c/opened_all.dump.tgz: New filtered img. + * doc/labeling/mp00307c/opened_thin.dump.tgz: New filtered img. + * doc/labeling/mp00307c/opened_thick.dump.tgz: New filtered img. + * doc/labeling/mp00307c/proj1_all.pgm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj1_all.ppm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj1_thin.pgm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj1_thin.ppm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj1_thick.pgm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj1_thick.ppm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj2_all.pgm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj2_all.ppm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj2_thin.pgm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj2_thin.ppm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj2_thick.pgm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj2_thick.ppm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj3_all.pgm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj3_all.ppm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj3_thin.pgm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj3_thin.ppm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj3_thick.pgm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj3_thick.ppm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj4_all.pgm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj4_all.ppm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj4_thin.pgm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj4_thin.ppm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj4_thick.pgm.tgz: New r/g projection. + * doc/labeling/mp00307c/proj4_thick.ppm.tgz: New r/g projection + * doc/labeling/mp00307c/quant.ppm.tgz: New quantified img + * doc/labeling/mp00307c/stats3_all.txt.tgz: New stats file. + * doc/labeling/mp00307c/stats3_thin.txt.tgz: New stats file. + * doc/labeling/mp00307c/stats3_thick.txt.tgz: New stats file. + * doc/labeling/mp00307c/stats4_all.txt.tgz: New stats file. + * doc/labeling/mp00307c/stats4_thin.txt.tgz: New stats file. + * doc/labeling/mp00307c/stats4_thick.txt.tgz: New stats file. + * doc/labeling/mp00307c/synthese.txt.tgz: New synthesis file. + + Import materials for next tests. + + * doc/labeling/mp00215c: New directory. + * doc/labeling/mp00215c/mp00215c.ppm.gz: New color input img. + * doc/labeling/mp00215c/mp00215c_thick.pbm.gz: New thick mask. + * doc/labeling/mp00215c/mp00215c_thin.pbm.gz: New thin mask. + + * doc/labeling/mp00234c: New directory. + * doc/labeling/mp00234c/mp00234c.ppm.gz: New color input img. + * doc/labeling/mp00234c/mp00234c_thick.pbm.gz: New thick mask. + * doc/labeling/mp00234c/mp00234c_thin.pbm.gz: New thin mask. + + * doc/labeling/mp00248c: New directory. + * doc/labeling/mp00248c/mp00248c.ppm.gz: New color input img. + * doc/labeling/mp00248c/mp00248c_thick.pbm.gz: New thick mask. + * doc/labeling/mp00248c/mp00248c_thin.pbm.gz: New thin mask. + + * doc/labeling/mp00031c: New directory. + * doc/labeling/mp00031c/mp00031c.ppm.gz: New color input img. + * doc/labeling/mp00031c/mp00031c_thick.pbm.gz: New thick mask. + * doc/labeling/mp00031c/mp00031c_thin.pbm.gz: New thin mask. + + * doc/labeling/mp00083c: New directory. + * doc/labeling/mp00083c/mp00083c.ppm.gz: New color input img. + * doc/labeling/mp00083c/mp00083c_thick.pbm.gz: New thick mask. + * doc/labeling/mp00083c/mp00083c_thin.pbm.gz: New thin mask. + + Import annotating search notes. + + * doc/annotating/class.txt: New documentation text file. + * doc/annotating/syntheseMillet.txt: New documentation text file. + * doc/annotating/testMillet2008: New documentation text file. + + Import milena learning examples. + + * doc/examples: New directory. + + * doc/examples/hello_world: New directory. + * doc/examples/hello_world/Makefile.am: New makefile. + * doc/examples/hello_world/hellow_world.cc: New source file. + * doc/examples/hello_world/print.cc: New source file. + + * doc/examples/hello_milena: New directory. + * doc/examples/hello_milena/Makefile.am: New makefile. + * doc/examples/hello_milena/hello_milena.cc: New source file. + + * doc/examples/learn_milena: New directory. + * doc/examples/learn_milena/Makefile.am: New makefile. + * doc/examples/learn_milena/learn_milena.cc: New source file. + + * doc/examples/otsu: New directory. + * doc/examples/otsu/Makefile.am: New makefile. + * doc/examples/otsu/otsu.cc: New source file. + + * doc/examples/frac: New directory. + * doc/examples/frac/Makefile.am: New makefile. + * doc/examples/frac/frac.cc: New source file. + * doc/examples/frac/frac.hh: New source file. + * doc/examples/frac/sign_prod.hh: New source file. + * doc/examples/frac/gcd.hh: New source file. + + * doc/examples/accu_color: New directory. + * doc/examples/accu_color/accu_color.cc: New source file. + + * doc/examples/io: New directory. + * doc/examples/io/Makefile.am: New makefile. + * doc/examples/io/io.cc: New source file. + + Write down the basis of the quick tour summary documentation. + + * doc/quick_tour: New specific directory. + * doc/quick_tour/quick_tour.tex: New documentation work. + + Write down 3d currently used formulaes. + + * doc/formulae: New specific directory. + * doc/formulae/formulae.tex: New recipe of 3d formulae. + + 2010-06-30 Yann Jacquelet <jacquelet@lrde.epita.fr> Add some futur materials on regional maxima. diff --git a/scribo/sandbox/green/README.green b/scribo/sandbox/green/README.green index 02d8654..7886914 100644 --- a/scribo/sandbox/green/README.green +++ b/scribo/sandbox/green/README.green @@ -236,13 +236,94 @@ n'importe quel algorithme type huffman (tous les archiveurs en possède un). VIII VISUALISATION HISTOGRAMMES 3D ---------------------------------- -==> to do - - -* demo/accu/stat/histo2d - -* mln/display/dispay_histo.hh -* mln/display/project_histo.hh +Les histogrammes sur lesquels nous sommes amenés à travailler sont en +3d. Nous étudions des images couleurs dans l'espace RGB, donc +l'histogramme dans cet espace possède 3 dimensions (une par axe, R, G +et B) et la cellule désignée par cette position RGB renfermera le nombre +de pixels de l'image ayant exactement cette couleur. Il est très +difficile de bien visualiser ces images, car elles sont en 3d. Gnuplot +nous donne qu'une aide très limitée, car il faut afficher 3 axes et la +force de la cellule, ce qui fait en fait quatre informations à +afficher. Il est possible de jouer avec les couleurs, mais il n'y a +pas de représentation très utile, on peut afficher le nuage des +couleurs pour percevoir sa forme générale, mais l'interprétation ne +peut pas vraiment aller plus loin. C'est pourquoi, nous proposons une +représentation plus pertinente. C'est Théo qui a roulé sa bosse en +classification qui a developpé ce genre de technique, je ne fais que +réutilliser les mêmes analyses en beaucoup moins fins que ce qu'il a +déjà pu développer par ailleurs. + +La première idée est de gommer une dimension, et c'est possible de le +faire car dans une image RGB, souvent l'axe bleu est fortement +correllé avec l'axe vert. Cela dépend beaucoup de la formation des +images et pour des images synthétiques, il n'y a aucune raison que +ce soit le cas. C'est juste une propriété qui s'applique pour les +images naturelles. La forte corrélation obtenue ne veut pas dire qu'il +y a exactement les mêmes informations, juste que dans l'ensemble on +note une relative redondance (du point de vue statistique). Pour t'en +convaincre, tu peux regarder sous gimp, les histogrammes sur les +différents canaux et tu observeras qu'il y a deux canaux (le vert et +bleu) pour lesquels les histogrammes sont presque identiques. + +La dernière étape est de réaliser un traitement sur la dimension qui a +été supprimée. Par exemple, sommer toutes les valeurs rencontrées ou +ne retenir que la valeur max ... + +Le fichier display_histo.hh joue le rôle de front hand pour les +routines de visualisation. Il a pour rôle d'initialiser, d'instancier, +de coordonner la chaine de visualisation. Le fichier project_histo.hh +décrit les algorithmes au coeur de la visualisation, comment est +construite concrêtement l'information que l'on visualise à la fin. + +Nous avons construit 3 sortes de projecteurs. Le premier va sommer le +long de l'axe bleu les différentes informations +rencontrées. Globalement, cela signifie, que plus il y a de pixels +dans le sous espace (red=v1,green=v2) avec pour chaque pixel +rencontrés des valeurs de bleu différentes, plus le nombre construit +sera grand. Sur cette information, on fera passer un logarithme pour +diminuer les pics et ne faire ressortir visuellement que les +informations les plus saillantes. En dernier lieu, on rescalera les +valeurs obtenues pour utiliser pleinement la dynamique d'une image de +256 niveaux de gris. La visualisation obtenue nous donne un aperçu de +la densité de l'espace des couleurs. On observera en très lumineux les +endroits de forte population de couleurs et en presque noir l'absence +de couleur dans l'image pour cette portion de l'espace RGB. + +Les autres techniques de visualisation sont des variantes du même +traitement que nous allons decrire. La chaine de base consiste à +parcourir la dimension bleu pour chaque point de l'espace rouge/vert +(comme dans la première technique). Cette fois-ci, ce n'est plus la +somme qui nous intéresse, mais la couleur la plus représentée. On va +faire un max des valeurs obtenues en parcourant l'axe bleu. Une +première version rapportera la position bleue qui rassemble le plus de +pixels. Une seconde version remplacera cette position bleue par un +label associé à une segmentation déjà effectuée dans cet espace. + +La dernière technique modifie la version précédente de la manière +suivante: Nous sommes toujours interessé par le max, mais on va remplacer +cette information directement par la couleur reconstituée (nous sommes +sur un point particulier de l'espace red/green donc red et green sont +connus, et on vient d'obtenir la valeur bleue la plus représentée, on +utilisera cette valeur pour former une couleur RGB). A l'issu du +processus, on obtient donc une image couleur. L'information obtenue +ici, n'est plus la densité de l'histogramme, mais plutôt la couleur la +plus représentée à cet endroit. La toute première technique et celle-ci +sont complémentaires pour la bonne visualisation d'un histogramme +3d. Si l'on dispose d'une segmentation de l'espace des couleurs, on +peut trouver le label associé au bleu prédominant et récupérer dans +une palette de couleur annexe la couleur associée au label. + +* mln/display/dispay_histo.hh: Front hand pour les routines de projection. +* mln/display/project_histo.hh: Les algorithmes de visualisations. + +Le travail dans use ne représente que deux routines sur six de +display_histo. Par manque de temps, je ne fais pas le reste de +manière à insister sur d'autres points documentaires plus +importants. Le cadre est en place et les autres routines plus +sophistiquées faisant intervenir la segmentation de l'histogramme +peuvent être tirées de tools/labeling/regmax par exemple. + +* use/display/display_histo: Visualisations des histogrammes. IX KMEANS @@ -388,29 +469,266 @@ tests effectués et montrent l'évolution du temps de calcul suivant la progression du paramètre observé (taille de l'image ou nombre de centres). -==> to do : le changelog + commit + give it to scribo-z branch - X REGIONAL MAXIMA ----------------- -==> to do +Pour cette partie, le temps a commencé à s'accélérer, ce qui fait +qu'il n'y a plus de tests unitaires. Par ailleurs, comme la +fonctionnalité n'a pas été pensée comme un élément de la librairie, il +n'y a donc pas non plus de répertoire "use" à cet effet. + + +a) Segmentation basé sur le watershed + +Cet exemple essaye une première méthode de filtrage de +l'histogramme. A noter elle ne compile pas. Elle eu compilé dans le +temps, mais le source a été tellement remanié que sa reconstruction +doit régler encore quelques détails. Sa compilation n'a pas vraiment +d'intérêt en soi, seule la démarche compte ici. Le temps me manque et +je ne persisterais pas à essayer de le faire compiler à tout prix. D'autres +sources sont beaucoup plus intéressant. Nota, gaussian.sh est un gnuplot +script shell qui sert à calibrer le filtrage de l'histogramme. Il permet +de déterminer visuellement la taille de la fenêtre win utilisée lors de la +convolution en fonction d'un écart type sigma donné. + +* demo/labeling/watershed: Demonstrator de la segmentation d'un histogramme. + + +b) Second essai avec les regional_maxima + +Le programme actuel ne compile pas non plus. Il n'est pas d'une grande +importance, alors du coup je le laisse tel quel. Il a servi a +plusieurs choses, en premier à tester les regional_maxima mais en +dernier lieu surtout à tester le filtrage par attribut (volume) qui +semblait avoir quelques soucis. A l'heure d'aujourd'hui, je ne peux +toujours pas dire s'il fonctionne convenablement ou non, il semble que +parfois des anomalies se produisent à ce niveau, mais elles peuvent +aussi bien être générées par un problème interne à mon programme. + +* demo/labeling/regional_maxima: Testeur du filtrage par attribut de volume. + + +c) Déplacement du programme b) dans exp. + +Même programme que b) mais qui compile. + +* exp/labeling/regional_maxima: Testeur du filtrage par attribut de volume. + + +d) Sources importantes ==> regional_maxima + +Il y avait une autre version des regional_maxima ou toute la chaine était +présente, si j'avais davantage de temps, je l'aurais réecrite. Il semble +qu'elle se soit perdue lors de la migration de SVN vers GIT. Aucune importance. +Les outils "up to date" sont ceux dont les sources sont dans tools. La classe +outil représente des binaires un peu plus travaillé au niveau de l'interface +texte, en gros ils prennent plein de paramètres et génèrent des résultats +intermédiaires. Chaque outil à son usage ... + + +Ce qu'il faut savoir sur l'outil histo. Tout d'abord le programme +prend 7 ou 8 arguments et c'est le dernier qui est optionnel. Les +arguments sont l'image couleur à partir de laquelle on veut extraire +l'histogramme couleur (3d), le degré de quantification que l'on veut +utiliser (sous échantillonnnage de l'image), le chemin de l'image +couleur quantifiée résultante après analyse, le chemin de +l'histogramme produit (réutilisé par les autres outils), la +visualisation rouge/verte de l'histogramme (brute) et la visualisation +augmentée de ce même histogramme avec les maxima dessus. Se reporter à +la documentation des histogrammes pour avoir plus d'information sur ce +sujet. Le dernier paramètre optionnel est un masque à appliquer sur +les pixels de l'image d'entrée. La chaine de traitement de l'outil, +commence par sous échantillonner l'image en n bits, n < 8, puis +construit l'histogramme 3d à partir des pixels présents dans le masque, +si ce dernier existe et enfin sauvegarde des résultats et des images +servant à la visualisation. + +* tools/labeling/histo: Construction de l'histogramme. + + +Ce qu'il faut savoir sur l'outil de filtrage de l'histogramme. Tout +d'abord, il prend en paramètre 6 arguments obligatoires. Les arguments +sont la quantification utilisée par l'outil de création de +l'histogramme, le chemin de l'histogramme à filtrer, le seuil utilisé +pour le filtrage (c'est le volume minimal en dessous duquel +l'information est jugée comme du bruit et donc ne doit pas passer), le +chemin de l'histogramme filtré, le chemin de la projection en densité +de l'histogramme et le chemin de la projection en couleurs +majoritaires de l'histogramme. Se reporter au chapitre sur la +visualisation pour comprendre les différentes projections. Le filtrage +est un traitement très simple, il applique uniquement l'algorithme +morphologique d'ouverture sur les attributs de volume. Imagine un +histogramme en 1d, l'attribut de volume est alors la surface sous la +courbe de l'histogramme. Une ouverture volumique consiste à supprimer +tous les pics ayant un volume inférieur au seuil. Cela fonctionne très +bien en général, toutefois, il y a des cas où les informations +retournées ne sont pas celles attendues. Concrêtement, des composantes +de volume inférieur au seuil sont retrouvées plus loin dans la chaine +de traitement, ce qui contredit l'usage de l'ouverture +morphologique. Il est difficile de définir ce qui se passe vraiment, +il est possible qu'il y ait un bug ou simplement que le reste de ma +chaine induise quelque fois ce résultat étrange. Honnêtement, je ne +sais pas ce qui se passe. Le cas n'arrive pas fréquemment, donc il est +très difficile d'isoler l'erreur. + +* tools/labeling/opening: Filtrage de l'histogramme. + + +Ce qu'il faut savoir sur l'outil de labellisation. Tout d'abord, il +prend 11 arguments dont le dernier est optionel. Les arguments sont +l'image originale (nécessaire pour calculer la couleur moyenne des +labels ==> réalité augmentée), la quantification utilisée +précédemment, l'image préalablement quantifiée, l'histogramme +original, l'histogramme filtré, le voisinage sur lequel effectué les +opérations (c6, c18 ou c26), l'histogramme segmenté en 3d, la +projection red/green associée, la colormap, l'image reconstruite des +moyennes associé à chaque label et éventuellement un fichier décrivant +les statistiques associés aux labels (couleur moyenne associé au +label, plus nombre de pixels concernés dans l'image, plus pourcentage +absolu et pourcentage sans tenir compte du fond). Le seul appel +intéressant est la labellisation de l'histogramme filtré qui produit +une image 3d de label. Tout le reste est de la tuyauterie pour faire +de la rélatité augmentée. Par exemple pour formée l'image des moyennes +associées à chaque label, il est nécessaire de construire l'image 2d +des labels qui fait intervenir elle-même l'image d'entrée quantifiée +et l'image originale. Idem pour la construction de la +colormap. L'outil segmente l'histogramme filtré par la détermination +des maxima régionnaux, autrement dit des zones de très fortes +densités. Ces zones sont en général très petites, quelques pixels pas +plus. C'est pourquoi l'outil suivant va nous servir à les étendre un +peu. + +* tools/labeling/regmax: Segmentation de l'histogramme. + + +Petite suprise désagréable, l'outil iz ne compile plus. La raison en +est toute simple, il y a eu du mouvement dans les fonctions +mln::transform::influence_zone_geodesic(). Un revamp un peu violent, +avec une version +mln::transform::influence_zone_geodesic_saturated(). J'ai corrigé le +changement d'appel, mais cela ne suffit pas. Dans la méthode +mln::transform::influence_zone_geodesic_fastest(), l.127, tu utilises +la méthode at() pour une image 2d et là pas de chance, moi j'utilise +cet algorithme pour une image de labels 3d (nous sommes dans un espace +RGB quantifié en n bits, n < 8). Je ne veux surtout rien détruire dans +scribo, donc je te laisse effectuer les changements qui s'imposent et +je continue la documentation. + +Ce qu'il faut savoir sur iz. Tout d'abord cette routine prend 12 +arguments dont le dernier est optionel. Les arguments sont +l'histogramme labelisé par l'outil précédent, la profondeur utilisée +pour l'influence par zone géodésique (0 signifie l'infini), puis vient +le voisinage 3d utilisé pour la propagation, puis l'image initiale, +puis le degrée de quantification utilisé par tous les outils, puis le +dump de l'histogramme, la colormap (utilisée pour la projection r/g +avec segmentation, puis l'histogramme labelisé après propagation nommé +iz et enfin la projection r/g, l'image reconstruite à l'aide des +moyennes des classes et le fichier de statistiques intégrant la +propagation des classes. La propagation a pour vocation d'agrandir les +classes obtenues jusqu'à maintenant. C'est une information que l'on +voit bien avec les changements dans les projections r/g. + +* tools/labeling/iz: Propagation des classes par zone d'influence. + + +Comme le paramétrage est difficile, il est conseillé de relire les +scripts des jeux de tests qui coordonnent l'appel de ces routines avec +une sucession de paramètres cohérents. Je sais ce que tu vas me dire, +c'est mal, il ne faut pas mettre d'images sur le dépot git. Dans +l'absolu, je suis d'accord, mais aujourd'hui, le code iz est cassé et +rejouer ces tests peut prendre énormément de temps, donc par facilité, +je me contente des résultats que j'avais archivé et que tu seras +content de trouver pour en inclure une partie dans ton rapport. + +Tout d'abord un jeu de répertoire de test en instance d'être lancé. Le +répertoire porte le nom de l'image sur laquelle est effectué le +test. On y trouvera l'image originale pleine résolution, et les deux +masques de gradient fin et un peu plus épais. Pour faire le test, il +suffit d'écrire le script comme dans doc/labeling/mp00307. + +* doc/labeling/mp00215c +* doc/labeling/mp00234c +* doc/labeling/mp00248c +* doc/labeling/ta00031c +* doc/labeling/ta00083c + + +Puis, nous avons les tous premiers tests qui ont servi pour déterminer +la quantification à utiliser et la méthode de propagation (infinie ou +saturée). Il y a longtemps, pour ces tests, je disposais d'une chaine +complète mais cette dernière c'est perdu dans la migration entre svn +et git. Il n'y a donc pas de script shell qui lance les outils, par +contre il existe un fichier de synthese qui explique exactement ce qui +a avait été lancé et avec quels paramètres, histoire de pouvoir rejouer le test. + +* doc/labeling/cmp_method: Test sur le type de propagation à utiliser. +* doc/labelling/cmp_quant: Test sur la quantification a utiliser. + + +Puis, nous avons les tests effectués à l'aide d'un script. Lire les +scripts pour situer correctement les binaires outils utilisés. Le +premier jeu test avait pour but d'étudier la combinatoire des options +et de choisir ensuite les paramètres qui vont bien. Il n'y a pas de +certitude complète en la matière. Lire attentivement le fichier +synthèse. Tout ces éléments ont été validés par théo. Je ne me rapelle +plus du détail, mais j'ai rédigé tout ce que je pouvais. Le dernier +répertoire n'a pas de fichier synthèse, je pense que l'étude était du +même gabarit que le test précédent. J'en étais à tester la routine sur +un maximum d'images pour voir si le jeu réduit de couleurs obtenues +correspondait à nos attentes ou non. Les paramètres stables sont à +rechercher dans les derniers répertoires mp00042c et mp00307c. + +* doc/labeling/mp00307c_bis: Test sur un grand nombre de combinaisons. +* doc/labeling/mp00411c: Test sur l'altération des statistiques. +* doc/labeling/mp00042c: Test sur la representativité des couleurs trouvées. +* doc/labeling/mp00307c: Test sur la representativité des couleurs trouvées. + + +Faire le changelog, il y a de l'aide dans git/doc/Changelog +... et commiter 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. +* doc/annotating + + -to do ... +XI AUTRES ASPECTS DOCUMENTAIRES +------------------------------- +Ces exemples de codes sont livrés tels quels sans aucune documentation +de ma part. Si tu as besoin de quelque chose, sert toi, tu les +remanieras à ta sauce. Il n'y a pas de raison de les documenter, se +serait disperser mes efforts vainement. +* doc/examples/accu_color: Petit programme pour se bidouiller avec la couleur. +* doc/examples/frac: Librairie pour manipuler des fractions sous milena. +* doc/examples/hello_milena: Petit exemple allant avec la doc de milena. +* doc/examples/hello_world: Test de la plateforme c++. +* doc/examples/io: Rien de vraiment intéressant dans l'état actuel. +* doc/examples/learn_milena: Autre exemple de base avec milena. +* doc/examples/otsu: Petit programme Otsu. +* doc/examples/stats: Exemple de manipulation d'accumulateurs. +Voici deux exemples sous LaTex. Un jeu de test avec la confection de +vecteur et de matrices pour relater les forrmules connues en espace +3d. La version actuelle est dégradée par rapport à ce que j'avais pu +écrire. J'étais arrivé à la mise au point d'un extracteur de valeurs +propres mais je n'ai jamais pu retrouver cette version là , surement +une erreur sous svn. Le second document devait présenter la +documentation quick tour sous milena, mais j'avoue que c'est un +lamentable échec, je n'ai pas pris le temps de le faire. Je pense que +l'idée d'une documentation collaborative permettrait de répartir +l'effort. +* doc/formulae: LaTex directory. +* doc/quick_tour: LaTex directory. diff --git a/scribo/sandbox/green/demo/clustering/kmean1d/Makefile.am b/scribo/sandbox/green/demo/labeling/regional_maxima/Makefile.am similarity index 100% copy from scribo/sandbox/green/demo/clustering/kmean1d/Makefile.am copy to scribo/sandbox/green/demo/labeling/regional_maxima/Makefile.am diff --git a/scribo/sandbox/green/demo/labeling/regional_maxima/regional_maxima.cc b/scribo/sandbox/green/demo/labeling/regional_maxima/regional_maxima.cc new file mode 100644 index 0000000..d0c524b --- /dev/null +++ b/scribo/sandbox/green/demo/labeling/regional_maxima/regional_maxima.cc @@ -0,0 +1,198 @@ +// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE +// +// This file is part of Olena. +// +// Olena is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation, version 2 of the License. +// +// Olena is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Olena. If not, see <http://www.gnu.org/licenses/>. +// +// As a special exception, you may use this file as part of a free +// software project without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to produce +// an executable, this file does not by itself cause the resulting +// executable to be covered by the GNU General Public License. This +// exception does not however invalidate any other reasons why the +// executable file might be covered by the GNU General Public License. + +/// \file +/// +/// This demonstrator is aimed to experiment the regional maxima +/// method. regional_maxima.It first test the 3d histogram from an +/// image and the number of colors which results. And in fact, doesn't +/// use the regional_maxima routine. Too many parameters must be fixed +/// and parts of the code has been commented. The last action of this +/// program consists in counting the number of colors of each image in a +/// directory. This source has been used to test the annotating image base. +/// +/// \fixme At this time, the source is in a transitional step. It doesn't +/// compile, something wrong with boost library. It doesn't matter, that's not +/// an important file. + + +#include <iostream> +#include <sstream> +#include <boost/filesystem.hpp> + +#include <mln/img_path.hh> + +#include <mln/accu/math/sum.hh> +#include <mln/accu/math/count.hh> +#include <mln/accu/stat/histo3d_rgb.hh> +#include <mln/accu/stat/mean.hh> +#include <mln/accu/stat/variance.hh> + +#include <mln/algebra/vec.hh> + +#include <mln/arith/diff_abs.hh> + +#include <mln/core/macros.hh> +#include <mln/core/alias/neighb3d.hh> +#include <mln/core/image/image2d.hh> +#include <mln/core/image/image3d.hh> +#include <mln/core/image/dmorph/image_if.hh> +#include <mln/core/routine/initialize.hh> + +#include <mln/data/compute.hh> +#include <mln/data/fill.hh> +#include <mln/data/transform.hh> + +#include <mln/fun/v2v/rgb8_to_rgbn.hh> + +#include <mln/io/pgm/load.hh> +#include <mln/io/pgm/save.hh> +#include <mln/io/ppm/load.hh> +#include <mln/io/ppm/save.hh> + +#include <mln/labeling/regional_maxima.hh> +#include <mln/labeling/mean_values.hh> +#include <mln/labeling/compute.hh> + +#include <mln/literal/colors.hh> + +#include <mln/morpho/opening/volume.hh> +#include <mln/morpho/elementary/dilation.hh> + +#include <mln/opt/at.hh> + +#include <mln/pw/cst.hh> + +#include <mln/util/array.hh> +#include <mln/util/timer.hh> + +#include <mln/value/label_8.hh> +#include <mln/value/rgb8.hh> +#include <mln/value/rgb.hh> +#include <mln/value/int_u.hh> + + +/// \brief This is the count method. +/// +/// \param[in] image the colored image. +/// +/// This function loads a color image (ppm) and count the colors after +/// using the min volume processing on the 3d histogram. Percentage +/// thresholding is in test. The file threshold.txt establishes the link +/// between percentage and size in image. +/// +// n < 8, n is the degree of quantification +template <unsigned n> +unsigned count_image_color(const std::string& image) +{ + typedef mln::value::label_8 t_lbl8; + typedef mln::value::int_u8 t_int_u8; + typedef mln::value::rgb8 t_rgb8; + typedef mln::value::rgb<n> t_rgbn; + typedef mln::image3d<t_lbl8> t_image3d_lbl8; + typedef mln::image2d<t_lbl8> t_image2d_lbl8; + typedef mln::image2d<t_rgb8> t_image2d_rgb8; + typedef mln::image2d<t_rgbn> t_image2d_rgbn; + typedef mln::image2d<t_int_u8> t_image2d_int_u8; + typedef mln::image3d<unsigned> t_histo3d; + typedef mln::image2d<unsigned> t_histo2d; + typedef mln::fun::v2v::rgb8_to_rgbn<n> t_rgb8_to_rgbn; + typedef mln::accu::meta::stat::histo3d_rgb t_histo3d_fun; + typedef mln::accu::meta::math::count t_count_fun; + + t_image2d_rgb8 input_rgb8; + t_image2d_rgbn input_rgbn; + t_image2d_rgbn output_rgbn; + t_histo3d histo; + t_histo3d opened; + t_image3d_lbl8 label; + t_image2d_lbl8 label_img; + t_image3d_lbl8 dilated; + t_lbl8 n_labels; + + mln::io::ppm::load(input_rgb8, image.c_str()); + + unsigned nb_pixel = input_rgb8.ncols() * input_rgb8.nrows(); + unsigned min_volume = (unsigned)(nb_pixel * 0.054); + + input_rgbn = mln::data::transform(input_rgb8, t_rgb8_to_rgbn()); + histo = mln::data::compute(t_histo3d_fun(), input_rgbn); + return mln::data::compute(t_count_fun(), histo); + + // return nb_pixel; + // opened = mln::morpho::opening::volume(histo, mln::c6(), min_volume); + // label = mln::labeling::regional_maxima(opened, mln::c6(), n_labels); + // return n_labels; +} + +/// \brief The main function aimed at looping over the whole directory. +/// +/// The main function is used to take care of file part in this +/// sofware. It manages the directory scanning aspect while the last +/// function does the image processing aspect. Statistics are +/// generated (mean and variance) about the number of colors after using +/// the min_volume routine. Some strange things happens with that routine +/// sometimes. +int main() +{ + typedef boost::filesystem::path t_path; + //typedef boost::filesystem::initial_path<t_path()> t_init_path; + typedef boost::filesystem::directory_iterator t_iter_path; + + t_path full_path(ANNOTATING_1_TYPED_IMG_PATH); + + std::cout << "entering " << full_path << std::endl; + + if (//1 < argc && + boost::filesystem::exists(full_path) && + boost::filesystem::is_directory(full_path)) + { + boost::filesystem::system_complete(full_path); + const t_iter_path end_iter; + unsigned count = 0; + unsigned sum1 = 0; + unsigned sum2 = 0; + + for (t_iter_path dir_iter(full_path); end_iter != dir_iter; ++dir_iter) + { + unsigned val = count_image_color<5>(dir_iter->path().string()); + + ++count; + sum1 += val; + sum2 += val*val; + + std::cout << dir_iter->path().string() << " => " << val << std::endl; + } + + unsigned mean = sum1 / count; + unsigned var = sum2 / count - mean * mean; + + std::cout << "mean : " << mean << std::endl; + std::cout << "var : " << var << std::endl; + } + + return 0; +} + diff --git a/milena/sandbox/green/demo/labeling/regional_maxima/thresholds.txt b/scribo/sandbox/green/demo/labeling/regional_maxima/thresholds.txt similarity index 100% copy from milena/sandbox/green/demo/labeling/regional_maxima/thresholds.txt copy to scribo/sandbox/green/demo/labeling/regional_maxima/thresholds.txt diff --git a/scribo/sandbox/green/demo/clustering/kmean1d/Makefile.am b/scribo/sandbox/green/demo/labeling/watershed/Makefile.am similarity index 100% copy from scribo/sandbox/green/demo/clustering/kmean1d/Makefile.am copy to scribo/sandbox/green/demo/labeling/watershed/Makefile.am diff --git a/milena/sandbox/green/tests/accu/stat/histo1d/gaussian.sh b/scribo/sandbox/green/demo/labeling/watershed/gaussian.sh similarity index 100% copy from milena/sandbox/green/tests/accu/stat/histo1d/gaussian.sh copy to scribo/sandbox/green/demo/labeling/watershed/gaussian.sh diff --git a/scribo/sandbox/green/demo/labeling/watershed/watershed.cc b/scribo/sandbox/green/demo/labeling/watershed/watershed.cc new file mode 100644 index 0000000..a9289f7 --- /dev/null +++ b/scribo/sandbox/green/demo/labeling/watershed/watershed.cc @@ -0,0 +1,360 @@ +// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE +// +// This file is part of Olena. +// +// Olena is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation, version 2 of the License. +// +// Olena is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Olena. If not, see <http://www.gnu.org/licenses/>. +// +// As a special exception, you may use this file as part of a free +// software project without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to produce +// an executable, this file does not by itself cause the resulting +// executable to be covered by the GNU General Public License. This +// exception does not however invalidate any other reasons why the +// executable file might be covered by the GNU General Public License. + +/// \file +/// +/// This demonstrator is the first step before using +/// regional_maxima. Its purpose is to work on histogram filtering and +/// on the whole image processing chain. +/// +/// \fixme: this source doesn't compile. I've no time to fix it. It's not +/// so important because it's just a basic sample, just keep in mind the +/// method to reach the result, it will be reuse for regional_maxima. + +#include <iostream> +#include <sstream> + +#include <mln/accu/stat/histo1d.hh> + +#include <mln/arith/revert.hh> + +#include <mln/core/alias/neighb1d.hh> +#include <mln/core/alias/window1d.hh> +#include <mln/core/macros.hh> +#include <mln/core/image/image1d.hh> +#include <mln/core/image/image2d.hh> +#include <mln/core/routine/initialize.hh> + +#include <mln/data/compute.hh> +#include <mln/data/transform.hh> + +#include <mln/io/pgm/load.hh> +#include <mln/io/pgm/save.hh> +#include <mln/io/ppm/save.hh> +#include <mln/io/plot/save_image_sh.hh> + +#include <mln/labeling/colorize.hh> +#include <mln/labeling/mean_values.hh> +#include <mln/labeling/regional_maxima.hh> + +#include <mln/linear/convolve.hh> +//#include <mln/linear/gaussian.hh> + +#include <mln/literal/colors.hh> + +#include <mln/morpho/elementary/closing.hh> +#include <mln/morpho/elementary/dilation.hh> +#include <mln/morpho/elementary/opening.hh> +#include <mln/morpho/opening/structural.hh> +#include <mln/morpho/watershed/flooding.hh> + +#include <mln/img_path.hh> + +#include <mln/value/int_u8.hh> +#include <mln/value/rgb8.hh> +#include <mln/value/label_8.hh> + +#include <mln/win/disk1d.hh> + + +/// \brief Compute the gaussian probability to obtain a given value. +/// +/// \param[in] x the value from which we want the probability. +/// \param[in] mean the mean parameter of the gaussian distribution. +/// \param[in] sigma the sqrt(variance) parameter of the gaussian. +/// \return the probability to obtain the x value. +/// +/// Implements the standard 1d equation of the gaussian. +double gaussian_distribution(const double x, + const double mean, + const 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; +} + + +/// \brief Make a 1d gaussian filter. +/// +/// \param[out] ws the window (filter) where to put the probability values. +/// \param[in] size the size of the filter. +/// \param[in] sigma the gaussian parameter for the standard deviation. +/// \return the probability to obtain the x value. +/// +/// Approach the gaussian distribution for a few discrete sites, and +/// then normilize the results to be sure that the sum obtain 1. +void gaussian_filter(double ws[], const unsigned size, const 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; +} + + +/// \brief Merge input image with label one. +/// +/// \param[in] input the window (filter) where to put the probability values. +/// \param[in] label the size of the filter. +/// \return the merged image. +/// +/// This function build a new image in which the input pixels are +/// replaced by the label associated to their grey level. +mln::image2d<mln::value::label_8> +merge(const mln::image2d<mln::value::int_u8>& input, + const mln::image1d<mln::value::label_8>& label) +{ + 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; + } + + return output; +} + +/// \brief This is the wathersed method for segmenting the histogram. +/// +/// \param[in] image the input image. +/// +/// The function returns nothing but writes different images on the +/// filesystem. The 3 outputs are the image label, the random coloring +/// of the image label and the average tone of the label image +/// (replace every label by the grey average of the group to which +/// it's belong to) . +void do_demo(const std::string& image) +{ + typedef mln::value::int_u8 t_int_u8; + typedef mln::value::label_8 t_lbl8; + typedef mln::value::rgb8 t_rgb8; + typedef mln::image1d<t_lbl8> t_image1d_lbl8; + typedef mln::image2d<t_rgb8> t_image2d_rgb8; + typedef mln::image2d<t_int_u8> t_image2d_int_u8; + typedef mln::image2d<t_lbl8> t_image2d_lbl8; + typedef mln::image1d<unsigned> t_image1d_unsigned; + + t_image2d_int_u8 img; + t_image1d_unsigned histo; + t_image1d_unsigned filtered; + t_image1d_unsigned reverted; + t_image1d_lbl8 label; + t_image2d_lbl8 output; + t_image2d_int_u8 mean; + t_image2d_rgb8 colorized; + t_lbl8 n_labels; + + + //--------------------------------------------------------------------------- + // LOADING PHASE + //--------------------------------------------------------------------------- + mln::io::pgm::load(img, image.c_str()); + mln::io::pgm::save(img, "img.pgm"); + + + //--------------------------------------------------------------------------- + // HISTO COMPUTING PHASE + //--------------------------------------------------------------------------- + histo = mln::data::compute(mln::accu::meta::stat::histo1d(), img); + mln::io::plot::save_image_sh(histo, "histo.sh"); + + + //--------------------------------------------------------------------------- + // HISTO FILTERING PHASE + //--------------------------------------------------------------------------- + + // a) GAUSSIAN FILTERING + double ws[41]; + gaussian_filter(ws, 41, 6.0); + filtered = mln::linear::convolve(histo, mln::make::w_window1d(ws)); + + // b) MORPHOLOGICAL ELEMENTARY OPENING + // filtered = mln::morpho::elementary::opening(histo, mln::c4()); + + // c) MORPHOLOGICAL STRUCTURAL OPENING (C4,C8 ??) + // filtered = mln::morpho::opening::structural(histo, mln::win_c8p()); + + // d) MORPHOLOGICAL STRUCTURAL DISK OPENING (SIZE = 11/21/31/41/51 ??) + // mln::win::disk1d disk1d(21); + // filtered = mln::morpho::opening::structural(histo, disk1d); + + mln::io::plot::save_image_sh(filtered, "filtered.sh"); + + + //--------------------------------------------------------------------------- + // HISTO LABELING PHASE + //--------------------------------------------------------------------------- + // a) watershed + reverted = mln::arith::revert(histo); + label = mln::morpho::watershed::flooding(reverted, mln::c4(), n_labels); + // b) regional maxima + // label = mln::labeling::regional_maxima(opened, mln::c8(), n_labels); + mln::io::pgm::save(label, "label.pgm"); + + + //--------------------------------------------------------------------------- + // FUZZY PHASE + //--------------------------------------------------------------------------- + dilated = mln::morpho::elementary::dilation(label, mln::c8()); + mln::io::pgm::save(dilated, "dilated.pgm"); + + + //--------------------------------------------------------------------------- + // OUTPUT PHASE + //--------------------------------------------------------------------------- + output = merge(house_rg8, label); + mean = mln::labeling::mean_values(img, label, nlabels); + colorized = mln::labeling::colorize(rgb8(), label); + + mln::io::pgm::save(output, "output.pgm"); + mln::io::pgm::save(mean, "mean.pgm"); + mln::io::ppm::save(colorized, "colorized.ppm"); +} + + +/// \brief This is the launcher of the method. +/// +/// \param[in] image the input image. +/// +/// The launcher is the good place for debugging input arguments or +/// setting defaults one. +void demo(const std::string& image = SCRIBO_PGM_IMG_PATH"/mp00082c_50p.pgm") +{ + std::cout << "----------------------------------------" << std::endl; + std::cout << "Launching the demo with these parameters" << std::endl; + std::cout << "image : " << image << std::endl; + std::cout << "----------------------------------------" << std::endl; + + do_demo(image); +} + + +/// \bief The usage function of the binary. +/// +/// \param[in] argc the binary number of arguments. +/// \param[in] args the binary array of arguments. +/// +/// This binary requires one input image to work. It is a grey level +/// image in pgm format. +void usage(const int argc, const char *args[]) +{ + std::cout << "----------------------------------------" << std::endl; + std::cout << "argc : " << argc << std::endl; + + for (int i = 0; i < argc; ++i) + std::cout << "args[" << i << "] : " << args[i] << std::endl; + + std::cout << "----------------------------------------" << std::endl; + std::cout << "usage: wateshed [image]" << std::endl; + std::cout << "pgm image (image to label)" << std::endl; + std::cout << "----------------------------------------" << std::endl; +} + + +/// \brief Convert a c string parameter to string object like. +/// +/// \param[in] status the flag to prevent bad work. +/// \param[in] arg the c string to convert in string object. +/// \param[out] val the return string object. +/// \return a flag to say if every thing goes well. +/// +/// Convert a c string (char *) in string object (std::string) in order +/// to simplify some string operations. +bool char_to_string(const bool status, const char *arg, std::string& val) +{ + bool result = false; + + if (status) + { + std::istringstream arg_stream(arg); + + arg_stream >> val; + + return !arg_stream.fail(); + } + + return result; +} + + +/// \brief Segment by the watershed method histogram space. +/// +/// \param[in] img the input image. +/// \return merge image. +/// +/// This is the main entry of the program. It takes an image as input +/// parameter and computes its histogram. The method segments the +/// histogram in order to build color classes (even we stay in grey +/// level). Merging image is returned where pixels have been replaced +/// by some attribute of the class (like the average color). +int main(const int argc, const char *args[]) +{ + std::string image("top"); + bool status = true; + + switch (argc) + { + case 2: status = char_to_string(status, args[1], image); break; + case 1: status = true; break; + default: status = false; + } + + if (status) + { + switch (argc) + { + case 1: demo(); break; + case 2: demo(image); break; + } + } + else + usage(argc, args); + + return 0; +} diff --git a/milena/sandbox/green/doc/annotating/class.txt b/scribo/sandbox/green/doc/annotating/class.txt similarity index 100% copy from milena/sandbox/green/doc/annotating/class.txt copy to scribo/sandbox/green/doc/annotating/class.txt diff --git a/milena/sandbox/green/doc/annotating/syntheseMillet2008.txt b/scribo/sandbox/green/doc/annotating/syntheseMillet2008.txt similarity index 100% copy from milena/sandbox/green/doc/annotating/syntheseMillet2008.txt copy to scribo/sandbox/green/doc/annotating/syntheseMillet2008.txt diff --git a/milena/sandbox/green/doc/annotating/testMillet2008 b/scribo/sandbox/green/doc/annotating/testMillet2008 similarity index 100% copy from milena/sandbox/green/doc/annotating/testMillet2008 copy to scribo/sandbox/green/doc/annotating/testMillet2008 diff --git a/milena/sandbox/green/doc/examples/accu_color/accu_color.cc b/scribo/sandbox/green/doc/examples/accu_color/accu_color.cc similarity index 100% copy from milena/sandbox/green/doc/examples/accu_color/accu_color.cc copy to scribo/sandbox/green/doc/examples/accu_color/accu_color.cc diff --git a/milena/sandbox/green/doc/examples/frac/Makefile.am b/scribo/sandbox/green/doc/examples/frac/Makefile.am similarity index 100% copy from milena/sandbox/green/doc/examples/frac/Makefile.am copy to scribo/sandbox/green/doc/examples/frac/Makefile.am diff --git a/milena/sandbox/green/doc/examples/frac/frac.cc b/scribo/sandbox/green/doc/examples/frac/frac.cc similarity index 100% copy from milena/sandbox/green/doc/examples/frac/frac.cc copy to scribo/sandbox/green/doc/examples/frac/frac.cc diff --git a/milena/sandbox/green/doc/examples/frac/frac.hh b/scribo/sandbox/green/doc/examples/frac/frac.hh similarity index 100% copy from milena/sandbox/green/doc/examples/frac/frac.hh copy to scribo/sandbox/green/doc/examples/frac/frac.hh diff --git a/milena/sandbox/green/doc/examples/frac/gcd.hh b/scribo/sandbox/green/doc/examples/frac/gcd.hh similarity index 100% copy from milena/sandbox/green/doc/examples/frac/gcd.hh copy to scribo/sandbox/green/doc/examples/frac/gcd.hh diff --git a/milena/sandbox/green/doc/examples/frac/sign_prod.hh b/scribo/sandbox/green/doc/examples/frac/sign_prod.hh similarity index 100% copy from milena/sandbox/green/doc/examples/frac/sign_prod.hh copy to scribo/sandbox/green/doc/examples/frac/sign_prod.hh diff --git a/milena/sandbox/green/doc/examples/hello_milena/Makefile.am b/scribo/sandbox/green/doc/examples/hello_milena/Makefile.am similarity index 100% copy from milena/sandbox/green/doc/examples/hello_milena/Makefile.am copy to scribo/sandbox/green/doc/examples/hello_milena/Makefile.am diff --git a/milena/sandbox/green/doc/examples/hello_milena/hello_milena.cc b/scribo/sandbox/green/doc/examples/hello_milena/hello_milena.cc similarity index 100% copy from milena/sandbox/green/doc/examples/hello_milena/hello_milena.cc copy to scribo/sandbox/green/doc/examples/hello_milena/hello_milena.cc diff --git a/milena/sandbox/green/doc/examples/hello_milena/Makefile.am b/scribo/sandbox/green/doc/examples/hello_world/Makefile.am similarity index 100% copy from milena/sandbox/green/doc/examples/hello_milena/Makefile.am copy to scribo/sandbox/green/doc/examples/hello_world/Makefile.am diff --git a/milena/sandbox/green/doc/examples/hello_world/hello_world.cc b/scribo/sandbox/green/doc/examples/hello_world/hello_world.cc similarity index 100% copy from milena/sandbox/green/doc/examples/hello_world/hello_world.cc copy to scribo/sandbox/green/doc/examples/hello_world/hello_world.cc diff --git a/milena/sandbox/green/doc/examples/hello_world/print.cc b/scribo/sandbox/green/doc/examples/hello_world/print.cc similarity index 100% copy from milena/sandbox/green/doc/examples/hello_world/print.cc copy to scribo/sandbox/green/doc/examples/hello_world/print.cc diff --git a/milena/sandbox/green/doc/examples/io/Makefile.am b/scribo/sandbox/green/doc/examples/io/Makefile.am similarity index 100% copy from milena/sandbox/green/doc/examples/io/Makefile.am copy to scribo/sandbox/green/doc/examples/io/Makefile.am diff --git a/milena/sandbox/green/doc/examples/io/io.cc b/scribo/sandbox/green/doc/examples/io/io.cc similarity index 100% copy from milena/sandbox/green/doc/examples/io/io.cc copy to scribo/sandbox/green/doc/examples/io/io.cc diff --git a/milena/sandbox/green/doc/examples/hello_milena/Makefile.am b/scribo/sandbox/green/doc/examples/learn_milena/Makefile.am similarity index 100% copy from milena/sandbox/green/doc/examples/hello_milena/Makefile.am copy to scribo/sandbox/green/doc/examples/learn_milena/Makefile.am diff --git a/milena/sandbox/green/doc/examples/learn_milena/learn_milena.cc b/scribo/sandbox/green/doc/examples/learn_milena/learn_milena.cc similarity index 100% copy from milena/sandbox/green/doc/examples/learn_milena/learn_milena.cc copy to scribo/sandbox/green/doc/examples/learn_milena/learn_milena.cc diff --git a/milena/sandbox/green/doc/examples/hello_milena/Makefile.am b/scribo/sandbox/green/doc/examples/otsu/Makefile.am similarity index 100% copy from milena/sandbox/green/doc/examples/hello_milena/Makefile.am copy to scribo/sandbox/green/doc/examples/otsu/Makefile.am diff --git a/milena/sandbox/green/doc/examples/otsu/otsu.cc b/scribo/sandbox/green/doc/examples/otsu/otsu.cc similarity index 100% copy from milena/sandbox/green/doc/examples/otsu/otsu.cc copy to scribo/sandbox/green/doc/examples/otsu/otsu.cc diff --git a/milena/sandbox/green/doc/examples/hello_milena/Makefile.am b/scribo/sandbox/green/doc/examples/stats/Makefile.am similarity index 100% copy from milena/sandbox/green/doc/examples/hello_milena/Makefile.am copy to scribo/sandbox/green/doc/examples/stats/Makefile.am diff --git a/milena/sandbox/green/doc/examples/stats/stats.cc b/scribo/sandbox/green/doc/examples/stats/stats.cc similarity index 100% copy from milena/sandbox/green/doc/examples/stats/stats.cc copy to scribo/sandbox/green/doc/examples/stats/stats.cc diff --git a/milena/sandbox/green/doc/formulae/formulae.tex b/scribo/sandbox/green/doc/formulae/formulae.tex similarity index 100% copy from milena/sandbox/green/doc/formulae/formulae.tex copy to scribo/sandbox/green/doc/formulae/formulae.tex diff --git a/milena/sandbox/green/doc/quick_tour/quick_tour.tex b/scribo/sandbox/green/doc/quick_tour/quick_tour.tex similarity index 100% copy from milena/sandbox/green/doc/quick_tour/quick_tour.tex copy to scribo/sandbox/green/doc/quick_tour/quick_tour.tex diff --git a/scribo/sandbox/green/exp/regional_maxima/Makefile.am b/scribo/sandbox/green/exp/regional_maxima/Makefile.am new file mode 100644 index 0000000..68bb53e --- /dev/null +++ b/scribo/sandbox/green/exp/regional_maxima/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/exp +BUILD__PATTERN= green/build/exp + + +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/exp/regional_maxima/regional_maxima.cc b/scribo/sandbox/green/exp/regional_maxima/regional_maxima.cc new file mode 100644 index 0000000..0cd8389 --- /dev/null +++ b/scribo/sandbox/green/exp/regional_maxima/regional_maxima.cc @@ -0,0 +1,196 @@ +// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE +// +// This file is part of Olena. +// +// Olena is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation, version 2 of the License. +// +// Olena is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Olena. If not, see <http://www.gnu.org/licenses/>. +// +// As a special exception, you may use this file as part of a free +// software project without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to produce +// an executable, this file does not by itself cause the resulting +// executable to be covered by the GNU General Public License. This +// exception does not however invalidate any other reasons why the +// executable file might be covered by the GNU General Public License. + +/// \file +/// +/// This demonstrator is aimed to experiment the regional maxima +/// method. regional_maxima.It first test the 3d histogram from an +/// image and the number of colors which results. And in fact, doesn't +/// use the regional_maxima routine. Too many parameters must be fixed +/// and parts of the code has been commented. The last action of this +/// program consists in counting the number of colors of each image in a +/// directory. This source has been used to test the annotating image base. + +#include <iostream> +#include <sstream> +#include <boost/filesystem.hpp> + +#include <mln/img_path.hh> + +#include <mln/accu/math/sum.hh> +#include <mln/accu/math/count.hh> +#include <mln/accu/stat/histo3d_rgb.hh> +#include <mln/accu/stat/mean.hh> +#include <mln/accu/stat/variance.hh> + +#include <mln/algebra/vec.hh> + +#include <mln/arith/diff_abs.hh> + +#include <mln/core/macros.hh> +#include <mln/core/alias/neighb3d.hh> +#include <mln/core/image/image2d.hh> +#include <mln/core/image/image3d.hh> +#include <mln/core/image/dmorph/image_if.hh> +#include <mln/core/routine/initialize.hh> + +#include <mln/data/compute.hh> +#include <mln/data/fill.hh> +#include <mln/data/transform.hh> + +#include <mln/fun/v2v/rgb8_to_rgbn.hh> + +#include <mln/io/pgm/load.hh> +#include <mln/io/pgm/save.hh> +#include <mln/io/ppm/load.hh> +#include <mln/io/ppm/save.hh> + +#include <mln/labeling/regional_maxima.hh> +#include <mln/labeling/mean_values.hh> +#include <mln/labeling/compute.hh> + +#include <mln/literal/colors.hh> + +#include <mln/morpho/opening/volume.hh> +#include <mln/morpho/elementary/dilation.hh> + +#include <mln/opt/at.hh> + +#include <mln/pw/cst.hh> + +#include <mln/util/array.hh> +#include <mln/util/timer.hh> + +#include <mln/value/label_8.hh> +#include <mln/value/rgb8.hh> +#include <mln/value/rgb.hh> +#include <mln/value/int_u.hh> + +/// \brief This is the count method. +/// +/// \param[in] image the colored image. +/// +/// This function loads a color image (ppm) and count the colors after +/// using the min volume processing on the 3d histogram. Percentage +/// thresholding is in test. The file threshold.txt establishes the link +/// between percentage and size in image. +/// +// n < 8, n is the degree of quantification +template <unsigned n> +unsigned count_image_color(const std::string& image) +{ + typedef mln::value::label_8 t_lbl8; + typedef mln::value::int_u8 t_int_u8; + typedef mln::value::rgb8 t_rgb8; + typedef mln::value::rgb<n> t_rgbn; + typedef mln::image3d<t_lbl8> t_image3d_lbl8; + typedef mln::image2d<t_lbl8> t_image2d_lbl8; + typedef mln::image2d<t_rgb8> t_image2d_rgb8; + typedef mln::image2d<t_rgbn> t_image2d_rgbn; + typedef mln::image2d<t_int_u8> t_image2d_int_u8; + typedef mln::image3d<unsigned> t_histo3d; + typedef mln::image2d<unsigned> t_histo2d; + typedef mln::fun::v2v::rgb8_to_rgbn<n> t_rgb8_to_rgbn; + typedef mln::accu::meta::stat::histo3d_rgb t_histo3d_fun; + typedef mln::accu::meta::math::count t_count_fun; + + t_image2d_rgb8 input_rgb8; + t_image2d_rgbn input_rgbn; + t_image2d_rgbn output_rgbn; + t_histo3d histo; + t_histo3d opened; + t_image3d_lbl8 label; + t_image2d_lbl8 label_img; + t_image3d_lbl8 dilated; + t_lbl8 n_labels; + + mln::io::ppm::load(input_rgb8, image.c_str()); + + unsigned nb_pixel = input_rgb8.ncols() * input_rgb8.nrows(); + unsigned min_volume = (unsigned)(nb_pixel * 0.054); + + input_rgbn = mln::data::transform(input_rgb8, t_rgb8_to_rgbn()); + histo = mln::data::compute(t_histo3d_fun(), input_rgbn); + return mln::data::compute(t_count_fun(), histo); + // return nb_pixel; + // opened = mln::morpho::opening::volume(histo, mln::c6(), min_volume); + // label = mln::labeling::regional_maxima(opened, mln::c6(), n_labels); + // return n_labels; +} + + +/// \brief The main function aimed at looping over the whole directory. +/// +/// The main function is used to take care of file part in this +/// sofware. It manages the directory scanning aspect while the last +/// function does the image processing aspect. Statistics are +/// generated (mean and variance) about the number of colors after using +/// the min_volume routine. Some strange things happens with that routine +/// sometimes. +int main() +{ + typedef boost::filesystem::path t_path; + //typedef boost::filesystem::initial_path<t_path()> t_init_path; + typedef boost::filesystem::directory_iterator t_iter_path; + + t_path full_path(ANNOTATING_1_TYPED_IMG_PATH); + + std::cout << "entering " << full_path << std::endl; + + if (//1 < argc && + boost::filesystem::exists(full_path) && + boost::filesystem::is_directory(full_path)) + { + boost::filesystem::system_complete(full_path); + const t_iter_path end_iter; + unsigned count = 0; + unsigned sum1 = 0; + unsigned sum2 = 0; + + for (t_iter_path dir_iter(full_path); end_iter != dir_iter; ++dir_iter) + { + unsigned val = count_image_color<5>(dir_iter->path().string()); + + ++count; + sum1 += val; + sum2 += val*val; + + std::cout << dir_iter->path().string() << " => " << val << std::endl; + // FIXME NB COULEURS BRUTES + // FIXME NB DE COULEURS + // FIXME LISTE DES COULEURS + // IMPORTANCES + } + + unsigned mean = sum1 / count; + unsigned var = sum2 / count - mean * mean; + + std::cout << "mean : " << mean << std::endl; + std::cout << "var : " << var << std::endl; + } + + return 0; +} + diff --git a/milena/sandbox/green/demo/labeling/regional_maxima/thresholds.txt b/scribo/sandbox/green/exp/regional_maxima/thresholds.txt similarity index 100% copy from milena/sandbox/green/demo/labeling/regional_maxima/thresholds.txt copy to scribo/sandbox/green/exp/regional_maxima/thresholds.txt diff --git a/scribo/sandbox/green/mln/display/display_histo.hh b/scribo/sandbox/green/mln/display/display_histo.hh index ef47182..d48f47f 100644 --- a/scribo/sandbox/green/mln/display/display_histo.hh +++ b/scribo/sandbox/green/mln/display/display_histo.hh @@ -47,6 +47,64 @@ /// 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. +/// +/// This is the sample code to use the red/green visualization. +/// +/// \fixme There is a lot of routines in display_histo.hh, but only +/// two of them have been call here. Stuff to complete. +/// +/// #include <iostream> +/// #include <mln/accu/stat/histo3d_rgb.hh> +/// #include <mln/core/macros.hh> +/// #include <mln/core/image/image2d.hh> +/// #include <mln/core/image/image3d.hh> +/// #include <mln/data/compute.hh> +/// #include <mln/data/transform.hh> +/// #include <mln/display/display_histo.hh> +/// #include <mln/fun/v2v/rgb8_to_rgbn.hh> +/// #include <mln/img_path.hh> +/// #include <mln/io/ppm/load.hh> +/// #include <mln/io/pgm/save.hh> +/// #include <mln/io/ppm/save.hh> +/// #include <mln/literal/colors.hh> +/// #include <mln/value/rgb8.hh> +/// #include <mln/value/rgb.hh> +/// +/// int main() +/// { +/// typedef mln::value::int_u8 t_int_u8; +/// typedef mln::value::int_u<4> t_int_u4; +/// typedef mln::value::rgb8 t_rgb8; +/// typedef mln::value::rgb<4> t_rgb4; +/// typedef mln::image2d<t_int_u8> t_image2d_int_u8; +/// typedef mln::image2d<t_int_u4> t_image2d_int_u4; +/// typedef mln::image2d<t_rgb8> t_image2d_rgb8; +/// typedef mln::image2d<t_rgb4> t_image2d_rgb4; +/// typedef mln::image2d<bool> t_image2d_bool; +/// typedef mln::image3d<unsigned> t_histo3d; +/// typedef mln::fun::v2v::rgb8_to_rgbn<4> t_rgb8_to_rgb4; +/// typedef mln::accu::meta::stat::histo3d_rgb t_histo3d_fun; +/// +/// t_image2d_rgb8 i0_input; // input rgb8 +/// t_image2d_rgb4 i1_input; // input rgbn +/// t_histo3d h1_input; // histo input +/// t_image2d_int_u8 p1_histo1;// histo proj1 +/// t_image2d_rgb4 p1_histo2;// histo proj2 +/// t_rgb4 red(mln::literal::red); +/// +/// mln::io::ppm::load(i0_input, OLENA_IMG_PATH"/lena.ppm"); +/// +/// i1_input = mln::data::transform(i0_input, t_rgb8_to_rgb4()); +/// h1_input = mln::data::compute(t_histo3d_fun(), i1_input); +/// p1_histo1 = mln::display::display_histo3d_unsigned(h1_input); +/// p1_histo2 = mln::display::display3_histo3d_unsigned(h1_input, red); +/// +/// mln::io::pgm::save(p1_histo1, "proj1.pgm"); +/// mln::io::ppm::save(p1_histo2, "proj2.ppm"); +/// +/// return 0; +/// } + namespace mln @@ -55,26 +113,100 @@ namespace mln namespace display { - // Forward declaration. + /// \brief Allow the visualization of the density of the 3d histogram. + /// + /// Direction r = 1 + /// Direction g = 2 + /// Direction b = 0 + /// + /// \parameter[in] histo the histogram in 3d. + /// \result return the projection of the histogram in 2d. + /// + /// 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 and take the log of value. Then, we stretch + /// value to feet pgm format. image2d<value::int_u8> display_histo3d_unsigned(const image3d<unsigned>& histo); + + /// \brief Allow the visualization of the important color of the 3d histo. + /// + /// Direction r = 1 + /// Direction g = 2 + /// Direction b = 0 + /// + /// \parameter[in] histo the histogram in 3d. + /// \parameter[in] ambiguous_color the color when no max is found. + /// \result return the projection of the histogram in 2d. + /// + /// The 3d histogram is projected in red/green space. In the blue + /// direction we check the max blue component. The position in + /// this blue axis is returned in the projection image. template <unsigned n> image2d< value::int_u<n> > display2_histo3d_unsigned(const image3d<unsigned>& histo, const value::int_u<n> ambiguous_color); + + /// \brief Allow the visualization of the color of the 3d segmented histo. + /// + /// Direction r = 1 + /// Direction g = 2 + /// Direction b = 0 + /// + /// \parameter[in] histo the histogram in 3d. + /// \parameter[in] label the label image to associate the result with. + /// \parameter[in] ambiguous_color the color when no max is found. + /// \result return the projection of the histogram in 2d. + /// + /// The 3d histogram is projected in red/green space. In the blue + /// direction we check the max blue component. The position in + /// this blue axis is associated to a segmented label and this label + /// is returned in the projection image. 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); + + /// \brief Allow the visualization with color of the 3d histo. + /// + /// Direction r = 1 + /// Direction g = 2 + /// Direction b = 0 + /// + /// \parameter[in] histo the histogram in 3d. + /// \parameter[in] ambiguous_color the color when no max is found. + /// \result return the projection of the histogram in 2d. + /// + /// The 3d histogram is projected in red/green space. In the blue + /// direction we check the max blue component. The position is used + /// to build a rgb color and put it as a returned value in projection image. template <unsigned n> image2d< value::rgb<n> > display3_histo3d_unsigned(const image3d<unsigned>& histo, const value::rgb<n> ambiguous_color); + + /// \brief Allow the visualization with color of the 3d segmented histo. + /// + /// Direction r = 1 + /// Direction g = 2 + /// Direction b = 0 + /// + /// \parameter[in] histo the histogram in 3d. + /// \parameter[in] label the label image to associte the result with. + /// \parameter[in] pal the color indexed list to associate to the label. + /// \parameter[in] ambiguous_color the color when no max is found. + /// \result return the projection of the histogram in 2d. + /// + /// The 3d histogram is projected in red/green space. In the blue + /// direction we check the max blue component. The position is used + /// to find the label associate to it and then the color associated to + /// this label. That's the information we return in the projection image. template <unsigned n> image2d< value::rgb8 > display3_histo3d_unsigned(const image3d<unsigned>& histo, @@ -84,21 +216,6 @@ namespace mln #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) { diff --git a/scribo/sandbox/green/mln/display/project_histo.hh b/scribo/sandbox/green/mln/display/project_histo.hh index 30bcd6d..36a5542 100644 --- a/scribo/sandbox/green/mln/display/project_histo.hh +++ b/scribo/sandbox/green/mln/display/project_histo.hh @@ -49,9 +49,71 @@ /// \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. +/// \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. This is the same preambule documentation as in display_histo +/// because display_histo is use as a front hand for this file. +/// +/// This is the sample code to use the red/green visualization. +/// +/// \fixme There is a lot of routines in display_histo.hh, but only +/// two of them have been call here. Stuff to complete. +/// +/// #include <iostream> +/// #include <mln/accu/stat/histo3d_rgb.hh> +/// #include <mln/core/macros.hh> +/// #include <mln/core/image/image2d.hh> +/// #include <mln/core/image/image3d.hh> +/// #include <mln/data/compute.hh> +/// #include <mln/data/transform.hh> +/// #include <mln/display/display_histo.hh> +/// #include <mln/fun/v2v/rgb8_to_rgbn.hh> +/// #include <mln/img_path.hh> +/// #include <mln/io/ppm/load.hh> +/// #include <mln/io/pgm/save.hh> +/// #include <mln/io/ppm/save.hh> +/// #include <mln/literal/colors.hh> +/// #include <mln/value/rgb8.hh> +/// #include <mln/value/rgb.hh> +/// +/// int main() +/// { +/// typedef mln::value::int_u8 t_int_u8; +/// typedef mln::value::int_u<4> t_int_u4; +/// typedef mln::value::rgb8 t_rgb8; +/// typedef mln::value::rgb<4> t_rgb4; +/// typedef mln::image2d<t_int_u8> t_image2d_int_u8; +/// typedef mln::image2d<t_int_u4> t_image2d_int_u4; +/// typedef mln::image2d<t_rgb8> t_image2d_rgb8; +/// typedef mln::image2d<t_rgb4> t_image2d_rgb4; +/// typedef mln::image2d<bool> t_image2d_bool; +/// typedef mln::image3d<unsigned> t_histo3d; +/// typedef mln::fun::v2v::rgb8_to_rgbn<4> t_rgb8_to_rgb4; +/// typedef mln::accu::meta::stat::histo3d_rgb t_histo3d_fun; +/// +/// t_image2d_rgb8 i0_input; // input rgb8 +/// t_image2d_rgb4 i1_input; // input rgbn +/// t_histo3d h1_input; // histo input +/// t_image2d_int_u8 p1_histo1;// histo proj1 +/// t_image2d_rgb4 p1_histo2;// histo proj2 +/// t_rgb4 red(mln::literal::red); +/// +/// mln::io::ppm::load(i0_input, OLENA_IMG_PATH"/lena.ppm"); +/// +/// i1_input = mln::data::transform(i0_input, t_rgb8_to_rgb4()); +/// h1_input = mln::data::compute(t_histo3d_fun(), i1_input); +/// p1_histo1 = mln::display::display_histo3d_unsigned(h1_input); +/// p1_histo2 = mln::display::display3_histo3d_unsigned(h1_input, red); +/// +/// mln::io::pgm::save(p1_histo1, "proj1.pgm"); +/// mln::io::ppm::save(p1_histo2, "proj2.ppm"); +/// +/// return 0; +/// } + namespace mln { @@ -59,50 +121,130 @@ namespace mln namespace display { - // Forward declaration. + /// \brief Allow the visualization of the density of the 3d histogram. + /// + /// 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. + /// + /// Direction r = 1 + /// Direction g = 2 + /// Direction b = 0 + /// + /// \parameter[in] histo the histogram in 3d. + /// \result return the projection of the histogram in 2d. + /// + /// 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 and take the log of value. Then, we stretch + /// value to feet pgm format. Not limited to red/green space. template <typename A, unsigned direction, typename V> image2d<mln_result(A)> project_histo(const image3d<V>& histo); + + /// \brief Allow the visualization of the important color of the 3d histo. + /// + /// 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. + /// + /// Direction r = 1 + /// Direction g = 2 + /// Direction b = 0 + /// + /// \parameter[in] histo the histogram in 3d. + /// \parameter[in] ambiguous_color the color when no max is found. + /// \result return the projection of the histogram in 2d. + /// + /// The 3d histogram is projected in red/green space. In the blue + /// direction we check the max blue component. The position in + /// this blue axis is returned in the projection image. Not + /// limited to red/green space. 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); + + /// \brief Allow the visualization of the color of the 3d segmented histo. + /// + /// 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. + /// + /// Direction r = 1 + /// Direction g = 2 + /// Direction b = 0 + /// + /// \parameter[in] histo the histogram in 3d. + /// \parameter[in] label the label image to associate the result with. + /// \result return the projection of the histogram in 2d. + /// + /// The 3d histogram is projected in red/green space. In the blue + /// direction we check the max blue component. The position in + /// this blue axis is associated to a segmented label and this label + /// is returned in the projection image. Not limited to red/green space. template <unsigned n, unsigned direction, typename V> image2d<V> project2_histo(const image3d<unsigned>& histo, const image3d<V>& label); + /// \brief Allow the visualization with color of the 3d histo. + /// + /// 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. + /// + /// Direction r = 1 + /// Direction g = 2 + /// Direction b = 0 + /// + /// \parameter[in] histo the histogram in 3d. + /// \parameter[in] ambiguous_color the color when no max is found. + /// \result return the projection of the histogram in 2d. + /// + /// The 3d histogram is projected in red/green space. In the blue + /// direction we check the max blue component. The position is + /// used to build a rgb color and put it as a returned value in + /// projection image. Not limited to red/green space. template <unsigned n, unsigned direction> image2d< value::rgb<n> > project3_histo(const image3d<unsigned>& histo, const value::rgb<n> ambiguous_color); + /// \brief Allow the visualization with color of the 3d segmented histo. + /// + /// 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. + /// + /// Direction r = 1 + /// Direction g = 2 + /// Direction b = 0 + /// + /// \parameter[in] histo the histogram in 3d. + /// \parameter[in] label the label image to associte the result with. + /// \parameter[in] pal the color indexed list to associate to the label. + /// \parameter[in] ambiguous_color the color when no max is found. + /// \result return the projection of the histogram in 2d. + /// + /// The 3d histogram is projected in red/green space. In the blue + /// direction we check the max blue component. The position is used + /// to find the label associate to it and then the color associated to + /// this label. That's the information we return in the projection image. + /// Not limited to red/green space. 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) diff --git a/scribo/sandbox/green/tools/labeling/histo/Makefile.am b/scribo/sandbox/green/tools/labeling/histo/Makefile.am new file mode 100644 index 0000000..f03a836 --- /dev/null +++ b/scribo/sandbox/green/tools/labeling/histo/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/tools +BUILD__PATTERN= green/build/tools + + +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/tools/labeling/histo/histo.cc b/scribo/sandbox/green/tools/labeling/histo/histo.cc new file mode 100644 index 0000000..1fee9df --- /dev/null +++ b/scribo/sandbox/green/tools/labeling/histo/histo.cc @@ -0,0 +1,204 @@ +// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE +// +// This file is part of Olena. +// +// Olena is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation, version 2 of the License. +// +// Olena is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Olena. If not, see <http://www.gnu.org/licenses/>. +// +// As a special exception, you may use this file as part of a free +// software project without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to produce +// an executable, this file does not by itself cause the resulting +// executable to be covered by the GNU General Public License. This +// exception does not however invalidate any other reasons why the +// executable file might be covered by the GNU General Public License. + +/// \file +/// +/// \brief This tool aimed at building 3d RGB histogram. +/// +/// Building histogram means quantifying the input and then image computing +/// the 3d histogram in RGB space. + +#include <iostream> + +#include <mln/accu/stat/histo3d_rgb.hh> + +#include <mln/core/macros.hh> +#include <mln/core/image/image2d.hh> +#include <mln/core/image/image3d.hh> +#include <mln/core/image/dmorph/image_if.hh> + +#include <mln/data/compute.hh> +#include <mln/data/transform.hh> + +#include <mln/display/display_histo.hh> + +#include <mln/fun/v2v/rgb8_to_rgbn.hh> + +#include <mln/io/pbm/load.hh> +#include <mln/io/ppm/load.hh> +#include <mln/io/dump/save.hh> +#include <mln/io/pgm/save.hh> +#include <mln/io/ppm/save.hh> + +#include <mln/literal/colors.hh> + +#include <mln/opt/at.hh> + +#include <mln/pw/value.hh> + +#include <mln/value/rgb8.hh> +#include <mln/value/rgb.hh> + + +/// \brief The histogram image processing chain. +/// +/// \param[in] input the input image. +/// \param[out] quant the name of the resulting quantified image. +/// \param[out] histo the name of the resulting 3d histogram. +/// \param[out] proj1 the red/green projection of the histogram. +/// \param[out] proj2 the red/green projection with maxima plot on. +/// \param[in] mask the mask with selects the pixels of the input image. +/// +/// This chain aimed at computing 3d RGB histogram of 2d RGB color +/// quantified image. As the 3d histogram induces lots and lots of +/// data, quantifiying the input image reduces the size of the +/// resulting histogram. Then, dumping and projections are done. +template <unsigned n> +void mk_histo(const std::string& input, // in + const std::string& quant, // in + const std::string& histo, // out + const std::string& proj1, // out + const std::string& proj2, // out + const std::string& mask) // [in] +{ + typedef mln::value::int_u8 t_int_u8; + typedef mln::value::int_u<n> t_int_un; + typedef mln::value::rgb8 t_rgb8; + typedef mln::value::rgb<n> t_rgbn; + typedef mln::image2d<t_int_u8> t_image2d_int_u8; + typedef mln::image2d<t_int_un> t_image2d_int_un; + typedef mln::image2d<t_rgb8> t_image2d_rgb8; + typedef mln::image2d<t_rgbn> t_image2d_rgbn; + typedef mln::image2d<bool> t_image2d_bool; + typedef mln::image3d<unsigned> t_histo3d; + typedef mln::fun::v2v::rgb8_to_rgbn<n> t_rgb8_to_rgbn; + typedef mln::accu::meta::stat::histo3d_rgb t_histo3d_fun; + + // START OF IMAGE PROCESSING CHAIN + t_image2d_rgb8 i0_input; // input rgb8 + t_image2d_rgbn i1_input; // input rgbn + t_image2d_bool m0_input; // mask input + t_histo3d h1_input; // histo input + t_image2d_int_u8 p1_histo1;// histo proj1 + t_image2d_rgbn p1_histo2;// histo proj2 + t_rgbn red(mln::literal::red); + + mln::io::ppm::load(i0_input, input.c_str()); + i1_input = mln::data::transform(i0_input, t_rgb8_to_rgbn()); + + if (0 < mask.size()) + { + mln::io::pbm::load(m0_input, mask.c_str()); + h1_input = mln::data::compute(t_histo3d_fun(), + (i1_input | mln::pw::value(m0_input)).rw()); + } + else + { + h1_input = mln::data::compute(t_histo3d_fun(), i1_input); + } + // END OF IMAGE PROCESSING CHAIN + + // BEGIN DUMPING + p1_histo1 = mln::display::display_histo3d_unsigned(h1_input); + p1_histo2 = mln::display::display3_histo3d_unsigned(h1_input, red); + + mln::io::ppm::save(i1_input, quant.c_str()); + mln::io::dump::save(h1_input, histo.c_str()); + mln::io::pgm::save(p1_histo1, proj1.c_str()); + mln::io::ppm::save(p1_histo2, proj2.c_str()); + // END DUMPING +} + + +/// \brief The online documentation of the tool. +/// +/// Print the documentation of the tool with the meaning of the +/// different parameters. +void usage() +{ + std::cout << std::endl; + std::cout << "histo input.ppm q quant.ppm histo.dump proj.pgm" + << " proj.ppm [msk.pbm]" << std::endl; + std::cout << std::endl; + std::cout << "where :" << std::endl; + std::cout << "* [ in] input.ppm is the 8 bits color ppm image" << std::endl; + std::cout << "* [ in] q is the degree of quantification" + << " {2,3,4,5,6,7,8}" << std::endl; + std::cout << "* [out] quant.ppm is the q bits quantified input" + << " image" << std::endl; + std::cout << "* [out] histo.dump is the quantified color" + << " histogram" << std::endl; + std::cout << "* [out] proj.pgm is the r/g projection of the" + << " histogram (summing along the blue axe)" << std::endl; + std::cout << "* [out] proj.ppm is the r/g projection of the" + << " histogram with maxima plot on" << std::endl; + std::cout << "* [ in] msk.pbm is the mask which selects the" + << " pixels" << std::endl; + std::cout << std::endl; +} + + +/// \brief The main entry of the software. +/// +/// \param[in] input the input image. +/// \param[in] q the quantification. +/// \param[out] quant.ppm the name of the resulting quantified image. +/// \param[out] histo.dump the name of the resulting 3d histogram. +/// \param[out] proj.pgm the red/green projection of the histogram. +/// \param[out] proj.ppm the red/green projection with maxima plot on. +/// \param[in] msk.pbm the mask with selects the pixels of the input image. +/// +/// This is the front hand for the image processing routine. The goal of this +/// chain is to provide 3d histogram for further analysis and to give a way to +/// see it. +int main(int argc, char* args[]) +{ + if (7 == argc || 8 == argc) + { + const std::string input(args[1]); // in + const char q = args[2][0]; // in + const std::string quant(args[3]); // out + const std::string histo(args[4]); // out + const std::string proj1(args[5]); // out + const std::string proj2(args[6]); // out + const std::string mask(8 == argc? args[7] : ""); // [in] + + switch(q) + { + case '2': mk_histo<2>(input, quant, histo, proj1, proj2, mask); break; + case '3': mk_histo<3>(input, quant, histo, proj1, proj2, mask); break; + case '4': mk_histo<4>(input, quant, histo, proj1, proj2, mask); break; + case '5': mk_histo<5>(input, quant, histo, proj1, proj2, mask); break; + case '6': mk_histo<6>(input, quant, histo, proj1, proj2, mask); break; + case '7': mk_histo<7>(input, quant, histo, proj1, proj2, mask); break; + case '8': mk_histo<8>(input, quant, histo, proj1, proj2, mask); break; + default: usage(); break; + } + } + else + usage(); + + return 0; +} diff --git a/scribo/sandbox/green/tools/labeling/iz/Makefile.am b/scribo/sandbox/green/tools/labeling/iz/Makefile.am new file mode 100644 index 0000000..57e7ec9 --- /dev/null +++ b/scribo/sandbox/green/tools/labeling/iz/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/tools +BUILD__PATTERN= green/build/tools + + +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/tools/labeling/iz/iz.cc b/scribo/sandbox/green/tools/labeling/iz/iz.cc new file mode 100644 index 0000000..f977898 --- /dev/null +++ b/scribo/sandbox/green/tools/labeling/iz/iz.cc @@ -0,0 +1,495 @@ +// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE +// +// This file is part of Olena. +// +// Olena is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation, version 2 of the License. +// +// Olena is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Olena. If not, see <http://www.gnu.org/licenses/>. +// +// As a special exception, you may use this file as part of a free +// software project without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to produce +// an executable, this file does not by itself cause the resulting +// executable to be covered by the GNU General Public License. This +// exception does not however invalidate any other reasons why the +// executable file might be covered by the GNU General Public License. + +/// \file +/// +/// \brief This tool aimed at propagating segmented labels over the background. +/// +/// Because regional maxima are very small regions, we need to make +/// them growing to be representative in the color space. +/// +/// \fixme Sorry, this source doesn't compile. The fact is the +/// influence_zone_geodesic has changed and fastest version is more +/// attentive to 2d image than 3d. That's why l.127 it call a 2d version of the +/// method at() and it's make trouble with my code that uses a 3d image. + +#include <iostream> +#include <fstream> +#include <boost/format.hpp> + +#include <mln/accu/stat/histo3d_rgb.hh> + +#include <mln/core/macros.hh> +#include <mln/core/alias/neighb3d.hh> +#include <mln/core/image/image2d.hh> +#include <mln/core/image/image3d.hh> + +#include <mln/data/compute.hh> + +#include <mln/display/display_histo.hh> + +#include <mln/io/dump/load.hh> +#include <mln/io/dump/save.hh> +#include <mln/io/ppm/load.hh> +#include <mln/io/ppm/save.hh> +#include <mln/io/pgm/load.hh> +#include <mln/io/pgm/save.hh> + +#include <mln/literal/colors.hh> + +#include <mln/labeling/compute.hh> +#include <mln/labeling/mean_values.hh> + +#include <mln/transform/influence_zone_geodesic.hh> +#include <mln/transform/influence_zone_geodesic_saturated.hh> + +#include <mln/value/int_u8.hh> + +/// \ brief Compute the 2d labeled image. +/// +/// Compute the 2d labeled image with the 2d labeled histogram and +/// the input image. +/// +/// \fixme Need to put it in mln library. Nothing to do here. +template <unsigned n> +struct t_labeling_rgbn : mln::Function_v2v< t_labeling_rgbn<n> > +{ + typedef mln::value::rgb<n> t_rgbn; + typedef mln::value::label_8 t_lbl8; + typedef t_rgbn argument; + typedef t_lbl8 result; + typedef mln::image3d<t_lbl8> t_label; + + const t_label& _label; + + t_labeling_rgbn(const t_label& label) : _label(label) {} + + result operator()(const argument& c) const + { + t_lbl8 tmp = mln::opt::at(_label, c.blue(), c.red(), c.green()); + + return tmp; + } +}; + +/// \brief Compute and dump stats. +/// +/// \param[in] i_input_rgb8 the 2d rgb input image. +/// \param[in] l_input_lbl8 the 2d labeled image. +/// \param[in] h_histo_rgbn the quantified histogram. +/// \param[in] l_histo_lbl8 the labeled quantified histogram. +/// \param[in] n_labels the number of labels (number of regions). +/// \param[in] the name of the logging file for the stats. +/// +/// Every segmented color has got it's own label. For each label, we +/// compute the mean in the r/g/b channels, the total of pixels, the +/// percentage of pixels in the image and the percentage without counting +/// the background (label 0). +void compute_stats(const mln::image2d<mln::value::rgb8>& i_input_rgb8, + const mln::image2d<mln::value::label_8>& l_input_lbl8, + const mln::image3d<unsigned>& h_histo_rgbn, + const mln::image3d<mln::value::label_8>& l_histo_lbl8, + const mln::value::label_8& n_labels, + const std::string& log) +{ + typedef mln::algebra::vec<3,float> t_vec3f; + typedef mln::accu::math::sum<unsigned,unsigned> t_sum; + typedef mln::accu::stat::mean<t_vec3f,t_vec3f,t_vec3f> t_mean; + typedef mln::util::array<unsigned> t_count_array; + typedef mln::util::array<t_vec3f> t_mean_array; + + mln::util::array<float> abs((unsigned)(n_labels)+1); + mln::util::array<float> rel((unsigned)(n_labels)+1); + unsigned nb = 0; + + for (unsigned i = 0; i <= n_labels; ++i) + { + abs[i] = 0.0; + rel[i] = 0.0; + } + + // COMPUTE THE SUM + t_count_array count = mln::labeling::compute(t_sum(), + h_histo_rgbn, + l_histo_lbl8, + n_labels); + + // COMPUTE THE TOTAL + for (unsigned i = 0; i <= n_labels; ++i) + { + unsigned c = count[i]; + nb += c; + } + + // COMPUTE THE PERCENTAGES + for (unsigned i = 0; i <= n_labels; ++i) + if (0 < count[i]) + { + abs[i] = ((float)count[i] / nb)*100.0; + rel[i] = ((float)count[i] / (nb - count[0]))*100.0; + } + + // COMPUTE THE MEAN + + t_mean_array mean = mln::labeling::compute(t_mean(), + i_input_rgb8, + l_input_lbl8, + n_labels); + + // CORRECT 0 LABEL STATS + rel[0] = 0; + mean[0][0] = 255.0; + mean[0][1] = 255.0; + mean[0][2] = 0.0; + + // PRINT STATS + std::ofstream log_stream(log.c_str()); + + for (unsigned i = 0; i <= n_labels; ++i) + { + const t_vec3f& mean_v = mean[i]; + + log_stream << boost::format("%2i|" + "r = %6.2f, g = %6.2f, b = %6.2f |" + "c = %7i, %%i = %5.2f, %%c = %5.2f") + % i + % mean_v[0] + % mean_v[1] + % mean_v[2] + % count[i] + % abs[i] + % rel[i] + << std::endl; + } + + log_stream << std::endl << std::endl; + log_stream.flush(); + log_stream.close(); +} + + +/// \brief Verify that a marker is present on the stream. +/// +/// \param[in] stream the input stream. +/// \param[in] expected the expected character to be on the stream. +/// +/// \return true if the expected character was on the stream, else false. +/// +/// This routine enables to read structured colormap file and to +/// follow the structure while reading colors. +bool expect(std::istream& stream, const std::string expected) +{ + bool result; + std::string got; + + stream >> got; + + result = (got == expected); + + return result; +} + +/// \brief Read a line of the colormap. +/// +/// \param[in] stream the input stream. +/// \param[out] color the output color read in the current line. +/// +/// \return the modified streams. +/// +/// This routine splits a line in differents marks in order to read +/// the R/G/B channels of the output color. +std::istream& operator>>(std::istream& stream, + mln::algebra::vec<3,float>& color) +{ + unsigned lbl; + + stream >> lbl; + if (expect(stream, std::string("|")) && + expect(stream, std::string("r")) && + expect(stream, std::string("="))) + { + stream >> color[0]; + + if (expect(stream, std::string(",")) && + expect(stream, std::string("g")) && + expect(stream, std::string("="))) + { + stream >> color[1]; + + if (expect(stream, std::string(",")) && + expect(stream, std::string("b")) && + expect(stream, std::string("="))) + { + stream >> color[2]; + } + } + } + + return stream; +} + + +/// \brief Load the colormap. +/// +/// \param[out] m2_label the memory representation of the colormap. +/// \param[in] colormap the name of the file where the colormap is stocked. +/// +/// This routine coordonates parsing actions in the colormap file. +void load(mln::util::array< mln::algebra::vec<3,float> >& m2_label, + const char *colormap) +{ + typedef mln::algebra::vec<3,float> t_vec3f; + typedef mln::util::array<t_vec3f> t_mean_array; + + std::ifstream stream(colormap); + std::string buffer; + + getline(stream, buffer); + + while (0 < buffer.size()) + { + std::stringstream line(buffer); + t_vec3f mean_v; + + line >> mean_v; + + m2_label.append(mean_v); + + getline(stream, buffer); + } + + stream.close(); +} + +/// \brief The image processing routine. +/// +/// \param[in] labeled the name of the 3d labeled histogram. +/// \param[in] d the depth for the zone influence transformation, 0 eq infinite. +/// \param[in] nbh the neighbouring (c6|c18|c26). +/// \param[in] input the 8 bit color ppm input image. +/// \param[in] quant the name of quantified RGB input image. +/// \param[in] histo the name of the 3d RGB quantified histogram. +/// \param[in] colormap the name of the colormap for labels. +/// \param[out] iz is the iz labeled 3d histogram. +/// \param[out] proj the red/green projection of the segmented histogram. +/// \param[out] mean the name of the mean rebuilded image. +/// \param[out] stats the name of the statistics file (optional). +/// +/// The core routine starts with image loading, then calls the rigth +/// iz version and then dumps the results, computes the stats and +/// makes r/g projection. The role of the iz routine is to propagated +/// labels around the regional maxima to enlarge the small previous +/// obtained regions. +template<unsigned n> +void mk_iz(const std::string& labeled, // in + const unsigned d, // in + const mln::neighb3d& nbh, // in + const std::string& input, // in + const std::string& quant, // in + const std::string& histo, // in + const std::string& colormap,// in + const std::string& iz, // out + const std::string& proj, // out + const std::string& mean, // out + const std::string& stats) // [out] +{ + typedef mln::value::int_u8 t_int_u8; + typedef mln::value::label_8 t_lbl8; + typedef mln::value::rgb8 t_rgb8; + typedef mln::value::rgb<n> t_rgbn; + typedef mln::algebra::vec<3,float> t_v3f; + typedef mln::image2d<t_int_u8> t_image2d_int_u8; + typedef mln::image2d<t_rgb8> t_image2d_rgb8; + typedef mln::image2d<t_rgbn> t_image2d_rgbn; + typedef mln::image2d<t_lbl8> t_image2d_lbl8; + typedef mln::image3d<unsigned> t_histo3d; + typedef mln::image3d<t_lbl8> t_image3d_lbl8; + typedef mln::accu::meta::stat::histo3d_rgb t_histo3d_fun; + typedef mln::accu::stat::mean<t_v3f,t_v3f,t_v3f> t_mean; + typedef mln::util::array<t_v3f> t_mean_array; + + // START OF IMAGE PROCESSING CHAIN + t_image2d_rgb8 i0_input; // input img + t_image2d_rgbn i1_input; // quant img + t_histo3d h1_input; // histo input + t_histo3d h2_input; // histo input + t_image2d_int_u8 p1_histo; // histo proj + t_image2d_rgb8 p3_histo; // histo proj + t_image3d_lbl8 l2_histo; // label histo + t_image3d_lbl8 l3_histo; // iz label hist + t_mean_array m2_label; // colormap + t_mean_array m3_label; // colormap + t_image2d_lbl8 l3_input; // label input + t_image2d_rgb8 i3_mean; // reconstructed + + t_lbl8 n_lbl; // nb labels + t_rgb8 red(mln::literal::red); + + mln::io::dump::load(l2_histo, labeled.c_str()); + mln::io::ppm::load(i0_input, input.c_str()); + mln::io::ppm::load(i1_input, quant.c_str()); + mln::io::dump::load(h1_input, histo.c_str()); + load(m2_label, colormap.c_str()); + + if (0 == d) + { + l3_histo = mln::transform::influence_zone_geodesic(l2_histo, nbh); + } + else + { + l3_histo =mln::transform::influence_zone_geodesic_saturated(l2_histo,nbh,d); + } + // END OF IMAGE PROCESSING CHAIN + + // BEGIN DUMPING + + n_lbl = (t_lbl8)(m2_label.size()-1); + + l3_input = mln::data::transform(i1_input, t_labeling_rgbn<n>(l3_histo)); + i3_mean = mln::labeling::mean_values(i0_input, l3_input, n_lbl); + m3_label = mln::labeling::compute(t_mean(), i0_input, l3_input, n_lbl); + + // CORRECT 0 LABEL STATS + m3_label[0][0] = 255.0; + m3_label[0][1] = 255.0; + m3_label[0][2] = 0.0; + + p3_histo = mln::display::display3_histo3d_unsigned<n>(h1_input, + l3_histo, + m3_label, + red); + mln::io::dump::save(l3_input, iz.c_str()); + mln::io::ppm::save(p3_histo, proj.c_str()); + mln::io::ppm::save(i3_mean, mean.c_str()); + + if (0 < stats.size()) + compute_stats(i0_input, l3_input, h1_input, l3_histo, n_lbl, stats); + + // END DUMPING +} + + +/// \brief The online documentation of the tool. +/// +/// Print the documentation of the tool with the meaning of the +/// different parameters. +void usage() +{ + std::cout << std::endl; + std::cout << "iz labeled.dump d nbh input.ppm q quant.ppm" + << " histo.dump colormap.txt iz.dump proj.ppm" + << " mean.ppm [stats.txt]" << std::endl; + std::cout << std::endl; + std::cout << "where :" << std::endl; + std::cout << "* [ in] labeled.dump is the labeled 3d histogram" << std::endl; + std::cout << "* [ in] d is the depth for the zone influence" + << " transformation (0 means infinite)" << std::endl; + std::cout << "* [ in] nbh is the 3d neighbourhood {6,18,26}" << std::endl; + std::cout << "* [ in] input.ppm is the 8 bits color ppm image" << std::endl; + std::cout << "* [ in] q is the degree of quantification" + << " {2,3,4,5,6,7,8}" << std::endl; + std::cout << "* [ in] quant.ppm is the q bits quantified input" + << " image" << std::endl; + std::cout << "* [ in] histo.dump is the quantified color" + << " histogram" << std::endl; + std::cout << "* [ in] colormap.txt is the colormap for labels" << std::endl; + std::cout << "* [out] iz.dump is the iz labeled 3d histogram" << std::endl; + std::cout << "* [out] proj.ppm is the r/g projection of the" + << " histogram with maxima label plot on" << std::endl; + std::cout << "* [out] mean.ppm is the mean reconstructed image" << std::endl; + std::cout << "* [out] stats.txt is the statistical label report"<< std::endl; + std::cout << std::endl; +} + +/// \brief The main entry of the software. +/// +/// \param[in] labeled.dump the name of the 3d labeled histogram. +/// \param[in] d the depth for the zone influence transformation, 0 eq infinite. +/// \param[in] nbh the code for the neighbouring (6|18|26). +/// \param[in] input.ppm the 8 bit color ppm input image. +/// \param[in] q is the degree of quantification {2,3,4,5,6,7,8}. +/// \param[in] quant.ppm the name of quantified RGB input image. +/// \param[in] histo.dump the name of the 3d RGB quantified histogram. +/// \param[in] colormap.txt the name of the colormap for labels. +/// \param[out] iz.dump is the iz labeled 3d histogram. +/// \param[out] proj.ppm the red/green projection of the segmented histogram. +/// \param[out] mean.ppm the name of the mean rebuilded image. +/// \param[out] stats.txt the name of the statistics file (optional). +/// +/// This is the front hand for the image processing routine. The goal of this +/// chain is to provide 3d histogram for further analysis and to give a way to +/// see it. +int main(int argc, char* args[]) +{ + if (12 == argc || 13 == argc) + { + const std::string labeled(args[1]); // in + const unsigned d = atoi(args[2]); // in + const char nbh = args[3][0]; // in + const std::string input(args[4]); // in + const char q = args[5][0]; // in + const std::string quant(args[6]); // in + const std::string histo(args[7]); // in + const std::string colormap(args[8]); // in + const std::string iz(args[9]); // out + const std::string proj(args[10]); // out + const std::string mean(args[11]); // out + const std::string stats(13 == argc? args[12] : ""); // [out] + + + mln::neighb3d neighbourhood; + + switch (nbh) + { + case '6': neighbourhood = mln::c6(); break; + case '1': neighbourhood = mln::c18(); break; + case '2': neighbourhood = mln::c26(); break; + default: usage(); return 0; // force usage and quit + } + + switch (q) + { + case '2' : mk_iz<2>(labeled,d,neighbourhood,input,quant, + histo,colormap,iz,proj,mean,stats);break; + case '3' : mk_iz<3>(labeled,d,neighbourhood,input,quant, + histo,colormap,iz,proj,mean,stats);break; + case '4' : mk_iz<4>(labeled,d,neighbourhood,input,quant, + histo,colormap,iz,proj,mean,stats);break; + case '5' : mk_iz<5>(labeled,d,neighbourhood,input,quant, + histo,colormap,iz,proj,mean,stats);break; + case '6' : mk_iz<6>(labeled,d,neighbourhood,input,quant, + histo,colormap,iz,proj,mean,stats);break; + case '7' : mk_iz<7>(labeled,d,neighbourhood,input,quant, + histo,colormap,iz,proj,mean,stats);break; + case '8' : mk_iz<8>(labeled,d,neighbourhood,input,quant, + histo,colormap,iz,proj,mean,stats);break; + default: usage(); break; + } + } + else + usage(); + + return 0; +} diff --git a/scribo/sandbox/green/tools/labeling/opening/Makefile.am b/scribo/sandbox/green/tools/labeling/opening/Makefile.am new file mode 100644 index 0000000..f03a836 --- /dev/null +++ b/scribo/sandbox/green/tools/labeling/opening/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/tools +BUILD__PATTERN= green/build/tools + + +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/tools/labeling/opening/opening.cc b/scribo/sandbox/green/tools/labeling/opening/opening.cc new file mode 100644 index 0000000..c4f1cb9 --- /dev/null +++ b/scribo/sandbox/green/tools/labeling/opening/opening.cc @@ -0,0 +1,174 @@ +// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE +// +// This file is part of Olena. +// +// Olena is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation, version 2 of the License. +// +// Olena is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Olena. If not, see <http://www.gnu.org/licenses/>. +// +// As a special exception, you may use this file as part of a free +// software project without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to produce +// an executable, this file does not by itself cause the resulting +// executable to be covered by the GNU General Public License. This +// exception does not however invalidate any other reasons why the +// executable file might be covered by the GNU General Public License. + +/// \file +/// +/// \brief This tool aimed at filtering the previous 3d RGB histogram. +/// +/// The current filtering is managed with morphological volume attribute. +/// +/// \fixme I don't know if the volume attribute do well it's +/// job. Sometimes, there is something strange happened. I know it's +/// related to that part of processing but i can't tell where it is wrong. + +#include <iostream> + +#include <mln/accu/stat/histo3d_rgb.hh> + +#include <mln/core/macros.hh> +#include <mln/core/alias/neighb3d.hh> +#include <mln/core/image/image2d.hh> +#include <mln/core/image/image3d.hh> + +#include <mln/data/compute.hh> + +#include <mln/display/display_histo.hh> + +#include <mln/io/dump/load.hh> +#include <mln/io/dump/save.hh> +#include <mln/io/ppm/save.hh> +#include <mln/io/pgm/save.hh> + +#include <mln/literal/colors.hh> + +#include <mln/morpho/opening/volume.hh> + +#include <mln/value/rgb.hh> +#include <mln/value/int_u8.hh> + +/// \brief The histogram image processing chain. +/// +/// \param[in] histo the name of the input histogram to filter. +/// \param[in] min_vol the minimum volume threshold to leave in the image. +/// \param[out] opened the name of the filtered histogram. +/// \param[out] proj1 the red/green projection of the histogram. +/// \param[out] proj2 the red/green projection with maxima plot on. +/// +/// This chain aimed at filtering 3d RGB histogram by volume +/// morphological attribute. The threshold indicates the minimum +/// volume information to leave, otherwhise information with less +/// volume attribute is discarded. Then, dumping and +/// projections are done. +template <unsigned n> +void mk_opening(const std::string& histo, // in + const unsigned min_vol, // in + const std::string& opened, // out + const std::string& proj1, // out + const std::string& proj2) // out +{ + typedef mln::value::int_u8 t_int_u8; + typedef mln::value::rgb<n> t_rgbn; + typedef mln::image2d<t_int_u8> t_image2d_int_u8; + typedef mln::image2d<t_rgbn> t_image2d_rgbn; + typedef mln::image3d<unsigned> t_histo3d; + typedef mln::accu::meta::stat::histo3d_rgb t_histo3d_fun; + + // START OF IMAGE PROCESSING CHAIN + t_histo3d h1_input; // histo input + t_histo3d h2_input; // histo input + t_image2d_int_u8 p1_histo1;// histo proj1 + t_image2d_rgbn p1_histo2;// histo proj2 + t_rgbn red(mln::literal::red); + + mln::io::dump::load(h1_input, histo.c_str()); + h2_input = mln::morpho::opening::volume(h1_input, mln::c6(), min_vol); + // END OF IMAGE PROCESSING CHAIN + + // BEGIN DUMPING + p1_histo1 = mln::display::display_histo3d_unsigned(h2_input); + p1_histo2 = mln::display::display3_histo3d_unsigned(h2_input, red); + mln::io::dump::save(h2_input, opened.c_str()); + mln::io::pgm::save(p1_histo1, proj1.c_str()); + mln::io::ppm::save(p1_histo2, proj2.c_str()); + // END DUMPING +} + + +/// \brief The online documentation of the tool. +/// +/// Print the documentation of the tool with the meaning of the +/// different parameters. +void usage() +{ + std::cout << std::endl; + std::cout << "opening q histo.dump v opened.dump proj.pgm" + << " proj.ppm" << std::endl; + std::cout << std::endl; + std::cout << "where :" << std::endl; + std::cout << "* [ in] q is the degree of quantification" + << " {2,3,4,5,6,7,8}" << std::endl; + std::cout << "* [ in] histo.dump is the quantified color" + << " histogram" << std::endl; + std::cout << "* [ in] v is the minimum size (in pixels) of" + << " each composant" << std::endl; + std::cout << "* [out] opened.dump is the filtered histogram" << std::endl; + std::cout << "* [out] proj.pgm is the r/g projection of the" + << " histogram (summing along the blue axe)" << std::endl; + std::cout << "* [out] proj.ppm is the r/g projection of the" + << " histogram with maxima plot on" << std::endl; + std::cout << std::endl; +} + + +/// \brief The main entry of the software. +/// +/// \param[in] q the quantification previously used. +/// \param[in] histo the name of the 3d RGB histogram to filter. +/// \param[in] min_vol the threshold of the morphological filtering. +/// \param[out] opened.dump the name of the resulting 3d histogram. +/// \param[out] proj.pgm the red/green projection of the histogram. +/// \param[out] proj2.ppm the red/green projection with maxima plot on. +/// +/// This is the front hand for the image processing routine. The goal of this +/// chain is to filter 3d histogram for further analysis and to give a way to +/// see it. +int main(int argc, char* args[]) +{ + if (7 == argc) + { + const char q = args[1][0]; // in + const std::string histo(args[2]); // in + const unsigned min_vol = atoi(args[3]); // in + const std::string opened(args[4]); // out + const std::string proj1(args[5]); // out + const std::string proj2(args[6]); // out + + switch(q) + { + case '2': mk_opening<2>(histo, min_vol, opened, proj1, proj2); break; + case '3': mk_opening<3>(histo, min_vol, opened, proj1, proj2); break; + case '4': mk_opening<4>(histo, min_vol, opened, proj1, proj2); break; + case '5': mk_opening<5>(histo, min_vol, opened, proj1, proj2); break; + case '6': mk_opening<6>(histo, min_vol, opened, proj1, proj2); break; + case '7': mk_opening<7>(histo, min_vol, opened, proj1, proj2); break; + case '8': mk_opening<8>(histo, min_vol, opened, proj1, proj2); break; + default: usage(); break; + } + } + else + usage(); + + return 0; +} diff --git a/scribo/sandbox/green/tools/labeling/regmax/Makefile.am b/scribo/sandbox/green/tools/labeling/regmax/Makefile.am new file mode 100644 index 0000000..f03a836 --- /dev/null +++ b/scribo/sandbox/green/tools/labeling/regmax/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/tools +BUILD__PATTERN= green/build/tools + + +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/tools/labeling/regmax/regmax.cc b/scribo/sandbox/green/tools/labeling/regmax/regmax.cc new file mode 100644 index 0000000..1fc9976 --- /dev/null +++ b/scribo/sandbox/green/tools/labeling/regmax/regmax.cc @@ -0,0 +1,428 @@ +// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE +// +// This file is part of Olena. +// +// Olena is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation, version 2 of the License. +// +// Olena is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Olena. If not, see <http://www.gnu.org/licenses/>. +// +// As a special exception, you may use this file as part of a free +// software project without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to produce +// an executable, this file does not by itself cause the resulting +// executable to be covered by the GNU General Public License. This +// exception does not however invalidate any other reasons why the +// executable file might be covered by the GNU General Public License. + +/// \file +/// +/// \brief This tool aimed at segmenting the histogram. +/// +/// The current segmentation of the histogram is done by finding the +/// regional maxima. Regional maxima are isolated small regions inside +/// the background (label 0). + +#include <iostream> +#include <fstream> +#include <boost/format.hpp> + +#include <mln/accu/stat/histo3d_rgb.hh> +#include <mln/accu/stat/mean.hh> + +#include <mln/algebra/vec.hh> + +#include <mln/core/macros.hh> +#include <mln/core/alias/neighb3d.hh> +#include <mln/core/image/image2d.hh> +#include <mln/core/image/image3d.hh> + +#include <mln/data/compute.hh> + +#include <mln/debug/println.hh> +#include <mln/display/display_histo.hh> + +#include <mln/io/dump/load.hh> +#include <mln/io/dump/save.hh> +#include <mln/io/pgm/load.hh> +#include <mln/io/pgm/save.hh> +#include <mln/io/ppm/load.hh> +#include <mln/io/ppm/save.hh> + +#include <mln/labeling/regional_maxima.hh> +#include <mln/labeling/compute.hh> +#include <mln/labeling/mean_values.hh> + +#include <mln/literal/colors.hh> + +#include <mln/morpho/opening/volume.hh> + +#include <mln/value/label_8.hh> +#include <mln/value/int_u8.hh> +#include <mln/value/rgb8.hh> + +#include <mln/util/array.hh> + +/// \ brief Compute the 2d labeled image. +/// +/// Compute the 2d labeled image with the 2d labeled histogram and +/// the input image. +/// +/// \fixme Need to put it in mln library. Nothing to do here. +template <unsigned n> +struct t_labeling_rgbn : mln::Function_v2v< t_labeling_rgbn<n> > +{ + typedef mln::value::rgb<n> t_rgbn; + typedef mln::value::label_8 t_lbl8; + typedef t_rgbn argument; + typedef t_lbl8 result; + typedef mln::image3d<t_lbl8> t_label; + + const t_label& _label; + + t_labeling_rgbn(const t_label& label) : _label(label) {} + + result operator()(const argument& c) const + { + t_lbl8 tmp = mln::opt::at(_label, c.blue(), c.red(), c.green()); + + return tmp; + } +}; + + +/// \brief Compute and dump stats. +/// +/// \param[in] i_input_rgb8 the 2d rgb input image. +/// \param[in] l_input_lbl8 the 2d labeled image. +/// \param[in] h_histo_rgbn the quantified histogram. +/// \param[in] l_histo_lbl8 the labeled quantified histogram. +/// \param[in] n_labels the number of labels (number of regions). +/// \param[in] the name of the logging file for the stats. +/// +/// Every segmented color has got it's own label. For each label, we +/// compute the mean in the r/g/b channels, the total of pixels, the +/// percentage of pixels in the image and the percentage without counting +/// the background (label 0). +void compute_stats(const mln::image2d<mln::value::rgb8>& i_input_rgb8, + const mln::image2d<mln::value::label_8>& l_input_lbl8, + const mln::image3d<unsigned>& h_histo_rgbn, + const mln::image3d<mln::value::label_8>& l_histo_lbl8, + const mln::value::label_8& n_labels, + const std::string& log) +{ + typedef mln::algebra::vec<3,float> t_vec3f; + typedef mln::accu::math::sum<unsigned,unsigned> t_sum; + typedef mln::accu::stat::mean<t_vec3f,t_vec3f,t_vec3f> t_mean; + typedef mln::util::array<unsigned> t_count_array; + typedef mln::util::array<t_vec3f> t_mean_array; + + mln::util::array<float> abs((unsigned)(n_labels)+1); + mln::util::array<float> rel((unsigned)(n_labels)+1); + unsigned nb = 0; + + for (unsigned i = 0; i <= n_labels; ++i) + { + abs[i] = 0.0; + rel[i] = 0.0; + } + + // COMPUTE THE SUM + t_count_array count = mln::labeling::compute(t_sum(), + h_histo_rgbn, + l_histo_lbl8, + n_labels); + + // COMPUTE THE TOTAL + for (unsigned i = 0; i <= n_labels; ++i) + { + unsigned c = count[i]; + nb += c; + } + + // COMPUTE THE PERCENTAGES + for (unsigned i = 0; i <= n_labels; ++i) + if (0 < count[i]) + { + abs[i] = ((float)count[i] / nb)*100.0; + rel[i] = ((float)count[i] / (nb - count[0]))*100.0; + } + + // COMPUTE THE MEAN + + t_mean_array mean = mln::labeling::compute(t_mean(), + i_input_rgb8, + l_input_lbl8, + n_labels); + + // CORRECT 0 LABEL STATS + rel[0] = 0; + mean[0][0] = 255.0; + mean[0][1] = 255.0; + mean[0][2] = 0.0; + + // PRINT STATS + std::ofstream log_stream(log.c_str()); + + for (unsigned i = 0; i <= n_labels; ++i) + { + const t_vec3f& mean_v = mean[i]; + + log_stream << boost::format("%2i|" + "r = %6.2f, g = %6.2f, b = %6.2f |" + "c = %7i, %%i = %5.2f, %%c = %5.2f") + % i + % mean_v[0] + % mean_v[1] + % mean_v[2] + % count[i] + % abs[i] + % rel[i] + << std::endl; + } + + log_stream << std::endl << std::endl; + log_stream.flush(); + log_stream.close(); +} + + + +/// \brief Dump the colormap. +/// +/// \param[in] m2_label the internal representation of the colormap. +/// \param[in] colormap the name of the colormap in the filesystem. +/// +/// Take an dynamic array of 3d vector which represents the colormap. +/// Use boost formatting to dump it properly. +void save(mln::util::array< mln::algebra::vec<3,float> >& m2_label, + const char *colormap) +{ + typedef mln::algebra::vec<3,float> t_vec3f; + typedef mln::util::array<t_vec3f> t_mean_array; + + std::ofstream stream(colormap); + + for (unsigned i = 0; i < m2_label.size(); ++i) + { + const t_vec3f& mean_v = m2_label[i]; + + stream << boost::format("%2i | r = %6.2f, g = %6.2f, b = %6.2f") + % i + % mean_v[0] + % mean_v[1] + % mean_v[2] + << std::endl; + } + + stream.flush(); + stream.close(); +} + + +/// \brief The regmax image processing chain. +/// +/// \param[in] input the name of the RGB input image. +/// \param[in] quant the name of quantified RGB input image. +/// \param[in] histo the name of the 3d RGB histogram to filter. +/// \param[in] opened the name of 3d histogram. +/// \param[in] nbh the neighbouring (c6|c18|c26). +/// \param[out] labeled the 3d labeled histogram. +/// \param[out] proj the red/green projection of the segmented histogram. +/// \param[out] colormap the name of the colormap produced. +/// \param[out] mean the name of the mean rebuilded image. +/// \param[out] stats the name of the statistics (optional). +/// +/// This is the core routine of this file. First every input file +/// (images or histograms) are loaded. Then regional labeling is +/// done. And finally, every colormap dumping, stats saving, +/// projection is done. +template <unsigned n> +void mk_regmax(const std::string& input, // in + const std::string& quant, // in + const std::string& histo, // in + const std::string& opened, // in + const mln::neighb3d& nbh, // in + const std::string& labeled, // out + const std::string& proj, // out + const std::string& colormap,// out + const std::string& mean, // out + const std::string& stats) // [out] +{ + typedef mln::value::label_8 t_lbl8; + typedef mln::value::rgb8 t_rgb8; + typedef mln::value::rgb<n> t_rgbn; + typedef mln::value::int_u8 t_int_u8; + typedef mln::value::int_u<n> t_int_un; + typedef mln::algebra::vec<3,float> t_v3f; + typedef mln::image2d<t_int_u8> t_image2d_int_u8; + typedef mln::image2d<t_int_un> t_image2d_int_un; + typedef mln::image2d<t_rgb8> t_image2d_rgb8; + typedef mln::image2d<t_rgbn> t_image2d_rgbn; + typedef mln::image3d<t_lbl8> t_image3d_lbl8; + typedef mln::image2d<t_lbl8> t_image2d_lbl8; + typedef mln::image3d<unsigned> t_histo3d; + typedef mln::accu::meta::stat::histo3d_rgb t_histo3d_fun; + typedef mln::accu::stat::mean<t_v3f,t_v3f,t_v3f> t_mean; + typedef mln::util::array<t_v3f> t_mean_array; + + t_image2d_rgb8 i0_input; // input img + t_image2d_rgbn i1_input; // quant img + t_histo3d h1_input; // input histo + t_histo3d h2_input; // opened histo + t_image2d_rgb8 p2_label; // histo proj + t_image3d_lbl8 l2_histo; // label histo + t_image2d_lbl8 l2_input; // label input + t_mean_array m2_label; // colormap + t_image2d_rgb8 i2_mean; // reconstructed + + t_lbl8 n_lbl; // nb class + t_rgb8 red(mln::literal::red); + + + // BEGIN LOADING + mln::io::ppm::load(i0_input, input.c_str()); + mln::io::ppm::load(i1_input, quant.c_str()); + mln::io::dump::load(h1_input, histo.c_str()); + mln::io::dump::load(h2_input, opened.c_str()); + // END LOADING + + // BEGIN IMAGE PROCESSING + l2_histo = mln::labeling::regional_maxima(h2_input, nbh, n_lbl); + // END IMAGE PROCESSING + + // BEGIN SAVING + mln::io::dump::save(l2_histo, labeled.c_str()); + + l2_input = mln::data::transform(i1_input, t_labeling_rgbn<n>(l2_histo)); + i2_mean = mln::labeling::mean_values(i0_input, l2_input, n_lbl); + m2_label = mln::labeling::compute(t_mean(), i0_input, l2_input, n_lbl); + + // CORRECT 0 LABEL STATS + m2_label[0][0] = 255.0; + m2_label[0][1] = 255.0; + m2_label[0][2] = 0.0; + + p2_label =mln::display::display3_histo3d_unsigned<n>(h1_input, + l2_histo, + m2_label, + red); + + mln::io::ppm::save(p2_label, proj.c_str()); + save(m2_label, colormap.c_str()); + mln::io::ppm::save(i2_mean, mean.c_str()); + + if (0 < stats.size()) + compute_stats(i0_input, l2_input, h1_input, l2_histo, n_lbl, stats); + + // END SAVING +} + + +/// \brief The online documentation of the tool. +/// +/// Print the documentation of the tool with the meaning of the +/// different parameters. +void usage() +{ + std::cout << std::endl; + std::cout << "regmax input.ppm q quant.ppm histo.dump" + << " opened.dump nbh labeled.dump proj.ppm" + << " colormap.txt mean.ppm [stats.txt]" << std::endl; + std::cout << std::endl; + std::cout << "where :" << std::endl; + std::cout << "* [ in] input.ppm is the 8 bits color ppm image" << std::endl; + std::cout << "* [ in] q is the degree of quantification" + << " {2,3,4,5,6,7,8}" << std::endl; + std::cout << "* [ in] quant.ppm is the q bits quantified input" + << " image" << std::endl; + std::cout << "* [ in] histo.dump is the quantified color" + << " histogram" << std::endl; + std::cout << "* [ in] opened.dump is the filtered histogram" << std::endl; + std::cout << "* [ in] nbh is the 3d neighbourhood {6,18,26}" << std::endl; + std::cout << "* [out] labeled.dump is the labeled 3d histogram" << std::endl; + std::cout << "* [out] proj.ppm is the r/g projection of the" + << " histogram with maxima label plot on" << std::endl; + std::cout << "* [out] colormap.txt is the colormap for labels" << std::endl; + std::cout << "* [out] mean.ppm is the mean reconstructed image" << std::endl; + std::cout << "* [out] stats.txt is the statistical label report"<< std::endl; + std::cout << std::endl; +} + + +/// \brief The main entry of the software. +/// +/// \param[in] input.ppm the name of the RGB input image. +/// \param[in] q the quantification previously used. +/// \param[in] quant.ppm the name of quantified RGB input image. +/// \param[in] histo.dump the name of the 3d RGB histogram to filter. +/// \param[in] opened.dump the name of 3d histogram. +/// \param[in] nbh the code for the neighbouring (6|18|26). +/// \param[out] labeled.dump the 3d labeled histogram. +/// \param[out] proj.ppm the red/green projection of the segmented histogram. +/// \param[out] colormap.txt the name of the colormap produced. +/// \param[out] mean.ppm the name of the mean rebuilded image. +/// \param[out] stats.txt the name of the statistics file (optional). +/// +/// This is the front hand for the image processing routine. The goal of this +/// chain is to segment the 3d histogram. +int main(int argc, char* args[]) +{ + if (11 == argc || 12 == argc) + { + const std::string input(args[1]); // in + const char q = args[2][0]; // in + const std::string quant(args[3]); // in + const std::string histo(args[4]); // in + const std::string opened(args[5]); // in + const char nbh = args[6][0]; // in + const std::string labeled(args[7]); // out + const std::string proj(args[8]); // out + const std::string colormap(args[9]);// out + const std::string mean(args[10]); // out + const std::string stats(12 == argc? args[11] : ""); // [out] + + + mln::neighb3d neighbourhood; + + switch (nbh) + { + case '6': neighbourhood = mln::c6(); break; + case '1': neighbourhood = mln::c18(); break; + case '2': neighbourhood = mln::c26(); break; + default: usage(); return 0; // force usage and quit + } + + switch (q) + { + + case '2': mk_regmax<2>(input,quant,histo,opened,neighbourhood, + labeled,proj,colormap,mean,stats); break; + case '3': mk_regmax<3>(input,quant,histo,opened,neighbourhood, + labeled,proj,colormap,mean,stats); break; + case '4': mk_regmax<4>(input,quant,histo,opened,neighbourhood, + labeled,proj,colormap,mean,stats); break; + case '5': mk_regmax<5>(input,quant,histo,opened,neighbourhood, + labeled,proj,colormap,mean,stats); break; + case '6': mk_regmax<6>(input,quant,histo,opened,neighbourhood, + labeled,proj,colormap,mean,stats); break; + case '7': mk_regmax<7>(input,quant,histo,opened,neighbourhood, + labeled,proj,colormap,mean,stats); break; + case '8': mk_regmax<8>(input,quant,histo,opened,neighbourhood, + labeled,proj,colormap,mean,stats); break; + default: usage(); break; + } + } + else + usage(); + + return 0; +} diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/display/display_histo/Makefile.am similarity index 100% copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am copy to scribo/sandbox/green/use/display/display_histo/Makefile.am diff --git a/scribo/sandbox/green/use/display/display_histo/display_histo.cc b/scribo/sandbox/green/use/display/display_histo/display_histo.cc new file mode 100644 index 0000000..090b609 --- /dev/null +++ b/scribo/sandbox/green/use/display/display_histo/display_histo.cc @@ -0,0 +1,86 @@ +// 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. + +/// \file +/// +/// \brief Sample code to use the red/green visualization. +/// +/// \fixme There is a lot of routines in display_histo.hh, but only +/// two of them have been call here. It's a poor job from me, but i've +/// the time to do it know. + +#include <iostream> +#include <mln/accu/stat/histo3d_rgb.hh> +#include <mln/core/macros.hh> +#include <mln/core/image/image2d.hh> +#include <mln/core/image/image3d.hh> +#include <mln/data/compute.hh> +#include <mln/data/transform.hh> +#include <mln/display/display_histo.hh> +#include <mln/fun/v2v/rgb8_to_rgbn.hh> +#include <mln/img_path.hh> +#include <mln/io/ppm/load.hh> +#include <mln/io/pgm/save.hh> +#include <mln/io/ppm/save.hh> +#include <mln/literal/colors.hh> +#include <mln/value/rgb8.hh> +#include <mln/value/rgb.hh> + +int main() +{ + typedef mln::value::int_u8 t_int_u8; + typedef mln::value::int_u<4> t_int_u4; + typedef mln::value::rgb8 t_rgb8; + typedef mln::value::rgb<4> t_rgb4; + typedef mln::image2d<t_int_u8> t_image2d_int_u8; + typedef mln::image2d<t_int_u4> t_image2d_int_u4; + typedef mln::image2d<t_rgb8> t_image2d_rgb8; + typedef mln::image2d<t_rgb4> t_image2d_rgb4; + typedef mln::image2d<bool> t_image2d_bool; + typedef mln::image3d<unsigned> t_histo3d; + typedef mln::fun::v2v::rgb8_to_rgbn<4> t_rgb8_to_rgb4; + typedef mln::accu::meta::stat::histo3d_rgb t_histo3d_fun; + + t_image2d_rgb8 i0_input; // input rgb8 + t_image2d_rgb4 i1_input; // input rgbn + t_histo3d h1_input; // histo input + t_image2d_int_u8 p1_histo1;// histo proj1 + t_image2d_rgb4 p1_histo2;// histo proj2 + t_rgb4 red(mln::literal::red); + + mln::io::ppm::load(i0_input, OLENA_IMG_PATH"/lena.ppm"); + + i1_input = mln::data::transform(i0_input, t_rgb8_to_rgb4()); + h1_input = mln::data::compute(t_histo3d_fun(), i1_input); + p1_histo1 = mln::display::display_histo3d_unsigned(h1_input); + p1_histo2 = mln::display::display3_histo3d_unsigned(h1_input, red); + + mln::io::pgm::save(p1_histo1, "proj1.pgm"); + mln::io::ppm::save(p1_histo2, "proj2.ppm"); + + return 0; +} -- 1.5.6.5
participants (1)
-
Guillaume Lazzara