Olena-patches
Threads by month
- ----- 2025 -----
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- 9625 discussions
* ok/mln/img_path.hh: New header file.
* ok/mln/accu/histo/histo1d.hh: New header file.
* ok/mln/accu/histo/histo2d.hh: New header file.
* ok/mln/accu/histo/histo3d.hh: New header file.
* ok/test/accu/histo/gaussian.sh: New gnuplot script file.
* ok/test/accu/histo/histo1d.cc: New source file.
---
scribo/sandbox/green/ChangeLog | 12 +
scribo/sandbox/green/README | 32 +
.../sandbox/green/ok/mln/accu/histo}/histo1d.hh | 100 ++--
.../sandbox/green/ok/mln/accu/histo}/histo2d.hh | 0
.../sandbox/green/ok/mln/accu/histo/histo3d.hh | 0
.../sandbox/green/ok}/mln/img_path.hh | 0
.../sandbox/green/ok/test/accu/histo}/gaussian.sh | 0
scribo/sandbox/green/ok/test/accu/histo/histo1d | Bin 0 -> 802920 bytes
scribo/sandbox/green/ok/test/accu/histo/histo1d.cc | 726 ++++++++++++++++++++
9 files changed, 813 insertions(+), 57 deletions(-)
create mode 100644 scribo/sandbox/green/README
copy {milena/sandbox/green/mln/accu/stat => scribo/sandbox/green/ok/mln/accu/histo}/histo1d.hh (74%)
copy {milena/sandbox/green/mln/accu/stat => scribo/sandbox/green/ok/mln/accu/histo}/histo2d.hh (100%)
copy milena/sandbox/green/mln/accu/stat/histo3d_rgb.hh => scribo/sandbox/green/ok/mln/accu/histo/histo3d.hh (100%)
copy {milena/sandbox/green => scribo/sandbox/green/ok}/mln/img_path.hh (100%)
copy {milena/sandbox/green/tests/accu/stat/histo1d => scribo/sandbox/green/ok/test/accu/histo}/gaussian.sh (100%)
create mode 100755 scribo/sandbox/green/ok/test/accu/histo/histo1d
create mode 100644 scribo/sandbox/green/ok/test/accu/histo/histo1d.cc
diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog
index e69de29..ed399c5 100644
--- a/scribo/sandbox/green/ChangeLog
+++ b/scribo/sandbox/green/ChangeLog
@@ -0,0 +1,12 @@
+2010-06-21 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Simple integration test.
+
+ * README: New text file.
+ * ok/mln/img_path.hh: New header file.
+ * ok/mln/accu/histo/histo1d.hh: New header file.
+ * ok/mln/accu/histo/histo2d.hh: New header file.
+ * ok/mln/accu/histo/histo3d.hh: New header file.
+ * ok/test/accu/histo/gaussian.sh: New gnuplot script file.
+ * ok/test/accu/histo/histo1d.cc: New source file.
+
diff --git a/scribo/sandbox/green/README b/scribo/sandbox/green/README
new file mode 100644
index 0000000..4eb71b7
--- /dev/null
+++ b/scribo/sandbox/green/README
@@ -0,0 +1,32 @@
+Le travail est classé dans deux répertoires ok et ko.
+Le répertoire ok correspond aux sources qui ont été reprises et retestées.
+Le répertoire ko correspond aux sources qui ont été juste transférées.
+
+La première brique logicielle importante sur laquelle s'appuie mes travaux est
+la création d'histogrammes sous forme d'image.
+
+
+CREATION DES HISTOGRAMMES
+-------------------------
+
+ko/mln/accu/stat/histo1d.hh: histogramme image valeur scalaire.
+ko/mln/accu/stat/histo2d.hh: histogramme image valeur vectorielle 2d.
+ko/mln/accu/stat/histo3d_hsl.hh: histogramme image valeur vectorielle 3d (HSL).
+ko/mln/accu/stat/histo3d_rgb.hh: histogramme image valeur vectorielle 3d (RGB).
+
+
+
+
+ok/mln/accu/histo/histo1d.hh: histogramme image valeur scalaire entière.
+ok/mln/accu/histo/histo2d.hh: histogramme image valeur vectorielle 2d entière.
+ok/mln/accu/histo/histo3d.hh: histogramme image valeur vectorielle 3d entière.
+
+
+SAUVEGARDE DES HISTOGRAMMES
+---------------------------
+
+
+
+
+VISUALISATION DES HISTOGRAMMES
+------------------------------
\ No newline at end of file
diff --git a/milena/sandbox/green/mln/accu/stat/histo1d.hh b/scribo/sandbox/green/ok/mln/accu/histo/histo1d.hh
similarity index 74%
copy from milena/sandbox/green/mln/accu/stat/histo1d.hh
copy to scribo/sandbox/green/ok/mln/accu/histo/histo1d.hh
index 57d6103..139cf39 100644
--- a/milena/sandbox/green/mln/accu/stat/histo1d.hh
+++ b/scribo/sandbox/green/ok/mln/accu/histo/histo1d.hh
@@ -1,6 +1,5 @@
-// Copyright (C) 2007 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007,2008,2009,2010 EPITA Research and Development
+// Laboratory (LRDE)
//
// This file is part of Olena.
//
@@ -25,35 +24,41 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
-#ifndef MLN_ACCU_STAT_HISTO1D_HH
-#define MLN_ACCU_STAT_HISTO1D_HH
+#ifndef MLN_ACCU_HISTO_HISTO1D_HH
+#define MLN_ACCU_HISTO_HISTO1D_HH
/// \file
///
-/// \brief Define a histogram as an accumulator which returns an image1d .
+/// \brief Define a histogram as accumulator which returns an image1d.
+///
+/// This source implements the discrete histogram version. It was
+/// created for images which the values are derived from integer
+/// type. The number of beans is directly infered from the cardinality
+/// of the image value. So the int_u8 image has got 256 bins, the
+/// int_u<14> image has got 16384 bins. But, this code doesn't work
+/// for that quantification because of the coord limitation (signed
+/// short, as it is defined in mln/core/def/coord.hh).
///
-/// This source implements the discrete histogram version. The number of beans
-/// is infer from the number of graylevels. A typical int_u8 image has got
-/// 256 bins. An int_u<14> image has got 16384 bins.
/// The following sample is a typical use of the histogram.
///
-/// #include <mln/value/int_u8.hh>
+/// #include <mln/accu/histo/histo1d.hh>
+/// #include <mln/data/compute.hh>
/// #include <mln/core/image/image1d.hh>
/// #include <mln/core/image/image2d.hh>
+/// #include <mln/img_path.hh>
/// #include <mln/io/pgm/load.hh>
-/// #include <mln/accu/stat/histo1d.hh>
-/// #include <mln/data/compute.hh>
-///
-/// #define OLENA_LENA "/usr/local/share/olena/images/lena.pgm"
+/// #include <mln/value/int_u8.hh>
///
-/// void test()
+/// int main()
/// {
-/// typedef mln::value::int_u8 int_u8;
-/// mln::image2d<int_u8> img_ref;
-/// mln::image1d<unsigned> img_res;
+/// typedef mln::value::int_u8 t_int_u8;
+/// mln::image2d<t_int_u8> img;
+/// mln::image1d<unsigned> histo;
+///
+/// mln::io::pgm::load(img, OLENA_IMG_PATH"/lena.pgm");
+/// histo = mln::data::compute(mln::accu::meta::histo::histo1d(), img);
///
-/// mln::io::pgm::load(img_ref, OLENA_LENA);
-/// img_res = mln::data::compute(mln::accu::meta::stat::histo1d(), img_ref);
+/// return 0;
/// }
@@ -80,20 +85,20 @@ namespace mln
namespace accu
{
- namespace stat
+ namespace histo
{
// Forward declaration
template <typename V>
struct histo1d;
- } // end of namespace mln::accu::stat
+ } // end of namespace mln::accu::histo
namespace meta
{
- namespace stat
+ namespace histo
{
struct histo1d : public Meta_Accumulator<histo1d>
@@ -101,11 +106,11 @@ namespace mln
template <typename V>
struct with
{
- typedef accu::stat::histo1d<V> ret;
+ typedef accu::histo::histo1d<V> ret;
};
};
- } // end of namespace mln::accu::meta::stat
+ } // end of namespace mln::accu::meta::histo
} // end of namespace mln::accu::meta
@@ -115,7 +120,7 @@ namespace mln
{
template <typename V>
- struct accumulator_< mln::accu::stat::histo1d<V> >
+ struct accumulator_< mln::accu::histo::histo1d<V> >
{
typedef accumulator::has_untake::no has_untake;
typedef accumulator::has_set_value::no has_set_value;
@@ -125,8 +130,8 @@ namespace mln
template <typename V>
struct set_precise_binary_<op::eq,
- accu::stat::histo1d<V>,
- accu::stat::histo1d<V> >
+ accu::histo::histo1d<V>,
+ accu::histo::histo1d<V> >
{
typedef bool ret;
};
@@ -136,7 +141,7 @@ namespace mln
namespace accu
{
- namespace stat
+ namespace histo
{
/// \brief Define an histogram which returns an image1d .
@@ -152,7 +157,7 @@ namespace mln
template <typename V>
struct histo1d :
- public mln::accu::internal::base<image1d<unsigned>, histo1d<V> >
+ public mln::accu::internal::base< image1d<unsigned>,histo1d<V> >
{
typedef V argument;
typedef image1d<unsigned> result;
@@ -230,7 +235,7 @@ namespace mln
inline
histo1d<V>::histo1d()
{
- trace::entering("mln::accu::stat::histo1d<V>::histo1d");
+ trace::entering("mln::accu::histo::histo1d::cstor");
typedef mln_trait_value_comp(V,0) comp;
typedef point<grid::tick, V> v_point1d;
typedef box<v_point1d> v_box1d;
@@ -242,33 +247,26 @@ namespace mln
count_.init_(box1d(point1d(mln_min(comp)),
point1d(mln_max(comp))));
-// std::cout << "min : " << mln_min(comp) << std::endl;
-// std::cout << "max : " << mln_max(comp) << std::endl;
+ // std::cout << "min : " << mln_min(comp) << std::endl;
+ // std::cout << "max : " << mln_max(comp) << std::endl;
- trace::exiting("mln::accu::stat::histo1d<V>::histo1d");
+ trace::exiting("mln::accu::histo::histo1d::cstor");
}
template <typename V>
inline
void histo1d<V>::init()
{
- trace::entering("mln::accu::stat::histo1d<V>::init");
-
data::fill(count_, 0);
- trace::exiting("mln::accu::stat::histo1d<V>::init");
}
template <typename V>
inline
void histo1d<V>::take(const argument& t)
{
- trace::entering("mln::accu::stat::histo1d<V>::take");
-
// Just convert a graylevel value (int_u8 like) to a position for an
// iterator on the resulting image.
++count_(point1d(t));
-
- trace::exiting("mln::accu::stat::histo1d<V>::take");
}
@@ -276,20 +274,13 @@ namespace mln
inline
void histo1d<V>::take(const histo1d<V>& other)
{
- trace::entering("mln::accu::stat::histo1d<V>::take");
-
count_ += other.count_;
-
- trace::exiting("mln::accu::stat::histo1d<V>::take");
}
template <typename V>
inline
typename histo1d<V>::result histo1d<V>::to_result() const
{
- trace::entering("mln::accu::stat::histo1d<V>::to_result");
-
- trace::exiting("mln::accu::stat::histo1d<V>::to_result");
return count_;
}
@@ -297,9 +288,6 @@ namespace mln
inline
histo1d<V>::operator result() const
{
- trace::entering("mln::accu::stat::histo1d<V>::operator result");
-
- trace::exiting("mln::accu::stat::histo1d<V>::operator result");
return count_;
}
@@ -307,17 +295,15 @@ namespace mln
inline
bool histo1d<V>::is_valid() const
{
- trace::entering("mln::accu::stat::histo1d<V>::is_valid");
bool result = count_.is_valid();
- trace::exiting("mln::accu::stat::histo1d<V>::is_valid");
return result;
}
template <typename V>
bool operator==(const histo1d<V>& histo1, const histo1d<V>& histo2)
{
- trace::entering("mln::accu::stat::operator==");
+ trace::entering("mln::accu::histo::histo1d::operator==");
bool result = true;
const image1d<unsigned>& res1 = histo1.to_result();
@@ -332,17 +318,17 @@ namespace mln
for_all_2(p1, p2)
result &= (res1(p1) == res2(p2));
- trace::exiting("mln::accu::stat::operator==");
+ trace::exiting("mln::accu::histo::histo1d::operator==");
return result;
}
#endif // ! MLN_INCLUDE_ONLY
- } // end of namespace mln::accu::stat
+ } // end of namespace mln::accu::histo
} // end of namespace mln::accu
} // end of namespace mln
-#endif // ! MLN_ACCU_STAT_HISTO1D_HH
+#endif // ! MLN_ACCU_HISTO_HISTO1D_HH
diff --git a/milena/sandbox/green/mln/accu/stat/histo2d.hh b/scribo/sandbox/green/ok/mln/accu/histo/histo2d.hh
similarity index 100%
copy from milena/sandbox/green/mln/accu/stat/histo2d.hh
copy to scribo/sandbox/green/ok/mln/accu/histo/histo2d.hh
diff --git a/milena/sandbox/green/mln/accu/stat/histo3d_rgb.hh b/scribo/sandbox/green/ok/mln/accu/histo/histo3d.hh
similarity index 100%
copy from milena/sandbox/green/mln/accu/stat/histo3d_rgb.hh
copy to scribo/sandbox/green/ok/mln/accu/histo/histo3d.hh
diff --git a/milena/sandbox/green/mln/img_path.hh b/scribo/sandbox/green/ok/mln/img_path.hh
similarity index 100%
copy from milena/sandbox/green/mln/img_path.hh
copy to scribo/sandbox/green/ok/mln/img_path.hh
diff --git a/milena/sandbox/green/tests/accu/stat/histo1d/gaussian.sh b/scribo/sandbox/green/ok/test/accu/histo/gaussian.sh
similarity index 100%
copy from milena/sandbox/green/tests/accu/stat/histo1d/gaussian.sh
copy to scribo/sandbox/green/ok/test/accu/histo/gaussian.sh
diff --git a/scribo/sandbox/green/ok/test/accu/histo/histo1d b/scribo/sandbox/green/ok/test/accu/histo/histo1d
new file mode 100755
index 0000000000000000000000000000000000000000..59d59e91c6f3c2db1b88ad6445e44797bdfcdd69
GIT binary patch
literal 802920
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≧*PsloE=u8E?7&vH&@mR;7*nwe
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ⅆfq!%z>S
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
literal 0
HcmV?d00001
diff --git a/scribo/sandbox/green/ok/test/accu/histo/histo1d.cc b/scribo/sandbox/green/ok/test/accu/histo/histo1d.cc
new file mode 100644
index 0000000..3d542cd
--- /dev/null
+++ b/scribo/sandbox/green/ok/test/accu/histo/histo1d.cc
@@ -0,0 +1,726 @@
+/// TEST HISTO1D
+
+#include <mln/accu/histo/histo1d.hh>
+#include <mln/data/compute.hh>
+#include <mln/core/image/image1d.hh>
+#include <mln/core/image/image2d.hh>
+#include <mln/img_path.hh>
+#include <mln/io/pgm/load.hh>
+#include <mln/value/int_u8.hh>
+
+int main()
+{
+ typedef mln::value::int_u8 t_int_u8;
+ mln::image2d<t_int_u8> img;
+ mln::image1d<unsigned> histo;
+
+ mln::io::pgm::load(img, OLENA_IMG_PATH"/lena.pgm");
+ histo = mln::data::compute(mln::accu::meta::histo::histo1d(), img);
+
+ return 0;
+}
+
+// #include <mln/img_path.hh>
+
+// #include <mln/io/plot/save_histo_sh.hh>
+// #include <mln/accu/stat/histo1d.hh>
+// #include <mln/fun/v2v/int_u16_to_int_u14.hh>
+
+// #include <mln/io/pgm/load.hh>
+// #include <mln/io/pgm/save.hh>
+// #include <mln/io/ppm/save.hh>
+// #include <mln/io/plot/save.hh>
+
+// #include <mln/data/compute.hh>
+// #include <mln/data/transform.hh>
+// #include <mln/data/fill.hh>
+
+// #include <mln/value/int_u8.hh>
+// #include <mln/value/int_u16.hh>
+// #include <mln/value/int_u.hh>
+// #include <mln/value/label_8.hh>
+// #include <mln/value/rgb8.hh>
+
+// #include <mln/core/alias/neighb1d.hh>
+// #include <mln/core/alias/box1d.hh>
+// #include <mln/core/alias/point1d.hh>
+
+// #include <mln/core/routine/initialize.hh>
+// #include <mln/core/contract.hh>
+// #include <mln/core/grids.hh>
+
+// #include <mln/accu/math/sum.hh>
+// #include <mln/accu/math/count.hh>
+// #include <mln/accu/stat/mean.hh>
+// #include <mln/accu/stat/variance.hh>
+
+// #include <mln/morpho/watershed/flooding.hh>
+// #include <mln/morpho/elementary/dilation.hh>
+// #include <mln/morpho/elementary/closing.hh>
+
+// #include <mln/linear/convolve.hh>
+// #include <mln/linear/gaussian.hh>
+// #include <mln/labeling/regional_maxima.hh>
+// #include <mln/labeling/colorize.hh>
+// #include <mln/labeling/mean_values.hh>
+
+// #include <mln/make/w_window1d.hh>
+
+// #include <mln/math/sqr.hh>
+// #include <mln/math/pi.hh>
+// #include <mln/math/abs.hh>
+
+// #include <mln/core/image/dmorph/image_if.hh>
+// #include <mln/pw/value.hh>
+
+// //------------------------------------------------------------------------------
+// // TEST IN 8 BITS
+// //------------------------------------------------------------------------------
+
+
+// void test_8bits_operator_equal()
+// {
+// using namespace mln::accu::stat;
+
+// typedef mln::value::int_u8 int_u8;
+// mln::accu::stat::histo1d<int_u8> histo1;
+// mln::accu::stat::histo1d<int_u8> histo2;
+// int_u8 val = 3;
+
+// histo1.init();
+// histo2.init();
+
+// mln_assertion(histo1 == histo2);
+
+// histo1.take(val);
+
+// mln_assertion(histo1 != histo2);
+
+// histo2.take(val);
+
+// mln_assertion(histo1 == histo2);
+
+// std::cout << "(08 bits) histo == histo : ok" << std::endl;
+// }
+
+// void test_8bits_instantiation_without_argument()
+// {
+// typedef mln::value::int_u8 int_u8;
+// const mln::accu::stat::histo1d<int_u8> histo;
+// const mln::image1d<unsigned>& res = histo.to_result();
+// const mln::point1d& min = mln::point1d(mln_min(int_u8));
+// const mln::point1d& max = mln::point1d(mln_max(int_u8));
+// const mln::box1d& ref = mln::box1d(min, max);
+
+// mln_assertion(ref == res.domain());
+// mln_assertion(res.is_valid());
+
+// std::cout << "(08 bits) histo<T> histo : ok" << std::endl;
+// }
+
+
+// void test_8bits_initialization()
+// {
+// typedef mln::value::int_u8 int_u8;
+// mln::accu::stat::histo1d<int_u8> histo;
+// mln::image1d<unsigned> img_res = histo.to_result();
+// mln::image1d<unsigned> img_ref;
+
+// mln::initialize(img_ref, img_res);
+// mln::data::fill(img_ref, 0);
+// histo.init();
+
+// unsigned res = mln::data::compute(mln::accu::math::sum<int_u8>(), img_res);
+// unsigned ref = mln::data::compute(mln::accu::math::sum<int_u8>(), img_ref);
+
+// mln_assertion(ref == res);
+
+// std::cout << "(08 bits) histo.init() : ok" << std::endl;
+// }
+
+
+// void test_8bits_take_argument()
+// {
+// typedef mln::value::int_u8 int_u8;
+// mln::accu::stat::histo1d<int_u8> histo1;
+// mln::accu::stat::histo1d<int_u8> histo2;
+// int_u8 val = 3;
+
+// histo1.init();
+// histo2.init();
+// histo1.take(val);
+
+// const mln::image1d<unsigned> img1 = histo1.to_result();
+// const mln::image1d<unsigned> img2 = histo2.to_result();
+
+// const unsigned res = mln::data::compute(mln::accu::math::sum<int_u8>(), img1);
+// const unsigned ref = mln::data::compute(mln::accu::math::sum<int_u8>(), img2);
+
+// mln_assertion(ref == res-1);
+// mln_assertion(1 == img1(mln::point1d(val)));
+
+// std::cout << "(08 bits) histo.take(argument) : ok" << std::endl;
+// }
+
+
+// void test_8bits_take_other()
+// {
+// typedef mln::value::int_u8 int_u8;
+// mln::accu::stat::histo1d<int_u8> histo1;
+// mln::accu::stat::histo1d<int_u8> histo2;
+// mln::accu::stat::histo1d<int_u8> histo3;
+// int_u8 val = 3;
+
+// histo1.init();
+// histo2.init();
+// histo3.init();
+
+// histo1.take(val);
+// histo1.take(val);
+// histo3.take(val);
+// histo2.take(val);
+// histo2.take(histo3);
+
+// mln_assertion(histo1 == histo2);
+
+// std::cout << "(08 bits) histo.take(other) : ok" << std::endl;
+// }
+
+// double count_histo(mln::image1d<unsigned> img)
+// {
+// mln_precondition(img.is_valid());
+
+// double result = 0.0;
+// mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+// for_all(p)
+// result += img(p);
+
+// return result;
+// }
+
+// double mean_histo(mln::image1d<unsigned> img)
+// {
+// mln_precondition(img.is_valid());
+
+// double count = 0.0;
+// double sum = 0.0;
+// double result = 0.0;
+// mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+// for_all(p)
+// {
+// count += img(p);
+// sum += p[0] * img(p);
+// }
+
+// result = sum / count;
+
+// return result;
+// }
+
+
+// double var_histo(mln::image1d<unsigned> img)
+// {
+// mln_precondition(img.is_valid());
+
+// double count = 0.0;
+// double sum = 0.0;
+// double sum2 = 0.0;
+// double result = 0.0;
+// mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+// for_all(p)
+// {
+// count += img(p);
+// sum += p[0] * img(p);
+// sum2 += p[0] * p[0] * img(p);
+// }
+
+// result = sum2 / count - (sum / count) * (sum / count);
+
+// return result;
+// }
+
+// double var_histo2(mln::image1d<unsigned> img)
+// {
+// mln_precondition(img.is_valid());
+
+// double count = count_histo(img);
+// double mean = mean_histo(img);
+// double result = 0.0;
+// mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+// for_all(p)
+// {
+// result += img(p) * (p[0] - mean) * (p[0] - mean);
+// }
+
+// result /= count;
+
+// return result;
+// }
+
+// void test_8bits_integration()
+// {
+// typedef mln::value::int_u8 int_u8;
+// typedef mln::accu::math::count<double> count;
+// typedef mln::accu::math::sum<double> sum;
+// typedef mln::accu::stat::mean<double> mean;
+// typedef mln::accu::stat::variance<double> variance;
+
+// mln::image2d<int_u8> img_ref;
+// mln::image1d<unsigned> img_res;
+
+// mln::io::pgm::load(img_ref, OLENA_IMG_PATH"/lena.pgm");
+
+// const double count_ref = mln::data::compute(count(), img_ref);
+// const double mean_ref = mln::data::compute(mean(), img_ref);
+// const double var_ref = mln::data::compute(variance(), img_ref);
+
+// img_res = mln::data::compute(mln::accu::meta::stat::histo1d(), img_ref);
+// // img_res = mln::data::compute(mln::accu::stat::histo1d<int_u8>(), img_ref);
+
+// const double count_res = count_histo(img_res);
+// const double mean_res = mean_histo(img_res);
+// const double var_res = var_histo(img_res);
+
+// mln_assertion(count_ref == count_res);
+// mln_assertion( mean_ref == mean_res );
+// mln_assertion(0.0001 > abs(var_ref - var_res));
+
+// std::cout << "(08 bits) test integration : ok" << std::endl;
+// }
+
+// double gaussian_distribution(double x, double mean, double sigma)
+// {
+// double num = exp(-0.5*mln::math::sqr((x - mean)/sigma));
+// double denom = sigma*mln::math::sqrt(2*mln::math::pi);
+// double result = num/denom;
+
+// return result;
+// }
+
+// /// To calibrate with gnuplot (see gaussian.sh)
+// /// square(x) = x*x
+// /// gaussian(x,mean,sigma)=exp(-0.5*square((x-mean)/sigma))/(sigma*sqrt(2*pi))
+// /// plot [-20:20] gaussian(x,0,6.0)
+
+// void gaussian_filter(double ws[], unsigned size, double sigma)
+// {
+// int h = size/2;
+
+// for (int i = -h; i <= h; ++i)
+// {
+// ws[i+h] = gaussian_distribution(i, 0.0, sigma);
+// }
+
+// double sum = 0.0;
+
+// for (unsigned i = 0; i < size; ++i)
+// sum += ws[i];
+
+// for (unsigned i = 0; i < size; ++i)
+// ws[i] /= sum;
+// }
+
+// /// The aim of this function is to rebuild an label image2d from the segmenting
+// /// image of the histogram (label) and the original image (input).
+// /// label_image2d / for each grey tone, associate its label.
+
+// mln::image2d<mln::value::label_8>
+// build_8bits(const mln::image2d<mln::value::int_u8>& input,
+// const mln::image1d<mln::value::label_8>& label)
+// {
+// mln::trace::entering("build_8bits");
+// mln_precondition(label.is_valid());
+// mln_precondition(input.is_valid());
+
+// mln::image2d<mln::value::label_8> output;
+
+// mln::initialize(output, input);
+
+// mln_piter_(mln::image2d<mln::value::int_u8>) pi(input.domain());
+// mln_piter_(mln::image2d<mln::value::label_8>) po(output.domain());
+
+// for_all_2(pi, po)
+// {
+// mln::value::int_u8 val = input(pi);
+// unsigned grp = label(mln::point1d(val));
+
+// output(po) = grp;
+// }
+
+// mln::trace::exiting("build_8bits");
+// return output;
+// }
+
+
+// void test_8bits_classifying()
+// {
+// typedef mln::value::int_u8 int_u8;
+// typedef mln::value::label_8 label_8;
+// typedef mln::value::rgb8 rgb8;
+// typedef mln::accu::stat::mean<double> mean;
+
+// mln::image2d<int_u8> img_ref;
+// mln::image2d<int_u8> img_out;
+// mln::image2d<rgb8> img_rgb;
+// mln::image1d<unsigned> img_res;
+// mln::image1d<double> img_smooth;
+// mln::image1d<label_8> labels;
+// label_8 nlabels;
+
+// //-----------------------------------------------------
+// // Loading the scribo image and computing its histogram
+// //-----------------------------------------------------
+
+// std::cout << "(08 bits) LOADING HISTOGRAM" << std::endl;
+
+// // mln::io::pgm::load(img_ref, OLENA_IMG_PATH"/lena.pgm");
+// mln::io::pgm::load(img_ref, SCRIBO_IMG_PATH"/mp00082c_50p_8bits.pgm");
+// img_res = mln::data::compute(mln::accu::stat::histo1d<int_u8>(), img_ref);
+// mln::io::plot::save_histo_sh(img_res, "histo0_8bits.sh");
+
+
+// //-----------------------------------------------------
+// // Smoothing the histogram with a gaussian filter
+// //-----------------------------------------------------
+
+// std::cout << "(08 bits) SMOOTHING HISTOGRAM" << std::endl;
+
+// double ws[41];
+// gaussian_filter(ws, 41, 6.0);
+// img_smooth = mln::linear::convolve(img_res, mln::make::w_window1d(ws));
+// mln::io::plot::save_histo_sh(img_smooth, "histo1_8bits.sh");
+
+
+// //-----------------------------------------------------
+// // Segmenting the histogram with the watershed method
+// //-----------------------------------------------------
+
+// std::cout << "SEGMENTING HISTOGRAM" << std::endl;
+
+// /*
+// labels = mln::labeling::regional_maxima(img_smooth, mln::c2(), nlabels);
+// std::cout << "N labels : " << nlabels << std::endl;
+// mln::io::plot::save_histo_sh(labels, "histo2_8bits.sh");
+// */
+
+
+// labels = mln::morpho::watershed::flooding(img_smooth, mln::c2(), nlabels);
+// std::cout << "N labels : " << nlabels << std::endl;
+// mln::io::plot::save_histo_sh(labels, "histo2_8bits.sh");
+
+
+// //-----------------------------------------------------
+// // Rebuilding the image with the mean of each region
+// //-----------------------------------------------------
+
+// std::cout << "(08 bits) BUILDING OUTPUT" << std::endl;
+
+// mln::image2d<label_8>img_label = build_8bits(img_ref, labels);
+
+// std::cout << "(08 bits) COLORING OUTPUT" << std::endl;
+
+// img_out = mln::labeling::mean_values(img_ref, img_label, nlabels);
+// img_rgb = mln::labeling::colorize(rgb8(), img_label);
+
+// mln::io::pgm::save(img_out, "out_8bits.pgm");
+// mln::io::ppm::save(img_rgb, "color_8bits.pgm");
+
+// //labels = mln::morpho::elementary::dilation(labels, mln::c2());
+// //mln::io::plot::save_histo_sh(labels, "histo3.sh");
+// //mln::io::plot::save(labels, "labelized.data");
+// }
+
+// //------------------------------------------------------------------------------
+// // TEST IN 15 BITS
+// //------------------------------------------------------------------------------
+
+// void test_14bits_operator_equal()
+// {
+// using namespace mln::accu::stat;
+
+// typedef mln::value::int_u<14> int_u14;
+// mln::accu::stat::histo1d<int_u14> histo1;
+// mln::accu::stat::histo1d<int_u14> histo2;
+// int_u14 val = 3;
+
+// histo1.init();
+// histo2.init();
+
+// mln_assertion(histo1 == histo2);
+
+// histo1.take(val);
+
+// /// FIXME mln_assertion(histo1 != histo2); doesn't work!!
+// mln_assertion(!(histo1 == histo2));
+
+// histo2.take(val);
+
+// mln_assertion(histo1 == histo2);
+
+// std::cout << "(14 bits) histo == histo : ok" << std::endl;
+// }
+
+// void test_14bits_instantiation_without_argument()
+// {
+// typedef mln::value::int_u<14> int_u14;
+// const mln::accu::stat::histo1d<int_u14> histo;
+// const mln::image1d<unsigned>& res = histo.to_result();
+// const mln::point1d& min =mln::point1d(mln_min(int_u14));
+// const mln::point1d& max =mln::point1d(mln_max(int_u14));
+// const mln::box1d& ref = mln::box1d(min, max);
+
+// mln_assertion(ref == res.domain());
+// mln_assertion(res.is_valid());
+
+// std::cout << "(14 bits) histo<T> histo : ok" << std::endl;
+// }
+
+
+// void test_14bits_initialization()
+// {
+// typedef mln::value::int_u<14> int_u14;
+// mln::accu::stat::histo1d<int_u14> histo;
+// mln::image1d<unsigned> img_res = histo.to_result();
+// mln::image1d<unsigned> img_ref;
+
+// mln::initialize(img_ref, img_res);
+// mln::data::fill(img_ref, 0);
+// histo.init();
+
+// unsigned res = mln::data::compute(mln::accu::math::sum<int_u14>(), img_res);
+// unsigned ref = mln::data::compute(mln::accu::math::sum<int_u14>(), img_ref);
+
+// mln_assertion(ref == res);
+
+// std::cout << "(14 bits) histo.init() : ok" << std::endl;
+// }
+
+
+// void test_14bits_take_argument()
+// {
+// typedef mln::value::int_u<14> int_u14;
+// mln::accu::stat::histo1d<int_u14> histo1;
+// mln::accu::stat::histo1d<int_u14> histo2;
+// int_u14 val = 3;
+
+// histo1.init();
+// histo2.init();
+// histo1.take(val);
+
+// const mln::image1d<unsigned> img1 = histo1.to_result();
+// const mln::image1d<unsigned> img2 = histo2.to_result();
+
+// const unsigned res = mln::data::compute(mln::accu::math::sum<int_u14>(),img1);
+// const unsigned ref = mln::data::compute(mln::accu::math::sum<int_u14>(),img2);
+
+// mln_assertion(ref == res-1);
+// mln_assertion(1 == img1(mln::point1d(val)));
+
+// std::cout << "(14 bits) histo.take(argument) : ok" << std::endl;
+// }
+
+
+// void test_14bits_take_other()
+// {
+// typedef mln::value::int_u<14> int_u14;
+// mln::accu::stat::histo1d<int_u14> histo1;
+// mln::accu::stat::histo1d<int_u14> histo2;
+// mln::accu::stat::histo1d<int_u14> histo3;
+// int_u14 val = 3;
+
+// histo1.init();
+// histo2.init();
+// histo3.init();
+
+// histo1.take(val);
+// histo1.take(val);
+// histo3.take(val);
+// histo2.take(val);
+// histo2.take(histo3);
+
+// mln_assertion(histo1 == histo2);
+
+// std::cout << "(14 bits) histo.take(other) : ok" << std::endl;
+// }
+
+// void test_14bits_integration()
+// {
+// typedef mln::value::int_u16 int_u16;
+// typedef mln::value::int_u<14> int_u14;
+// typedef mln::accu::math::count<double> count;
+// typedef mln::accu::math::sum<double> sum;
+// typedef mln::accu::stat::mean<double> mean;
+// typedef mln::accu::stat::variance<double> variance;
+
+// mln::image2d<int_u16> img_fst;
+// mln::image2d<int_u14> img_ref;
+// mln::image1d<unsigned> img_res;
+
+// mln::io::pgm::load(img_fst, OLENA_IMG_PATH"/lena_16.pgm");
+// img_ref = mln::data::transform(img_fst, mln::fun::v2v::int_u16_to_int_u14());
+
+// const double count_ref = mln::data::compute(count(), img_ref);
+// const double mean_ref = mln::data::compute(mean(), img_ref);
+// const double var_ref = mln::data::compute(variance(), img_ref);
+
+// img_res = mln::data::compute(mln::accu::stat::histo1d<int_u14>(), img_ref);
+
+// const double count_res = count_histo(img_res);
+// const double mean_res = mean_histo(img_res);
+// const double var_res = var_histo2(img_res);
+
+// //std::cout << "var_res : " << var_res << std::endl;
+// //std::cout << "var_ref : " << var_ref << std::endl;
+
+// mln_assertion(count_ref == count_res);
+// mln_assertion( mean_ref == mean_res );
+// mln_assertion(0.0001 > abs(var_ref - var_res));
+
+// std::cout << "(14 bits) test integration : ok" << std::endl;
+// }
+
+// /// The aim of this function is to rebuild an label image2d from the segmenting
+// /// image of the histogram (label) and the original image (input).
+// /// label_image2d / for each grey tone, associate its label.
+
+// mln::image2d<mln::value::label_8>
+// build_14bits(const mln::image2d<mln::value::int_u<14> >& input,
+// const mln::image1d<mln::value::label_8>& label)
+// {
+// mln::trace::entering("build_14bits");
+// mln_precondition(label.is_valid());
+// mln_precondition(input.is_valid());
+
+// mln::image2d<mln::value::label_8> output;
+
+// mln::initialize(output, input);
+
+// mln_piter_(mln::image2d<mln::value::int_u<14> >) pi(input.domain());
+// mln_piter_(mln::image2d<mln::value::label_8>) po(output.domain());
+
+// for_all_2(pi, po)
+// {
+// mln::value::int_u<14> val = input(pi);
+// unsigned grp = label(mln::point1d(val));
+
+// output(po) = grp;
+// }
+
+// mln::trace::exiting("build_14bits");
+// return output;
+// }
+
+
+// void test_14bits_classifying()
+// {
+// typedef mln::value::int_u16 int_u16;
+// typedef mln::value::int_u<14> int_u14;
+// typedef mln::value::label_8 label_8;
+// typedef mln::value::rgb8 rgb8;
+// typedef mln::accu::stat::mean<double> mean;
+
+// mln::image2d<int_u16> img_fst;
+// mln::image2d<int_u14> img_ref;
+// mln::image2d<int_u14> img_out;
+// mln::image2d<rgb8> img_rgb;
+// mln::image1d<unsigned> img_res;
+// mln::image1d<double> img_smooth;
+// mln::image1d<label_8> labels;
+// label_8 nlabels;
+
+// //-----------------------------------------------------
+// // Loading the scribo image and computing its histogram
+// //-----------------------------------------------------
+
+// std::cout << "(14 bits) LOADING HISTOGRAM" << std::endl;
+
+// //mln::io::pgm::load(img_fst, OLENA_IMG_PATH"/lena_16.pgm");
+// mln::io::pgm::load(img_fst, SCRIBO_IMG_PATH"/mp00082c_50p_16bits.pgm");
+// img_ref = mln::data::transform(img_fst, mln::fun::v2v::int_u16_to_int_u14());
+// img_res = mln::data::compute(mln::accu::stat::histo1d<int_u14>(), img_ref);
+// mln::io::plot::save_histo_sh(img_res, "histo0_14bits.sh");
+
+
+// //-----------------------------------------------------
+// // Smoothing the histogram with a gaussian filter
+// //-----------------------------------------------------
+
+// std::cout << "(14 bits) SMOOTHING HISTOGRAM" << std::endl;
+
+// double ws[401];
+// gaussian_filter(ws, 401, 50.0);
+// img_smooth = mln::linear::convolve(img_res, mln::make::w_window1d(ws));
+// mln::io::plot::save_histo_sh(img_smooth, "histo1_14bits.sh");
+
+
+// //-----------------------------------------------------
+// // Segmenting the histogram with the watershed method
+// //-----------------------------------------------------
+
+// std::cout << "(14 bits) SEGMENTING HISTOGRAM" << std::endl;
+
+// /*
+// labels = mln::labeling::regional_maxima(img_smooth, mln::c2(), nlabels);
+// std::cout << "N labels : " << nlabels << std::endl;
+// mln::io::plot::save_histo_sh(labels, "histo2.sh");
+// */
+
+
+// labels = mln::morpho::watershed::flooding(img_smooth, mln::c2(), nlabels);
+// std::cout << "N labels : " << nlabels << std::endl;
+// mln::io::plot::save_histo_sh(labels, "histo2_14bits.sh");
+
+
+// //-----------------------------------------------------
+// // Rebuilding the image with the mean of each region
+// //-----------------------------------------------------
+
+// std::cout << "(14 bits) BUILDING OUTPUT" << std::endl;
+
+// mln::image2d<label_8>img_label = build_14bits(img_ref, labels);
+
+// std::cout << "(14 bits) COLORING OUTPUT" << std::endl;
+
+// img_out = mln::labeling::mean_values(img_ref, img_label, nlabels);
+// img_rgb = mln::labeling::colorize(rgb8(), img_label);
+
+// mln::io::pgm::save(img_out, "out_14bits.pgm");
+// mln::io::ppm::save(img_rgb, "color_14bits.pgm");
+
+// //labels = mln::morpho::elementary::dilation(labels, mln::c2());
+// //mln::io::plot::save_histo_sh(labels, "histo3.sh");
+// //mln::io::plot::save(labels, "labelized.data");
+// }
+
+// int main()
+// {
+// test_8bits_operator_equal();
+// /*
+// test_8bits_instantiation_without_argument();
+// test_8bits_initialization();
+// test_8bits_take_argument();
+// test_8bits_take_other();
+// test_8bits_operator_equal();
+// */
+// //test_8bits_integration();
+
+// //test_8bits_classifying();
+
+// // PROBLEME AVEC LES COORDONNEES PAR DEFAUT QUI SONT EN SIGNED SHORT
+// // SEE mln/core/def/coord.hh
+// /*
+// test_14bits_instantiation_without_argument();
+// test_14bits_initialization();
+// test_14bits_take_argument();
+// test_14bits_take_other();
+// test_14bits_operator_equal();
+// test_14bits_integration();
+// */
+// //test_14bits_classifying();
+
+// return 0;
+// }
--
1.5.6.5
1
0
15 Nov '10
* mln/accu/stat/histo1d.hh: New header file.
* mln/accu/stat/histo2d.hh: New header file.
* mln/accu/stat/histo3d_hsl.hh: New header file.
* mln/accu/stat/histo3d_rgb.hh: New header file.
* mln/clustering/k_mean.hh: New header file.
* mln/clustering/kmean1d.hh: New header file.
* mln/clustering/kmean2d.hh: New header file.
* mln/clustering/kmean3d.hh: New header file.
* mln/clustering/kmean_rgb.hh: New header file.
* mln/display/display_histo.hh: New header file.
* mln/display/project_histo.hh: New header file.
* mln/fun/p2b/achromatic.hh: New header file.
* mln/fun/p2b/component_equals.hh: New header file.
* mln/fun/v2v/achromatism.hh: New header file.
* mln/fun/v2v/hue_concentration.hh: New header file.
* mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
* mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
* mln/fun/v2v/log.hh: New header file.
* mln/fun/v2v/rg_to_rgb.hh: New header file.
* mln/fun/v2v/rgb8_to_int_u8: New header file.
* mln/fun/v2v/rgb_to_achromastism_map.hh: New header file.
* mln/fun/v2v/rgb_to_hsv.hh: New header file.
* mln/fun/v2v/rgb_to_hue_map.hh: New header file.
* mln/fun/v2v/rgb_to_saturation_map.hh: New header file.
* mln/fun/v2v/rgb_to_value_map.hh: New header file.
* mln/img_path.hh: New header file.
* mln/io/plot/save_image_sh.hh: New header file.
* mln/math/cell.hh: New header file.
* mln/math/floor.hh: New header file.
* tests/accu/stat/histo1d/Makefile.am: New makefile.
* tests/accu/stat/histo1d/histo1d.cc: New source.
* tests/accu/stat/histo2d/Makefile.am: New makefile.
* tests/accu/stat/histo2d/histo2d.cc: New source.
---
scribo/sandbox/green/ChangeLog | 47 +
scribo/sandbox/green/README | 223 ++++-
scribo/sandbox/green/mln/accu/stat/histo1d.hh | 340 +++++++
scribo/sandbox/green/mln/accu/stat/histo2d.hh | 358 +++++++
.../sandbox/green/mln/accu/stat/histo3d_hsl.hh | 0
.../sandbox/green/mln/accu/stat/histo3d_rgb.hh | 0
.../sandbox/green/mln/clustering/k_mean.hh | 0
.../sandbox/green/mln/clustering/kmean1d.hh | 0
.../sandbox/green/mln/clustering/kmean2d.hh | 0
.../sandbox/green/mln/clustering/kmean3d.hh | 0
.../sandbox/green/mln/clustering/kmean_rgb.hh | 0
.../sandbox/green/mln/display/display_histo.hh | 0
.../sandbox/green/mln/display/project_histo.hh | 0
.../sandbox/green/mln/fun/p2b/achromatic.hh | 0
.../sandbox/green/mln/fun/p2b/component_equals.hh | 0
.../sandbox/green/mln/fun/v2v/achromatism.hh | 0
.../sandbox/green/mln/fun/v2v/hue_concentration.hh | 0
.../green/mln/fun/v2v/int_u16_to_int_u14.hh | 0
.../sandbox/green/mln/fun/v2v/log.hh | 0
.../sandbox/green/mln/fun/v2v/rg_to_rgb.hh | 0
.../sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh | 0
.../sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh | 0
.../green/mln/fun/v2v/rgb_to_achromatism_map.hh | 0
.../sandbox/green/mln/fun/v2v/rgb_to_hsv.hh | 0
.../sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh | 0
scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh | 111 ++
.../green/mln/fun/v2v/rgb_to_saturation_map.hh | 0
.../sandbox/green/mln/fun/v2v/rgb_to_value_map.hh | 0
{milena => scribo}/sandbox/green/mln/img_path.hh | 0
scribo/sandbox/green/mln/io/plot/save_image_sh.hh | 1056 ++++++++++++++++++++
{milena => scribo}/sandbox/green/mln/math/ceil.hh | 0
{milena => scribo}/sandbox/green/mln/math/floor.hh | 0
{milena => scribo}/sandbox/green/mln/value/hsv.hh | 0
scribo/sandbox/green/mln/value/rg.hh | 175 ++++
.../green/tests/accu/stat/histo1d/Makefile.am | 153 +++
.../green/tests/accu/stat/histo1d/histo1d.cc | 21 +
.../green/use/accu/stat/histo1d/Makefile.am | 153 +++
.../sandbox/green/use/accu/stat/histo1d/histo1d.cc | 24 +
.../green/use/accu/stat/histo2d/Makefile.am | 153 +++
.../sandbox/green/use/accu/stat/histo2d/histo2d.cc | 33 +
40 files changed, 2829 insertions(+), 18 deletions(-)
create mode 100644 scribo/sandbox/green/mln/accu/stat/histo1d.hh
create mode 100644 scribo/sandbox/green/mln/accu/stat/histo2d.hh
copy {milena => scribo}/sandbox/green/mln/accu/stat/histo3d_hsl.hh (100%)
copy {milena => scribo}/sandbox/green/mln/accu/stat/histo3d_rgb.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/k_mean.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/kmean1d.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/kmean2d.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/kmean3d.hh (100%)
copy {milena => scribo}/sandbox/green/mln/clustering/kmean_rgb.hh (100%)
copy {milena => scribo}/sandbox/green/mln/display/display_histo.hh (100%)
copy {milena => scribo}/sandbox/green/mln/display/project_histo.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/p2b/achromatic.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/p2b/component_equals.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/achromatism.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/hue_concentration.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/log.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rg_to_rgb.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb_to_achromatism_map.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh (100%)
create mode 100644 scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb_to_saturation_map.hh (100%)
copy {milena => scribo}/sandbox/green/mln/fun/v2v/rgb_to_value_map.hh (100%)
copy {milena => scribo}/sandbox/green/mln/img_path.hh (100%)
create mode 100644 scribo/sandbox/green/mln/io/plot/save_image_sh.hh
copy {milena => scribo}/sandbox/green/mln/math/ceil.hh (100%)
copy {milena => scribo}/sandbox/green/mln/math/floor.hh (100%)
copy {milena => scribo}/sandbox/green/mln/value/hsv.hh (100%)
create mode 100644 scribo/sandbox/green/mln/value/rg.hh
create mode 100644 scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
create mode 100644 scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
create mode 100644 scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
create mode 100644 scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
create mode 100644 scribo/sandbox/green/use/accu/stat/histo2d/Makefile.am
create mode 100644 scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog
index ed399c5..6a3c8fa 100644
--- a/scribo/sandbox/green/ChangeLog
+++ b/scribo/sandbox/green/ChangeLog
@@ -1,3 +1,50 @@
+2010-06-24 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Import files from milena/sandbox/green.
+
+ * mln/accu/stat/histo1d.hh: New header file.
+ * mln/accu/stat/histo2d.hh: New header file.
+ * mln/accu/stat/histo3d_hsl.hh: New header file.
+ * mln/accu/stat/histo3d_rgb.hh: New header file.
+ * mln/clustering/k_mean.hh: New header file.
+ * mln/clustering/kmean1d.hh: New header file.
+ * mln/clustering/kmean2d.hh: New header file.
+ * mln/clustering/kmean3d.hh: New header file.
+ * mln/clustering/kmean_rgb.hh: New header file.
+ * mln/display/display_histo.hh: New header file.
+ * mln/display/project_histo.hh: New header file.
+ * mln/fun/p2b/achromatic.hh: New header file.
+ * mln/fun/p2b/component_equals.hh: New header file.
+ * mln/fun/v2v/achromatism.hh: New header file.
+ * mln/fun/v2v/hue_concentration.hh: New header file.
+ * mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
+ * mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
+ * mln/fun/v2v/log.hh: New header file.
+ * mln/fun/v2v/rg_to_rgb.hh: New header file.
+ * mln/fun/v2v/rgb8_to_int_u8: New header file.
+ * mln/fun/v2v/rgb_to_achromastism_map.hh: New header file.
+ * mln/fun/v2v/rgb_to_hsv.hh: New header file.
+ * mln/fun/v2v/rgb_to_hue_map.hh: New header file.
+ * mln/fun/v2v/rgb_to_saturation_map.hh: New header file.
+ * mln/fun/v2v/rgb_to_value_map.hh: New header file.
+ * mln/img_path.hh: New header file.
+ * mln/io/plot/save_image_sh.hh: New header file.
+ * mln/math/cell.hh: New header file.
+ * mln/math/floor.hh: New header file.
+ * tests/accu/stat/histo1d/Makefile.am: New makefile.
+ * tests/accu/stat/histo1d/histo1d.cc: New source.
+ * tests/accu/stat/histo2d/Makefile.am: New makefile.
+ * tests/accu/stat/histo2d/histo2d.cc: New source.
+
+2010-06-21 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Save histogram library.
+
+ * mln/accu/histo/histo1d.hh: New header file.
+ * mln/accu/histo/histo2d.hh: New header file.
+ * mln/accu/histo/histo3d_rgb.hh: New header file.
+ * mln/accu/histo/histo3d_hsl.hh: New header file.
+
2010-06-21 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
Simple integration test.
diff --git a/scribo/sandbox/green/README b/scribo/sandbox/green/README
index 4eb71b7..3efe50d 100644
--- a/scribo/sandbox/green/README
+++ b/scribo/sandbox/green/README
@@ -1,32 +1,219 @@
-Le travail est classé dans deux répertoires ok et ko.
-Le répertoire ok correspond aux sources qui ont été reprises et retestées.
-Le répertoire ko correspond aux sources qui ont été juste transférées.
+I ARBORESCENCE
+--------------
-La première brique logicielle importante sur laquelle s'appuie mes travaux est
-la création d'histogrammes sous forme d'image.
+bench ==> Comparaison d'algorithmes d'un point de vue temps d'exécution.
+bug ==> Bug rencontrés dans milena et archivés sous forme de programme.
+build ==> Répertoire d'exécution, non sauvé dans git.
+demo ==> Première version d'un algorithme pour voir son comportement.
+doc ==> Documentation tex ou code minimal pour de petits exemples.
+exp ==> Version avancée des algorithmes pour traitées les bases de données.
+mln ==> Partie mise en librairie milena des différents travaux.
+tests ==> Tests unitaires sur certains algorithmes.
+tools ==> Découpage de certains algorithmes pour mieux les tester séparément.
+use ==> Test de compilation, code minimal pour compiler un élément.
+II COMPILATION
+--------------
-CREATION DES HISTOGRAMMES
--------------------------
+L'unité minimale de code choisie est le répertoire.
+Donc aller dans le répertoire qui nous interesse,
+par exemple, green/demo/annotating/hsv et lancé le make
-ko/mln/accu/stat/histo1d.hh: histogramme image valeur scalaire.
-ko/mln/accu/stat/histo2d.hh: histogramme image valeur vectorielle 2d.
-ko/mln/accu/stat/histo3d_hsl.hh: histogramme image valeur vectorielle 3d (HSL).
-ko/mln/accu/stat/histo3d_rgb.hh: histogramme image valeur vectorielle 3d (RGB).
+#:~/git/olena/scribo/sandbox/green$cd demo/annotating/hsv
+#:~/git/olena/scribo/sandbox/green/demo/annotating/hsv$ make -f Makefile.am
+Cette opération créé dans build le répertoire de compilation
+green/build/demo/annotating/hsv. Dans ce répertoire aura été copié un
+Makefile et tous les fichiers qui ne sont pas des sources. Par
+exemple, des fichiers de calibration comme gaussian.sh (pour vérifier
+la mire du filtre de gaussienne) ou de la documentation à la sauvette
+sous forme de fichiers textes jetés à la va vite dans le répertoire
+pour ne pas perdre l'information recherchée. En l'occurence, ici, il
+n'y a rien à copier. Rendons-nous dans le répertoire de compilation et lançons
+le makefile.
+#:~/git/olena/scribo/sandbox/green/demo/annotating/hsv$
+cd ../../../build/demo/annotating/hsv
+#:~/git/olena/scribo/sandbox/green/build/demo/annotating/hsv$ make clean all
-ok/mln/accu/histo/histo1d.hh: histogramme image valeur scalaire entière.
-ok/mln/accu/histo/histo2d.hh: histogramme image valeur vectorielle 2d entière.
-ok/mln/accu/histo/histo3d.hh: histogramme image valeur vectorielle 3d entière.
+L'exécutable est généré par le makefile, il porte le nom du
+répertoire. Si il y a besoin de mettre à jour le makefile, le faire
+dans le répertoire des sources en éditant Makefile.am, puis en
+régénérant le Makefile dans le répertoire d'exécution par la commande
+make -f Makefile.am depuis le répertoire source.
-SAUVEGARDE DES HISTOGRAMMES
----------------------------
+III MAKEFILE
+------------
+Les makefiles utilisés sont tous les mêmes avec quelques variables
+dont le contenu change dans leur partie en-tête.
+Pour chaque répertoire, le makefile doit savoir si le chemin courant
+est un répertoire de compilation ou un répertoire de source. Pour les
+identifier, il a recours à un pattern qui malheureusemnt fait
+intervenir le nom de la branche de développement (bench,demo,bug,exp ...).
+SOURCE_PATTERN= green/demo
+BUILD__PATTERN= green/build/demo
-VISUALISATION DES HISTOGRAMMES
-------------------------------
\ No newline at end of file
+Si un makefile ne fonctionne pas, il faut vérifier ceci en premier
+lieu. Ici, le makefile doit être situé dans la branche démo.
+
+Autre élément à savoir, la compilation nécessite d'inclure la
+librairie milena, ainsi que les développements propres en vu de leur
+intégration futur dans milena, ceci est fait par un jeu d'INCLUDES1
+et INCLUDES2.
+
+INCLUDES1= -I$(HOME)/git/olena/scribo/sandbox/green
+INCLUDES2= -I$(HOME)/git/olena/milena
+INCLUDES= $(INCLUDES1) $(INCLUDES2)
+
+Suivant l'allure du compte où l'on exécute les makefiles, il faut
+revoir le chemin pour trouver des deux répertoires.
+
+Enfin, les options de compilations ne sont pas toujours les mêmes. Les
+trois lignes possibles sont toutes présentes et seule celle qui est
+utilisée n'est pas commentée. Typiquement, dans la branche de
+développement démo où les perfomances ne sont pas le problème, on
+compilera avec tout le matériel pour utiliser gdb et sans
+optimisation. A l'inverse, dans la branche d'expérimentation, où le
+code a déjà été testé, on cherche à aller vite car on exécute ce code
+sur de nombreuses images. Dans cette optique, pas de débugage, pas de
+traçage, optimisation conséquente.
+
+CXXFLAGS= -ggdb -O0 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+#CXXFLAGS= -DNDEBUG -O1 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+#CXXFLAGS= -DNDEBUG -O3 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+
+Une dernière dernière information, dans le cadre des développements
+exp, et tools, on utilise la librairie boost soit pour la
+virtualisation du filesystem, soit pour le formatage des fichiers text
+(réalisation de colonnes, mettre des entiers sur un certain nombre de
+caractères). Une ligne de chargement des librairies peut apparaitre donc.
+
+LOADLIBES= -lboost_filesystem
+
+On retrouvera les includes suivantes dans les sources:
+
+#include <boost/format.hpp>
+#include <boost/filesystem.hpp>
+
+
+IV CHEMINS DES IMAGES
+---------------------
+
+Toutes les images ont toujours été locales sur mon ordinateur. La
+politique a toujours été d'utiliser un fichier img_path pour coder les
+chemins des images. Les chemins étant plutôt long, j'ai toujours eu
+tendance à faire en sorte qu'ils soient compilés en dur (sauf pour la
+partie développement tools qui est vraiment voué à donner des
+exécutables indépendants et génériques). Le fichier mln/img_path.hh
+code la position de toutes les images dans mon arborescence. Il faudra
+donc veiller à changer tous les chemins pour les adapter au compte
+dans lequel on voudra reprendre le code. Dans le code, les références
+aux positions des images sont faites via des macros.
+
+Toutes les images sont située dans git/img. En règle générale, je ne
+traite que des images au format .pgm, .pbm et .ppm. Il m'arrive
+fréquemment de dumper des images au format .sh (gnuplot shell
+image). Pour la branche tools, nous avons utilisé les dumps de milena
+comme format de transfert d'un utilitaire à un autre. Les images sont
+classées suivant leur provenance. Nous avons tout d'abord la base
+OLENA (copie des images de tests milena), la base INIM (très peu
+utilisée voire jamais), la base ICDAR (très utilisée, surtout dans
+exp), la base AFP (très utilisée dans exp) et les bases ANNOTATING1 et
+ANNOTATING2 (pas très utilisées ni l'une, ni l'autre).
+
+La plus part du temps, sauver les résultats dans le répertoire
+d'exécution courant est largement suffisant. Parfois, il est
+nécessaire de sauvegarder de grosses quantités d'informations et de
+les classer comme dans la branche de développement exp. C'est pour
+cela, qu'un certain nombre de macros définissent des endroits pour
+sauvegarder les résultats lors d'expérimentation de grande ampleur sur
+toute la base ICDAR ou AFP.
+
+
+V GNUPLOT SCRIPT SHELL IMAGE FORMAT
+-----------------------------------
+
+J'abrège le nom du format par gnuplot shell format. En fait, c'est un
+format d'image particulier qui a besoin de gnuplot pour être lu. Il
+est donc compatible avec aucun viewer si ce n'est gnuplot, mais a la
+caractéristique d'afficher tous les points de manière visible. Par
+ailleurs, comme il s'agit d'un script gnuplot il permet d'insérer très
+facilement une fonction pour visualiser les données autrement (par
+exemple, changer d'espace: HSL, HSV). Le fichier tire son nom de la
+façon dont il fonctionne. C'est un script shell qui fait un appel à
+gnuplot et lui passe le jeu de données directement à partir de ce même
+fichier, pas besoin de faire appel à un autre fichier. Une fois
+généré, le fichier doit être modifié pour avoir les permissions
+d'exécution (chmod 755 gnuplot_shell_file.sh). Comme je trouve le format
+extrêmement pratique, il se retrouve preque partout dans mes sources.
+
+
+V MLN
+-----
+
+a) La sauvegarde des images au format gnuplot shell
+
+* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
+
+to do ...
+
+
+
+b) Les histogrammes
+
+Un des travaux demandés par théo est la réalisation d'une librairie
+d'histogramme permettant de fournir un résultat sous forme d'image.
+L'intérêt est ensuite de pouvoir filtrer directement ces histogrammes
+par les algorithmes de milena, ou encore d'étudier les valeurs
+caractéristiques par d'autres accumulateurs. Les codes réellement
+utilisés sont histo1d et histo3d RGB. Tous les autres codes sont très
+expérimentaux. Notemment, le code HSL demande de quantifier l'espace
+de comptage puisqu'il est décrit sous la forme de triplets de float
+(les autres sont inférés). Néanmoins, le code est à conserver car il
+contient une séquence d'appels pour les routines permettant de
+considérer la dimension de la teinte comme circulaire.
+
+* mln/accu/stat/histo1d.hh: Accumulateur histogramme image1d.
+* use/accu/stat/histo1d: Code minimal utilisant un histogramme 1d.
+
+* mln/accu/stat/histo2d.hh: Accumulateur histogramme image2d.
+* mln/value/rg.hh: Définition du type vectoriel 2d rouge/vert (RG).
+* mln/fun/v2v/rgb_to_rg.hh: Transformation de l'espace RGB vers l'espace RG.
+* use/accu/stat/histo2d: Code minimal utilisant un histogramme 2d.
+
+
+* mln/accu/stat/histo3d_rgb.hh: Accumulateur histogramme image3d RGB.
+* mln/accu/stat/histo3d_hsl.hh: Accumulateur histogramme image3d HSL.
+
+* use/accu/stat/histo3_rgb: Code minimal utilisant un histogramme 3d RGB.
+* use/accu/stat/histo3_hsl: Code minimal utilisant un histogramme 3d HSL.
+
+
+
+* tests/accu/stat/histo1d
+
+
+
+
+* tests/accu/stat/histo2d
+
+
+
+* use/accu/stat/histo3d_rgb
+* tests/accu/stat/histo3d_rgb
+
+* use/accu/stat/histo3d_hsl
+* tests/accu/stat/histo3d_hsl
+
+
+c) La visualisation des histogrammes 3d
+
+* demo/accu/stat/histo2d
+
+* mln/display/dispay_histo.hh
+* mln/displayproject_histo.hh
diff --git a/scribo/sandbox/green/mln/accu/stat/histo1d.hh b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
new file mode 100644
index 0000000..d480cf0
--- /dev/null
+++ b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
@@ -0,0 +1,340 @@
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+#ifndef MLN_ACCU_STAT_HISTO1D_HH
+#define MLN_ACCU_STAT_HISTO1D_HH
+
+/// \file
+///
+/// \brief Define a histogram as accumulator which returns an image1d.
+///
+/// This source implements the discrete histogram version. It was
+/// created for images which the values are derived from integer
+/// type. The number of bins is directly infered from the cardinality
+/// of the image value. So the int_u8 image has got 256 bins, the
+/// int_u<14> image has got 16384 bins. But, this code doesn't work
+/// for that quantification because of the coord limitation (signed
+/// short, as it is defined in mln/core/def/coord.hh). Take care of
+/// the limitation from the result image value. We hard code unsigned,
+/// but it sometimes not enought to count data in one bin. That last
+/// case has not occured since the beginning of the creation of the type.
+///
+/// The following sample is a typical use of the histogram.
+///
+/// #include <mln/accu/stat/histo1d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/core/image/image1d.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/pgm/load.hh>
+/// #include <mln/value/int_u8.hh>
+///
+/// int main()
+/// {
+/// typedef mln::value::int_u8 t_int_u8;
+/// mln::image2d<t_int_u8> img;
+/// mln::image1d<unsigned> histo;
+///
+/// mln::io::pgm::load(img, OLENA_IMG_PATH"/lena.pgm");
+/// histo = mln::data::compute(mln::accu::meta::histo::histo1d(), img);
+///
+/// return 0;
+/// }
+
+
+#include <iostream>
+
+#include <mln/accu/internal/base.hh>
+
+#include <mln/arith/plus.hh>
+
+#include <mln/core/concept/meta_accumulator.hh>
+#include <mln/core/image/image1d.hh>
+#include <mln/core/macros.hh>
+
+#include <mln/literal/zero.hh>
+
+#include <mln/trace/entering.hh>
+#include <mln/trace/exiting.hh>
+
+#include <mln/trait/value/comp.hh>
+
+#include <mln/value/ops.hh>
+
+namespace mln
+{
+
+ namespace accu
+ {
+
+ namespace stat
+ {
+
+ // Forward declaration
+ template <typename V>
+ struct histo1d;
+
+ } // end of namespace mln::accu::stat
+
+
+ namespace meta
+ {
+
+ namespace stat
+ {
+
+ struct histo1d : public Meta_Accumulator<histo1d>
+ {
+ template <typename V>
+ struct with
+ {
+ typedef accu::stat::histo1d<V> ret;
+ };
+ };
+
+ } // end of namespace mln::accu::meta::stat
+
+ } // end of namespace mln::accu::meta
+
+ } // end of namespace mln::accu
+
+ namespace trait
+ {
+
+ template <typename V>
+ struct accumulator_< mln::accu::stat::histo1d<V> >
+ {
+ typedef accumulator::has_untake::no has_untake;
+ typedef accumulator::has_set_value::no has_set_value;
+ typedef accumulator::has_stop::no has_stop;
+ typedef accumulator::when_pix::use_v when_pix;
+ };
+
+ template <typename V>
+ struct set_precise_binary_<op::eq,
+ accu::stat::histo1d<V>,
+ accu::stat::histo1d<V> >
+ {
+ typedef bool ret;
+ };
+
+ } // end of namespace mln::trait
+
+ namespace accu
+ {
+
+ namespace stat
+ {
+
+ /// \brief Define a histogram as accumulator which returns an image1d.
+ ///
+ /// Param V defines the type of the input image value. It is in
+ /// this space that we count the values. For instance, this
+ /// histogram works well for image2d<int_u8> or with
+ /// image2d<int_u<14> >. The number of bins depends directly the
+ /// values V. For 8 bits there is 256 bins, for 14 bits there
+ /// is 16384 bins. Note that over quantification works too (up
+ /// to 14 bits).
+ ///
+ /// \ingroup modaccuvalues
+
+ template <typename V>
+ struct histo1d :
+ public mln::accu::internal::base<image1d<unsigned>, histo1d<V> >
+ {
+ typedef V argument;
+ typedef image1d<unsigned> result;
+ typedef result q_result;
+
+ /// Constructors
+ /// \{
+ /// \brief Infer the size of the resulting image1d domain.
+ ///
+ /// By evaluating the minimum and the maximum of V, we define the domain
+ /// of the resulting image1d.
+ histo1d();
+ /// \}
+
+
+ /// Manipulators.
+ /// \{
+ /// \brief Initialize the histogram with zero value.
+ ///
+ /// This method must be called just before starting the use of the
+ /// histogram. If it's not, resulting values won't converge to the
+ /// density.
+ void init();
+
+
+ /// \brief Update the histogram with the graylevel of the pixel t.
+ /// \param[in] t a graylevel pixel of type V.
+ ///
+ /// The end user shouldn't call this method. In place of it, he can
+ /// go through the data compute interface.
+ void take(const argument& t);
+
+
+ /// \brief Update the histogram with an other histogram.
+ /// \param[in] other the other histogram.
+ ///
+ /// The end user shouldn't call this method. This is part of
+ /// data compute interface mechanism.
+
+ void take(const histo1d<V>& other);
+ /// \}
+
+ /// Accessors.
+ /// \{
+ /// \brief Return the histogram as an image1d.
+ ///
+ /// This is the machinery to communicate with data compute interface.
+ /// The end user should'nt use it.
+ result to_result() const;
+ operator result () const;
+ /// \}
+
+ /// \brief Check whethever this accumulator is able to return a result.
+ ///
+ /// Depends if the resulting image1d is valid. We can assume it is quite
+ /// always the case.
+ bool is_valid() const;
+
+ protected:
+ result count_;
+ };
+
+ /// \brief Check wethever an histogram is equal to an other one.
+ /// \param[in] histo1 the first histogram to compare with.
+ /// \param[in] histo2 the second histogram.
+ ///
+ /// The operator compares all the bins from the two histograms.
+ /// Nobody uses this method unless unitary tests.
+
+ template <typename V>
+ bool operator==(const histo1d<V>& histo1, const histo1d<V>& histo2);
+
+#ifndef MLN_INCLUDE_ONLY
+
+ template <typename V>
+ inline
+ histo1d<V>::histo1d()
+ {
+ trace::entering("mln::accu::stat::histo1d::cstor");
+ typedef mln_trait_value_comp(V,0) comp;
+ typedef point<grid::tick, V> v_point1d;
+ typedef box<v_point1d> v_box1d;
+
+ // comp keep a trace of the dimension of the theorical image.
+ // mln_min(comp) --> 0
+ // mln_max(comp) --> 2^(n-1) [127 for n=7][255 for n=8] ...
+
+ count_.init_(box1d(point1d(mln_min(comp)),
+ point1d(mln_max(comp))));
+
+ // std::cout << "min : " << mln_min(comp) << std::endl;
+ // std::cout << "max : " << mln_max(comp) << std::endl;
+
+ trace::exiting("mln::accu::stat::histo1d::cstor");
+ }
+
+ template <typename V>
+ inline
+ void histo1d<V>::init()
+ {
+ data::fill(count_, literal::zero);
+ }
+
+ template <typename V>
+ inline
+ void histo1d<V>::take(const argument& t)
+ {
+ // Just convert a graylevel value (int_u8 like) to a position for an
+ // iterator on the resulting image.
+ ++count_(point1d(t));
+ }
+
+
+ template <typename V>
+ inline
+ void histo1d<V>::take(const histo1d<V>& other)
+ {
+ count_ += other.count_;
+ }
+
+ template <typename V>
+ inline
+ typename histo1d<V>::result histo1d<V>::to_result() const
+ {
+ return count_;
+ }
+
+ template <typename V>
+ inline
+ histo1d<V>::operator result() const
+ {
+ return count_;
+ }
+
+ template <typename V>
+ inline
+ bool histo1d<V>::is_valid() const
+ {
+ bool result = count_.is_valid();
+
+ return result;
+ }
+
+ template <typename V>
+ bool operator==(const histo1d<V>& histo1, const histo1d<V>& histo2)
+ {
+ trace::entering("mln::accu::stat::histo1d::operator==");
+
+ bool result = true;
+ const image1d<unsigned>& res1 = histo1.to_result();
+ const image1d<unsigned>& res2 = histo2.to_result();
+
+ mln_precondition(res1.is_valid());
+ mln_precondition(res2.is_valid());
+
+ mln_piter(image1d<unsigned>) p1(res1.domain());
+ mln_piter(image1d<unsigned>) p2(res2.domain());
+
+ for_all_2(p1, p2)
+ result &= (res1(p1) == res2(p2));
+
+ trace::exiting("mln::accu::stat::histo1d::operator==");
+ return result;
+ }
+
+#endif // ! MLN_INCLUDE_ONLY
+
+
+ } // end of namespace mln::accu::stat
+
+ } // end of namespace mln::accu
+
+} // end of namespace mln
+
+#endif // ! MLN_ACCU_STAT_HISTO1D_HH
diff --git a/scribo/sandbox/green/mln/accu/stat/histo2d.hh b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
new file mode 100644
index 0000000..c28723c
--- /dev/null
+++ b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
@@ -0,0 +1,358 @@
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+#ifndef MLN_ACCU_STAT_HISTO2D_HH
+# define MLN_ACCU_STAT_HISTO2D_HH
+
+/// \file
+///
+/// \brief Define a histogram as accumulator which returns an image2d.
+///
+/// This source implements the discrete histogram version. It was
+/// created for images which the values are derived from integer
+/// type. The number of bins is directly infered from the cardinality
+/// of the image value. It works with vectorial image, typically RGB
+/// space where only RG are preserved. See histo1d.hh for limitations
+/// of such implementation. 8 bits quantification starts to be
+/// expensive, it produces image2d with [0..255,0..255] as domain.
+///
+/// The following sample is a typical use of the histogram.
+///
+/// #include <mln/accu/stat/histo2d.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.hh>
+/// #include <mln/fun/v2v/rgb_to_rg.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/ppm/load.hh>
+/// #include <mln/value/rg.hh>
+/// #include <mln/value/rgb8.hh>
+///
+/// int main()
+/// {
+/// typedef mln::value::rg<8> t_rg8
+/// typedef mln::value::rgb8 t_rgb8;
+/// typedef mln::fun::v2v::rgb_to_rg<8> t_rgb_to_rg;
+/// typedef mln::image2d<t_rg8> t_image2d_rg8;
+/// typedef mln::image2d<t_rgb8> t_image2d_rgb8;
+/// typedef mln::image2d<unsigned> t_histo;
+/// t_image2d_rgb8 img_rgb8;
+/// t_image2d_rg8 img_rg8;
+/// t_histo histo;
+///
+/// mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+/// img_rg8 = mln::data::transform(img_rgb8, t_rgb_to_rg());
+/// histo = mln::data::compute(mln::accu::meta::stat::histo2d(), img_rg8);
+///
+/// return 0;
+/// }
+
+# include <iostream>
+
+# include <mln/accu/internal/base.hh>
+
+# include <mln/core/macros.hh>
+# include <mln/core/image/image2d.hh>
+# include <mln/core/alias/point2d.hh>
+# include <mln/core/alias/box2d.hh>
+
+# include <mln/trait/value/comp.hh>
+
+# include <mln/arith/plus.hh>
+
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
+
+# include <mln/value/ops.hh>
+
+namespace mln
+{
+
+ namespace accu
+ {
+
+ namespace stat
+ {
+
+ // Forward declaration
+ template <typename V>
+ struct histo2d;
+
+ } // end of namespace mln::accu::stat
+
+ namespace meta
+ {
+
+ namespace stat
+ {
+
+ struct histo2d : public Meta_Accumulator<histo2d>
+ {
+ template <typename V>
+ struct with
+ {
+ typedef accu::stat::histo2d<V> ret;
+ };
+ };
+
+ } // end of namespace mln::accu::meta::stat
+
+ } // end of namespace mln::accu::meta
+
+ } // end of namespace mln::accu
+
+
+ namespace trait
+ {
+
+ template <typename V>
+ struct accumulator_< mln::accu::stat::histo2d<V> >
+ {
+ typedef accumulator::has_untake::no has_untake;
+ typedef accumulator::has_set_value::no has_set_value;
+ typedef accumulator::has_stop::no has_stop;
+ typedef accumulator::when_pix::use_v when_pix;
+ };
+
+ template <typename V>
+ struct set_precise_binary_<op::eq,
+ accu::stat::histo2d<V>,
+ accu::stat::histo2d<V> >
+ {
+ typedef bool ret;
+ };
+
+ } // end of namespace mln::trait
+
+ namespace accu
+ {
+
+ namespace stat
+ {
+
+ /// \brief Define an histogram which returns an image3d .
+ ///
+ /// Param V defines the space in which we count the values.
+ /// For instance, this histogram works image2d<rgb<2>> or
+ /// image2d<rgb<7>>. The histogram count the occurrence of each value.
+ /// The number of bins depends of the grayscale values, for 8 bits there
+ /// is 256x3 bins. Note that over
+ /// quantification works too.
+ ///
+ /// \ingroup modaccuvalues
+
+ template <typename V>
+ struct histo2d :
+ public mln::accu::internal::base<image2d<unsigned>, histo2d<V> >
+ {
+ typedef V argument;
+ typedef image2d<unsigned> result;
+ typedef result q_result;
+
+ /// Constructors
+ /// \{
+ /// \brief Initialize the size of the resulting image1d.
+ ///
+ /// Initialize the size the resulting image from the theorical dynamic
+ /// of the greylevel values (Use V to manage it).
+ histo2d();
+ /// \}
+
+
+ /// Manipulators.
+ /// \{
+ /// \brief Initialize the histogram with zero value.
+ ///
+ /// This method must be called just before starting the use of the
+ /// histogram. If it's not, resulting values won't converge to the
+ /// density.
+ void init();
+
+
+ /// \brief Update the histogram with the RGB pixel t.
+ /// \param[in] t a greylevel pixel of type V.
+ ///
+ /// The end user shouldn't call this method. In place of it, he can
+ /// go through the data compute interface.
+ void take(const argument& t);
+
+
+ /// \brief Update the histogram with an other histogram.
+ /// \param[in] other the other histogram.
+ void take(const histo2d<V>& other);
+ /// \}
+
+ /// Accessors.
+ /// \{
+ /// \brief Return the histogram as an image1d.
+ ///
+ /// This is the machinery to communicate with data compute interface.
+ /// The end user should'nt use it.
+ result to_result() const;
+ operator result () const;
+ /// \}
+
+ /// \brief Check whethever this accumulator is able to return a result.
+ ///
+ /// Depends if the resulting image1d is valid. We can assume it is quite
+ /// always the case.
+ bool is_valid() const;
+
+ protected:
+ result count_;
+ };
+
+ /// \brief Check wethever an histogram is equal to an other one.
+ /// \param[in] histo1 the first histogram to compare with.
+ /// \param[in] histo2 the second histogram.
+ ///
+ /// The operator compare all the bins from the two histogram.
+
+ template <typename V>
+ bool operator==(const histo2d<V>& histo1,
+ const histo2d<V>& histo2);
+
+#ifndef MLN_INCLUDE_ONLY
+
+ template <typename V>
+ inline
+ histo2d<V>::histo2d()
+ {
+ trace::entering("mln::accu::stat::histo2d::histo2d");
+ typedef mln_trait_value_comp(V,0) comp0;
+ typedef mln_trait_value_comp(V,1) comp1;
+
+ // comp keep a trace of the dimension of the theorical image.
+ // mln_min(comp) --> 0
+ // mln_max(comp) --> 2^(n-1) [127 for n=7][255 for n=8] ...
+
+ count_.init_(box2d(point2d(mln_min(comp0),
+ mln_min(comp1)),
+ point2d(mln_max(comp0),
+ mln_max(comp1))));
+
+ trace::exiting("mln::accu::stat::histo2d::histo2d");
+ }
+
+ template <typename V>
+ inline
+ void histo2d<V>::init()
+ {
+ trace::entering("mln::accu::stat::histo2d::init");
+
+ data::fill(count_, 0);
+ trace::exiting("mln::accu::stat::histo2d::init");
+ }
+
+ template <typename V>
+ inline
+ void histo2d<V>::take(const argument& t)
+ {
+ trace::entering("mln::accu::stat::histo2d::take");
+
+ // Just convert a greyscale value (int_u8 like) to a position for an
+ // iterator on the resulting image.
+ // Take care to the constructor : Point(slice, row, column)
+ ++count_(point2d(t.red(), t.green()));
+
+ trace::exiting("mln::accu::stat::histo2d::take");
+ }
+
+
+ template <typename V>
+ inline
+ void histo2d<V>::take(const histo2d<V>& other)
+ {
+ trace::entering("mln::accu::stat::histo2d::take");
+
+ count_ += other.count_;
+
+ trace::exiting("mln::accu::stat::histo2d::take");
+ }
+
+ template <typename V>
+ inline
+ typename histo2d<V>::result histo2d<V>::to_result() const
+ {
+ trace::entering("mln::accu::stat::histo2d::to_result");
+
+ trace::exiting("mln::accu::stat::histo2d::to_result");
+ return count_;
+ }
+
+ template <typename V>
+ inline
+ histo2d<V>::operator result() const
+ {
+ trace::entering("mln::accu::stat::histo2d::operator result");
+
+ trace::exiting("mln::accu::stat::histo2d::operator result");
+ return count_;
+ }
+
+ template <typename V>
+ inline
+ bool histo2d<V>::is_valid() const
+ {
+ trace::entering("mln::accu::stat::histo2d::is_valid");
+ bool result = count_.is_valid();
+
+ trace::exiting("mln::accu::stat::histo2d::is_valid");
+ return result;
+ }
+
+ template <typename V>
+ bool operator==(const histo2d<V>& histo1,
+ const histo2d<V>& histo2)
+ {
+ trace::entering("mln::accu::stat::operator==");
+
+ bool result = true;
+ const image2d<unsigned>& res1 = histo1.to_result();
+ const image2d<unsigned>& res2 = histo2.to_result();
+
+ mln_precondition(res1.is_valid());
+ mln_precondition(res2.is_valid());
+
+ mln_piter(image2d<unsigned>) p1(res1.domain());
+ mln_piter(image2d<unsigned>) p2(res2.domain());
+
+ for_all_2(p1, p2)
+ result &= (res1(p1) == res2(p2));
+
+ trace::exiting("mln::accu::stat::operator==");
+ return result;
+ }
+
+#endif // ! MLN_INCLUDE_ONLY
+
+
+ } // end of namespace mln::accu::stat
+
+ } // end of namespace mln::accu
+
+} // end of namespace mln
+
+#endif // ! MLN_ACCU_STAT_HISTO2D_HH
diff --git a/milena/sandbox/green/mln/accu/stat/histo3d_hsl.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
similarity index 100%
copy from milena/sandbox/green/mln/accu/stat/histo3d_hsl.hh
copy to scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
diff --git a/milena/sandbox/green/mln/accu/stat/histo3d_rgb.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
similarity index 100%
copy from milena/sandbox/green/mln/accu/stat/histo3d_rgb.hh
copy to scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
diff --git a/milena/sandbox/green/mln/clustering/k_mean.hh b/scribo/sandbox/green/mln/clustering/k_mean.hh
similarity index 100%
copy from milena/sandbox/green/mln/clustering/k_mean.hh
copy to scribo/sandbox/green/mln/clustering/k_mean.hh
diff --git a/milena/sandbox/green/mln/clustering/kmean1d.hh b/scribo/sandbox/green/mln/clustering/kmean1d.hh
similarity index 100%
copy from milena/sandbox/green/mln/clustering/kmean1d.hh
copy to scribo/sandbox/green/mln/clustering/kmean1d.hh
diff --git a/milena/sandbox/green/mln/clustering/kmean2d.hh b/scribo/sandbox/green/mln/clustering/kmean2d.hh
similarity index 100%
copy from milena/sandbox/green/mln/clustering/kmean2d.hh
copy to scribo/sandbox/green/mln/clustering/kmean2d.hh
diff --git a/milena/sandbox/green/mln/clustering/kmean3d.hh b/scribo/sandbox/green/mln/clustering/kmean3d.hh
similarity index 100%
copy from milena/sandbox/green/mln/clustering/kmean3d.hh
copy to scribo/sandbox/green/mln/clustering/kmean3d.hh
diff --git a/milena/sandbox/green/mln/clustering/kmean_rgb.hh b/scribo/sandbox/green/mln/clustering/kmean_rgb.hh
similarity index 100%
copy from milena/sandbox/green/mln/clustering/kmean_rgb.hh
copy to scribo/sandbox/green/mln/clustering/kmean_rgb.hh
diff --git a/milena/sandbox/green/mln/display/display_histo.hh b/scribo/sandbox/green/mln/display/display_histo.hh
similarity index 100%
copy from milena/sandbox/green/mln/display/display_histo.hh
copy to scribo/sandbox/green/mln/display/display_histo.hh
diff --git a/milena/sandbox/green/mln/display/project_histo.hh b/scribo/sandbox/green/mln/display/project_histo.hh
similarity index 100%
copy from milena/sandbox/green/mln/display/project_histo.hh
copy to scribo/sandbox/green/mln/display/project_histo.hh
diff --git a/milena/sandbox/green/mln/fun/p2b/achromatic.hh b/scribo/sandbox/green/mln/fun/p2b/achromatic.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/p2b/achromatic.hh
copy to scribo/sandbox/green/mln/fun/p2b/achromatic.hh
diff --git a/milena/sandbox/green/mln/fun/p2b/component_equals.hh b/scribo/sandbox/green/mln/fun/p2b/component_equals.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/p2b/component_equals.hh
copy to scribo/sandbox/green/mln/fun/p2b/component_equals.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/achromatism.hh b/scribo/sandbox/green/mln/fun/v2v/achromatism.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/achromatism.hh
copy to scribo/sandbox/green/mln/fun/v2v/achromatism.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/hue_concentration.hh b/scribo/sandbox/green/mln/fun/v2v/hue_concentration.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/hue_concentration.hh
copy to scribo/sandbox/green/mln/fun/v2v/hue_concentration.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh b/scribo/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh
copy to scribo/sandbox/green/mln/fun/v2v/int_u16_to_int_u14.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/log.hh b/scribo/sandbox/green/mln/fun/v2v/log.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/log.hh
copy to scribo/sandbox/green/mln/fun/v2v/log.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/rg_to_rgb.hh b/scribo/sandbox/green/mln/fun/v2v/rg_to_rgb.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rg_to_rgb.hh
copy to scribo/sandbox/green/mln/fun/v2v/rg_to_rgb.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh b/scribo/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh
copy to scribo/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh b/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
copy to scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/rgb_to_achromatism_map.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_achromatism_map.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rgb_to_achromatism_map.hh
copy to scribo/sandbox/green/mln/fun/v2v/rgb_to_achromatism_map.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh
copy to scribo/sandbox/green/mln/fun/v2v/rgb_to_hsv.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh
copy to scribo/sandbox/green/mln/fun/v2v/rgb_to_hue_map.hh
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
new file mode 100644
index 0000000..d4c1e46
--- /dev/null
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
@@ -0,0 +1,111 @@
+// Copyright (C) 2007,2008,2009,2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+#ifndef MLN_FUN_V2V_RGB_TO_RG_HH
+# define MLN_FUN_V2V_RGB_TO_RG_HH
+
+# include <mln/value/rg.hh>
+# include <mln/value/rgb.hh>
+# include <mln/core/contract.hh>
+
+/// \file
+///
+/// \brief Convert a rgb value to a rg value.
+///
+/// This source implements the conversion between rgb space and rg space.
+///
+/// The following sample is a typical use of the rgb/rg conversion function.
+///
+/// #include <mln/accu/stat/histo2d.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.hh>
+/// #include <mln/fun/v2v/rgb_to_rg.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/ppm/load.hh>
+/// #include <mln/value/rg.hh>
+/// #include <mln/value/rgb8.hh>
+///
+/// int main()
+/// {
+/// typedef mln::value::rg<8> t_rg8
+/// typedef mln::value::rgb8 t_rgb8;
+/// typedef mln::fun::v2v::rgb_to_rg<8> t_rgb_to_rg;
+/// typedef mln::image2d<t_rg8> t_image2d_rg8;
+/// typedef mln::image2d<t_rgb8> t_image2d_rgb8;
+/// typedef mln::image2d<unsigned> t_histo;
+/// t_image2d_rgb8 img_rgb8;
+/// t_image2d_rg8 img_rg8;
+/// t_histo histo;
+///
+/// mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+/// img_rg8 = mln::data::transform(img_rgb8, t_rgb_to_rg());
+/// histo = mln::data::compute(mln::accu::meta::stat::histo2d(), img_rg8);
+///
+/// return 0;
+/// }
+
+namespace mln
+{
+
+ namespace fun
+ {
+
+ namespace v2v
+ {
+
+ /// \brief Convert a rgb value to a rg value.
+ ///
+ /// Param n defines the quantification used for rgb space and rg space.
+ ///
+ /// \ingroup modfunv2v
+
+ template <unsigned n>
+ struct rgb_to_rg : Function_v2v< rgb_to_rg<n> >
+ {
+ typedef value::rg<n> result;
+ typedef value::rgb<n> argument;
+
+ /// \brief Convert rgb value to rg value.
+ ///
+ /// \param[in] v the rgb value to convert.
+ ///
+ /// Conversion is done by calling the rg constructor. There is
+ /// no modification of values. The red/green fields from rgb the value
+ /// are preserved. Blue value is dropped.
+
+ result operator()(const argument& v) const
+ {
+ return value::rg<n>(v);
+ }
+ };
+
+ } // end of namespace mln::fun::v2v
+
+ } // end of namespace mln::fun
+
+} // end of namespace mln
+
+#endif // ! MLN_FUN_V2V_RGB_TO_RG_HH
diff --git a/milena/sandbox/green/mln/fun/v2v/rgb_to_saturation_map.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_saturation_map.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rgb_to_saturation_map.hh
copy to scribo/sandbox/green/mln/fun/v2v/rgb_to_saturation_map.hh
diff --git a/milena/sandbox/green/mln/fun/v2v/rgb_to_value_map.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_value_map.hh
similarity index 100%
copy from milena/sandbox/green/mln/fun/v2v/rgb_to_value_map.hh
copy to scribo/sandbox/green/mln/fun/v2v/rgb_to_value_map.hh
diff --git a/milena/sandbox/green/mln/img_path.hh b/scribo/sandbox/green/mln/img_path.hh
similarity index 100%
copy from milena/sandbox/green/mln/img_path.hh
copy to scribo/sandbox/green/mln/img_path.hh
diff --git a/scribo/sandbox/green/mln/io/plot/save_image_sh.hh b/scribo/sandbox/green/mln/io/plot/save_image_sh.hh
new file mode 100644
index 0000000..137f78d
--- /dev/null
+++ b/scribo/sandbox/green/mln/io/plot/save_image_sh.hh
@@ -0,0 +1,1056 @@
+// Copyright (C) 2007,2008,2009,2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+#ifndef MLN_IO_PLOT_SAVE_IMAGE_SH_HH
+# define MLN_IO_PLOT_SAVE_IMAGE_SH_HH
+
+/// \file
+///
+/// \brief Define some functions to export to gnuplot format as a script shell.
+///
+/// Theses routines are dedicated to image visualization. The aim is to display
+/// image whatever the value used as pixel. The behaviour of gnuplot is more
+/// like xv than imageMagick. A Gnuplot script shell file is a text dump file
+/// with a preambule to let gnuplot interpret data. As a script shell, you can
+/// launch it (don't forget the permissions), and every thing is packed in it.
+/// The script file call gnuplot in batch mode, the result window persists and
+/// that's all.
+///
+
+# include <fstream>
+# include <string>
+
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
+
+# include <mln/core/macros.hh>
+# include <mln/core/contract.hh>
+# include <mln/core/image/image1d.hh>
+# include <mln/core/image/image2d.hh>
+# include <mln/core/image/image3d.hh>
+
+# include <mln/geom/min_ind.hh>
+# include <mln/geom/max_ind.hh>
+# include <mln/geom/min_row.hh>
+# include <mln/geom/max_row.hh>
+# include <mln/geom/min_col.hh>
+# include <mln/geom/max_col.hh>
+
+# include <mln/trait/value_.hh>
+
+# include <mln/value/int_u.hh>
+# include <mln/value/int_s.hh>
+# include <mln/value/rgb.hh>
+# include <mln/value/hsl.hh>
+# include <mln/value/hsi.hh>
+
+# include <mln/util/array.hh>
+
+
+namespace mln
+{
+
+ namespace io
+ {
+
+ namespace plot
+ {
+
+ /// \brief Save an image as a gnuplot script shell.
+ ///
+ /// Every thing is save. The image could be 1d, 2d or 3d. The value of
+ /// the pixels could be int_u<n>, int_s<n>, float, double, hsl_f, hsl_d,
+ /// hsi_f, hsi_d and rgb<n>.
+ ///
+ /// \param[in] img the image which contains the data to save.
+ /// \param[in] filename the name of the unix script shell.
+ /// \return the status of the opening file operation.
+ ///
+ /// The result depends on the permission to save the file with
+ /// filename parameter as unix path. The script shell file must have the
+ /// permission to execute (chmod 755). Launch the script shell to call
+ /// gnuplot in batchmode with fine parameters.
+
+ template <typename I>
+ bool save_image_sh(const Image<I>& img, const std::string& filename);
+
+ /// \brief Save a stack of image.
+ ///
+ /// This is an experimental support.
+ ///
+ /// \param[in] stack the stack of image to save.
+ /// \param[in] filename the name of the unix script shell.
+ /// \return the status of the opening file operation.
+ ///
+ /// The result depends on the permission to save the file with
+ /// filename parameter as unix path. The script shell file must have the
+ /// permission to execute (chmod 755). Launch the script shell to call
+ /// gnuplot in batchmode with fine parameters.
+ template <typename I>
+ bool save_image_sh(const util::array< image1d<I> >& stack,
+ const std::string& filename);
+
+ template <typename I>
+ bool save_image_sh(const util::array< util::array< image1d<I> > >& stack,
+ const std::string& filename);
+
+ } // end of namespace mln::io::plot
+
+ } // end of namespace mln::io
+
+
+ namespace io
+ {
+
+ namespace plot
+ {
+
+#ifndef MLN_INCLUDE_ONLY
+
+ //------------------------------------------------------------------------
+ // Impl.
+ //------------------------------------------------------------------------
+
+ namespace impl
+ {
+
+
+ //----------------------------------------------------------------------
+ // save_image_sh_array_array_image1d(const array<array<image1d<I>>>&,
+ // const string&)
+ //----------------------------------------------------------------------
+
+ template <typename I>
+ inline
+ bool save_image_sh_array_array_image1d(const util::array< util::array<
+ image1d<I> > >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d");
+
+ mln_precondition(!stack.is_empty());
+ mln_precondition(!stack[0].is_empty());
+ mln_precondition(stack[0][0].is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_ind = geom::min_ind(stack[0][0]);
+ unsigned max_ind = geom::max_ind(stack[0][0]);
+
+ if (result)
+ {
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set xrange [" << min_ind;
+ out << ":" << max_ind;
+ out << "]" << std::endl;
+ out << "plot '-' with line";
+
+ for (unsigned i = 1; i < stack.size(); ++i)
+ {
+ for (unsigned j = 1; j < stack[i].size(); ++j)
+ {
+
+ out << ",\\" << std::endl;
+ out << " '-' with line";
+ }
+ }
+
+ out << std::endl;
+
+ mln_eiter(util::array< util::array< image1d<I> > >) e0(stack);
+
+ for_all (e0)
+ {
+ mln_eiter(util::array< image1d<I> >) e1(stack[e0.index_()]);
+
+ for_all (e1)
+ {
+ mln_piter(image1d< I >)
+ p(stack[e0.index_()][e1.index_()].domain());
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.ind() << " ";
+ out << stack[e0.index_()][e1.index_()](p) << std::endl;;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ }
+ }
+
+ out << "EOF" << std::endl;
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d");
+
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_array_array_image1d_vec3(
+ // const array<array<image1d<vec<3,T>>>>&,
+ // const string&)
+ //----------------------------------------------------------------------
+
+ template <typename T>
+ inline
+ bool save_image_sh_array_array_image1d_vec3(
+ const util::array<util::array<image1d<algebra::vec<3,T> > > >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d_vec3");
+
+ typedef algebra::vec<3,T> t_val;
+ typedef image1d<t_val> t_img;
+ typedef util::array<t_img> t_array;
+ typedef util::array<t_array> t_stack;
+
+ mln_precondition(!stack.is_empty());
+ mln_precondition(!stack[0].is_empty());
+ mln_precondition(stack[0][0].is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_ind = geom::min_ind(stack[0][0]);
+ unsigned max_ind = geom::max_ind(stack[0][0]);
+
+ if (result)
+ {
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set xrange [" << min_ind;
+ out << ":" << max_ind;
+ out << "]" << std::endl;
+ out << "splot '-' with line palette";
+
+ for (unsigned i = 1; i < stack.size(); ++i)
+ {
+ for (unsigned j = 1; j < stack[i].size(); ++j)
+ {
+
+ out << ",\\" << std::endl;
+ out << " '-' with line palette";
+ }
+ }
+
+ out << std::endl;
+
+ mln_eiter(t_stack) e0(stack);
+
+ for_all (e0)
+ {
+ mln_eiter(t_array) e1(stack[e0.index_()]);
+
+ for_all (e1)
+ {
+ mln_piter(t_img) p(stack[e0.index_()][e1.index_()].domain());
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.ind() << " ";
+ out << stack[e0.index_()][e1.index_()](p)[0] << " ";
+ out << stack[e0.index_()][e1.index_()](p)[1] << " ";
+ out << stack[e0.index_()][e1.index_()](p)[2] << std::endl;;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ }
+ }
+
+ out << "EOF" << std::endl;
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d_vec3");
+
+ return result;
+ }
+
+
+ //----------------------------------------------------------------------
+ // save_image_sh_array_array_image1d_vec2(
+ // const array<array<image1d<vec<2,T>>>>&,
+ // const string&)
+ //----------------------------------------------------------------------
+
+ template <typename T>
+ inline
+ bool save_image_sh_array_array_image1d_vec2(
+ const util::array<util::array<image1d<algebra::vec<2,T> > > >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d_vec2");
+
+ typedef algebra::vec<2,T> t_val;
+ typedef image1d<t_val> t_img;
+ typedef util::array<t_img> t_array;
+ typedef util::array<t_array> t_stack;
+
+ mln_precondition(!stack.is_empty());
+ mln_precondition(!stack[0].is_empty());
+ mln_precondition(stack[0][0].is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_ind = geom::min_ind(stack[0][0]);
+ unsigned max_ind = geom::max_ind(stack[0][0]);
+
+ if (result)
+ {
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set xrange [" << min_ind;
+ out << ":" << max_ind;
+ out << "]" << std::endl;
+ out << "splot '-' with line";
+
+ for (unsigned i = 1; i < stack.size(); ++i)
+ {
+ for (unsigned j = 1; j < stack[i].size(); ++j)
+ {
+
+ out << ",\\" << std::endl;
+ out << " '-' with line";
+ }
+ }
+
+ out << std::endl;
+
+ mln_eiter(t_stack) e0(stack);
+
+ for_all (e0)
+ {
+ mln_eiter(t_array) e1(stack[e0.index_()]);
+
+ for_all (e1)
+ {
+ mln_piter(t_img) p(stack[e0.index_()][e1.index_()].domain());
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.ind() << " ";
+ out << stack[e0.index_()][e1.index_()](p)[0] << " ";
+ out << stack[e0.index_()][e1.index_()](p)[1] << std::endl;;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ }
+ }
+
+ out << "EOF" << std::endl;
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::"
+ "save_image_sh_array_array_image1d_vec2");
+
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_array_image1d(const array<image1d<I>>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <typename I>
+ inline
+ bool save_image_sh_array_image1d(const util::array< image1d<I> >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_array_image1d");
+ mln_precondition(!stack.is_empty());
+ mln_precondition(stack[0].is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_ind = geom::min_ind(stack[0]);
+ unsigned max_ind = geom::max_ind(stack[0]);
+
+ if (result)
+ {
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set xrange [" << min_ind;
+ out << ":" << max_ind;
+ out << "]" << std::endl;
+ out << "plot '-' with line";
+
+ for (unsigned i = 1; i < stack.size(); ++i)
+ {
+
+ out << ",\\" << std::endl;
+ out << " '-' with line";
+ }
+
+ out << std::endl;
+
+ mln_eiter(util::array< image1d<I> >) e(stack);
+
+ for_all (e)
+ {
+ mln_piter(image1d< I >) p(stack[e.index_()].domain());
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.ind() << " ";
+ out << stack[e.index_()](p) << std::endl;;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ }
+
+ out << "EOF" << std::endl;
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_array_image1d");
+ return result;
+ }
+
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image2d_rgb(const image2d<rgb<n>>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <unsigned n>
+ inline
+ bool save_image_sh_image2d_rgb(const image2d<value::rgb<n> >& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image2d_rgb");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_row = geom::min_row(img);
+ unsigned max_row = geom::max_row(img);
+ unsigned min_col = geom::min_col(img);
+ unsigned max_col = geom::max_col(img);
+
+ if (result)
+ {
+ mln_piter(image2d< value::rgb<n> >) p(img.domain());
+
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, r, g, b) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set xrange [" << min_col;
+ out << ":" << max_col;
+ out << "]" << std::endl;
+ out << "set yrange [-" << max_row;
+ out << ":" << min_row;
+ out << "]" << std::endl;
+ out << "plot '-' using 2:(-\\$1):3:4:5 with rgbimage" << std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.row() << " ";
+ out << p.col() << " ";
+ out << img(p).red() << " ";
+ out << img(p).green() << " ";
+ out << img(p).blue() << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image2d_rgb");
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image2d_hsl(const image2d<hsl_<T,T,T>>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <typename T>
+ inline
+ bool save_image_sh_image2d_hsl(const image2d<value::hsl_<T,T,T> >& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image2d_hsl");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_row = geom::min_row(img);
+ unsigned max_row = geom::max_row(img);
+ unsigned min_col = geom::min_col(img);
+ unsigned max_col = geom::max_col(img);
+
+ typedef mln::value::hsl_<T,T,T> hsl;
+
+ if (result)
+ {
+ mln_piter(image2d< hsl >) p(img.domain());
+
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "q(l,s) = (l < 0.5)? (l*(1+s)):(l+s-(l*s))" << std::endl;
+ out << "p(l,s) = (2.0 * l - q(l,s))" << std::endl;
+ out << "n(x) = (x < 0)?(x+1):(x > 1)?(x-1) : (x)"<< std::endl;
+ out << std::endl;
+ out << "c(p,q,t) = (t <(1.0/6.0))?(p+(q-p)*6.0*t):\\"<< std::endl;
+ out << " (t <(1.0/2.0))?(q) :\\" << std::endl;
+ out << " (t<(2.0/3.0))?(p+(q-p)*6.0*((2.0/3.0)-t)):\\" << std::endl;
+ out << " (p)" << std::endl;
+ out << std::endl;
+ out << "r(h,s,l) = c(p(l,s),q(l,s),n(h/360.0+1.0/3.0))"<< std::endl;
+ out << "g(h,s,l) = c(p(l,s),q(l,s),n(h/360.0))" << std::endl;
+ out << "b(h,s,l) = c(p(l,s),q(l,s),n(h/360.0-1.0/3.0))"<< std::endl;
+ out << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set palette gray" << std::endl;
+ out << "set xrange [" << min_col;
+ out << ":" << max_col;
+ out << "]" << std::endl;
+ out << "set yrange [-" << max_row;
+ out << ":" << min_row;
+ out << "]" << std::endl;
+ out << "plot '-' using 2:(-\\$1):\\" << std::endl;
+ out << " (r(\\$3,\\$4,\\$5)):\\" << std::endl;
+ out << " (g(\\$3,\\$4,\\$5)):\\" << std::endl;
+ out << " (b(\\$3,\\$4,\\$5)) with rgbimage" << std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.row() << " ";
+ out << p.col() << " ";
+ out << img(p).hue() << " ";
+ out << img(p).sat() << " ";
+ out << img(p).lum() << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image2d_hsl");
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image2d_hsi(const image2d<hsi_<T,T,T>>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <typename T>
+ inline
+ bool save_image_sh_image2d_hsi(const image2d<value::hsi_<T,T,T> >& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image2d_hsi");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_row = geom::min_row(img);
+ unsigned max_row = geom::max_row(img);
+ unsigned min_col = geom::min_col(img);
+ unsigned max_col = geom::max_col(img);
+
+ typedef mln::value::hsi_<T,T,T> hsi;
+
+ if (result)
+ {
+ mln_piter(image2d< hsi >) p(img.domain());
+
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "teta(h) = (h/180.0) * pi" << std::endl;
+ out << "alpha(s,h) = s*cos(teta(h))" << std::endl;
+ out << "beta(s,h) = s*sin(teta(h))" << std::endl;
+ out << "n(x) = (x < 0)?(x+1) : (x > 1)?(x-1):(x)"<< std::endl;
+ out << std::endl;
+ out << "c(p,q,t) = (t <(1.0/6.0))?(p+(q-p)*6.0*t):\\"<< std::endl;
+ out << " (t <(1.0/2.0))?(q) :\\" << std::endl;
+ out << " (t <(2.0/3.0))?(p+(q-p)*6.0*((2.0/3.0)-t)):\\"<< std::endl;
+ out << " (p)" << std::endl;
+ out << std::endl;
+ out << "r(h,s,i) = (sqrt(3.0)/3.0) * i \\" << std::endl;
+ out << " + (2.0/(sqrt(6.0))) * beta(s,h)" << std::endl;
+ out << "g(h,s,i) = (sqrt(3.0)/3.0) * i \\" << std::endl;
+ out << " + (2.0/(sqrt(2.0))) * alpha(s,h)\\" << std::endl;
+ out << " - (1.0/(sqrt(6.0))) * beta(s,h)" << std::endl;
+ out << "b(h,s,i) = (sqrt(3.0)/3.0) * i \\" << std::endl;
+ out << " - (2.0/(sqrt(2.0))) * alpha(s,h) \\"<< std::endl;
+ out << " - (1.0/(sqrt(6.0))) * beta(s,h)" << std::endl;
+ out << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set palette gray" << std::endl;
+ out << "set xrange [" << min_col;
+ out << ":" << max_col;
+ out << "]" << std::endl;
+ out << "set yrange [-" << max_row;
+ out << ":" << min_row;
+ out << "]" << std::endl;
+ out << "plot '-' using 2:(-\\$1):\\" << std::endl;
+ out << " (r(\\$3,\\$4,\\$5)):\\" << std::endl;
+ out << " (g(\\$3,\\$4,\\$5)):\\" << std::endl;
+ out << " (b(\\$3,\\$4,\\$5)) with rgbimage" << std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.row() << " ";
+ out << p.col() << " ";
+ out << img(p).hue() << " ";
+ out << img(p).sat() << " ";
+ out << img(p).inty() << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:" << filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image2d_hsi");
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image2d(const image2d<I>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <typename I>
+ inline
+ bool save_image_sh_image2d(const image2d<I>& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image2d");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+ unsigned min_row = geom::min_row(img);
+ unsigned max_row = geom::max_row(img);
+ unsigned min_col = geom::min_col(img);
+ unsigned max_col = geom::max_col(img);
+
+ if (result)
+ {
+ mln_piter(image2d<I>) p(img.domain());
+
+ // Output data prelude (terminal X11, image).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "set palette gray" << std::endl;
+ out << "set xrange [" << min_col;
+ out << ":" << max_col;
+ out << "]" << std::endl;
+ out << "set yrange [-" << max_row;
+ out << ":" << min_row;
+ out << "]" << std::endl;
+ out << "plot '-' using 2:(-\\$1):3 with image" <<std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.row() << " ";
+ out << p.col() << " ";
+ out << img(p) << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:"<< filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image2d");
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image1d(const image1d<I>&, const string&)
+ //----------------------------------------------------------------------
+
+ template <typename I>
+ inline
+ bool save_image_sh_image1d(const image1d<I>& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image1d");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+
+ if (result)
+ {
+ mln_piter(image1d<I>) p(img.domain());
+
+ // Output data prelude (terminal X11, impulse).
+ out << "#!/bin/sh" << std::endl;
+ out << "##########################" << std::endl;
+ out << "# Two columns = (x, val) #" << std::endl;
+ out << "##########################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "plot '-' with impulse" << std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.ind() << " ";
+ out << img(p) << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:"<< filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image1d");
+ return result;
+ }
+
+ //----------------------------------------------------------------------
+ // save_image_sh_image3d(const image3d<I>&, const string&)
+ //----------------------------------------------------------------------
+
+
+ template <typename I>
+ inline
+ bool save_image_sh_image3d(const image3d<I>& img,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::impl::save_image_sh_image3d");
+ mln_precondition(img.is_valid());
+
+ std::ofstream out(filename.c_str());
+ bool result = !out.fail();
+
+ if (result)
+ {
+ mln_piter(image3d<I>) p(img.domain());
+
+ // Output data prelude (terminal X11, pointtype 0).
+ out << "#!/bin/sh" << std::endl;
+ out << "####################################" << std::endl;
+ out << "# Columns = (x, y, z, val) #" << std::endl;
+ out << "####################################" << std::endl;
+ out << std::endl;
+ out << "gnuplot <<EOF" << std::endl;
+ out << "set terminal x11 persist 1" << std::endl;
+ out << "splot '-' with points palette pointtype 7" << std::endl;
+
+ // Output data.
+ for_all(p)
+ {
+ out << p.row() << " ";
+ out << p.col() << " ";
+ out << p.sli() << " ";
+ out << img(p) << std::endl;
+ }
+
+ // Close gnuplot data stream.
+ out << "e" << std::endl;
+ out << "EOF" << std::endl;
+
+ out.close();
+ }
+ else
+ {
+ std::cerr << "ERROR[mln::io::plot::save_image_sh]:"<< filename;
+ std::cerr << " couldn't be opened !!" << std::endl;
+ }
+
+ trace::exiting("mln::io::plot::impl::save_image_sh_image3d");
+ return result;
+ }
+
+ } // end of namespace impl
+
+
+ //------------------------------------------------------------------------
+ // Internal.
+ //------------------------------------------------------------------------
+
+ namespace internal
+ {
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const util::array< image1d<I> >& stack,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_array_image1d(stack, filename);
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const util::array<
+ util::array <image1d<I> > >& stack,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_array_array_image1d(stack, filename);
+ }
+
+ template <typename T>
+ inline
+ bool save_image_sh_dispatch(
+ const util::array<util::array<image1d<algebra::vec<3,T> > > >& stack,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_array_array_image1d_vec3(stack, filename);
+ }
+
+ template <typename T>
+ inline
+ bool save_image_sh_dispatch(
+ const util::array<util::array<image1d<algebra::vec<2,T> > > >& stack,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_array_array_image1d_vec2(stack, filename);
+ }
+
+ template <unsigned n>
+ inline
+ bool save_image_sh_dispatch(const image2d<value::rgb<n> >& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image2d_rgb(img, filename);
+ }
+
+ template <typename T>
+ inline
+ bool save_image_sh_dispatch(const image2d<value::hsl_<T,T,T> >& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image2d_hsl(img, filename);
+ }
+
+ template <typename T>
+ inline
+ bool save_image_sh_dispatch(const image2d<value::hsi_<T,T,T> >& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image2d_hsi(img, filename);
+ }
+
+
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const image2d<I>& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image2d(img, filename);
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const image1d<I>& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image1d(img, filename);
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const image3d<I>& img,
+ const std::string& filename)
+ {
+ return impl::save_image_sh_image3d(img, filename);
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh_dispatch(const Image<I>& img,
+ const std::string& filename)
+ {
+ return save_image_sh_dispatch(exact(img), filename);
+ }
+
+ } // end of namespace mln::io::plot::internal
+
+ //------------------------------------------------------------------------
+ // Facade.
+ //------------------------------------------------------------------------
+
+ template <typename I>
+ inline
+ bool save_image_sh(const Image<I>& img, const std::string& filename)
+ {
+ trace::entering("mln::io::plot::save_image_sh");
+
+ bool result = internal::save_image_sh_dispatch(img, filename);
+
+ trace::exiting("mln::io::plot::save_image_sh");
+ return result;
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh(const util::array< image1d<I> >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::save_image_sh");
+
+ bool result = internal::save_image_sh_dispatch(stack, filename);
+
+ trace::exiting("mln::io::plot::save_image_sh");
+ return result;
+ }
+
+ template <typename I>
+ inline
+ bool save_image_sh(const util::array< util::array< image1d<I> > >& stack,
+ const std::string& filename)
+ {
+ trace::entering("mln::io::plot::save_image_sh");
+
+ bool result = internal::save_image_sh_dispatch(stack, filename);
+
+ trace::exiting("mln::io::plot::save_image_sh");
+ return result;
+ }
+
+
+#endif // ! MLN_INCLUDE_ONLY
+
+
+ } // end of namespace mln::io::plot
+
+ } // end of namespace mln::io
+
+} // end of namespace mln
+
+#endif // ! MLN_IO_PLOT_SAVE_IMAGE_SH_HH
diff --git a/milena/sandbox/green/mln/math/ceil.hh b/scribo/sandbox/green/mln/math/ceil.hh
similarity index 100%
copy from milena/sandbox/green/mln/math/ceil.hh
copy to scribo/sandbox/green/mln/math/ceil.hh
diff --git a/milena/sandbox/green/mln/math/floor.hh b/scribo/sandbox/green/mln/math/floor.hh
similarity index 100%
copy from milena/sandbox/green/mln/math/floor.hh
copy to scribo/sandbox/green/mln/math/floor.hh
diff --git a/milena/sandbox/green/mln/value/hsv.hh b/scribo/sandbox/green/mln/value/hsv.hh
similarity index 100%
copy from milena/sandbox/green/mln/value/hsv.hh
copy to scribo/sandbox/green/mln/value/hsv.hh
diff --git a/scribo/sandbox/green/mln/value/rg.hh b/scribo/sandbox/green/mln/value/rg.hh
new file mode 100644
index 0000000..d083ffd
--- /dev/null
+++ b/scribo/sandbox/green/mln/value/rg.hh
@@ -0,0 +1,175 @@
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+#ifndef MLN_VALUE_RG_HH
+# define MLN_VALUE_RG_HH
+
+/// \file
+///
+/// \brief Define the red/green vectorial image type.
+///
+/// This source implements the red/green (RG) vectorial image type. It
+/// is a partial copy of the rgb type. This type doesn't manage
+/// anykind of interaction. Its purpose is limited to store a couple
+/// of values. Do not use it outside this purpose, i can't garantie
+/// the behaviour.
+///
+/// The following sample is a typical use of the rg type.
+///
+/// #include <mln/accu/stat/histo2d.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.hh>
+/// #include <mln/fun/v2v/rgb_to_rg.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/ppm/load.hh>
+/// #include <mln/value/rg.hh>
+/// #include <mln/value/rgb8.hh>
+///
+/// int main()
+/// {
+/// typedef mln::value::rg<8> t_rg8
+/// typedef mln::value::rgb8 t_rgb8;
+/// typedef mln::fun::v2v::rgb_to_rg<8> t_rgb_to_rg;
+/// typedef mln::image2d<t_rg8> t_image2d_rg8;
+/// typedef mln::image2d<t_rgb8> t_image2d_rgb8;
+/// typedef mln::image2d<unsigned> t_histo;
+/// t_image2d_rgb8 img_rgb8;
+/// t_image2d_rg8 img_rg8;
+/// t_histo histo;
+///
+/// mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+/// img_rg8 = mln::data::transform(img_rgb8, t_rgb_to_rg());
+/// histo = mln::data::compute(mln::accu::meta::stat::histo2d(), img_rg8);
+///
+/// return 0;
+/// }
+
+
+# include <mln/algebra/vec.hh>
+# include <mln/value/concept/vectorial.hh>
+# include <mln/value/int_u.hh>
+# include <mln/value/rgb8.hh>
+# include <mln/trait/value_.hh>
+
+
+namespace mln
+{
+
+ namespace value
+ {
+
+ // Forward declaration.
+ template <unsigned n> struct rg;
+
+ } // end of namespace mln::value
+
+ namespace trait
+ {
+
+ template <unsigned n>
+ struct value_< mln::value::rg<n> >
+ {
+ enum {
+ dim = 2,
+ nbits = dim * n,
+ card = mln_value_card_from_(nbits)
+ };
+
+ typedef trait::value::nature::vectorial nature;
+ typedef trait::value::kind::color kind;
+ typedef trait::value::quant::high quant;
+
+ typedef void comp;
+ typedef mln::value::int_u<n> comp_0;
+ typedef mln::value::int_u<n> comp_1;
+
+ static comp_0 get_comp_0(const mln::value::rg<n>& v){return v.red(); }
+ static comp_1 get_comp_1(const mln::value::rg<n>& v){return v.green();}
+
+ typedef algebra::vec<dim, float> sum;
+
+ static const char* name()
+ {
+ static std::string s = std::string("rg").append(1, 8 + '0');
+ return s.c_str();
+ }
+ };
+
+ } // end of namespace mln::trait
+
+ namespace value
+ {
+
+ /// \brief Define the red/green vectorial image type.
+ ///
+ /// Param n defines the quantification used for red/green space.
+
+ template <unsigned n>
+ struct rg :public mln::value::Vectorial< rg<n> >,
+ public internal::value_like_<
+ algebra::vec< 2, int_u<n> >, // Equivalent.
+ algebra::vec< 2, int_u<n> >, // Encoding.
+ algebra::vec< 2, int >, // Interoperation.
+ rg<n> > // Exact.
+ {
+ typedef int_u<n> t_red;
+ typedef int_u<n> t_green;
+
+ int_u<n> red() const {return this->v_[0];}
+ int_u<n>& red() {return this->v_[0];}
+ int_u<n> green() const {return this->v_[1];}
+ int_u<n>& green() {return this->v_[1];}
+
+ /// Constructors
+ /// \{
+ /// \brief Create a rg value.
+ ///
+ /// Two constructors exist, the first one do nothing and the second one
+ /// initializes the red/green components from a rgb value.
+ rg(){}
+ rg(const rgb8& val){this->v_[0] = val.red(); this->v_[1] = val.green();}
+ /// \}
+
+ /// \brief Affect a rg value to this object.
+ /// \param[in] rhs the value to affect to this object.
+ ///
+ /// If the two objects are different, then then copy the
+ /// underline array of values.
+
+ rg operator=(const rg& rhs)
+ {
+ if (&rhs != this)
+ this->v_ = rhs.v_;
+
+ return *this;
+ }
+ };
+
+ } // end of namespace mln::value
+
+} // end of namespace mln
+
+#endif // ! MLN_VALUE_RG_HH
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
new file mode 100644
index 0000000..77f9015
--- /dev/null
+++ b/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
@@ -0,0 +1,153 @@
+#
+# Generic Makefile
+#
+
+#########
+# TOOLS #
+#########
+
+#LOADLIBES= -lboost_filesystem
+INCLUDES1= -I$(HOME)/git/olena/scribo/sandbox/green
+INCLUDES2= -I$(HOME)/git/olena/milena
+INCLUDES= $(INCLUDES1) $(INCLUDES2)
+CXXFLAGS= -ggdb -O0 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+#CXXFLAGS= -DNDEBUG -O1 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+#CXXFLAGS= -DNDEBUG -O3 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+ECHO= echo
+RM= rm
+MKDIR= mkdir -p
+CP= cp
+
+SOURCE_PATTERN= green/tests
+BUILD__PATTERN= green/build/tests
+
+
+ifeq ($(findstring $(BUILD__PATTERN),$(PWD)), $(BUILD__PATTERN))
+# Case where make is done from build directory.
+SOURCE_DIR= $(subst $(BUILD__PATTERN),$(SOURCE_PATTERN),$(PWD))
+BUILD__DIR= $(PWD)/
+else
+# Case where make is done from source directory.
+SOURCE_DIR= $(PWD)/
+BUILD__DIR= $(subst $(SOURCE_PATTERN),$(BUILD__PATTERN),$(PWD))
+endif
+
+SRC= $(notdir $(wildcard $(SOURCE_DIR)/*.cc))
+OLD= $(notdir $(wildcard $(SOURCE_DIR)/*~))
+OBJ= $(patsubst %.cc,%.o,$(SRC))
+SOURCE_MAKEFILE=Makefile.am
+BUILD__MAKEFILE=Makefile
+TARGET_FILE= $(notdir $(PWD))
+SOURCE_FILES= $(notdir $(wildcard $(SOURCE_DIR)/*.*))
+BUILD__FILES= $(filter-out $(SRC) $(SOURCE_MAKEFILE), $(SOURCE_FILES))
+
+BUILD__F_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__FILES))
+SOURCE_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_FILES))
+
+BUILD__M_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__MAKEFILE))
+SOURCE_M_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_MAKEFILE))
+
+TARGET_F_PATH= $(addprefix $(BUILD__DIR)/,$(TARGET_FILE))
+OBJ_F_PATH= $(addprefix $(BUILD__DIR)/,$(OBJ))
+SRC_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SRC))
+OLD_F_PATH= $(addprefix $(SOURCE_DIR)/,$(OLD))
+
+#############
+# BOOTSTRAP #
+#############
+
+
+bootstrap: $(BUILD__DIR) $(BUILD__F_PATH) $(BUILD__M_PATH)
+
+# Create, if nessary, the destination directory
+$(BUILD__DIR):
+ $(MKDIR) $(BUILD__DIR)
+
+# Copy, if nessary, all the files, except the Makefile.am
+$(BUILD__F_PATH): $(SOURCE_F_PATH)
+ $(CP) $(addprefix $(SOURCE_DIR),$(@F)) $@
+
+# Copy if nessary, the Makefile.am into Makefile
+$(BUILD__M_PATH): $(SOURCE_M_PATH)
+ $(CP) $(SOURCE_M_PATH) $(BUILD__M_PATH)
+
+
+#######
+# ALL #
+#######
+
+# We assume that the call is done from the build directory.
+# With the directive vpath, hidden files are found in the source directory.
+
+all: $(TARGET_F_PATH)
+
+
+$(TARGET_F_PATH): $(OBJ_F_PATH)
+ $(LINK.cc) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+$(OBJ_F_PATH):$(SRC_F_PATH)
+ $(COMPILE.cc) $(OUTPUT_OPTION) $<
+
+
+#########
+# CLEAN #
+#########
+
+# Force every time the deletion
+clean: clean_target clean_obj clean_dst clean_old #clean_make
+
+
+clean_target:
+ -@$(RM) $(TARGET_F_PATH) &> /dev/null
+
+clean_obj:
+ -@$(RM) $(OBJ_F_PATH) &> /dev/null
+
+clean_dst:
+ -@$(RM) $(BUILD_F_PATH) &> /dev/null
+
+clean_make:
+ -@$(RM) $(BUILD_M_PATH) &> /dev/null
+
+clean_old:
+ -@$(RM) $(OLD_F_PATH) &> /dev/null
+
+
+#########
+# PRINT #
+#########
+
+print: print_tools print_bootstrap
+
+print_tools:
+ @$(ECHO) "HOME = $(HOME)"
+ @$(ECHO) "INCLUDES = $(INCLUDES)"
+ @$(ECHO) "CXXFLAGS = $(CXXFLAGS)"
+ @$(ECHO) "ECHO = $(ECHO)"
+ @$(ECHO) "RM = $(RM)"
+ @$(ECHO) "MKDIR = $(MKDIR)"
+ @$(ECHO) "CP = $(CP)"
+ @$(ECHO)
+
+print_bootstrap:
+ @$(ECHO) "PWD = $(PWD)"
+ @$(ECHO) "SOURCE_PATTERN = $(SOURCE_PATTERN)"
+ @$(ECHO) "BUILD__PATTERN = $(BUILD__PATTERN)"
+ @$(ECHO) "SOURCE_DIR = $(SOURCE_DIR)"
+ @$(ECHO) "BUILD__DIR = $(BUILD__DIR)"
+ @$(ECHO) "SOURCE_MAKEFILE = $(SOURCE_MAKEFILE)"
+ @$(ECHO) "BUILD__MAKEFILE = $(BUILD__MAKEFILE)"
+ @$(ECHO) "TARGET_FILE = $(TARGET_FILE)"
+ @$(ECHO) "SOURCE_FILES = $(SOURCE_FILES)"
+ @$(ECHO) "SOURCE_F_PATH = $(SOURCE_F_PATH)"
+ @$(ECHO) "BUILD__FILES = $(BUILD__FILES)"
+ @$(ECHO) "BUILD__F_PATH = $(BUILD__F_PATH)"
+ @$(ECHO) "BUILD__M_PATH = $(BUILD__M_PATH)"
+ @$(ECHO) "SOURCE_M_PATH = $(SOURCE_M_PATH)"
+ @$(ECHO) "SRC = $(SRC)"
+ @$(ECHO) "OBJ = $(OBJ)"
+ @$(ECHO) "OLD = $(OLD)"
+ @$(ECHO) "SRC_F_PATH = $(SRC_F_PATH)"
+ @$(ECHO) "OBJ_F_PATH = $(OBJ_F_PATH)"
+ @$(ECHO) "OLD_F_PATH = $(OLD_F_PATH)"
+ @$(ECHO)
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
new file mode 100644
index 0000000..5a5c4c4
--- /dev/null
+++ b/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
@@ -0,0 +1,21 @@
+/// TEST HISTO1D
+
+#include <mln/accu/stat/histo1d.hh>
+#include <mln/data/compute.hh>
+#include <mln/core/image/image1d.hh>
+#include <mln/core/image/image2d.hh>
+#include <mln/img_path.hh>
+#include <mln/io/pgm/load.hh>
+#include <mln/value/int_u8.hh>
+
+int main()
+{
+ typedef mln::value::int_u8 t_int_u8;
+ mln::image2d<t_int_u8> img;
+ mln::image1d<unsigned> histo;
+
+ mln::io::pgm::load(img, OLENA_IMG_PATH"/lena.pgm");
+ histo = mln::data::compute(mln::accu::meta::stat::histo1d(), img);
+
+ return 0;
+}
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
new file mode 100644
index 0000000..a96b2e9
--- /dev/null
+++ b/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
@@ -0,0 +1,153 @@
+#
+# Generic Makefile
+#
+
+#########
+# TOOLS #
+#########
+
+#LOADLIBES= -lboost_filesystem
+INCLUDES1= -I$(HOME)/git/olena/scribo/sandbox/green
+INCLUDES2= -I$(HOME)/git/olena/milena
+INCLUDES= $(INCLUDES1) $(INCLUDES2)
+CXXFLAGS= -ggdb -O0 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+#CXXFLAGS= -DNDEBUG -O1 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+#CXXFLAGS= -DNDEBUG -O3 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+ECHO= echo
+RM= rm
+MKDIR= mkdir -p
+CP= cp
+
+SOURCE_PATTERN= green/use
+BUILD__PATTERN= green/build/use
+
+
+ifeq ($(findstring $(BUILD__PATTERN),$(PWD)), $(BUILD__PATTERN))
+# Case where make is done from build directory.
+SOURCE_DIR= $(subst $(BUILD__PATTERN),$(SOURCE_PATTERN),$(PWD))
+BUILD__DIR= $(PWD)/
+else
+# Case where make is done from source directory.
+SOURCE_DIR= $(PWD)/
+BUILD__DIR= $(subst $(SOURCE_PATTERN),$(BUILD__PATTERN),$(PWD))
+endif
+
+SRC= $(notdir $(wildcard $(SOURCE_DIR)/*.cc))
+OLD= $(notdir $(wildcard $(SOURCE_DIR)/*~))
+OBJ= $(patsubst %.cc,%.o,$(SRC))
+SOURCE_MAKEFILE=Makefile.am
+BUILD__MAKEFILE=Makefile
+TARGET_FILE= $(notdir $(PWD))
+SOURCE_FILES= $(notdir $(wildcard $(SOURCE_DIR)/*.*))
+BUILD__FILES= $(filter-out $(SRC) $(SOURCE_MAKEFILE), $(SOURCE_FILES))
+
+BUILD__F_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__FILES))
+SOURCE_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_FILES))
+
+BUILD__M_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__MAKEFILE))
+SOURCE_M_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_MAKEFILE))
+
+TARGET_F_PATH= $(addprefix $(BUILD__DIR)/,$(TARGET_FILE))
+OBJ_F_PATH= $(addprefix $(BUILD__DIR)/,$(OBJ))
+SRC_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SRC))
+OLD_F_PATH= $(addprefix $(SOURCE_DIR)/,$(OLD))
+
+#############
+# BOOTSTRAP #
+#############
+
+
+bootstrap: $(BUILD__DIR) $(BUILD__F_PATH) $(BUILD__M_PATH)
+
+# Create, if nessary, the destination directory
+$(BUILD__DIR):
+ $(MKDIR) $(BUILD__DIR)
+
+# Copy, if nessary, all the files, except the Makefile.am
+$(BUILD__F_PATH): $(SOURCE_F_PATH)
+ $(CP) $(addprefix $(SOURCE_DIR),$(@F)) $@
+
+# Copy if nessary, the Makefile.am into Makefile
+$(BUILD__M_PATH): $(SOURCE_M_PATH)
+ $(CP) $(SOURCE_M_PATH) $(BUILD__M_PATH)
+
+
+#######
+# ALL #
+#######
+
+# We assume that the call is done from the build directory.
+# With the directive vpath, hidden files are found in the source directory.
+
+all: $(TARGET_F_PATH)
+
+
+$(TARGET_F_PATH): $(OBJ_F_PATH)
+ $(LINK.cc) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+$(OBJ_F_PATH):$(SRC_F_PATH)
+ $(COMPILE.cc) $(OUTPUT_OPTION) $<
+
+
+#########
+# CLEAN #
+#########
+
+# Force every time the deletion
+clean: clean_target clean_obj clean_dst clean_old #clean_make
+
+
+clean_target:
+ -@$(RM) $(TARGET_F_PATH) &> /dev/null
+
+clean_obj:
+ -@$(RM) $(OBJ_F_PATH) &> /dev/null
+
+clean_dst:
+ -@$(RM) $(BUILD_F_PATH) &> /dev/null
+
+clean_make:
+ -@$(RM) $(BUILD_M_PATH) &> /dev/null
+
+clean_old:
+ -@$(RM) $(OLD_F_PATH) &> /dev/null
+
+
+#########
+# PRINT #
+#########
+
+print: print_tools print_bootstrap
+
+print_tools:
+ @$(ECHO) "HOME = $(HOME)"
+ @$(ECHO) "INCLUDES = $(INCLUDES)"
+ @$(ECHO) "CXXFLAGS = $(CXXFLAGS)"
+ @$(ECHO) "ECHO = $(ECHO)"
+ @$(ECHO) "RM = $(RM)"
+ @$(ECHO) "MKDIR = $(MKDIR)"
+ @$(ECHO) "CP = $(CP)"
+ @$(ECHO)
+
+print_bootstrap:
+ @$(ECHO) "PWD = $(PWD)"
+ @$(ECHO) "SOURCE_PATTERN = $(SOURCE_PATTERN)"
+ @$(ECHO) "BUILD__PATTERN = $(BUILD__PATTERN)"
+ @$(ECHO) "SOURCE_DIR = $(SOURCE_DIR)"
+ @$(ECHO) "BUILD__DIR = $(BUILD__DIR)"
+ @$(ECHO) "SOURCE_MAKEFILE = $(SOURCE_MAKEFILE)"
+ @$(ECHO) "BUILD__MAKEFILE = $(BUILD__MAKEFILE)"
+ @$(ECHO) "TARGET_FILE = $(TARGET_FILE)"
+ @$(ECHO) "SOURCE_FILES = $(SOURCE_FILES)"
+ @$(ECHO) "SOURCE_F_PATH = $(SOURCE_F_PATH)"
+ @$(ECHO) "BUILD__FILES = $(BUILD__FILES)"
+ @$(ECHO) "BUILD__F_PATH = $(BUILD__F_PATH)"
+ @$(ECHO) "BUILD__M_PATH = $(BUILD__M_PATH)"
+ @$(ECHO) "SOURCE_M_PATH = $(SOURCE_M_PATH)"
+ @$(ECHO) "SRC = $(SRC)"
+ @$(ECHO) "OBJ = $(OBJ)"
+ @$(ECHO) "OLD = $(OLD)"
+ @$(ECHO) "SRC_F_PATH = $(SRC_F_PATH)"
+ @$(ECHO) "OBJ_F_PATH = $(OBJ_F_PATH)"
+ @$(ECHO) "OLD_F_PATH = $(OLD_F_PATH)"
+ @$(ECHO)
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
new file mode 100644
index 0000000..1c6176b
--- /dev/null
+++ b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
@@ -0,0 +1,24 @@
+/// \file
+///
+/// \brief Minimal code for building 1d image histogram version.
+///
+
+#include <mln/accu/stat/histo1d.hh>
+#include <mln/data/compute.hh>
+#include <mln/core/image/image1d.hh>
+#include <mln/core/image/image2d.hh>
+#include <mln/img_path.hh>
+#include <mln/io/pgm/load.hh>
+#include <mln/value/int_u8.hh>
+
+int main()
+{
+ typedef mln::value::int_u8 t_int_u8;
+ mln::image2d<t_int_u8> img;
+ mln::image1d<unsigned> histo;
+
+ mln::io::pgm::load(img, OLENA_IMG_PATH"/lena.pgm");
+ histo = mln::data::compute(mln::accu::meta::stat::histo1d(), img);
+
+ return 0;
+}
diff --git a/scribo/sandbox/green/use/accu/stat/histo2d/Makefile.am b/scribo/sandbox/green/use/accu/stat/histo2d/Makefile.am
new file mode 100644
index 0000000..a96b2e9
--- /dev/null
+++ b/scribo/sandbox/green/use/accu/stat/histo2d/Makefile.am
@@ -0,0 +1,153 @@
+#
+# Generic Makefile
+#
+
+#########
+# TOOLS #
+#########
+
+#LOADLIBES= -lboost_filesystem
+INCLUDES1= -I$(HOME)/git/olena/scribo/sandbox/green
+INCLUDES2= -I$(HOME)/git/olena/milena
+INCLUDES= $(INCLUDES1) $(INCLUDES2)
+CXXFLAGS= -ggdb -O0 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+#CXXFLAGS= -DNDEBUG -O1 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+#CXXFLAGS= -DNDEBUG -O3 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+ECHO= echo
+RM= rm
+MKDIR= mkdir -p
+CP= cp
+
+SOURCE_PATTERN= green/use
+BUILD__PATTERN= green/build/use
+
+
+ifeq ($(findstring $(BUILD__PATTERN),$(PWD)), $(BUILD__PATTERN))
+# Case where make is done from build directory.
+SOURCE_DIR= $(subst $(BUILD__PATTERN),$(SOURCE_PATTERN),$(PWD))
+BUILD__DIR= $(PWD)/
+else
+# Case where make is done from source directory.
+SOURCE_DIR= $(PWD)/
+BUILD__DIR= $(subst $(SOURCE_PATTERN),$(BUILD__PATTERN),$(PWD))
+endif
+
+SRC= $(notdir $(wildcard $(SOURCE_DIR)/*.cc))
+OLD= $(notdir $(wildcard $(SOURCE_DIR)/*~))
+OBJ= $(patsubst %.cc,%.o,$(SRC))
+SOURCE_MAKEFILE=Makefile.am
+BUILD__MAKEFILE=Makefile
+TARGET_FILE= $(notdir $(PWD))
+SOURCE_FILES= $(notdir $(wildcard $(SOURCE_DIR)/*.*))
+BUILD__FILES= $(filter-out $(SRC) $(SOURCE_MAKEFILE), $(SOURCE_FILES))
+
+BUILD__F_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__FILES))
+SOURCE_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_FILES))
+
+BUILD__M_PATH= $(addprefix $(BUILD__DIR)/,$(BUILD__MAKEFILE))
+SOURCE_M_PATH= $(addprefix $(SOURCE_DIR)/,$(SOURCE_MAKEFILE))
+
+TARGET_F_PATH= $(addprefix $(BUILD__DIR)/,$(TARGET_FILE))
+OBJ_F_PATH= $(addprefix $(BUILD__DIR)/,$(OBJ))
+SRC_F_PATH= $(addprefix $(SOURCE_DIR)/,$(SRC))
+OLD_F_PATH= $(addprefix $(SOURCE_DIR)/,$(OLD))
+
+#############
+# BOOTSTRAP #
+#############
+
+
+bootstrap: $(BUILD__DIR) $(BUILD__F_PATH) $(BUILD__M_PATH)
+
+# Create, if nessary, the destination directory
+$(BUILD__DIR):
+ $(MKDIR) $(BUILD__DIR)
+
+# Copy, if nessary, all the files, except the Makefile.am
+$(BUILD__F_PATH): $(SOURCE_F_PATH)
+ $(CP) $(addprefix $(SOURCE_DIR),$(@F)) $@
+
+# Copy if nessary, the Makefile.am into Makefile
+$(BUILD__M_PATH): $(SOURCE_M_PATH)
+ $(CP) $(SOURCE_M_PATH) $(BUILD__M_PATH)
+
+
+#######
+# ALL #
+#######
+
+# We assume that the call is done from the build directory.
+# With the directive vpath, hidden files are found in the source directory.
+
+all: $(TARGET_F_PATH)
+
+
+$(TARGET_F_PATH): $(OBJ_F_PATH)
+ $(LINK.cc) $< $(LOADLIBES) $(LDLIBS) -o $@
+
+$(OBJ_F_PATH):$(SRC_F_PATH)
+ $(COMPILE.cc) $(OUTPUT_OPTION) $<
+
+
+#########
+# CLEAN #
+#########
+
+# Force every time the deletion
+clean: clean_target clean_obj clean_dst clean_old #clean_make
+
+
+clean_target:
+ -@$(RM) $(TARGET_F_PATH) &> /dev/null
+
+clean_obj:
+ -@$(RM) $(OBJ_F_PATH) &> /dev/null
+
+clean_dst:
+ -@$(RM) $(BUILD_F_PATH) &> /dev/null
+
+clean_make:
+ -@$(RM) $(BUILD_M_PATH) &> /dev/null
+
+clean_old:
+ -@$(RM) $(OLD_F_PATH) &> /dev/null
+
+
+#########
+# PRINT #
+#########
+
+print: print_tools print_bootstrap
+
+print_tools:
+ @$(ECHO) "HOME = $(HOME)"
+ @$(ECHO) "INCLUDES = $(INCLUDES)"
+ @$(ECHO) "CXXFLAGS = $(CXXFLAGS)"
+ @$(ECHO) "ECHO = $(ECHO)"
+ @$(ECHO) "RM = $(RM)"
+ @$(ECHO) "MKDIR = $(MKDIR)"
+ @$(ECHO) "CP = $(CP)"
+ @$(ECHO)
+
+print_bootstrap:
+ @$(ECHO) "PWD = $(PWD)"
+ @$(ECHO) "SOURCE_PATTERN = $(SOURCE_PATTERN)"
+ @$(ECHO) "BUILD__PATTERN = $(BUILD__PATTERN)"
+ @$(ECHO) "SOURCE_DIR = $(SOURCE_DIR)"
+ @$(ECHO) "BUILD__DIR = $(BUILD__DIR)"
+ @$(ECHO) "SOURCE_MAKEFILE = $(SOURCE_MAKEFILE)"
+ @$(ECHO) "BUILD__MAKEFILE = $(BUILD__MAKEFILE)"
+ @$(ECHO) "TARGET_FILE = $(TARGET_FILE)"
+ @$(ECHO) "SOURCE_FILES = $(SOURCE_FILES)"
+ @$(ECHO) "SOURCE_F_PATH = $(SOURCE_F_PATH)"
+ @$(ECHO) "BUILD__FILES = $(BUILD__FILES)"
+ @$(ECHO) "BUILD__F_PATH = $(BUILD__F_PATH)"
+ @$(ECHO) "BUILD__M_PATH = $(BUILD__M_PATH)"
+ @$(ECHO) "SOURCE_M_PATH = $(SOURCE_M_PATH)"
+ @$(ECHO) "SRC = $(SRC)"
+ @$(ECHO) "OBJ = $(OBJ)"
+ @$(ECHO) "OLD = $(OLD)"
+ @$(ECHO) "SRC_F_PATH = $(SRC_F_PATH)"
+ @$(ECHO) "OBJ_F_PATH = $(OBJ_F_PATH)"
+ @$(ECHO) "OLD_F_PATH = $(OLD_F_PATH)"
+ @$(ECHO)
diff --git a/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc b/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
new file mode 100644
index 0000000..6369b5a
--- /dev/null
+++ b/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
@@ -0,0 +1,33 @@
+/// \file
+///
+/// \brief Minimal code for building 2d image histogram version.
+///
+
+#include <mln/accu/stat/histo2d.hh>
+#include <mln/core/image/image2d.hh>
+#include <mln/data/compute.hh>
+#include <mln/data/transform.hh>
+#include <mln/fun/v2v/rgb_to_rg.hh>
+#include <mln/img_path.hh>
+#include <mln/io/ppm/load.hh>
+#include <mln/value/rg.hh>
+#include <mln/value/rgb8.hh>
+
+int main()
+{
+ typedef mln::value::rg<8> t_rg8;
+ typedef mln::value::rgb8 t_rgb8;
+ typedef mln::fun::v2v::rgb_to_rg<8> t_rgb_to_rg;
+ typedef mln::image2d<t_rg8> t_image2d_rg8;
+ typedef mln::image2d<t_rgb8> t_image2d_rgb8;
+ typedef mln::image2d<unsigned> t_histo;
+ t_image2d_rgb8 img_rgb8;
+ t_image2d_rg8 img_rg8;
+ t_histo histo;
+
+ mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+ img_rg8 = mln::data::transform(img_rgb8, t_rgb_to_rg());
+ histo = mln::data::compute(mln::accu::meta::stat::histo2d(), img_rg8);
+
+ return 0;
+}
--
1.5.6.5
1
0
last-svn-commit-41-g8b22095 Define accumulator which computes histogram view as image.
by Yann Jacquelet 15 Nov '10
by Yann Jacquelet 15 Nov '10
15 Nov '10
* mln/img_path.hh: New header file.
Define the 1d component version of the the library.
* mln/accu/stat/histo1d.hh: New header file.
Give an example of code.
* use/accu/stat/histo1d: New directory.
* use/accu/stat/histo1d/Makefile.am: New makefile.
* use/accu/stat/histo1d/histo1d.cc: New source.
Make some unitary tests on histo1d library.
* tests/accu/stat/histo1d: New directory.
* tests/accu/stat/histo1d/Makefile.am: New makefile.
* tests/accu/stat/histo1d/histo1d.cc: New source.
Define the 2d component version of the the library.
* mln/accu/stat/histo2d.hh: New header file.
* mln/value/rg.hh: New header file.
* mln/fun/v2v/rgb_to_rg.hh: New header file.
Give an example of code.
* use/accu/stat/histo2d: New directory.
* use/accu/stat/histo2d/Makefile.am: New makefile.
* use/accu/stat/histo2d/histo2d.cc: New source.
* use/value/rg: New directory.
* use/value/rg/Makefile.am: New makefile.
* use/value/rg/rg.cc: New source.
* use/fun/v2v/rgb_to_rg: New directory.
* use/fun/v2v/rgb_to_rg/Makefile.am: New makefile.
* use/fun/v2v/rgb_to_rg/rgb_to_rg.cc: New source.
Define the RGB 3d component version of the the library.
* mln/accu/stat/histo3d_rgb.hh: New header file.
* mln/fun/v2v/rgb8_to_rgbn.hh: New header file.
Give an example of code.
* use/accu/stat/histo3_rgb: New directory.
* use/accu/stat/histo3d_rgb/Makefile.am: New makefile.
* use/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
* use/fun/v2v/rgb8_to_rgbn: New directory.
* use/fun/v2v/rgb8_to_rgbn/Makefile.am: New makefile.
* use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc: New source.
Make some unitary tests on histo3d library.
* tests/accu/stat/histo3d_rgb: New directory.
* tests/accu/stat/histo3d_rgb/Makefile.am: New makefile.
* tests/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
Define the HSL 3d component version of the the library.
* mln/accu/stat/histo3d_hsl.hh: New header file.
Give an example of code.
* use/accu/stat/histo3_hsl: New directory.
* use/accu/stat/histo3d_hsl/Makefile.am: New makefile.
* use/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
Make some unitary tests on histo3d library.
* tests/accu/stat/histo3d_hsl: New directory.
* tests/accu/stat/histo3d_hsl/Makefile.am: New makefile.
* tests/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
---
scribo/sandbox/green/ChangeLog | 82 +++-
scribo/sandbox/green/README | 73 +++-
scribo/sandbox/green/mln/accu/stat/histo1d.hh | 32 +-
scribo/sandbox/green/mln/accu/stat/histo2d.hh | 75 ++--
scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh | 249 +++++-----
scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh | 138 +++---
scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh | 49 ++-
scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh | 2 -
.../green/tests/accu/stat/histo1d/histo1d.cc | 502 +++++++++++++++++++-
.../accu/stat/{histo1d => histo3d_hsl}/Makefile.am | 0
.../tests/accu/stat/histo3d_hsl/histo3d_hsl.cc | 394 +++++++---------
.../accu/stat/{histo1d => histo3d_rgb}/Makefile.am | 0
.../tests/accu/stat/histo3d_rgb/histo3d_rgb.cc | 355 +++++++-------
.../sandbox/green/use/accu/stat/histo1d/histo1d.cc | 27 +
.../sandbox/green/use/accu/stat/histo2d/histo2d.cc | 25 +
.../accu/stat/{histo1d => histo3d_hsl}/Makefile.am | 0
.../green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc | 56 ++--
.../accu/stat/{histo1d => histo3d_rgb}/Makefile.am | 0
.../green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc | 45 +-
.../histo1d => fun/v2v/rgb8_to_rgbn}/Makefile.am | 0
.../green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc | 45 +-
.../stat/histo1d => fun/v2v/rgb_to_rg}/Makefile.am | 0
.../green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc | 51 +-
.../{accu/stat/histo1d => value/rg}/Makefile.am | 0
.../sandbox/green/use/value/rg/rg.cc | 51 +-
25 files changed, 1450 insertions(+), 801 deletions(-)
copy scribo/sandbox/green/tests/accu/stat/{histo1d => histo3d_hsl}/Makefile.am (100%)
copy {milena => scribo}/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc (73%)
copy scribo/sandbox/green/tests/accu/stat/{histo1d => histo3d_rgb}/Makefile.am (100%)
copy {milena => scribo}/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc (64%)
copy scribo/sandbox/green/use/accu/stat/{histo1d => histo3d_hsl}/Makefile.am (100%)
copy milena/tests/fun/v2v/rgb_to_hsl.cc => scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc (57%)
copy scribo/sandbox/green/use/accu/stat/{histo1d => histo3d_rgb}/Makefile.am (100%)
copy milena/tests/io/ppm/ppm.cc => scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc (63%)
copy scribo/sandbox/green/use/{accu/stat/histo1d => fun/v2v/rgb8_to_rgbn}/Makefile.am (100%)
copy milena/tests/io/ppm/ppm.cc => scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc (63%)
copy scribo/sandbox/green/use/{accu/stat/histo1d => fun/v2v/rgb_to_rg}/Makefile.am (100%)
copy milena/tests/fun/v2v/hsl_to_rgb.cc => scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc (59%)
copy scribo/sandbox/green/use/{accu/stat/histo1d => value/rg}/Makefile.am (100%)
copy milena/tests/fun/v2v/hsl_to_rgb.cc => scribo/sandbox/green/use/value/rg/rg.cc (60%)
diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog
index 6a3c8fa..8f5101b 100644
--- a/scribo/sandbox/green/ChangeLog
+++ b/scribo/sandbox/green/ChangeLog
@@ -38,12 +38,84 @@
2010-06-21 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
- Save histogram library.
+ Define accumulator which computes histogram view as image.
+
+ * mln/img_path.hh: New header file.
+
+ Define the 1d component version of the the library.
+
+ * mln/accu/stat/histo1d.hh: New header file.
+
+ Give an example of code.
+
+ * use/accu/stat/histo1d: New directory.
+ * use/accu/stat/histo1d/Makefile.am: New makefile.
+ * use/accu/stat/histo1d/histo1d.cc: New source.
+
+ Make some unitary tests on histo1d library.
+
+ * tests/accu/stat/histo1d: New directory.
+ * tests/accu/stat/histo1d/Makefile.am: New makefile.
+ * tests/accu/stat/histo1d/histo1d.cc: New source.
+
+ Define the 2d component version of the the library.
+
+ * mln/accu/stat/histo2d.hh: New header file.
+ * mln/value/rg.hh: New header file.
+ * mln/fun/v2v/rgb_to_rg.hh: New header file.
+
+ Give an example of code.
+
+ * use/accu/stat/histo2d: New directory.
+ * use/accu/stat/histo2d/Makefile.am: New makefile.
+ * use/accu/stat/histo2d/histo2d.cc: New source.
+
+ * use/value/rg: New directory.
+ * use/value/rg/Makefile.am: New makefile.
+ * use/value/rg/rg.cc: New source.
+
+ * use/fun/v2v/rgb_to_rg: New directory.
+ * use/fun/v2v/rgb_to_rg/Makefile.am: New makefile.
+ * use/fun/v2v/rgb_to_rg/rgb_to_rg.cc: New source.
+
+ Define the RGB 3d component version of the the library.
+
+ * mln/accu/stat/histo3d_rgb.hh: New header file.
+ * mln/fun/v2v/rgb8_to_rgbn.hh: New header file.
+
+ Give an example of code.
+
+ * use/accu/stat/histo3_rgb: New directory.
+ * use/accu/stat/histo3d_rgb/Makefile.am: New makefile.
+ * use/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
+
+ * use/fun/v2v/rgb8_to_rgbn: New directory.
+ * use/fun/v2v/rgb8_to_rgbn/Makefile.am: New makefile.
+ * use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc: New source.
+
+ Make some unitary tests on histo3d library.
+
+ * tests/accu/stat/histo3d_rgb: New directory.
+ * tests/accu/stat/histo3d_rgb/Makefile.am: New makefile.
+ * tests/accu/stat/histo3d_rgb/histo3d_rgb.cc: New source.
+
+
+ Define the HSL 3d component version of the the library.
+
+ * mln/accu/stat/histo3d_hsl.hh: New header file.
+
+ Give an example of code.
+
+ * use/accu/stat/histo3_hsl: New directory.
+ * use/accu/stat/histo3d_hsl/Makefile.am: New makefile.
+ * use/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
+
+ Make some unitary tests on histo3d library.
+
+ * tests/accu/stat/histo3d_hsl: New directory.
+ * tests/accu/stat/histo3d_hsl/Makefile.am: New makefile.
+ * tests/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
- * mln/accu/histo/histo1d.hh: New header file.
- * mln/accu/histo/histo2d.hh: New header file.
- * mln/accu/histo/histo3d_rgb.hh: New header file.
- * mln/accu/histo/histo3d_hsl.hh: New header file.
2010-06-21 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
diff --git a/scribo/sandbox/green/README b/scribo/sandbox/green/README
index 3efe50d..4b6fb26 100644
--- a/scribo/sandbox/green/README
+++ b/scribo/sandbox/green/README
@@ -153,18 +153,8 @@ d'exécution (chmod 755 gnuplot_shell_file.sh). Comme je trouve le format
extrêmement pratique, il se retrouve preque partout dans mes sources.
-V MLN
------
-
-a) La sauvegarde des images au format gnuplot shell
-
-* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
-
-to do ...
-
-
-
-b) Les histogrammes
+V HISTOGRAMMES
+--------------
Un des travaux demandés par théo est la réalisation d'une librairie
d'histogramme permettant de fournir un résultat sous forme d'image.
@@ -178,20 +168,67 @@ de comptage puisqu'il est décrit sous la forme de triplets de float
contient une séquence d'appels pour les routines permettant de
considérer la dimension de la teinte comme circulaire.
+
+a) version 1d
+
* mln/accu/stat/histo1d.hh: Accumulateur histogramme image1d.
* use/accu/stat/histo1d: Code minimal utilisant un histogramme 1d.
+* tests/accu/stat/histo1d: Test unitaire sur l'histogramme 1d.
+
+
+b) version 2d
-* mln/accu/stat/histo2d.hh: Accumulateur histogramme image2d.
* mln/value/rg.hh: Définition du type vectoriel 2d rouge/vert (RG).
+* use/value/rg: Exemple de code pour l'utilisation de rg.
+
* mln/fun/v2v/rgb_to_rg.hh: Transformation de l'espace RGB vers l'espace RG.
+* use/fun/v2v/rgb_to_rg: Exemple de code pour l'utilisation de rgb_to_rg.
+
+* mln/accu/stat/histo2d.hh: Accumulateur histogramme image2d.
* use/accu/stat/histo2d: Code minimal utilisant un histogramme 2d.
-* mln/accu/stat/histo3d_rgb.hh: Accumulateur histogramme image3d RGB.
-* mln/accu/stat/histo3d_hsl.hh: Accumulateur histogramme image3d HSL.
+c) version 3d RGB
+
+
+* mln/fun/v2v/rgb8_to_rgbn.hh: Diminution de la quantification (n < 8 bits).
+* use/fun/v2v/rgb8_to_rgbn: Exemple de code pour l'utilisation de rgb8_to_rgbn.
+* mln/accu/stat/histo3d_rgb.hh: Accumulateur histogramme image3d RGB.
* use/accu/stat/histo3_rgb: Code minimal utilisant un histogramme 3d RGB.
+
+
+
+d) version 3d HSL
+
+* mln/accu/stat/histo3d_hsl.hh: Accumulateur histogramme image3d HSL.
* use/accu/stat/histo3_hsl: Code minimal utilisant un histogramme 3d HSL.
+* tests/accu/stat/histo3d_hsl: Test unitaire sur l'histogramme HSL 3d.
+
+Le code HSL ne compile plus car l'interface liant la transformation du
+domaine et la fonction fold a changée. Je n'ai pas le temps de
+regarder plus avant.
+
+
+
+V MLN
+-----
+
+a) La sauvegarde des images au format gnuplot shell
+
+* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
+
+to do ...
+
+
+
+b) Les histogrammes
+
+
+
+
+
+
@@ -210,6 +247,12 @@ considérer la dimension de la teinte comme circulaire.
* use/accu/stat/histo3d_hsl
* tests/accu/stat/histo3d_hsl
+VI SAUVEGARDE FORMAT GNUPLOT SHELL
+----------------------------------
+
+
+VII VISUALISATION HISTOGRAMMES 3D
+---------------------------------
c) La visualisation des histogrammes 3d
diff --git a/scribo/sandbox/green/mln/accu/stat/histo1d.hh b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
index d480cf0..fae94c8 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo1d.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo1d.hh
@@ -24,7 +24,7 @@
// executable file might be covered by the GNU General Public License.
#ifndef MLN_ACCU_STAT_HISTO1D_HH
-#define MLN_ACCU_STAT_HISTO1D_HH
+# define MLN_ACCU_STAT_HISTO1D_HH
/// \file
///
@@ -64,24 +64,24 @@
/// }
-#include <iostream>
+# include <iostream>
-#include <mln/accu/internal/base.hh>
+# include <mln/accu/internal/base.hh>
-#include <mln/arith/plus.hh>
+# include <mln/arith/plus.hh>
-#include <mln/core/concept/meta_accumulator.hh>
-#include <mln/core/image/image1d.hh>
-#include <mln/core/macros.hh>
+# include <mln/core/concept/meta_accumulator.hh>
+# include <mln/core/image/image1d.hh>
+# include <mln/core/macros.hh>
-#include <mln/literal/zero.hh>
+# include <mln/literal/zero.hh>
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
-#include <mln/trait/value/comp.hh>
+# include <mln/trait/value/comp.hh>
-#include <mln/value/ops.hh>
+# include <mln/value/ops.hh>
namespace mln
{
@@ -168,7 +168,7 @@ namespace mln
typedef image1d<unsigned> result;
typedef result q_result;
- /// Constructors
+ /// Constructors.
/// \{
/// \brief Infer the size of the resulting image1d domain.
///
@@ -201,7 +201,6 @@ namespace mln
///
/// The end user shouldn't call this method. This is part of
/// data compute interface mechanism.
-
void take(const histo1d<V>& other);
/// \}
@@ -231,11 +230,10 @@ namespace mln
///
/// The operator compares all the bins from the two histograms.
/// Nobody uses this method unless unitary tests.
-
template <typename V>
bool operator==(const histo1d<V>& histo1, const histo1d<V>& histo2);
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
template <typename V>
inline
@@ -328,7 +326,7 @@ namespace mln
return result;
}
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln::accu::stat
diff --git a/scribo/sandbox/green/mln/accu/stat/histo2d.hh b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
index c28723c..11a1bb3 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo2d.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo2d.hh
@@ -73,14 +73,16 @@
# include <mln/accu/internal/base.hh>
+# include <mln/arith/plus.hh>
+
# include <mln/core/macros.hh>
# include <mln/core/image/image2d.hh>
# include <mln/core/alias/point2d.hh>
# include <mln/core/alias/box2d.hh>
-# include <mln/trait/value/comp.hh>
+#include <mln/literal/zero.hh>
-# include <mln/arith/plus.hh>
+# include <mln/trait/value/comp.hh>
# include <mln/trace/entering.hh>
# include <mln/trace/exiting.hh>
@@ -152,13 +154,13 @@ namespace mln
namespace stat
{
- /// \brief Define an histogram which returns an image3d .
+ /// \brief Define a histogram as accumulator which returns an image2d.
///
- /// Param V defines the space in which we count the values.
- /// For instance, this histogram works image2d<rgb<2>> or
- /// image2d<rgb<7>>. The histogram count the occurrence of each value.
- /// The number of bins depends of the grayscale values, for 8 bits there
- /// is 256x3 bins. Note that over
+ /// Param V defines the type of the input image value. It is in
+ /// this space that we count the values. For instance, this
+ /// histogram works well for image2d< rgb<2> > or with image2d<
+ /// rgb<7> >. The number of bins depends directly the values V.
+ /// For 8 bits there is 256x3 bins. Note that less
/// quantification works too.
///
/// \ingroup modaccuvalues
@@ -171,16 +173,15 @@ namespace mln
typedef image2d<unsigned> result;
typedef result q_result;
- /// Constructors
+ /// Constructors.
/// \{
- /// \brief Initialize the size of the resulting image1d.
+ /// \brief Infer the size of the resulting image2d domain.
///
- /// Initialize the size the resulting image from the theorical dynamic
- /// of the greylevel values (Use V to manage it).
+ /// By evaluating the minimum and the maximum of V, we define the domain
+ /// of the resulting image2d.
histo2d();
/// \}
-
/// Manipulators.
/// \{
/// \brief Initialize the histogram with zero value.
@@ -190,23 +191,24 @@ namespace mln
/// density.
void init();
-
- /// \brief Update the histogram with the RGB pixel t.
- /// \param[in] t a greylevel pixel of type V.
+ /// \brief Update the histogram with the RG pixel t.
+ /// \param[in] t a graylevel pixel of type V.
///
/// The end user shouldn't call this method. In place of it, he can
/// go through the data compute interface.
void take(const argument& t);
-
/// \brief Update the histogram with an other histogram.
/// \param[in] other the other histogram.
+ ///
+ /// The end user shouldn't call this method. This is part of
+ /// data compute interface mechanism.
void take(const histo2d<V>& other);
/// \}
/// Accessors.
/// \{
- /// \brief Return the histogram as an image1d.
+ /// \brief Return the histogram as an image2d.
///
/// This is the machinery to communicate with data compute interface.
/// The end user should'nt use it.
@@ -228,19 +230,19 @@ namespace mln
/// \param[in] histo1 the first histogram to compare with.
/// \param[in] histo2 the second histogram.
///
- /// The operator compare all the bins from the two histogram.
-
+ /// The operator compares all the bins from the two histograms.
+ /// Nobody uses this method unless unitary tests.
template <typename V>
bool operator==(const histo2d<V>& histo1,
const histo2d<V>& histo2);
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
template <typename V>
inline
histo2d<V>::histo2d()
{
- trace::entering("mln::accu::stat::histo2d::histo2d");
+ trace::entering("mln::accu::stat::histo2d::cstor");
typedef mln_trait_value_comp(V,0) comp0;
typedef mln_trait_value_comp(V,1) comp1;
@@ -253,31 +255,24 @@ namespace mln
point2d(mln_max(comp0),
mln_max(comp1))));
- trace::exiting("mln::accu::stat::histo2d::histo2d");
+ trace::exiting("mln::accu::stat::histo2d::cstor");
}
template <typename V>
inline
void histo2d<V>::init()
{
- trace::entering("mln::accu::stat::histo2d::init");
-
- data::fill(count_, 0);
- trace::exiting("mln::accu::stat::histo2d::init");
+ data::fill(count_, literal::zero);
}
template <typename V>
inline
void histo2d<V>::take(const argument& t)
{
- trace::entering("mln::accu::stat::histo2d::take");
-
// Just convert a greyscale value (int_u8 like) to a position for an
// iterator on the resulting image.
// Take care to the constructor : Point(slice, row, column)
++count_(point2d(t.red(), t.green()));
-
- trace::exiting("mln::accu::stat::histo2d::take");
}
@@ -285,20 +280,13 @@ namespace mln
inline
void histo2d<V>::take(const histo2d<V>& other)
{
- trace::entering("mln::accu::stat::histo2d::take");
-
count_ += other.count_;
-
- trace::exiting("mln::accu::stat::histo2d::take");
}
template <typename V>
inline
typename histo2d<V>::result histo2d<V>::to_result() const
{
- trace::entering("mln::accu::stat::histo2d::to_result");
-
- trace::exiting("mln::accu::stat::histo2d::to_result");
return count_;
}
@@ -306,9 +294,6 @@ namespace mln
inline
histo2d<V>::operator result() const
{
- trace::entering("mln::accu::stat::histo2d::operator result");
-
- trace::exiting("mln::accu::stat::histo2d::operator result");
return count_;
}
@@ -316,10 +301,8 @@ namespace mln
inline
bool histo2d<V>::is_valid() const
{
- trace::entering("mln::accu::stat::histo2d::is_valid");
bool result = count_.is_valid();
- trace::exiting("mln::accu::stat::histo2d::is_valid");
return result;
}
@@ -327,7 +310,7 @@ namespace mln
bool operator==(const histo2d<V>& histo1,
const histo2d<V>& histo2)
{
- trace::entering("mln::accu::stat::operator==");
+ trace::entering("mln::accu::stat::histo2d::operator==");
bool result = true;
const image2d<unsigned>& res1 = histo1.to_result();
@@ -342,11 +325,11 @@ namespace mln
for_all_2(p1, p2)
result &= (res1(p1) == res2(p2));
- trace::exiting("mln::accu::stat::operator==");
+ trace::exiting("mln::accu::stat::histo2d::operator==");
return result;
}
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln::accu::stat
diff --git a/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
index c84aaa4..35d78e2 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo3d_hsl.hh
@@ -1,6 +1,4 @@
-// Copyright (C) 2007 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
//
// This file is part of Olena.
//
@@ -26,82 +24,115 @@
// executable file might be covered by the GNU General Public License.
#ifndef MLN_ACCU_STAT_HISTO3D_HSL_HH
-#define MLN_ACCU_STAT_HISTO3D_HSL_HH
+# define MLN_ACCU_STAT_HISTO3D_HSL_HH
/// \file
///
-/// \brief Define a histogram as an accumulator which returns an image1d .
+/// \brief Define a histogram as accumulator which returns an HSL image3d.
+///
+/// This source implements the discrete histogram version. It was
+/// created for images which the values are derived from integer
+/// type. The number of bins is given by the user via the q parameter.
+/// It works for HSL space.
///
-/// This source implements the discrete histogram version. The number of beans
-/// is infer from the number of greylevels. A typical int_u8 image has got
-/// 256 bins. An int_u16 image has got 65535 bins.
/// The following sample is a typical use of the histogram.
///
-/// #include <mln/value/int_u8.hh>
-/// #include <mln/core/image/image1d.hh>
+/// #include <mln/accu/stat/histo3d_hsl.hh>
/// #include <mln/core/image/image2d.hh>
-/// #include <mln/io/pgm/load.hh>
-/// #include <mln/accu/stat/histo1d.hh>
+/// #include <mln/core/image/image3d.hh>
/// #include <mln/data/compute.hh>
-/// #include <mln/io/plot/save_histo_sh.hh>
-///
-/// #define OLENA_LENA "/usr/local/share/olena/images/lena.pgm"
+/// #include <mln/data/transform.hh>
+/// #include <mln/fun/v2v/rgb_to_hsl.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/ppm/load.hh>
+/// #include <mln/value/hsl.hh>
+/// #include <mln/value/rgb8.hh>
///
-/// void test()
+/// int main()
/// {
-/// typedef mln::value::int_u8 int_u8;
-/// mln::image2d<int_u8> img_ref;
-/// mln::image1d<unsigned> img_res;
+/// typedef mln::value::rgb8 t_rgb;
+/// typedef mln::value::hsl_f t_hsl;
+/// typedef mln::fun::v2v::f_rgb_to_hsl_<t_hsl> t_rgb_to_hsl;
+/// mln::image2d<t_rgb> img_rgb;
+/// mln::image2d<t_hsl> img_hsl;
+/// mln::image3d<unsigned> histo;
+///
+/// mln::io::ppm::load(img_rgb, OLENA_IMG_PATH"/lena.ppm");
+/// img_hsl = mln::data::transform(img_rgb, t_rgb_to_hsl());
+/// histo=mln::data::compute(mln::accu::meta::stat::histo3d_hsl<7>(),img_hsl);
///
-/// mln::io::pgm::load(img_ref, OLENA_LENA);
-/// img_res = mln::data::compute(mln::accu::stat::histo1d<int_u8>(), img_ref);
+/// return 0;
/// }
+///
+/// \fixme This implementation is very doubtfull ! Be carefull !!
+/// \fixme This code should be compile, but it doesn't!
+/// \fixme The fold interface has changed v2v -> p2p or the inverse.
+
+# include <iostream>
-#include <iostream>
+# include <mln/accu/internal/base.hh>
-#include <mln/accu/internal/base.hh>
+# include <mln/arith/plus.hh>
-#include <mln/core/macros.hh>
-#include <mln/core/image/image3d.hh>
-#include <mln/core/alias/point3d.hh>
-#include <mln/core/alias/box3d.hh>
+# include <mln/core/alias/point3d.hh>
+# include <mln/core/alias/box3d.hh>
+# include <mln/core/image/image3d.hh>
+# include <mln/core/image/dmorph/transformed_image.hh>
+# include <mln/core/macros.hh>
-#include <mln/value/int_u.hh>
-#include <mln/trait/value/comp.hh>
+# include <mln/fun/p2p/fold.hh>
-#include <mln/arith/plus.hh>
+# include <mln/literal/zero.hh>
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
-#include <mln/value/ops.hh>
+# include <mln/trait/value/comp.hh>
-// make hue cyclic
-#include <mln/fun/p2p/fold.hh>
-#include <mln/core/image/dmorph/transformed_image.hh>
+# include <mln/value/int_u.hh>
+# include <mln/value/ops.hh>
namespace mln
{
-
+
namespace accu
{
-
+
namespace stat
{
-
+
// Forward declaration
template <unsigned q, typename V>
struct histo3d_hsl;
} // end of namespace mln::accu::stat
-
- } // end of namespace mln::accu
+ namespace meta
+ {
+
+ namespace stat
+ {
+
+ template <unsigned q>
+ struct histo3d_hsl : public Meta_Accumulator< histo3d_hsl<q> >
+ {
+ template <typename V>
+ struct with
+ {
+ typedef accu::stat::histo3d_hsl<q,V> ret;
+ };
+ };
+
+ } // end of namespace mln::accu::meta::stat
+
+ } // end of namespace mln::accu::meta
+
+ } // end of namespace mln::accu
namespace trait
{
-
+
template <unsigned q, typename V>
struct accumulator_< mln::accu::stat::histo3d_hsl<q,V> >
{
@@ -112,65 +143,59 @@ namespace mln
};
template <unsigned q, typename V>
- struct set_precise_binary_<op::eq,
+ struct set_precise_binary_<op::eq,
accu::stat::histo3d_hsl<q,V>,
accu::stat::histo3d_hsl<q,V> >
{
typedef bool ret;
};
-
+
} // end of namespace mln::trait
namespace accu
{
-
+
namespace stat
- {
+ {
- /// \brief Define an histogram which returns an image1d .
+
+ /// \brief Define a histogram as accumulator which returns an image3d.
///
- /// Param V defines the space in which we count the values.
- /// For instance, this histogram works image2d<int_u8> or
- /// image1d<int_u16>. The histogram count the occurrence of each value.
- /// The number of bins depends of the greyscale values, for 8 bits there
- /// is 256 bins, for 16 bits there is 65536 bins. Note that over
- /// quantification works too.
+ /// Param q defines the number of bins per axe.
+ /// Param V defines the type of the input image value. We assume that
+ /// V is a kind of hsl_<float,float,float>.
///
/// \ingroup modaccuvalues
-
- /// q is the number of bins per axe because quantification info are died.
- /// we assume that V is a kind of hsl_<float,float,float>
-
template <unsigned q, typename V>
- struct histo3d_hsl :
+ struct histo3d_hsl :
public mln::accu::internal::base<image3d<unsigned>, histo3d_hsl<q,V> >
{
typedef V argument;
typedef image3d<unsigned> result;
typedef result q_result;
- /// Constructors
+ /// Constructors.
/// \{
- /// \brief Initialize the size of the resulting image1d.
+ /// \brief Infer the size of the resulting image3d domain.
///
- /// Initialize the size the resulting image from the theorical dynamic
- /// of the greylevel values (Use V to manage it).
+ /// By evaluating the minimum and the maximum of V, we define the domain
+ /// of the resulting image3d.
histo3d_hsl();
/// \}
-
+
/// Manipulators.
/// \{
/// \brief Initialize the histogram with zero value.
///
- /// This method must be called just before starting the use of the
- /// histogram. If it's not, resulting values won't converge to the
+ /// This method must be called just before starting the use of the
+ /// histogram. If it's not, resulting values won't converge to the
/// density.
void init();
-
+
/// \brief Update the histogram with the RGB pixel t.
- /// \param[in] t a greylevel pixel of type V.
+ /// \param[in] t a graylevel pixel of type V.
///
/// The end user shouldn't call this method. In place of it, he can
/// go through the data compute interface.
@@ -179,12 +204,15 @@ namespace mln
/// \brief Update the histogram with an other histogram.
/// \param[in] other the other histogram.
+ ///
+ /// The end user shouldn't call this method. This is part of
+ /// data compute interface mechanism.
void take(const histo3d_hsl<q,V>& other);
/// \}
/// Accessors.
/// \{
- /// \brief Return the histogram as an image1d.
+ /// \brief Return the histogram as an HSL image3d.
///
/// This is the machinery to communicate with data compute interface.
/// The end user should'nt use it.
@@ -208,31 +236,31 @@ namespace mln
const float min_sat;
const float max_sat;
float step_sat;
- result count_;
+ result count_;
};
/// \brief Check wethever an histogram is equal to an other one.
/// \param[in] histo1 the first histogram to compare with.
/// \param[in] histo2 the second histogram.
///
- /// The operator compare all the bins from the two histogram.
-
+ /// The operator compares all the bins from the two histograms.
+ /// Nobody uses this method unless unitary tests.
template <unsigned q, typename V>
- bool operator==(const histo3d_hsl<q,V>& histo1,
+ bool operator==(const histo3d_hsl<q,V>& histo1,
const histo3d_hsl<q,V>& histo2);
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
template <unsigned q, typename V>
inline
histo3d_hsl<q,V>::histo3d_hsl() : min_hue(0.0), max_hue(360.0),
- min_lum(0.0), max_lum(1.0),
- min_sat(0.0), max_sat(1.0)
+ min_lum(0.0), max_lum(1.0),
+ min_sat(0.0), max_sat(1.0)
{
- trace::entering("mln::accu::stat::histo3d_hsl<q,V>::histo3d_hsl");
-
- // As there is no info about preceding color space
- // we ask the end user to specify the quantification he's looking for.
+ trace::entering("mln::accu::stat::histo3d_hsl::cstor");
+
+ /// As there is no info about preceding color space
+ /// we ask the end user to specify the quantification he's looking for.
count_.init_(box3d(point3d(mln_min(value::int_u<q>),
mln_min(value::int_u<q>),
@@ -241,7 +269,7 @@ namespace mln
mln_max(value::int_u<q>),
mln_max(value::int_u<q>))));
- // Make the hue domain cyclic
+ /// Make the hue domain cyclic
fun::p2p::fold<point3d,1,0,0> fold_(count_.domain());
transform_domain(count_, fold_);
@@ -249,39 +277,34 @@ namespace mln
step_lum = (max_lum - min_lum)/q;
step_sat = (max_sat - min_sat)/q;
- trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::histo3d_hsl");
+ trace::exiting("mln::accu::stat::histo3d_hsl::cstor");
}
template <unsigned q, typename V>
inline
void histo3d_hsl<q,V>::init()
{
- trace::entering("mln::accu::stat::histo3d_hsl<q,V>::init");
-
- data::fill(count_, 0);
- trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::init");
+ data::fill(count_, literal::zero);
}
template <unsigned q, typename V>
inline
void histo3d_hsl<q,V>::take(const argument& t)
{
- trace::entering("mln::accu::stat::histo3d_hsl<q,V>::take");
-
- // Just convert a greyscale value (int_u8 like) to a position for an
+ // Just convert a greyscale value (int_u8 like) to a position for an
// iterator on the resulting image.
//++count_(point3d(t.red(), t.green(), t.blue()));
-
-
+
+
// Technical way to access i° component without kwnowing the name
// mln::trait::value_<argument>::get_comp_0(t);
-
+
// is def::coord1d the type of x, y, z ??
unsigned x = (t.hue() - min_hue)/step_hue;
- unsigned y = (t.lum() - min_lum)/step_lum;
- unsigned z = (t.sat() - min_sat)/step_sat;
+ unsigned y = (t.sat() - min_sat)/step_sat;
+ unsigned z = (t.lum() - min_lum)/step_lum;
/*
-
+
std::cout << "H : " << t.hue() << std::endl;
std::cout << "L : " << t.lum() << std::endl;
std::cout << "S : " << t.sat() << std::endl;
@@ -295,66 +318,50 @@ namespace mln
std::cout << "Z : " << z << std::endl;
*/
- // faire attention avec les histoires de points et leurs coordonnées
++count_(point3d(z, x, y));
- //++count_(point3d(t.hue(), t.sat(), t.lum()));
-
- trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::take");
}
-
+
template <unsigned q, typename V>
inline
void histo3d_hsl<q,V>::take(const histo3d_hsl<q,V>& other)
{
- trace::entering("mln::accu::stat::histo3d_hsl<q,V>::take");
-
count_ += other.count_;
-
- trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::take");
}
-
+
template <unsigned q, typename V>
inline
typename histo3d_hsl<q,V>::result histo3d_hsl<q,V>::to_result() const
{
- trace::entering("mln::accu::stat::histo3d_hsl<q,V>::to_result");
-
- trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::to_result");
return count_;
}
-
+
template <unsigned q, typename V>
inline
histo3d_hsl<q,V>::operator result() const
{
- trace::entering("mln::accu::stat::histo3d_rgb<q,V>::operator result");
-
- trace::exiting("mln::accu::stat::histo3d_rgb<q,V>::operator result");
return count_;
- }
+ }
template <unsigned q, typename V>
inline
bool histo3d_hsl<q,V>::is_valid() const
{
- trace::entering("mln::accu::stat::histo3d_hsl<q,V>::is_valid");
bool result = count_.is_valid();
-
- trace::exiting("mln::accu::stat::histo3d_hsl<q,V>::is_valid");
+
return result;
}
template <unsigned q, typename V>
- bool operator==(const histo3d_hsl<q,V>& histo1,
+ bool operator==(const histo3d_hsl<q,V>& histo1,
const histo3d_hsl<q,V>& histo2)
{
- trace::entering("mln::accu::stat::operator==");
+ trace::entering("mln::accu::stat::histo3d_hsl::operator==");
bool result = true;
const image3d<unsigned>& res1 = histo1.to_result();
const image3d<unsigned>& res2 = histo2.to_result();
-
+
mln_precondition(res1.is_valid());
mln_precondition(res2.is_valid());
@@ -364,11 +371,11 @@ namespace mln
for_all_2(p1, p2)
result &= (res1(p1) == res2(p2));
- trace::exiting("mln::accu::stat::operator==");
+ trace::exiting("mln::accu::stat::histo3d_hsl::operator==");
return result;
}
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln::accu::stat
@@ -377,4 +384,4 @@ namespace mln
} // end of namespace mln
-#endif // ! MLN_ACCU_STAT_HISTO3D_RGB_HH
+#endif // ! MLN_ACCU_STAT_HISTO3D_HSL_HH
diff --git a/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh b/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
index 48c49da..6a48024 100644
--- a/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
+++ b/scribo/sandbox/green/mln/accu/stat/histo3d_rgb.hh
@@ -1,6 +1,4 @@
-// Copyright (C) 2007 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
//
// This file is part of Olena.
//
@@ -26,54 +24,67 @@
// executable file might be covered by the GNU General Public License.
#ifndef MLN_ACCU_STAT_HISTO3D_RGB_HH
-#define MLN_ACCU_STAT_HISTO3D_RGB_HH
+# define MLN_ACCU_STAT_HISTO3D_RGB_HH
/// \file
///
-/// \brief Define a histogram as an accumulator which returns an image1d .
+/// \brief Define a histogram as accumulator which returns an image3d.
+///
+/// This source implements the discrete histogram version. It was
+/// created for images which the values are derived from integer
+/// type. The number of bins is directly infered from the cardinality
+/// of the image value. It works for RGB space. See histo1d.hh for limitations
+/// of such implementation. 8 bits quantification is very
+/// expensive, it produces image3d with [0..255,0..255,0..255] as domain.
///
-/// This source implements the discrete histogram version. The number of beans
-/// is infer from the number of greylevels. A typical rgb8 image has got
-/// 256x3 bins. Working with a 8 bit quantification in rgb is very costly.
/// The following sample is a typical use of the histogram.
///
-/// #include <mln/value/rgb.hh>
-/// #include <mln/core/image/image1d.hh>
-/// #include <mln/core/image/image3d.hh>
-/// #include <mln/io/ppm/load.hh>
/// #include <mln/accu/stat/histo3d_rgb.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/core/image/image3d.hh>
/// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.hh>
+/// #include <mln/fun/v2v/rgb8_to_rgbn.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/ppm/load.hh>
+/// #include <mln/value/rgb.hh>
+/// #include <mln/value/rgb8.hh>
///
-/// #define OLENA_LENA ""/usr/local/share/olena/images/lena.ppm"
-///
-/// void test()
+/// int main()
/// {
-/// typedef mln::value::rgb<7> rgb7;
-/// mln::image2d<rgb7> img_ref;
-/// mln::image3d<unsigned> img_res;
+/// typedef mln::value::rgb8 t_rgb8;
+/// typedef mln::value::rgb<7> t_rgb7;
+/// mln::image2d<t_rgb8> img_rgb8;
+/// mln::image2d<t_rgb7> img_rgb7;
+/// mln::image3d<unsigned> histo;
///
-/// mln::io::ppm::load(img_ref, OLENA_LENA);
-/// img_res=mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_ref);
+/// mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+/// img_rgb7 =mln::data::transform(img_rgb8,mln::fun::v2v::rgb8_to_rgbn<7>());
+/// histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_rgb7);
+///
+/// return 0;
/// }
-#include <iostream>
+# include <iostream>
+
+# include <mln/accu/internal/base.hh>
-#include <mln/accu/internal/base.hh>
+# include <mln/arith/plus.hh>
-#include <mln/core/macros.hh>
-#include <mln/core/image/image3d.hh>
-#include <mln/core/alias/point3d.hh>
-#include <mln/core/alias/box3d.hh>
+# include <mln/core/macros.hh>
+# include <mln/core/image/image3d.hh>
+# include <mln/core/alias/point3d.hh>
+# include <mln/core/alias/box3d.hh>
-#include <mln/trait/value/comp.hh>
+# include <mln/literal/zero.hh>
-#include <mln/arith/plus.hh>
+# include <mln/trace/entering.hh>
+# include <mln/trace/exiting.hh>
-#include <mln/trace/entering.hh>
-#include <mln/trace/exiting.hh>
+# include <mln/trait/value/comp.hh>
-#include <mln/value/ops.hh>
+# include <mln/value/ops.hh>
namespace mln
{
@@ -140,13 +151,13 @@ namespace mln
namespace stat
{
- /// \brief Define an histogram which returns an image3d .
+ /// \brief Define a histogram as accumulator which returns an image3d.
///
- /// Param V defines the space in which we count the values.
- /// For instance, this histogram works image2d<rgb<2>> or
- /// image2d<rgb<7>>. The histogram count the occurrence of each value.
- /// The number of bins depends of the grayscale values, for 8 bits there
- /// is 256x3 bins. Note that over
+ /// Param V defines the type of the input image value. It is in
+ /// this space that we count the values. For instance, this
+ /// histogram works well for image2d< rgb<2> > or with image2d<
+ /// rgb<7> >. The number of bins depends directly the values V.
+ /// For 8 bits there is 256x3 bins. Note that less
/// quantification works too.
///
/// \ingroup modaccuvalues
@@ -159,16 +170,15 @@ namespace mln
typedef image3d<unsigned> result;
typedef result q_result;
- /// Constructors
+ /// Constructors.
/// \{
- /// \brief Initialize the size of the resulting image1d.
+ /// \brief Infer the size of the resulting image3d domain.
///
- /// Initialize the size the resulting image from the theorical dynamic
- /// of the greylevel values (Use V to manage it).
+ /// By evaluating the minimum and the maximum of V, we define the domain
+ /// of the resulting image3d.
histo3d_rgb();
/// \}
-
/// Manipulators.
/// \{
/// \brief Initialize the histogram with zero value.
@@ -180,7 +190,7 @@ namespace mln
/// \brief Update the histogram with the RGB pixel t.
- /// \param[in] t a greylevel pixel of type V.
+ /// \param[in] t a graylevel pixel of type V.
///
/// The end user shouldn't call this method. In place of it, he can
/// go through the data compute interface.
@@ -189,12 +199,15 @@ namespace mln
/// \brief Update the histogram with an other histogram.
/// \param[in] other the other histogram.
+ ///
+ /// The end user shouldn't call this method. This is part of
+ /// data compute interface mechanism.
void take(const histo3d_rgb<V>& other);
/// \}
/// Accessors.
/// \{
- /// \brief Return the histogram as an image1d.
+ /// \brief Return the histogram as an RGB image3d.
///
/// This is the machinery to communicate with data compute interface.
/// The end user should'nt use it.
@@ -216,19 +229,19 @@ namespace mln
/// \param[in] histo1 the first histogram to compare with.
/// \param[in] histo2 the second histogram.
///
- /// The operator compare all the bins from the two histogram.
-
+ /// The operator compares all the bins from the two histograms.
+ /// Nobody uses this method unless unitary tests.
template <typename V>
bool operator==(const histo3d_rgb<V>& histo1,
const histo3d_rgb<V>& histo2);
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
template <typename V>
inline
histo3d_rgb<V>::histo3d_rgb()
{
- trace::entering("mln::accu::stat::histo3d_rgb<V>::histo3d_rgb");
+ trace::entering("mln::accu::stat::histo3d_rgb::cstor");
typedef mln_trait_value_comp(V,0) comp0;
typedef mln_trait_value_comp(V,1) comp1;
typedef mln_trait_value_comp(V,2) comp2;
@@ -244,31 +257,24 @@ namespace mln
mln_max(comp1),
mln_max(comp2))));
- trace::exiting("mln::accu::stat::histo3d_rgb<V>::histo3d_rgb");
+ trace::exiting("mln::accu::stat::histo3d_rgb::cstor");
}
template <typename V>
inline
void histo3d_rgb<V>::init()
{
- trace::entering("mln::accu::stat::histo3d_rgb<V>::init");
-
- data::fill(count_, 0);
- trace::exiting("mln::accu::stat::histo3d_rgb<V>::init");
+ data::fill(count_, literal::zero);
}
template <typename V>
inline
void histo3d_rgb<V>::take(const argument& t)
{
- trace::entering("mln::accu::stat::histo3d_rgb<V>::take");
-
// Just convert a greyscale value (int_u8 like) to a position for an
// iterator on the resulting image.
// Take care to the constructor : Point(slice, row, column)
++count_(point3d(t.blue(), t.red(), t.green()));
-
- trace::exiting("mln::accu::stat::histo3d_rgb<V>::take");
}
@@ -276,20 +282,13 @@ namespace mln
inline
void histo3d_rgb<V>::take(const histo3d_rgb<V>& other)
{
- trace::entering("mln::accu::stat::histo3d_rgb<V>::take");
-
count_ += other.count_;
-
- trace::exiting("mln::accu::stat::histo3d_rgb<V>::take");
}
template <typename V>
inline
typename histo3d_rgb<V>::result histo3d_rgb<V>::to_result() const
{
- trace::entering("mln::accu::stat::histo3d_rgb<V>::to_result");
-
- trace::exiting("mln::accu::stat::histo3d_rgb<V>::to_result");
return count_;
}
@@ -297,9 +296,6 @@ namespace mln
inline
histo3d_rgb<V>::operator result() const
{
- trace::entering("mln::accu::stat::histo3d_rgb<V>::operator result");
-
- trace::exiting("mln::accu::stat::histo3d_rgb<V>::operator result");
return count_;
}
@@ -307,10 +303,8 @@ namespace mln
inline
bool histo3d_rgb<V>::is_valid() const
{
- trace::entering("mln::accu::stat::histo3d_rgb<V>::is_valid");
bool result = count_.is_valid();
- trace::exiting("mln::accu::stat::histo3d_rgb<V>::is_valid");
return result;
}
@@ -318,7 +312,7 @@ namespace mln
bool operator==(const histo3d_rgb<V>& histo1,
const histo3d_rgb<V>& histo2)
{
- trace::entering("mln::accu::stat::operator==");
+ trace::entering("mln::accu::stat::histo3d_rgb::operator==");
bool result = true;
const image3d<unsigned>& res1 = histo1.to_result();
@@ -333,11 +327,11 @@ namespace mln
for_all_2(p1, p2)
result &= (res1(p1) == res2(p2));
- trace::exiting("mln::accu::stat::operator==");
+ trace::exiting("mln::accu::stat::histo3d_rgb::operator==");
return result;
}
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln::accu::stat
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh b/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
index 2918b1a..acf1b5e 100644
--- a/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb8_to_rgbn.hh
@@ -1,6 +1,4 @@
-// Copyright (C) 2007 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
//
// This file is part of Olena.
//
@@ -35,6 +33,37 @@
/// \file
///
/// \brief Convert rgb8 value to rgbn, n < 8.
+///
+/// The source implements the reduction of quantification for any size less 8.
+///
+/// The following sample is a typical use of the histogram.
+///
+/// #include <mln/accu/stat/histo3d_rgb.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/core/image/image3d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/data/transform.hh>
+/// #include <mln/fun/v2v/rgb8_to_rgbn.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/ppm/load.hh>
+/// #include <mln/value/rgb.hh>
+/// #include <mln/value/rgb8.hh>
+///
+/// int main()
+/// {
+/// typedef mln::value::rgb8 t_rgb8;
+/// typedef mln::value::rgb<7> t_rgb7;
+/// mln::image2d<t_rgb8> img_rgb8;
+/// mln::image2d<t_rgb7> img_rgb7;
+/// mln::image3d<unsigned> histo;
+///
+/// mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+/// img_rgb7 =mln::data::transform(img_rgb8,mln::fun::v2v::rgb8_to_rgbn<7>());
+/// histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(),img_rgb7);
+///
+/// return 0;
+/// }
+
namespace mln
{
@@ -45,16 +74,24 @@ namespace mln
namespace v2v
{
- /// \brief Convert rgb8 value to rgbn, n < 8.
+ /// \brief Convert a rgb8 value to a rgn, n < 8.
+ ///
+ /// Param n defines the output quantification used for the transformation.
///
/// \ingroup modfunv2v
-
template <unsigned n>
struct rgb8_to_rgbn : Function_v2v< rgb8_to_rgbn<n> >
{
typedef value::rgb8 argument;
typedef value::rgb<n> result;
+ /// \brief Convert a rgb8 value to a rgn, n < 8.
+ ///
+ /// \param[in] v the rgb8 value to convert.
+ ///
+ /// Conversion is done by computing the size by which we
+ /// divide each rgb component.
+
result operator()(const argument& c) const
{
mln_precondition(8 > n);
@@ -65,7 +102,7 @@ namespace mln
std::cout << "red : " << c.red() << std::endl;
std::cout << "size : " << size << std::endl;
std::cout << "res : " << (c.red() / size) << std::endl;
- std::cout << "max : " << (mln_max(mln::value::int_u<n>)) << std::endl;
+ std::cout << "max : " << (mln_max(mln::value::int_u<n>))<< std::endl;
*/
result res(c.red() / size, c.green() / size, c.blue() / size);
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh b/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
index d4c1e46..e9450e1 100644
--- a/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
+++ b/scribo/sandbox/green/mln/fun/v2v/rgb_to_rg.hh
@@ -81,7 +81,6 @@ namespace mln
/// Param n defines the quantification used for rgb space and rg space.
///
/// \ingroup modfunv2v
-
template <unsigned n>
struct rgb_to_rg : Function_v2v< rgb_to_rg<n> >
{
@@ -95,7 +94,6 @@ namespace mln
/// Conversion is done by calling the rg constructor. There is
/// no modification of values. The red/green fields from rgb the value
/// are preserved. Blue value is dropped.
-
result operator()(const argument& v) const
{
return value::rg<n>(v);
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
index 5a5c4c4..2fdc7dd 100644
--- a/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
+++ b/scribo/sandbox/green/tests/accu/stat/histo1d/histo1d.cc
@@ -1,21 +1,507 @@
-/// TEST HISTO1D
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+/// \file
+///
+/// \brief This source manages unitary testing on image1d histogram component.
+///
+/// Tests are performed in 8 bits and also in 14 bits quantification. The goal
+/// is to go through each programmatic flow to verify the conformity of the
+/// code. It sounds like a theoritic model of unitary testing for milena.
+/// The last test enables statistic computations on that component.
+
+#include <mln/accu/math/count.hh>
+#include <mln/accu/math/sum.hh>
#include <mln/accu/stat/histo1d.hh>
+#include <mln/accu/stat/mean.hh>
+#include <mln/accu/stat/variance.hh>
+
+#include <mln/core/alias/box1d.hh>
+#include <mln/core/alias/point1d.hh>
+#include <mln/core/contract.hh>
+#include <mln/core/grids.hh>
+#include <mln/core/routine/initialize.hh>
+
#include <mln/data/compute.hh>
-#include <mln/core/image/image1d.hh>
-#include <mln/core/image/image2d.hh>
+#include <mln/data/fill.hh>
+#include <mln/data/transform.hh>
+
+#include <mln/fun/v2v/int_u16_to_int_u14.hh>
+
#include <mln/img_path.hh>
+
#include <mln/io/pgm/load.hh>
+
+#include <mln/math/sqr.hh>
+#include <mln/math/abs.hh>
+
#include <mln/value/int_u8.hh>
+#include <mln/value/int_u16.hh>
+
+
+/// Specific histogram accumulators.
+/// \{
+/// \brief Define statistical accumulator for histogram.
+///
+/// Here, some histogram accumulators are defined, the sum of the frequencies,
+/// the average, the variance.
+
+double count_histo(const mln::image1d<unsigned> img)
+{
+ mln_precondition(img.is_valid());
+
+ double result = 0.0;
+ double value = 0.0;
+ mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+ for_all(p)
+ {
+ value = img(p);
+ result += value;
+ }
+
+ return result;
+}
+
+double mean_histo(mln::image1d<unsigned> img)
+{
+ mln_precondition(img.is_valid());
+
+ double value = 0.0;
+ double site = 0.0;
+ double count = 0.0;
+ double sum = 0.0;
+ double result = 0.0;
+ mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+ for_all(p)
+ {
+ value = img(p);
+ site = p.ind();
+ count += value;
+ sum += site * value;
+ }
+
+ result = sum / count;
+
+ return result;
+}
+
+
+/// \fixme there is a conversion type problem with the interface of iterator p.
+
+double var_histo(const mln::image1d<unsigned> img)
+{
+ mln_precondition(img.is_valid());
+
+ double value = 0.0;
+ double site = 0.0;
+ // FIXME: such variables value and site are necessary to obtain the
+ // well computation of the variance.
+
+ double count = 0.0;
+ double sum = 0.0;
+ double sum2 = 0.0;
+ double result = 0.0;
+ mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+ for_all(p)
+ {
+ value = img(p);
+ site = p.ind();
+ count += value;
+ sum += site * value;
+ sum2 += mln::math::sqr(site) * value;
+ }
+
+ result = sum2 / count - (sum / count) * (sum / count);
+
+ return result;
+}
+
+
+/// \fixme there is a conversion type problem with the interface of iterator p.
+
+double var_histo2(const mln::image1d<unsigned> img)
+{
+ mln_precondition(img.is_valid());
+
+ double value = 0.0;
+ double site = 0.0;
+ // FIXME: such variables value and site are necessary to obtain the
+ // well computation of the variance.
+
+ double count = count_histo(img);
+ double mean = mean_histo(img);
+ double result = 0.0;
+ mln_piter_(mln::image1d<unsigned>) p(img.domain());
+
+ for_all(p)
+ {
+ value = img(p);
+ site = p.ind();
+ result += value * mln::math::sqr(site - mean);
+ }
+
+ result /= count;
+
+ return result;
+}
+
+/// \}
+
+
+/// 8-bits testing
+/// \{
+/// \brief This part of the code manages the 8-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
+
+void test_8bits_operator_equal()
+{
+ using namespace mln::accu::stat;
+
+ typedef mln::value::int_u8 int_u8;
+ mln::accu::stat::histo1d<int_u8> histo1;
+ mln::accu::stat::histo1d<int_u8> histo2;
+ int_u8 val = 3;
+
+ histo1.init();
+ histo2.init();
+
+ mln_assertion(histo1 == histo2);
+
+ histo1.take(val);
+
+ mln_assertion(!(histo1 == histo2));
+ // mln_assertion(histo1 != histo2);
+ // FIXME: DOESN'T WORK !!
+
+ histo2.take(val);
+
+ mln_assertion(histo1 == histo2);
+
+ std::cout << "(08 bits) histo == histo : ok" << std::endl;
+}
+
+void test_8bits_instantiation_without_argument()
+{
+ typedef mln::value::int_u8 int_u8;
+ const mln::accu::stat::histo1d<int_u8> histo;
+ const mln::image1d<unsigned>& res = histo.to_result();
+ const mln::point1d& min = mln::point1d(mln_min(int_u8));
+ const mln::point1d& max = mln::point1d(mln_max(int_u8));
+ const mln::box1d& ref = mln::box1d(min, max);
+
+ mln_assertion(ref == res.domain());
+ mln_assertion(res.is_valid());
+
+ std::cout << "(08 bits) histo<T> histo : ok" << std::endl;
+}
+
+
+void test_8bits_initialization()
+{
+ typedef mln::value::int_u8 int_u8;
+ mln::accu::stat::histo1d<int_u8> histo;
+ mln::image1d<unsigned> img_res = histo.to_result();
+ mln::image1d<unsigned> img_ref;
+
+ mln::initialize(img_ref, img_res);
+ mln::data::fill(img_ref, 0);
+ histo.init();
+
+ unsigned res = mln::data::compute(mln::accu::math::sum<int_u8>(), img_res);
+ unsigned ref = mln::data::compute(mln::accu::math::sum<int_u8>(), img_ref);
+
+ mln_assertion(ref == res);
+
+ std::cout << "(08 bits) histo.init() : ok" << std::endl;
+}
+
+
+void test_8bits_take_argument()
+{
+ typedef mln::value::int_u8 int_u8;
+ mln::accu::stat::histo1d<int_u8> histo1;
+ mln::accu::stat::histo1d<int_u8> histo2;
+ int_u8 val = 3;
+
+ histo1.init();
+ histo2.init();
+ histo1.take(val);
+
+ const mln::image1d<unsigned> img1 = histo1.to_result();
+ const mln::image1d<unsigned> img2 = histo2.to_result();
+
+ const unsigned res = mln::data::compute(mln::accu::math::sum<int_u8>(), img1);
+ const unsigned ref = mln::data::compute(mln::accu::math::sum<int_u8>(), img2);
+
+ mln_assertion(ref == res-1);
+ mln_assertion(1 == img1(mln::point1d(val)));
+
+ std::cout << "(08 bits) histo.take(argument) : ok" << std::endl;
+}
+
+
+void test_8bits_take_other()
+{
+ typedef mln::value::int_u8 int_u8;
+ mln::accu::stat::histo1d<int_u8> histo1;
+ mln::accu::stat::histo1d<int_u8> histo2;
+ mln::accu::stat::histo1d<int_u8> histo3;
+ int_u8 val = 3;
+
+ histo1.init();
+ histo2.init();
+ histo3.init();
+
+ histo1.take(val);
+ histo1.take(val);
+ histo3.take(val);
+ histo2.take(val);
+ histo2.take(histo3);
+
+ mln_assertion(histo1 == histo2);
+
+ std::cout << "(08 bits) histo.take(other) : ok" << std::endl;
+}
+
+void test_8bits_integration()
+{
+ typedef mln::value::int_u8 int_u8;
+ typedef mln::accu::math::count<double> count;
+ typedef mln::accu::math::sum<double> sum;
+ typedef mln::accu::stat::mean<double> mean;
+ typedef mln::accu::stat::variance<double> variance;
+
+ mln::image2d<int_u8> img_ref;
+ mln::image1d<unsigned> img_res;
+
+ mln::io::pgm::load(img_ref, OLENA_IMG_PATH"/lena.pgm");
+
+ const double count_ref = mln::data::compute(count(), img_ref);
+ const double mean_ref = mln::data::compute(mean(), img_ref);
+ const double var_ref = mln::data::compute(variance(), img_ref);
+
+ img_res = mln::data::compute(mln::accu::meta::stat::histo1d(), img_ref);
+
+ const double count_res = count_histo(img_res);
+ const double mean_res = mean_histo(img_res);
+ const double var_res = var_histo(img_res);
+
+ mln_assertion(count_ref == count_res);
+ mln_assertion( mean_ref == mean_res );
+
+ // std::cout << "var_ref : " << var_ref << std::endl;
+ // std::cout << "var_res : " << var_res << std::endl;
+
+ mln_assertion(0.0001 > mln::math::abs(var_ref - var_res));
+
+ std::cout << "(08 bits) test integration : ok" << std::endl;
+}
+
+/// \}
+
+/// 14-bits testing
+/// \{
+/// \brief This part of the code manages the 14-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
+
+void test_14bits_operator_equal()
+{
+ using namespace mln::accu::stat;
+
+ typedef mln::value::int_u<14> int_u14;
+ mln::accu::stat::histo1d<int_u14> histo1;
+ mln::accu::stat::histo1d<int_u14> histo2;
+ int_u14 val = 3;
+
+ histo1.init();
+ histo2.init();
+
+ mln_assertion(histo1 == histo2);
+
+ histo1.take(val);
+
+ /// FIXME: mln_assertion(histo1 != histo2); doesn't work!!
+ mln_assertion(!(histo1 == histo2));
+
+ histo2.take(val);
+
+ mln_assertion(histo1 == histo2);
+
+ std::cout << "(14 bits) histo == histo : ok" << std::endl;
+}
+
+void test_14bits_instantiation_without_argument()
+{
+ typedef mln::value::int_u<14> int_u14;
+ const mln::accu::stat::histo1d<int_u14> histo;
+ const mln::image1d<unsigned>& res = histo.to_result();
+ const mln::point1d& min =mln::point1d(mln_min(int_u14));
+ const mln::point1d& max =mln::point1d(mln_max(int_u14));
+ const mln::box1d& ref = mln::box1d(min, max);
+
+ mln_assertion(ref == res.domain());
+ mln_assertion(res.is_valid());
+
+ std::cout << "(14 bits) histo<T> histo : ok" << std::endl;
+}
+
+
+void test_14bits_initialization()
+{
+ typedef mln::value::int_u<14> int_u14;
+ mln::accu::stat::histo1d<int_u14> histo;
+ mln::image1d<unsigned> img_res = histo.to_result();
+ mln::image1d<unsigned> img_ref;
+
+ mln::initialize(img_ref, img_res);
+ mln::data::fill(img_ref, 0);
+ histo.init();
+
+ unsigned res = mln::data::compute(mln::accu::math::sum<int_u14>(), img_res);
+ unsigned ref = mln::data::compute(mln::accu::math::sum<int_u14>(), img_ref);
+
+ mln_assertion(ref == res);
+
+ std::cout << "(14 bits) histo.init() : ok" << std::endl;
+}
+
+
+void test_14bits_take_argument()
+{
+ typedef mln::value::int_u<14> int_u14;
+ mln::accu::stat::histo1d<int_u14> histo1;
+ mln::accu::stat::histo1d<int_u14> histo2;
+ int_u14 val = 3;
+
+ histo1.init();
+ histo2.init();
+ histo1.take(val);
+
+ const mln::image1d<unsigned> img1 = histo1.to_result();
+ const mln::image1d<unsigned> img2 = histo2.to_result();
+
+ const unsigned res = mln::data::compute(mln::accu::math::sum<int_u14>(),img1);
+ const unsigned ref = mln::data::compute(mln::accu::math::sum<int_u14>(),img2);
+
+ mln_assertion(ref == res-1);
+ mln_assertion(1 == img1(mln::point1d(val)));
+
+ std::cout << "(14 bits) histo.take(argument) : ok" << std::endl;
+}
+
+
+void test_14bits_take_other()
+{
+ typedef mln::value::int_u<14> int_u14;
+ mln::accu::stat::histo1d<int_u14> histo1;
+ mln::accu::stat::histo1d<int_u14> histo2;
+ mln::accu::stat::histo1d<int_u14> histo3;
+ int_u14 val = 3;
+
+ histo1.init();
+ histo2.init();
+ histo3.init();
+
+ histo1.take(val);
+ histo1.take(val);
+ histo3.take(val);
+ histo2.take(val);
+ histo2.take(histo3);
+
+ mln_assertion(histo1 == histo2);
+
+ std::cout << "(14 bits) histo.take(other) : ok" << std::endl;
+}
+
+void test_14bits_integration()
+{
+ typedef mln::value::int_u16 int_u16;
+ typedef mln::value::int_u<14> int_u14;
+ typedef mln::accu::math::count<double> count;
+ typedef mln::accu::math::sum<double> sum;
+ typedef mln::accu::stat::mean<double> mean;
+ typedef mln::accu::stat::variance<double> variance;
+
+ mln::image2d<int_u16> img_fst;
+ mln::image2d<int_u14> img_ref;
+ mln::image1d<unsigned> img_res;
+
+ mln::io::pgm::load(img_fst, OLENA_IMG_PATH"/lena_16_imageMagick.pgm");
+ img_ref = mln::data::transform(img_fst, mln::fun::v2v::int_u16_to_int_u14());
+
+ const double count_ref = mln::data::compute(count(), img_ref);
+ const double mean_ref = mln::data::compute(mean(), img_ref);
+ const double var_ref = mln::data::compute(variance(), img_ref);
+
+ img_res = mln::data::compute(mln::accu::stat::histo1d<int_u14>(), img_ref);
+
+ const double count_res = count_histo(img_res);
+ const double mean_res = mean_histo(img_res);
+ const double var_res = var_histo2(img_res);
+
+ //std::cout << "var_res : " << var_res << std::endl;
+ //std::cout << "var_ref : " << var_ref << std::endl;
+
+ mln_assertion(count_ref == count_res);
+ mln_assertion( mean_ref == mean_res );
+ mln_assertion(0.0001 > abs(var_ref - var_res));
+
+ std::cout << "(14 bits) test integration : ok" << std::endl;
+}
+
+/// \}
int main()
{
- typedef mln::value::int_u8 t_int_u8;
- mln::image2d<t_int_u8> img;
- mln::image1d<unsigned> histo;
+ test_8bits_operator_equal();
+ test_8bits_instantiation_without_argument();
+ test_8bits_initialization();
+ test_8bits_take_argument();
+ test_8bits_take_other();
+ test_8bits_operator_equal();
+ test_8bits_integration();
- mln::io::pgm::load(img, OLENA_IMG_PATH"/lena.pgm");
- histo = mln::data::compute(mln::accu::meta::stat::histo1d(), img);
+ test_14bits_instantiation_without_argument();
+ test_14bits_initialization();
+ test_14bits_take_argument();
+ test_14bits_take_other();
+ test_14bits_operator_equal();
+ test_14bits_integration();
return 0;
}
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/tests/accu/stat/histo3d_hsl/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/tests/accu/stat/histo3d_hsl/Makefile.am
diff --git a/milena/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc b/scribo/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
similarity index 73%
copy from milena/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
copy to scribo/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
index 0a12706..eed377c 100644
--- a/milena/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
+++ b/scribo/sandbox/green/tests/accu/stat/histo3d_hsl/histo3d_hsl.cc
@@ -1,66 +1,189 @@
-/// TEST HISTO3D_HSL
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief This source manages unitary testing on rgb image3d histogram.
+///
+/// Tests are performed from 2 bits up to 8 bits quantification. The goal
+/// is to go through each programmatic flow to verify the conformity of the
+/// code. It sounds like a theoritic model of unitary testing for milena.
+/// The last test enables statistic computations on that component.
-#include <mln/img_path.hh>
-
-#include <mln/io/plot/save_histo_sh.hh>
+#include <mln/accu/math/sum.hh>
+#include <mln/accu/math/count.hh>
#include <mln/accu/stat/histo3d_hsl.hh>
-#include <mln/fun/v2v/rgb8_to_rgbn.hh>
-#include <mln/fun/v2v/rgb_to_hsl.hh>
+#include <mln/accu/stat/mean.hh>
+#include <mln/accu/stat/variance.hh>
+#include <mln/accu/stat/var.hh>
-#include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-#include <mln/io/pfm/save.hh>
-#include <mln/io/plot/save.hh>
+#include <mln/core/alias/box3d.hh>
+#include <mln/core/alias/point3d.hh>
+#include <mln/core/contract.hh>
+#include <mln/core/grids.hh>
+#include <mln/core/routine/initialize.hh>
#include <mln/data/compute.hh>
-#include <mln/data/transform.hh>
#include <mln/data/fill.hh>
+#include <mln/data/transform.hh>
+
+#include <mln/fun/v2v/rgb_to_hsl.hh>
+
+#include <mln/img_path.hh>
+
+#include <mln/io/ppm/load.hh>
+
+#include <mln/literal/zero.hh>
+
+#include <mln/math/sqr.hh>
+#include <mln/math/abs.hh>
-#include <mln/value/label_8.hh>
#include <mln/value/rgb8.hh>
#include <mln/value/hsl.hh>
-#include <mln/value/rgb.hh>
-#include <mln/value/int_u.hh>
-#include <mln/core/alias/neighb3d.hh>
-#include <mln/core/alias/box3d.hh>
-#include <mln/core/alias/point3d.hh>
+/// Specific histogram accumulators.
+/// \{
+/// \brief Define statistical accumulator for histogram.
+///
+/// Here, some histogram accumulators are defined, the sum of the frequencies,
+/// the average, the variance.
-#include <mln/core/routine/initialize.hh>
-#include <mln/core/contract.hh>
-#include <mln/core/grids.hh>
+double count_histo(const mln::image3d<unsigned>& img)
+{
+ mln_precondition(img.is_valid());
-#include <mln/accu/math/sum.hh>
-#include <mln/accu/math/count.hh>
-#include <mln/accu/stat/mean.hh>
-#include <mln/accu/stat/variance.hh>
-#include <mln/accu/stat/var.hh>
+ double result = 0.0;
+ mln_piter_(mln::image3d<unsigned>) p(img.domain());
-#include <mln/morpho/watershed/flooding.hh>
-#include <mln/morpho/elementary/dilation.hh>
-#include <mln/morpho/elementary/closing.hh>
+ for_all(p)
+ result += img(p);
-#include <mln/literal/zero.hh>
-#include <mln/linear/convolve.hh>
-#include <mln/linear/gaussian.hh>
-#include <mln/labeling/regional_maxima.hh>
-#include <mln/labeling/colorize.hh>
-#include <mln/labeling/mean_values.hh>
+ return result;
+}
-#include <mln/make/w_window3d.hh>
+mln::algebra::vec<3,float> conv(const mln::algebra::vec<3,float>& vec,
+ const unsigned q)
+{
+ mln::algebra::vec<3,float> result;
-#include <mln/math/sqr.hh>
-#include <mln/math/pi.hh>
-#include <mln/math/abs.hh>
+ /*
+ result[0] = vec[2] * (360.0/q);
+ result[1] = vec[0] * (1.0/q);
+ result[2] = vec[1] * (1.0/q);
+ */
+
+ result[0] = (vec[0]+0.5) * (360.0/q);
+ result[1] = (vec[1]+0.5) * (1.0/q);
+ result[2] = (vec[2]+0.5) * (1.0/q);
+
+ return result;
+}
+
+mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img,
+ const unsigned q)
+{
+ mln_precondition(img.is_valid());
+ typedef mln::algebra::vec<3,float> vec3f;
+ double count = 0.0;
+ vec3f sum = mln::literal::zero;
+ vec3f result;
+
+ mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+ for_all(p)
+ {
+ count += img(p);
+ sum += conv((vec3f)p, q) * img(p);
+ }
+
+ result = sum / count;
+
+ return result;
+}
+
+mln::algebra::mat<3,3,float> var_histo(const mln::image3d<unsigned>& img,
+ const unsigned q)
+{
+ mln_precondition(img.is_valid());
+ typedef mln::algebra::vec<3,float> vec3f;
+ typedef mln::algebra::mat<3,3,float> mat3f;
+
+ double count = count_histo(img);
+ vec3f mean = mean_histo(img,q);
+ vec3f point;
+ mat3f result = mln::literal::zero;
+ mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+ for_all(p)
+ {
+ point = conv((vec3f)p, q) - mean;
+ result += img(p) * (point * point.t());
+ }
-#include <mln/core/image/dmorph/image_if.hh>
-#include <mln/pw/value.hh>
+ result /= count;
+
+ return result;
+}
-#include <mln/trait/image/print.hh>
-#include <mln/trait/value_.hh>
-#include <mln/core/concept/function.hh>
+/// \}
+
+struct hslf_2_vec3f : public mln::Function_v2v< hslf_2_vec3f >
+{
+ typedef mln::algebra::vec<3,float> result;
+ result operator()(const mln::value::hsl_f& hsl) const;
+};
+
+mln::algebra::vec<3,float>
+hslf_2_vec3f::operator()(const mln::value::hsl_f& hsl) const
+{
+ return mln::make::vec(hsl.hue(), hsl.lum(), hsl.sat());
+}
+
+struct hslf_2_h : public mln::Function_v2v< hslf_2_h >
+{
+ typedef float result;
+ result operator()(const mln::value::hsl_f& hsl) const;
+};
+
+float
+hslf_2_h::operator()(const mln::value::hsl_f& hsl) const
+{
+ return hsl.hue();
+}
+/// n-bits testing
+/// \{
+/// \brief This part of the code manages the n-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
+
template <unsigned n>
void test_operator_equal()
{
@@ -129,7 +252,7 @@ void test_initialization()
unsigned res = mln::data::compute(mln::accu::math::sum<int_un>(), img_res);
unsigned ref = mln::data::compute(mln::accu::math::sum<int_un>(), img_ref);
-
+
mln_assertion(ref == res);
std::cout << "(" << n << " bits) histo.init() : ok" << std::endl;
@@ -184,131 +307,6 @@ void test_take_other()
std::cout << "(" << n << " bits) histo.take(other) : ok" << std::endl;
}
-double count_histo(const mln::image3d<unsigned>& img)
-{
- mln_precondition(img.is_valid());
-
- double result = 0.0;
- mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
- for_all(p)
- result += img(p);
-
- return result;
-}
-
-mln::algebra::vec<3,float> conv(const mln::algebra::vec<3,float>& vec,
- const unsigned q)
-{
- mln::algebra::vec<3,float> result;
-
- /*
- result[0] = vec[2] * (360.0/q);
- result[1] = vec[0] * (1.0/q);
- result[2] = vec[1] * (1.0/q);
- */
-
- result[0] = (vec[0]+0.5) * (360.0/q);
- result[1] = (vec[1]+0.5) * (1.0/q);
- result[2] = (vec[2]+0.5) * (1.0/q);
-
- return result;
-}
-
-mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img,
- const unsigned q)
-{
- mln_precondition(img.is_valid());
- typedef mln::algebra::vec<3,float> vec3f;
- double count = 0.0;
- vec3f sum = mln::literal::zero;
- vec3f result;
-
- mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
- for_all(p)
- {
- count += img(p);
- sum += conv((vec3f)p, q) * img(p);
- }
-
- result = sum / count;
-
- return result;
-}
-
-
-double var_histo(const mln::image3d<unsigned>& img)
-{
- mln_precondition(img.is_valid());
- typedef mln::algebra::vec<3,float> vec3f;
- typedef mln::algebra::mat<3,3,float> mat3f;
- double count = 0.0;
- double sum = 0.0;
- double sum2 = 0.0;
- double result = 0.0;
- mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
- for_all(p)
- {
- count += img(p);
- sum += p[0] * img(p);
- sum2 += p[0] * p[0] * img(p);
- }
-
- result = sum2 / count - (sum / count) * (sum / count);
-
- return result;
-}
-
-mln::algebra::mat<3,3,float> var_histo2(const mln::image3d<unsigned>& img,
- const unsigned q)
-{
- mln_precondition(img.is_valid());
- typedef mln::algebra::vec<3,float> vec3f;
- typedef mln::algebra::mat<3,3,float> mat3f;
-
- double count = count_histo(img);
- vec3f mean = mean_histo(img,q);
- vec3f point;
- mat3f result = mln::literal::zero;
- mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
- for_all(p)
- {
- point = conv((vec3f)p, q) - mean;
- result += img(p) * (point * point.t());
- }
-
- result /= count;
-
- return result;
-}
-
-struct hslf_2_vec3f : public mln::Function_v2v< hslf_2_vec3f >
-{
- typedef mln::algebra::vec<3,float> result;
- result operator()(const mln::value::hsl_f& hsl) const;
-};
-
-mln::algebra::vec<3,float>
-hslf_2_vec3f::operator()(const mln::value::hsl_f& hsl) const
-{
- return mln::make::vec(hsl.hue(), hsl.lum(), hsl.sat());
-}
-
-struct hslf_2_h : public mln::Function_v2v< hslf_2_h >
-{
- typedef float result;
- result operator()(const mln::value::hsl_f& hsl) const;
-};
-
-float
-hslf_2_h::operator()(const mln::value::hsl_f& hsl) const
-{
- return hsl.hue();
-}
-
template <unsigned n, unsigned q>
void test_integration()
{
@@ -331,37 +329,27 @@ void test_integration()
mln::image2d<float> img_sav;
mln::io::ppm::load(img_fst, OLENA_IMG_PATH"/lena.ppm");
- //mln::io::ppm::load(img_fst, OLENA_IMG_PATH"/fly.ppm");
- //img_sec = mln::data::transform(img_fst, mln::fun::v2v::rgb8_to_rgbn<n>());
img_thd = mln::data::transform(img_fst,mln::fun::v2v::f_rgb_to_hsl_<hsl_f>());
-
- //img_sav = mln::data::transform(img_thd, hslf_2_h());
- //mln::io::plot::save_histo_sh(img_sav, "lena2.sh");
-
img_ref = mln::data::transform(img_thd, hslf_2_vec3f());
const double count_ref = mln::data::compute(count(), img_ref);
- // const vec3f sum_ref = mln::data::compute(sum(), img_ref);
- const vec3f mean_ref = mln::data::compute(mean(), img_ref);
+ const vec3f mean_ref = mln::data::compute(mean(), img_ref);
const mat3f var_ref = mln::data::compute(var(), img_ref);
- img_res = mln::data::compute(mln::accu::stat::histo3d_hsl<q,hsl_f>(),img_thd);
-
- mln::io::plot::save_histo_sh(img_res, "histo_hsl.sh");
+ img_res = mln::data::compute(mln::accu::meta::stat::histo3d_hsl<q>(),img_thd);
const double count_res = count_histo(img_res);
const vec3f mean_res = mean_histo(img_res, q);
const mat3f var_res = var_histo2(img_res, q);
-
- std::cout << "count_ref : " << count_ref << std::endl;
- std::cout << "mean_ref : " << mean_ref << std::endl;
- std::cout << "var_ref : " << var_ref << std::endl;
- std::cout << "count_res : " << count_res << std::endl;
- std::cout << "mean_res : " << mean_res << std::endl;
- std::cout << "var_res : " << var_res << std::endl;
+ // std::cout << "count_ref : " << count_ref << std::endl;
+ // std::cout << "mean_ref : " << mean_ref << std::endl;
+ // std::cout << "var_ref : " << var_ref << std::endl;
+
+ // std::cout << "count_res : " << count_res << std::endl;
+ // std::cout << "mean_res : " << mean_res << std::endl;
+ // std::cout << "var_res : " << var_res << std::endl;
-
mln_assertion(count_ref == count_res);
/*
@@ -385,39 +373,19 @@ void test_integration()
std::cout << "(" << n << " bits) test integration : ok" << std::endl;
}
-void test()
-{
- typedef mln::value::rgb8 rgb8;
- typedef mln::value::hsl_f hsl_f;
- typedef mln::fun::v2v::f_rgb_to_hsl_<hsl_f> rgb_to_hsl_f;
- mln::image2d<rgb8> img_fst;
- mln::image2d<hsl_f> img_ref;
- rgb_to_hsl_f instance;
- rgb8 rgb(255,127,0);
- hsl_f hsl = instance(rgb);
-
- std::cout << hsl.hue() << std::endl;
- std::cout << hsl.lum() << std::endl;
- std::cout << hsl.sat() << std::endl;
-
+/// \}
- mln::io::ppm::load(img_fst, OLENA_IMG_PATH"/lena.ppm");
- img_ref = mln::data::transform(img_fst, rgb_to_hsl_f());
-
- //mln::accu::stat::histo3d_hsl<hsl_f>();
-
-}
+/// \fixme Should compile but doesn't. Fold problem in histo_hsl.hh.
int main()
{
- /*
+
test_operator_equal<3>();
test_instantiation_without_argument<3>();
test_initialization<3>();
- test_take_argument<3>();
+ test_take_argument<3>();
test_take_other<3>();
- */
test_integration<7,6>();
-
+
return 0;
}
diff --git a/scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/tests/accu/stat/histo3d_rgb/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/tests/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/tests/accu/stat/histo3d_rgb/Makefile.am
diff --git a/milena/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc b/scribo/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
similarity index 64%
copy from milena/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
copy to scribo/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
index cbf273b..3f87c4d 100644
--- a/milena/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
+++ b/scribo/sandbox/green/tests/accu/stat/histo3d_rgb/histo3d_rgb.cc
@@ -1,58 +1,152 @@
-/// TEST HISTO3D_RGB
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief This source manages unitary testing on rgb image3d histogram.
+///
+/// Tests are performed from 2 bits up to 8 bits quantification. The goal
+/// is to go through each programmatic flow to verify the conformity of the
+/// code. It sounds like a theoritic model of unitary testing for milena.
+/// The last test enables statistic computations on that component.
-#include <mln/img_path.hh>
-
-#include <mln/io/plot/save_histo_sh.hh>
+#include <mln/accu/math/sum.hh>
+#include <mln/accu/math/count.hh>
#include <mln/accu/stat/histo3d_rgb.hh>
-#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+#include <mln/accu/stat/mean.hh>
+#include <mln/accu/stat/variance.hh>
+#include <mln/accu/stat/var.hh>
-#include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-#include <mln/io/plot/save.hh>
-#include <mln/io/plot/save_histo_sh.hh>
+#include <mln/core/alias/box3d.hh>
+#include <mln/core/alias/point3d.hh>
+#include <mln/core/contract.hh>
+#include <mln/core/grids.hh>
+#include <mln/core/routine/initialize.hh>
#include <mln/data/compute.hh>
-#include <mln/data/transform.hh>
#include <mln/data/fill.hh>
+#include <mln/data/transform.hh>
+
+#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+
+#include <mln/img_path.hh>
+
+#include <mln/io/ppm/load.hh>
+
+#include <mln/literal/zero.hh>
+
+#include <mln/math/sqr.hh>
+#include <mln/math/abs.hh>
-#include <mln/value/label_8.hh>
#include <mln/value/rgb8.hh>
#include <mln/value/rgb.hh>
-#include <mln/value/int_u.hh>
-#include <mln/core/alias/neighb3d.hh>
-#include <mln/core/alias/box3d.hh>
-#include <mln/core/alias/point3d.hh>
+/// Specific histogram accumulators.
+/// \{
+/// \brief Define statistical accumulator for histogram.
+///
+/// Here, some histogram accumulators are defined, the sum of the frequencies,
+/// the average, the variance.
-#include <mln/core/routine/initialize.hh>
-#include <mln/core/contract.hh>
-#include <mln/core/grids.hh>
+double count_histo(const mln::image3d<unsigned>& img)
+{
+ mln_precondition(img.is_valid());
-#include <mln/accu/math/sum.hh>
-#include <mln/accu/math/count.hh>
-#include <mln/accu/stat/mean.hh>
-#include <mln/accu/stat/variance.hh>
-#include <mln/accu/stat/var.hh>
+ double value = 0.0;
+ double result = 0.0;
+ mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+ for_all(p)
+ {
+ value = img(p);
+ result += value;
+ }
-#include <mln/morpho/watershed/flooding.hh>
-#include <mln/morpho/elementary/dilation.hh>
-#include <mln/morpho/elementary/closing.hh>
+ return result;
+}
-#include <mln/literal/zero.hh>
-#include <mln/linear/convolve.hh>
-#include <mln/linear/gaussian.hh>
-#include <mln/labeling/regional_maxima.hh>
-#include <mln/labeling/colorize.hh>
-#include <mln/labeling/mean_values.hh>
+mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img)
+{
+ mln_precondition(img.is_valid());
+ typedef mln::algebra::vec<3,float> vec3f;
+ double value = 0.0;
+ double count = 0.0;
+ vec3f sum = mln::literal::zero;
+ vec3f result;
-#include <mln/make/w_window3d.hh>
+ mln_piter_(mln::image3d<unsigned>) p(img.domain());
-#include <mln/math/sqr.hh>
-#include <mln/math/pi.hh>
-#include <mln/math/abs.hh>
+ for_all(p)
+ {
+ value = img(p);
+ count += value;
+ sum += p.to_vec() * value;
+ }
-#include <mln/core/image/dmorph/image_if.hh>
-#include <mln/pw/value.hh>
+ result = sum / count;
+
+ return result;
+}
+
+
+mln::algebra::mat<3,3,float> var_histo (const mln::image3d<unsigned>& img)
+{
+ mln_precondition(img.is_valid());
+ typedef mln::algebra::vec<3,float> vec3f;
+ typedef mln::algebra::mat<3,3,float> mat3f;
+
+ double value = 0.0;
+ double count = count_histo(img);
+ vec3f mean = mean_histo(img);
+ vec3f point;
+ mat3f result = mln::literal::zero;
+ mln_piter_(mln::image3d<unsigned>) p(img.domain());
+
+ for_all(p)
+ {
+ value = img(p);
+ point = p.to_vec() - mean;
+ result += value * (point * point.t());
+ }
+
+ result /= count;
+
+ return result;
+}
+
+/// \}
+
+/// n-bits testing
+/// \{
+/// \brief This part of the code manages the n-bits unitary testing.
+///
+/// Many tests are performed such equalities between two histograms,
+/// instantiation without argument, initialization, take interface and
+/// integration.
+///
+/// \fixme the operator != isn't infer from the operator ==.
template <unsigned n>
@@ -72,8 +166,10 @@ void test_operator_equal()
histo1.take(val);
- /// FIXME mln_assertion(histo1 != histo2); doesn't work!!
mln_assertion(!(histo1 == histo2));
+ // mln_assertion(histo1 != histo2);
+ // FIXME: DOESN'T WORK !!
+
histo2.take(val);
@@ -118,7 +214,7 @@ void test_initialization()
unsigned res = mln::data::compute(mln::accu::math::sum<int_un>(), img_res);
unsigned ref = mln::data::compute(mln::accu::math::sum<int_un>(), img_ref);
-
+
mln_assertion(ref == res);
std::cout << "(" << n << " bits) histo.init() : ok" << std::endl;
@@ -173,86 +269,7 @@ void test_take_other()
std::cout << "(" << n << " bits) histo.take(other) : ok" << std::endl;
}
-double count_histo(const mln::image3d<unsigned>& img)
-{
- mln_precondition(img.is_valid());
-
- double result = 0.0;
- mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
- for_all(p)
- result += img(p);
-
- return result;
-}
-
-mln::algebra::vec<3,float> mean_histo(const mln::image3d<unsigned>& img)
-{
- mln_precondition(img.is_valid());
- typedef mln::algebra::vec<3,float> vec3f;
- double count = 0.0;
- vec3f sum = mln::literal::zero;
- vec3f result;
-
- mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
- for_all(p)
- {
- count += img(p);
- sum += p.to_vec() * img(p);
- }
-
- result = sum / count;
-
- return result;
-}
-
-
-double var_histo(const mln::image3d<unsigned>& img)
-{
- mln_precondition(img.is_valid());
- typedef mln::algebra::vec<3,float> vec3f;
- typedef mln::algebra::mat<3,3,float> mat3f;
- double count = 0.0;
- double sum = 0.0;
- double sum2 = 0.0;
- double result = 0.0;
- mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
- for_all(p)
- {
- count += img(p);
- sum += p[0] * img(p);
- sum2 += p[0] * p[0] * img(p);
- }
-
- result = sum2 / count - (sum / count) * (sum / count);
-
- return result;
-}
-
-mln::algebra::mat<3,3,float> var_histo2(const mln::image3d<unsigned>& img)
-{
- mln_precondition(img.is_valid());
- typedef mln::algebra::vec<3,float> vec3f;
- typedef mln::algebra::mat<3,3,float> mat3f;
-
- double count = count_histo(img);
- vec3f mean = mean_histo(img);
- vec3f point;
- mat3f result = mln::literal::zero;
- mln_piter_(mln::image3d<unsigned>) p(img.domain());
-
- for_all(p)
- {
- point = p.to_vec() - mean;
- result += img(p) * (point * point.t());
- }
-
- result /= count;
-
- return result;
-}
+/// \fixme When the quantification grows, the computation error grows.
template <unsigned n>
void test_integration()
@@ -277,77 +294,65 @@ void test_integration()
const vec3f sum_ref = mln::data::compute(sum(), img_ref);
const vec3f mean_ref = mln::data::compute(mean(), img_ref);
const mat3f var_ref = mln::data::compute(var(), img_ref);
-
- img_res = mln::data::compute(mln::accu::stat::histo3d_rgb<rgbn>(), img_ref);
- mln::io::plot::save_histo_sh(img_res, "histo_rgb.sh");
+ img_res = mln::data::compute(mln::accu::stat::histo3d_rgb<rgbn>(), img_ref);
const double count_res = count_histo(img_res);
const vec3f mean_res = mean_histo(img_res);
- const mat3f var_res = var_histo2(img_res);
-
- std::cout << "count_ref : " << count_ref << std::endl;
- std::cout << "mean_ref : " << mean_ref << std::endl;
- std::cout << "var_ref : " << var_ref << std::endl;
+ const mat3f var_res = var_histo(img_res);
+
+ // std::cout << "count_ref : " << count_ref << std::endl;
+ // std::cout << "mean_ref : " << mean_ref << std::endl;
+ // std::cout << "var_ref : " << var_ref << std::endl;
+
+ // std::cout << "count_res : " << count_res << std::endl;
+ // std::cout << "mean_res : " << mean_res << std::endl;
+ // std::cout << "var_res : " << var_res << std::endl;
- std::cout << "count_res : " << count_res << std::endl;
- std::cout << "mean_res : " << mean_res << std::endl;
- std::cout << "var_res : " << var_res << std::endl;
-
mln_assertion(count_ref == count_res);
-
- mln_assertion(0.0001 > abs(mean_ref[0] - mean_res[0]));
- mln_assertion(0.0001 > abs(mean_ref[1] - mean_res[1]));
- mln_assertion(0.0001 > abs(mean_ref[2] - mean_res[2]));
- mln_assertion(0.0001 > abs(var_ref(0,0) - var_res(0,0)));
- mln_assertion(0.0001 > abs(var_ref(0,1) - var_res(0,1)));
- mln_assertion(0.0001 > abs(var_ref(1,0) - var_res(1,0)));
+ /// FIXME: The error acceptance seems to high !!
+ mln_assertion(3 > mln::math::abs(mean_ref[0] - mean_res[0]));
+ mln_assertion(3 > mln::math::abs(mean_ref[1] - mean_res[1]));
+ mln_assertion(3 > mln::math::abs(mean_ref[2] - mean_res[2]));
+
+ mln_assertion(3 > mln::math::abs(var_ref(0,0) - var_res(0,0)));
+ mln_assertion(3 > mln::math::abs(var_ref(0,1) - var_res(0,1)));
+ mln_assertion(3 > mln::math::abs(var_ref(1,0) - var_res(1,0)));
- mln_assertion(0.0001 > abs(var_ref(1,1) - var_res(1,1)));
- mln_assertion(0.0001 > abs(var_ref(0,2) - var_res(0,2)));
- mln_assertion(0.0001 > abs(var_ref(2,0) - var_res(2,0)));
+ mln_assertion(3 > mln::math::abs(var_ref(1,1) - var_res(1,1)));
+ mln_assertion(3 > mln::math::abs(var_ref(0,2) - var_res(0,2)));
+ mln_assertion(3 > mln::math::abs(var_ref(2,0) - var_res(2,0)));
+ mln_assertion(3 > mln::math::abs(var_ref(2,2) - var_res(2,2)));
+ mln_assertion(3 > mln::math::abs(var_ref(2,1) - var_res(2,1)));
+ mln_assertion(3 > mln::math::abs(var_ref(1,2) - var_res(1,2)));
- mln_assertion(0.0001 > abs(var_ref(2,2) - var_res(2,2)));
- mln_assertion(0.0001 > abs(var_ref(2,1) - var_res(2,1)));
- mln_assertion(0.0001 > abs(var_ref(1,2) - var_res(1,2)));
-
std::cout << "(" << n << " bits) test integration : ok" << std::endl;
}
+/// \}
+
+/// \fixme Doesn't work with 1 bit, compilation problem.
+
int main()
{
- //
- // Doesn't work with 1 bit, compilation problem
- //
- /*
- test_operator_equal<1>();
- test_instantiation_without_argument<1>();
- test_initialization<1>();
- test_take_argument<1>();
- test_take_other<1>();
- test_integration<1>();
- */
- /*
test_operator_equal<2>();
test_instantiation_without_argument<2>();
test_initialization<2>();
test_take_argument<2>();
test_take_other<2>();
test_integration<2>();
- */
- /*
+
+
test_operator_equal<3>();
test_instantiation_without_argument<3>();
test_initialization<3>();
test_take_argument<3>();
test_take_other<3>();
test_integration<3>();
-
-
test_operator_equal<4>();
test_instantiation_without_argument<4>();
@@ -355,44 +360,38 @@ int main()
test_take_argument<4>();
test_take_other<4>();
test_integration<4>();
-
-
+
test_operator_equal<5>();
test_instantiation_without_argument<5>();
test_initialization<5>();
test_take_argument<5>();
test_take_other<5>();
test_integration<5>();
- */
+
test_operator_equal<6>();
test_instantiation_without_argument<6>();
test_initialization<6>();
test_take_argument<6>();
test_take_other<6>();
test_integration<6>();
-
- /*
+
test_operator_equal<7>();
test_instantiation_without_argument<7>();
test_initialization<7>();
test_take_argument<7>();
test_take_other<7>();
test_integration<7>();
- */
-
+
//
// Do not execute it, unless you have the time :)
//
- /*
- test_operator_equal<8>();
- test_instantiation_without_argument<8>();
- test_initialization<8>();
- test_take_argument<8>();
- test_take_other<8>();
- test_integration<8>();
- */
-
+ // test_operator_equal<8>();
+ // test_instantiation_without_argument<8>();
+ // test_initialization<8>();
+ // test_take_argument<8>();
+ // test_take_other<8>();
+ // test_integration<8>();
return 0;
}
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
index 1c6176b..af39d94 100644
--- a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
@@ -1,3 +1,28 @@
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
/// \file
///
/// \brief Minimal code for building 1d image histogram version.
@@ -11,6 +36,8 @@
#include <mln/io/pgm/load.hh>
#include <mln/value/int_u8.hh>
+
+
int main()
{
typedef mln::value::int_u8 t_int_u8;
diff --git a/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc b/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
index 6369b5a..2e36867 100644
--- a/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo2d/histo2d.cc
@@ -1,3 +1,28 @@
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
/// \file
///
/// \brief Minimal code for building 2d image histogram version.
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/accu/stat/histo3d_hsl/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/accu/stat/histo3d_hsl/Makefile.am
diff --git a/milena/tests/fun/v2v/rgb_to_hsl.cc b/scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc
similarity index 57%
copy from milena/tests/fun/v2v/rgb_to_hsl.cc
copy to scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc
index 6fd9a17..17b12cc 100644
--- a/milena/tests/fun/v2v/rgb_to_hsl.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo3d_hsl/histo3d_hsl.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
//
// This file is part of Olena.
//
@@ -23,37 +23,37 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
-#include <mln/core/image/image2d.hh>
+/// \file
+///
+/// \brief Minimal code for building HSL 3d image histogram version.
+//
+/// \fixme This code should compile but it doesn't.
+///
+#include <mln/accu/stat/histo3d_hsl.hh>
+#include <mln/core/image/image2d.hh>
+#include <mln/core/image/image3d.hh>
+#include <mln/data/compute.hh>
+#include <mln/data/transform.hh>
+#include <mln/fun/v2v/rgb_to_hsl.hh>
+#include <mln/img_path.hh>
+#include <mln/io/ppm/load.hh>
#include <mln/value/hsl.hh>
#include <mln/value/rgb8.hh>
-#include <mln/fun/v2v/rgb_to_hsl.hh>
-
-#include <mln/data/compare.hh>
-#include <mln/data/transform.hh>
-
-#include <mln/make/image.hh>
-
-#include <mln/debug/println.hh>
-
-using mln::value::rgb8;
-using mln::value::hsl_f;
-
-rgb8 dat[][2] = { { rgb8(0,0,0), rgb8(255,255,255) },
- { rgb8(128,128,128), rgb8(90,90, 90) } };
-
-hsl_f ref[][2] = { { hsl_f(0,0,0), hsl_f(0,0,1.0) },
- { hsl_f(0,0,128.0 / 255.0), hsl_f(0,0,90.0 / 255.0) } };
-
int main()
{
- using namespace mln;
-
- image2d<value::rgb8> ima = make::image(dat);
- image2d<hsl_f> ref_ima = make::image(ref);
- image2d<hsl_f> ima_hsl = data::transform(ima,
- fun::v2v::f_rgb_to_hsl_f);
-
- mln_assertion(ima_hsl == ref_ima);
+ typedef mln::value::rgb8 t_rgb;
+ typedef mln::value::hsl_f t_hsl;
+ typedef mln::fun::v2v::f_rgb_to_hsl_<t_hsl> t_rgb_to_hsl;
+ mln::image2d<t_rgb> img_rgb;
+ mln::image2d<t_hsl> img_hsl;
+ mln::image3d<unsigned> histo;
+
+ mln::io::ppm::load(img_rgb, OLENA_IMG_PATH"/lena.ppm");
+ img_hsl = mln::data::transform(img_rgb, t_rgb_to_hsl());
+ //histo =mln::data::compute(mln::accu::meta::stat::histo3d_hsl<7>(), img_hsl);
+ //histo =mln::data::compute(mln::accu::stat::histo3d_hsl<7,t_hsl>(), img_hsl);
+ mln::accu::stat::histo3d_hsl<7,t_hsl>();
+ return 0;
}
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/accu/stat/histo3d_rgb/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/accu/stat/histo3d_rgb/Makefile.am
diff --git a/milena/tests/io/ppm/ppm.cc b/scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc
similarity index 63%
copy from milena/tests/io/ppm/ppm.cc
copy to scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc
index c2dac07..20267a0 100644
--- a/milena/tests/io/ppm/ppm.cc
+++ b/scribo/sandbox/green/use/accu/stat/histo3d_rgb/histo3d_rgb.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
//
// This file is part of Olena.
//
@@ -23,32 +23,35 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
+/// \file
+///
+/// \brief Minimal code for building 3d image histogram version.
+///
+
+
+#include <mln/accu/stat/histo3d_rgb.hh>
#include <mln/core/image/image2d.hh>
#include <mln/core/image/image3d.hh>
-#include <mln/core/image/dmorph/slice_image.hh>
-#include <mln/value/rgb8.hh>
-
+#include <mln/data/compute.hh>
+#include <mln/data/transform.hh>
+#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+#include <mln/img_path.hh>
#include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-
-#include <mln/data/compare.hh>
-
-#include <mln/util/array.hh>
-
-#include <mln/literal/colors.hh>
-
-#include "tests/data.hh"
-
+#include <mln/value/rgb.hh>
+#include <mln/value/rgb8.hh>
int main()
{
- using namespace mln;
- using value::rgb8;
+ typedef mln::value::rgb8 t_rgb8;
+ typedef mln::value::rgb<7> t_rgb7;
+ mln::image2d<t_rgb8> img_rgb8;
+ mln::image2d<t_rgb7> img_rgb7;
+ mln::image3d<unsigned> histo;
+
+ mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+ img_rgb7 = mln::data::transform(img_rgb8, mln::fun::v2v::rgb8_to_rgbn<7>());
- image2d<rgb8> lena = io::ppm::load<rgb8>(MLN_IMG_DIR "/lena.ppm");
- io::ppm::save(lena, "out.ppm");
+ histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(), img_rgb7);
- image2d<rgb8> lena2;
- io::ppm::load(lena2, "out.ppm");
- mln_assertion(lena2 == lena);
+ return 0;
}
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/Makefile.am
diff --git a/milena/tests/io/ppm/ppm.cc b/scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc
similarity index 63%
copy from milena/tests/io/ppm/ppm.cc
copy to scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc
index c2dac07..cec04e7 100644
--- a/milena/tests/io/ppm/ppm.cc
+++ b/scribo/sandbox/green/use/fun/v2v/rgb8_to_rgbn/rgb8_to_rgbn.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
//
// This file is part of Olena.
//
@@ -23,32 +23,35 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
+/// \file
+///
+/// \brief Example of using rgb8_t_rgbn transformation to compute 3d histogram.
+///
+
+
+#include <mln/accu/stat/histo3d_rgb.hh>
#include <mln/core/image/image2d.hh>
#include <mln/core/image/image3d.hh>
-#include <mln/core/image/dmorph/slice_image.hh>
-#include <mln/value/rgb8.hh>
-
+#include <mln/data/compute.hh>
+#include <mln/data/transform.hh>
+#include <mln/fun/v2v/rgb8_to_rgbn.hh>
+#include <mln/img_path.hh>
#include <mln/io/ppm/load.hh>
-#include <mln/io/ppm/save.hh>
-
-#include <mln/data/compare.hh>
-
-#include <mln/util/array.hh>
-
-#include <mln/literal/colors.hh>
-
-#include "tests/data.hh"
-
+#include <mln/value/rgb.hh>
+#include <mln/value/rgb8.hh>
int main()
{
- using namespace mln;
- using value::rgb8;
+ typedef mln::value::rgb8 t_rgb8;
+ typedef mln::value::rgb<7> t_rgb7;
+ mln::image2d<t_rgb8> img_rgb8;
+ mln::image2d<t_rgb7> img_rgb7;
+ mln::image3d<unsigned> histo;
+
+ mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+ img_rgb7 = mln::data::transform(img_rgb8, mln::fun::v2v::rgb8_to_rgbn<7>());
- image2d<rgb8> lena = io::ppm::load<rgb8>(MLN_IMG_DIR "/lena.ppm");
- io::ppm::save(lena, "out.ppm");
+ histo = mln::data::compute(mln::accu::meta::stat::histo3d_rgb(), img_rgb7);
- image2d<rgb8> lena2;
- io::ppm::load(lena2, "out.ppm");
- mln_assertion(lena2 == lena);
+ return 0;
}
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/fun/v2v/rgb_to_rg/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/fun/v2v/rgb_to_rg/Makefile.am
diff --git a/milena/tests/fun/v2v/hsl_to_rgb.cc b/scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc
similarity index 59%
copy from milena/tests/fun/v2v/hsl_to_rgb.cc
copy to scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc
index 237e605..8e612b2 100644
--- a/milena/tests/fun/v2v/hsl_to_rgb.cc
+++ b/scribo/sandbox/green/use/fun/v2v/rgb_to_rg/rgb_to_rg.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
//
// This file is part of Olena.
//
@@ -23,33 +23,36 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
+/// \file
+///
+/// \brief Example of using rgb_t_rg transformation to compute 2d histogram.
+///
+
+#include <mln/accu/stat/histo2d.hh>
#include <mln/core/image/image2d.hh>
-#include <mln/fun/v2v/hsl_to_rgb.hh>
-#include <mln/data/compare.hh>
+#include <mln/data/compute.hh>
#include <mln/data/transform.hh>
-#include <mln/value/hsl.hh>
+#include <mln/fun/v2v/rgb_to_rg.hh>
+#include <mln/img_path.hh>
+#include <mln/io/ppm/load.hh>
+#include <mln/value/rg.hh>
#include <mln/value/rgb8.hh>
-
int main()
{
- using namespace mln;
-
- using mln::value::rgb8;
- using mln::value::hsl_f;
-
- rgb8 ref[][2] = { { rgb8(0,0,0), rgb8(255,255,255) },
- { rgb8(128,128,128), rgb8(90,90, 90) } };
-
- hsl_f dat[][2] = { { hsl_f(0,0,0), hsl_f(0,0,1.0) },
- { hsl_f(0,0,128.0 / 255.0), hsl_f(0,0,90.0 / 255.0) } };
-
- image2d<rgb8> ref_ima = make::image(ref);
- image2d<hsl_f> ima = make::image(dat);
-
- image2d<value::rgb8> ima_rgb = data::transform(ima,
- fun::v2v::f_hsl_to_rgb_3x8);
-
- // mln_assertion(ima_rgb == ref_ima);
- (void) ima_rgb;
+ typedef mln::value::rg<8> t_rg8;
+ typedef mln::value::rgb8 t_rgb8;
+ typedef mln::fun::v2v::rgb_to_rg<8> t_rgb_to_rg;
+ typedef mln::image2d<t_rg8> t_image2d_rg8;
+ typedef mln::image2d<t_rgb8> t_image2d_rgb8;
+ typedef mln::image2d<unsigned> t_histo;
+ t_image2d_rgb8 img_rgb8;
+ t_image2d_rg8 img_rg8;
+ t_histo histo;
+
+ mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+ img_rg8 = mln::data::transform(img_rgb8, t_rgb_to_rg());
+ histo = mln::data::compute(mln::accu::meta::stat::histo2d(), img_rg8);
+
+ return 0;
}
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/value/rg/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/value/rg/Makefile.am
diff --git a/milena/tests/fun/v2v/hsl_to_rgb.cc b/scribo/sandbox/green/use/value/rg/rg.cc
similarity index 60%
copy from milena/tests/fun/v2v/hsl_to_rgb.cc
copy to scribo/sandbox/green/use/value/rg/rg.cc
index 237e605..b5ea15f 100644
--- a/milena/tests/fun/v2v/hsl_to_rgb.cc
+++ b/scribo/sandbox/green/use/value/rg/rg.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2010 EPITA LRDE
//
// This file is part of Olena.
//
@@ -23,33 +23,36 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
+/// \file
+///
+/// \brief Example of using rg to compute an 2d histogram.
+///
+
+#include <mln/accu/stat/histo2d.hh>
#include <mln/core/image/image2d.hh>
-#include <mln/fun/v2v/hsl_to_rgb.hh>
-#include <mln/data/compare.hh>
+#include <mln/data/compute.hh>
#include <mln/data/transform.hh>
-#include <mln/value/hsl.hh>
+#include <mln/fun/v2v/rgb_to_rg.hh>
+#include <mln/img_path.hh>
+#include <mln/io/ppm/load.hh>
+#include <mln/value/rg.hh>
#include <mln/value/rgb8.hh>
-
int main()
{
- using namespace mln;
-
- using mln::value::rgb8;
- using mln::value::hsl_f;
-
- rgb8 ref[][2] = { { rgb8(0,0,0), rgb8(255,255,255) },
- { rgb8(128,128,128), rgb8(90,90, 90) } };
-
- hsl_f dat[][2] = { { hsl_f(0,0,0), hsl_f(0,0,1.0) },
- { hsl_f(0,0,128.0 / 255.0), hsl_f(0,0,90.0 / 255.0) } };
-
- image2d<rgb8> ref_ima = make::image(ref);
- image2d<hsl_f> ima = make::image(dat);
-
- image2d<value::rgb8> ima_rgb = data::transform(ima,
- fun::v2v::f_hsl_to_rgb_3x8);
-
- // mln_assertion(ima_rgb == ref_ima);
- (void) ima_rgb;
+ typedef mln::value::rg<8> t_rg8;
+ typedef mln::value::rgb8 t_rgb8;
+ typedef mln::fun::v2v::rgb_to_rg<8> t_rgb_to_rg;
+ typedef mln::image2d<t_rg8> t_image2d_rg8;
+ typedef mln::image2d<t_rgb8> t_image2d_rgb8;
+ typedef mln::image2d<unsigned> t_histo;
+ t_image2d_rgb8 img_rgb8;
+ t_image2d_rg8 img_rg8;
+ t_histo histo;
+
+ mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
+ img_rg8 = mln::data::transform(img_rgb8, t_rgb_to_rg());
+ histo = mln::data::compute(mln::accu::meta::stat::histo2d(), img_rg8);
+
+ return 0;
}
--
1.5.6.5
1
0
15 Nov '10
* gaussian.sh: New gnuplot shell file.
* guassian2d.sh: New gnuplot shell file.
* test_labelling.cc: New source.
* tests/clustering/k_mean/Makefile.am: New makefile.
* tests/clustering/k_mean/k_mean.cc: New source.
* tests/clustering/kmean1d/Makefile.am: New makefile.
* tests/clustering/kmean1d/kmean1d.cc: New source.
* tests/io/plot/save_image_sh/Makefile.am: New makefile.
* tests/io/plot/save_image_sh/save_image_sh.cc: New source.
---
scribo/sandbox/green/ChangeLog | 14 +
.../histo1d => scribo/sandbox/green}/gaussian.sh | 0
.../histo2d => scribo/sandbox/green}/gaussian2d.sh | 0
scribo/sandbox/green/test_labelling.cc | 336 ++++++++++++++++++++
.../green/tests/clustering/k_mean/Makefile.am | 0
.../green/tests/clustering/k_mean/k_mean.cc | 0
.../green/tests/clustering/kmean1d/Makefile.am | 0
.../green/tests/clustering/kmean1d/kmean1d.cc | 0
.../green/tests/io/plot/save_image_sh}/Makefile.am | 0
.../tests/io/plot/save_image_sh/save_image_sh.cc | 0
10 files changed, 350 insertions(+), 0 deletions(-)
copy {milena/sandbox/green/tests/accu/stat/histo1d => scribo/sandbox/green}/gaussian.sh (100%)
copy {milena/sandbox/green/tests/accu/stat/histo2d => scribo/sandbox/green}/gaussian2d.sh (100%)
create mode 100644 scribo/sandbox/green/test_labelling.cc
copy {milena => scribo}/sandbox/green/tests/clustering/k_mean/Makefile.am (100%)
copy {milena => scribo}/sandbox/green/tests/clustering/k_mean/k_mean.cc (100%)
copy {milena => scribo}/sandbox/green/tests/clustering/kmean1d/Makefile.am (100%)
copy {milena => scribo}/sandbox/green/tests/clustering/kmean1d/kmean1d.cc (100%)
copy {milena/sandbox/green/doc/examples/frac => scribo/sandbox/green/tests/io/plot/save_image_sh}/Makefile.am (100%)
copy {milena => scribo}/sandbox/green/tests/io/plot/save_image_sh/save_image_sh.cc (100%)
diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog
index 8f5101b..db589a1 100644
--- a/scribo/sandbox/green/ChangeLog
+++ b/scribo/sandbox/green/ChangeLog
@@ -2,6 +2,20 @@
Import files from milena/sandbox/green.
+ * gaussian.sh: New gnuplot shell file.
+ * guassian2d.sh: New gnuplot shell file.
+ * test_labelling.cc: New source.
+ * tests/clustering/k_mean/Makefile.am: New makefile.
+ * tests/clustering/k_mean/k_mean.cc: New source.
+ * tests/clustering/kmean1d/Makefile.am: New makefile.
+ * tests/clustering/kmean1d/kmean1d.cc: New source.
+ * tests/io/plot/save_image_sh/Makefile.am: New makefile.
+ * tests/io/plot/save_image_sh/save_image_sh.cc: New source.
+
+2010-06-24 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Import files from milena/sandbox/green.
+
* mln/accu/stat/histo1d.hh: New header file.
* mln/accu/stat/histo2d.hh: New header file.
* mln/accu/stat/histo3d_hsl.hh: New header file.
diff --git a/milena/sandbox/green/tests/accu/stat/histo1d/gaussian.sh b/scribo/sandbox/green/gaussian.sh
similarity index 100%
copy from milena/sandbox/green/tests/accu/stat/histo1d/gaussian.sh
copy to scribo/sandbox/green/gaussian.sh
diff --git a/milena/sandbox/green/tests/accu/stat/histo2d/gaussian2d.sh b/scribo/sandbox/green/gaussian2d.sh
similarity index 100%
copy from milena/sandbox/green/tests/accu/stat/histo2d/gaussian2d.sh
copy to scribo/sandbox/green/gaussian2d.sh
diff --git a/scribo/sandbox/green/test_labelling.cc b/scribo/sandbox/green/test_labelling.cc
new file mode 100644
index 0000000..6238d2b
--- /dev/null
+++ b/scribo/sandbox/green/test_labelling.cc
@@ -0,0 +1,336 @@
+// 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.
+
+
+#include <mln/io/plot/save_histo_sh.hh>
+#include <mln/value/rgb8.hh>
+#include <mln/value/label_8.hh>
+#include <mln/core/alias/neighb1d.hh>
+#include <mln/core/image/dmorph/image_if.hh>
+#include <mln/labeling/colorize.hh>
+#include <mln/labeling/mean_values.hh>
+#include <mln/labeling/regional_maxima.hh>
+#include <mln/make/w_window1d.hh>
+#include <mln/math/pi.hh>
+#include <mln/morpho/watershed/flooding.hh>
+#include <mln/morpho/elementary/dilation.hh>
+#include <mln/morpho/elementary/closing.hh>
+#include <mln/pw/value.hh>
+#include <mln/linear/convolve.hh>
+#include <mln/linear/gaussian.hh>
+
+
+/// ... to complete
+
+/// \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 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 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.
+
+/// The aim of this function is to rebuild an label image2d from the segmenting
+/// image of the histogram (label) and the original image (input).
+/// label_image2d / for each grey tone, associate its label.
+
+mln::image2d<mln::value::label_8>
+build_8bits(const mln::image2d<mln::value::int_u8>& input,
+ const mln::image1d<mln::value::label_8>& label)
+{
+ mln::trace::entering("build_8bits");
+ mln_precondition(label.is_valid());
+ mln_precondition(input.is_valid());
+
+ mln::image2d<mln::value::label_8> output;
+
+ mln::initialize(output, input);
+
+ mln_piter_(mln::image2d<mln::value::int_u8>) pi(input.domain());
+ mln_piter_(mln::image2d<mln::value::label_8>) po(output.domain());
+
+ for_all_2(pi, po)
+ {
+ mln::value::int_u8 val = input(pi);
+ unsigned grp = label(mln::point1d(val));
+
+ output(po) = grp;
+ }
+
+ mln::trace::exiting("build_8bits");
+ return output;
+}
+
+
+void test_8bits_classifying()
+{
+ typedef mln::value::int_u8 int_u8;
+ typedef mln::value::label_8 label_8;
+ typedef mln::value::rgb8 rgb8;
+ typedef mln::accu::stat::mean<double> mean;
+
+ mln::image2d<int_u8> img_ref;
+ mln::image2d<int_u8> img_out;
+ mln::image2d<rgb8> img_rgb;
+ mln::image1d<unsigned> img_res;
+ mln::image1d<double> img_smooth;
+ mln::image1d<label_8> labels;
+ label_8 nlabels;
+
+ //-----------------------------------------------------
+ // Loading the scribo image and computing its histogram
+ //-----------------------------------------------------
+
+ std::cout << "(08 bits) LOADING HISTOGRAM" << std::endl;
+
+ // mln::io::pgm::load(img_ref, OLENA_IMG_PATH"/lena.pgm");
+ mln::io::pgm::load(img_ref, SCRIBO_IMG_PATH"/mp00082c_50p_8bits.pgm");
+ img_res = mln::data::compute(mln::accu::stat::histo1d<int_u8>(), img_ref);
+ mln::io::plot::save_histo_sh(img_res, "histo0_8bits.sh");
+
+
+ //-----------------------------------------------------
+ // Smoothing the histogram with a gaussian filter
+ //-----------------------------------------------------
+
+ std::cout << "(08 bits) SMOOTHING HISTOGRAM" << std::endl;
+
+ double ws[41];
+ gaussian_filter(ws, 41, 6.0);
+ img_smooth = mln::linear::convolve(img_res, mln::make::w_window1d(ws));
+ mln::io::plot::save_histo_sh(img_smooth, "histo1_8bits.sh");
+
+
+ //-----------------------------------------------------
+ // Segmenting the histogram with the watershed method
+ //-----------------------------------------------------
+
+ std::cout << "SEGMENTING HISTOGRAM" << std::endl;
+
+ /*
+ labels = mln::labeling::regional_maxima(img_smooth, mln::c2(), nlabels);
+ std::cout << "N labels : " << nlabels << std::endl;
+ mln::io::plot::save_histo_sh(labels, "histo2_8bits.sh");
+ */
+
+ // need to revert the histogram
+ labels = mln::morpho::watershed::flooding(img_smooth, mln::c2(), nlabels);
+ std::cout << "N labels : " << nlabels << std::endl;
+ mln::io::plot::save_histo_sh(labels, "histo2_8bits.sh");
+
+
+ //-----------------------------------------------------
+ // Rebuilding the image with the mean of each region
+ //-----------------------------------------------------
+
+ std::cout << "(08 bits) BUILDING OUTPUT" << std::endl;
+
+ mln::image2d<label_8>img_label = build_8bits(img_ref, labels);
+
+ std::cout << "(08 bits) COLORING OUTPUT" << std::endl;
+
+ img_out = mln::labeling::mean_values(img_ref, img_label, nlabels);
+ img_rgb = mln::labeling::colorize(rgb8(), img_label);
+
+ mln::io::pgm::save(img_out, "out_8bits.pgm");
+ mln::io::ppm::save(img_rgb, "color_8bits.pgm");
+
+ //labels = mln::morpho::elementary::dilation(labels, mln::c2());
+ //mln::io::plot::save_histo_sh(labels, "histo3.sh");
+ //mln::io::plot::save(labels, "labelized.data");
+}
+
+
+/// The aim of this function is to rebuild an label image2d from the segmenting
+/// image of the histogram (label) and the original image (input).
+/// label_image2d / for each grey tone, associate its label.
+
+mln::image2d<mln::value::label_8>
+build_14bits(const mln::image2d<mln::value::int_u<14> >& input,
+ const mln::image1d<mln::value::label_8>& label)
+{
+ mln::trace::entering("build_14bits");
+ mln_precondition(label.is_valid());
+ mln_precondition(input.is_valid());
+
+ mln::image2d<mln::value::label_8> output;
+
+ mln::initialize(output, input);
+
+ mln_piter_(mln::image2d<mln::value::int_u<14> >) pi(input.domain());
+ mln_piter_(mln::image2d<mln::value::label_8>) po(output.domain());
+
+ for_all_2(pi, po)
+ {
+ mln::value::int_u<14> val = input(pi);
+ unsigned grp = label(mln::point1d(val));
+
+ output(po) = grp;
+ }
+
+ mln::trace::exiting("build_14bits");
+ return output;
+}
+
+
+void test_14bits_classifying()
+{
+ typedef mln::value::int_u16 int_u16;
+ typedef mln::value::int_u<14> int_u14;
+ typedef mln::value::label_8 label_8;
+ typedef mln::value::rgb8 rgb8;
+ typedef mln::accu::stat::mean<double> mean;
+
+ mln::image2d<int_u16> img_fst;
+ mln::image2d<int_u14> img_ref;
+ mln::image2d<int_u14> img_out;
+ mln::image2d<rgb8> img_rgb;
+ mln::image1d<unsigned> img_res;
+ mln::image1d<double> img_smooth;
+ mln::image1d<label_8> labels;
+ label_8 nlabels;
+
+ //-----------------------------------------------------
+ // Loading the scribo image and computing its histogram
+ //-----------------------------------------------------
+
+ std::cout << "(14 bits) LOADING HISTOGRAM" << std::endl;
+
+ //mln::io::pgm::load(img_fst, OLENA_IMG_PATH"/lena_16.pgm");
+ mln::io::pgm::load(img_fst, SCRIBO_IMG_PATH"/mp00082c_50p_16bits.pgm");
+ img_ref = mln::data::transform(img_fst, mln::fun::v2v::int_u16_to_int_u14());
+ img_res = mln::data::compute(mln::accu::stat::histo1d<int_u14>(), img_ref);
+ mln::io::plot::save_histo_sh(img_res, "histo0_14bits.sh");
+
+
+ //-----------------------------------------------------
+ // Smoothing the histogram with a gaussian filter
+ //-----------------------------------------------------
+
+ std::cout << "(14 bits) SMOOTHING HISTOGRAM" << std::endl;
+
+ double ws[401];
+ gaussian_filter(ws, 401, 50.0);
+ img_smooth = mln::linear::convolve(img_res, mln::make::w_window1d(ws));
+ mln::io::plot::save_histo_sh(img_smooth, "histo1_14bits.sh");
+
+
+ //-----------------------------------------------------
+ // Segmenting the histogram with the watershed method
+ //-----------------------------------------------------
+
+ std::cout << "(14 bits) SEGMENTING HISTOGRAM" << std::endl;
+
+ /*
+ labels = mln::labeling::regional_maxima(img_smooth, mln::c2(), nlabels);
+ std::cout << "N labels : " << nlabels << std::endl;
+ mln::io::plot::save_histo_sh(labels, "histo2.sh");
+ */
+
+
+ labels = mln::morpho::watershed::flooding(img_smooth, mln::c2(), nlabels);
+ std::cout << "N labels : " << nlabels << std::endl;
+ mln::io::plot::save_histo_sh(labels, "histo2_14bits.sh");
+
+
+ //-----------------------------------------------------
+ // Rebuilding the image with the mean of each region
+ //-----------------------------------------------------
+
+ std::cout << "(14 bits) BUILDING OUTPUT" << std::endl;
+
+ mln::image2d<label_8>img_label = build_14bits(img_ref, labels);
+
+ std::cout << "(14 bits) COLORING OUTPUT" << std::endl;
+
+ img_out = mln::labeling::mean_values(img_ref, img_label, nlabels);
+ img_rgb = mln::labeling::colorize(rgb8(), img_label);
+
+ mln::io::pgm::save(img_out, "out_14bits.pgm");
+ mln::io::ppm::save(img_rgb, "color_14bits.pgm");
+
+ //labels = mln::morpho::elementary::dilation(labels, mln::c2());
+ //mln::io::plot::save_histo_sh(labels, "histo3.sh");
+ //mln::io::plot::save(labels, "labelized.data");
+}
+
+int main()
+{
+ test_8bits_classifying();
+
+ test_14bits_classifying();
+
+ return 0;
+}
diff --git a/milena/sandbox/green/tests/clustering/k_mean/Makefile.am b/scribo/sandbox/green/tests/clustering/k_mean/Makefile.am
similarity index 100%
copy from milena/sandbox/green/tests/clustering/k_mean/Makefile.am
copy to scribo/sandbox/green/tests/clustering/k_mean/Makefile.am
diff --git a/milena/sandbox/green/tests/clustering/k_mean/k_mean.cc b/scribo/sandbox/green/tests/clustering/k_mean/k_mean.cc
similarity index 100%
copy from milena/sandbox/green/tests/clustering/k_mean/k_mean.cc
copy to scribo/sandbox/green/tests/clustering/k_mean/k_mean.cc
diff --git a/milena/sandbox/green/tests/clustering/kmean1d/Makefile.am b/scribo/sandbox/green/tests/clustering/kmean1d/Makefile.am
similarity index 100%
copy from milena/sandbox/green/tests/clustering/kmean1d/Makefile.am
copy to scribo/sandbox/green/tests/clustering/kmean1d/Makefile.am
diff --git a/milena/sandbox/green/tests/clustering/kmean1d/kmean1d.cc b/scribo/sandbox/green/tests/clustering/kmean1d/kmean1d.cc
similarity index 100%
copy from milena/sandbox/green/tests/clustering/kmean1d/kmean1d.cc
copy to scribo/sandbox/green/tests/clustering/kmean1d/kmean1d.cc
diff --git a/milena/sandbox/green/doc/examples/frac/Makefile.am b/scribo/sandbox/green/tests/io/plot/save_image_sh/Makefile.am
similarity index 100%
copy from milena/sandbox/green/doc/examples/frac/Makefile.am
copy to scribo/sandbox/green/tests/io/plot/save_image_sh/Makefile.am
diff --git a/milena/sandbox/green/tests/io/plot/save_image_sh/save_image_sh.cc b/scribo/sandbox/green/tests/io/plot/save_image_sh/save_image_sh.cc
similarity index 100%
copy from milena/sandbox/green/tests/io/plot/save_image_sh/save_image_sh.cc
copy to scribo/sandbox/green/tests/io/plot/save_image_sh/save_image_sh.cc
--
1.5.6.5
1
0
15 Nov '10
* mln/io/plot/save_image_sh.hh: New header file.
Give an example of code.
* use/io/plot/save_image_sh: New directory.
* use/io/plot/save_image_sh/Makefile.am: New makefile.
* use/io/plot/save_image_sh/save_image_sh.cc: New source file.
Make some unitary tests on gnuplot shell export.
* tests/io/plot/save_image_sh: New directory.
* tests/io/plot/save_image_sh/Makefile.am: New makefile.
* tests/io/plot/save_image_sh/save_image_sh.cc: New source file.
---
scribo/sandbox/green/ChangeLog | 109 +++++----
scribo/sandbox/green/README | 52 ++---
scribo/sandbox/green/mln/io/plot/save_image_sh.hh | 36 +++-
.../green/tests/io/plot/save_image_sh/Makefile.am | 13 +-
.../tests/io/plot/save_image_sh/save_image_sh.cc | 284 ++++++++++++++------
.../histo1d => io/plot/save_image_sh}/Makefile.am | 0
.../plot/save_image_sh/save_image_sh.cc} | 4 +-
7 files changed, 329 insertions(+), 169 deletions(-)
copy scribo/sandbox/green/use/{accu/stat/histo1d => io/plot/save_image_sh}/Makefile.am (100%)
copy scribo/sandbox/green/use/{accu/stat/histo1d/histo1d.cc => io/plot/save_image_sh/save_image_sh.cc} (91%)
diff --git a/scribo/sandbox/green/ChangeLog b/scribo/sandbox/green/ChangeLog
index db589a1..5a7ceaa 100644
--- a/scribo/sandbox/green/ChangeLog
+++ b/scribo/sandbox/green/ChangeLog
@@ -1,54 +1,20 @@
-2010-06-24 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+2010-06-23 green <jacquelet(a)lrde.epita.fr>
- Import files from milena/sandbox/green.
+ Define gnuplot shell export format.
- * gaussian.sh: New gnuplot shell file.
- * guassian2d.sh: New gnuplot shell file.
- * test_labelling.cc: New source.
- * tests/clustering/k_mean/Makefile.am: New makefile.
- * tests/clustering/k_mean/k_mean.cc: New source.
- * tests/clustering/kmean1d/Makefile.am: New makefile.
- * tests/clustering/kmean1d/kmean1d.cc: New source.
- * tests/io/plot/save_image_sh/Makefile.am: New makefile.
- * tests/io/plot/save_image_sh/save_image_sh.cc: New source.
+ * mln/io/plot/save_image_sh.hh: New header file.
-2010-06-24 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+ Give an example of code.
- Import files from milena/sandbox/green.
+ * use/io/plot/save_image_sh: New directory.
+ * use/io/plot/save_image_sh/Makefile.am: New makefile.
+ * use/io/plot/save_image_sh/save_image_sh.cc: New source file.
- * mln/accu/stat/histo1d.hh: New header file.
- * mln/accu/stat/histo2d.hh: New header file.
- * mln/accu/stat/histo3d_hsl.hh: New header file.
- * mln/accu/stat/histo3d_rgb.hh: New header file.
- * mln/clustering/k_mean.hh: New header file.
- * mln/clustering/kmean1d.hh: New header file.
- * mln/clustering/kmean2d.hh: New header file.
- * mln/clustering/kmean3d.hh: New header file.
- * mln/clustering/kmean_rgb.hh: New header file.
- * mln/display/display_histo.hh: New header file.
- * mln/display/project_histo.hh: New header file.
- * mln/fun/p2b/achromatic.hh: New header file.
- * mln/fun/p2b/component_equals.hh: New header file.
- * mln/fun/v2v/achromatism.hh: New header file.
- * mln/fun/v2v/hue_concentration.hh: New header file.
- * mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
- * mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
- * mln/fun/v2v/log.hh: New header file.
- * mln/fun/v2v/rg_to_rgb.hh: New header file.
- * mln/fun/v2v/rgb8_to_int_u8: New header file.
- * mln/fun/v2v/rgb_to_achromastism_map.hh: New header file.
- * mln/fun/v2v/rgb_to_hsv.hh: New header file.
- * mln/fun/v2v/rgb_to_hue_map.hh: New header file.
- * mln/fun/v2v/rgb_to_saturation_map.hh: New header file.
- * mln/fun/v2v/rgb_to_value_map.hh: New header file.
- * mln/img_path.hh: New header file.
- * mln/io/plot/save_image_sh.hh: New header file.
- * mln/math/cell.hh: New header file.
- * mln/math/floor.hh: New header file.
- * tests/accu/stat/histo1d/Makefile.am: New makefile.
- * tests/accu/stat/histo1d/histo1d.cc: New source.
- * tests/accu/stat/histo2d/Makefile.am: New makefile.
- * tests/accu/stat/histo2d/histo2d.cc: New source.
+ Make some unitary tests on gnuplot shell export.
+
+ * tests/io/plot/save_image_sh: New directory.
+ * tests/io/plot/save_image_sh/Makefile.am: New makefile.
+ * tests/io/plot/save_image_sh/save_image_sh.cc: New source file.
2010-06-21 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
@@ -130,6 +96,57 @@
* tests/accu/stat/histo3d_hsl/Makefile.am: New makefile.
* tests/accu/stat/histo3d_hsl/histo3d_hsl.cc: New source.
+2010-06-21 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Import files from milena/sandbox/green.
+
+ * gaussian.sh: New gnuplot shell file.
+ * guassian2d.sh: New gnuplot shell file.
+ * test_labelling.cc: New source.
+ * tests/clustering/k_mean/Makefile.am: New makefile.
+ * tests/clustering/k_mean/k_mean.cc: New source.
+ * tests/clustering/kmean1d/Makefile.am: New makefile.
+ * tests/clustering/kmean1d/kmean1d.cc: New source.
+ * tests/io/plot/save_image_sh/Makefile.am: New makefile.
+ * tests/io/plot/save_image_sh/save_image_sh.cc: New source.
+
+2010-06-21 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Import files from milena/sandbox/green.
+
+ * mln/accu/stat/histo1d.hh: New header file.
+ * mln/accu/stat/histo2d.hh: New header file.
+ * mln/accu/stat/histo3d_hsl.hh: New header file.
+ * mln/accu/stat/histo3d_rgb.hh: New header file.
+ * mln/clustering/k_mean.hh: New header file.
+ * mln/clustering/kmean1d.hh: New header file.
+ * mln/clustering/kmean2d.hh: New header file.
+ * mln/clustering/kmean3d.hh: New header file.
+ * mln/clustering/kmean_rgb.hh: New header file.
+ * mln/display/display_histo.hh: New header file.
+ * mln/display/project_histo.hh: New header file.
+ * mln/fun/p2b/achromatic.hh: New header file.
+ * mln/fun/p2b/component_equals.hh: New header file.
+ * mln/fun/v2v/achromatism.hh: New header file.
+ * mln/fun/v2v/hue_concentration.hh: New header file.
+ * mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
+ * mln/fun/v2v/int_u16_to_int_u14.hh: New header file.
+ * mln/fun/v2v/log.hh: New header file.
+ * mln/fun/v2v/rg_to_rgb.hh: New header file.
+ * mln/fun/v2v/rgb8_to_int_u8: New header file.
+ * mln/fun/v2v/rgb_to_achromastism_map.hh: New header file.
+ * mln/fun/v2v/rgb_to_hsv.hh: New header file.
+ * mln/fun/v2v/rgb_to_hue_map.hh: New header file.
+ * mln/fun/v2v/rgb_to_saturation_map.hh: New header file.
+ * mln/fun/v2v/rgb_to_value_map.hh: New header file.
+ * mln/img_path.hh: New header file.
+ * mln/io/plot/save_image_sh.hh: New header file.
+ * mln/math/cell.hh: New header file.
+ * mln/math/floor.hh: New header file.
+ * tests/accu/stat/histo1d/Makefile.am: New makefile.
+ * tests/accu/stat/histo1d/histo1d.cc: New source.
+ * tests/accu/stat/histo2d/Makefile.am: New makefile.
+ * tests/accu/stat/histo2d/histo2d.cc: New source.
2010-06-21 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
diff --git a/scribo/sandbox/green/README b/scribo/sandbox/green/README
index 4b6fb26..03106d3 100644
--- a/scribo/sandbox/green/README
+++ b/scribo/sandbox/green/README
@@ -153,8 +153,8 @@ d'exécution (chmod 755 gnuplot_shell_file.sh). Comme je trouve le format
extrêmement pratique, il se retrouve preque partout dans mes sources.
-V HISTOGRAMMES
---------------
+VI HISTOGRAMMES
+---------------
Un des travaux demandés par théo est la réalisation d'une librairie
d'histogramme permettant de fournir un résultat sous forme d'image.
@@ -173,7 +173,7 @@ a) version 1d
* mln/accu/stat/histo1d.hh: Accumulateur histogramme image1d.
* use/accu/stat/histo1d: Code minimal utilisant un histogramme 1d.
-* tests/accu/stat/histo1d: Test unitaire sur l'histogramme 1d.
+* tests/accu/stat/histo1d: Tests unitaires sur l'histogramme 1d.
b) version 2d
@@ -203,52 +203,42 @@ d) version 3d HSL
* mln/accu/stat/histo3d_hsl.hh: Accumulateur histogramme image3d HSL.
* use/accu/stat/histo3_hsl: Code minimal utilisant un histogramme 3d HSL.
-* tests/accu/stat/histo3d_hsl: Test unitaire sur l'histogramme HSL 3d.
+* tests/accu/stat/histo3d_hsl: Tests unitaires sur l'histogramme HSL 3d.
Le code HSL ne compile plus car l'interface liant la transformation du
domaine et la fonction fold a changée. Je n'ai pas le temps de
regarder plus avant.
+VII SAUVEGARDE FORMAT GNUPLOT SHELL
+-----------------------------------
-V MLN
------
-
-a) La sauvegarde des images au format gnuplot shell
-
-* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
-
-to do ...
-
-
-
-b) Les histogrammes
-
-
-
-
-
-
-
+Ce travail est personnel. Ces développements m'ont été tellement
+utiles que je ne regrette pas l'investissement effectué. L'idée est de
+pouvoir avoir un format d'image en écriture lisible. J'ai pris celui
+de gnuplot, ce qui permet en plus de pouvoir "sucrer" la présentation
+des données à loisir. Les images sont plus lourdes car le codage est
+textuel et un peu plus "verbose" mais se compresse aisément par
+n'importe quel algorithme type huffman (tous les archiveurs en possède un).
+* mln/io/plot/save_image_sh.hh: Librairie de sauvegarde au format gnuplot shell.
+* use/io/plot/save_image_sh: Code simple d'utilisation de la sauvegarde.
+* tests/io/plot/save_image_sh: Tests unitaires sur l'export.
-* tests/accu/stat/histo1d
+VI MLN
+-----
+a) La sauvegarde des images au format gnuplot shell
-* tests/accu/stat/histo2d
+* mln/io/plot/save_image_sh.hh: Librairie sauvegarde format gnuplot shell.
+to do ...
-* use/accu/stat/histo3d_rgb
-* tests/accu/stat/histo3d_rgb
-* use/accu/stat/histo3d_hsl
-* tests/accu/stat/histo3d_hsl
-VI SAUVEGARDE FORMAT GNUPLOT SHELL
-----------------------------------
VII VISUALISATION HISTOGRAMMES 3D
diff --git a/scribo/sandbox/green/mln/io/plot/save_image_sh.hh b/scribo/sandbox/green/mln/io/plot/save_image_sh.hh
index 137f78d..7e28f6f 100644
--- a/scribo/sandbox/green/mln/io/plot/save_image_sh.hh
+++ b/scribo/sandbox/green/mln/io/plot/save_image_sh.hh
@@ -38,6 +38,29 @@
/// The script file call gnuplot in batch mode, the result window persists and
/// that's all.
///
+/// The following sample is a typical use of the gnuplot shell export library.
+///
+/// #include <mln/accu/stat/histo1d.hh>
+/// #include <mln/data/compute.hh>
+/// #include <mln/core/image/image1d.hh>
+/// #include <mln/core/image/image2d.hh>
+/// #include <mln/img_path.hh>
+/// #include <mln/io/pgm/load.hh>
+/// #include <mln/io/plot/save_image_sh.hh>
+/// #include <mln/value/int_u8.hh>
+///
+/// int main()
+/// {
+/// typedef mln::value::int_u8 t_int_u8;
+/// mln::image2d<t_int_u8> img;
+/// mln::image1d<unsigned> histo;
+///
+/// mln::io::pgm::load(img, OLENA_IMG_PATH"/lena.pgm");
+/// histo = mln::data::compute(mln::accu::meta::histo::histo1d(), img);
+/// mln::io::plot::save_image_sh(histo, "histo.sh");
+///
+/// return 0;
+/// }
# include <fstream>
# include <string>
@@ -92,7 +115,6 @@ namespace mln
/// filename parameter as unix path. The script shell file must have the
/// permission to execute (chmod 755). Launch the script shell to call
/// gnuplot in batchmode with fine parameters.
-
template <typename I>
bool save_image_sh(const Image<I>& img, const std::string& filename);
@@ -112,6 +134,18 @@ namespace mln
bool save_image_sh(const util::array< image1d<I> >& stack,
const std::string& filename);
+ /// \brief Save a stack of stack of image.
+ ///
+ /// This is an experimental support.
+ ///
+ /// \param[in] stack the stack of image to save.
+ /// \param[in] filename the name of the unix script shell.
+ /// \return the status of the opening file operation.
+ ///
+ /// The result depends on the permission to save the file with
+ /// filename parameter as unix path. The script shell file must have the
+ /// permission to execute (chmod 755). Launch the script shell to call
+ /// gnuplot in batchmode with fine parameters.
template <typename I>
bool save_image_sh(const util::array< util::array< image1d<I> > >& stack,
const std::string& filename);
diff --git a/scribo/sandbox/green/tests/io/plot/save_image_sh/Makefile.am b/scribo/sandbox/green/tests/io/plot/save_image_sh/Makefile.am
index d970989..77f9015 100644
--- a/scribo/sandbox/green/tests/io/plot/save_image_sh/Makefile.am
+++ b/scribo/sandbox/green/tests/io/plot/save_image_sh/Makefile.am
@@ -6,8 +6,13 @@
# TOOLS #
#########
-INCLUDES= -I$(HOME)/svn/oln/trunk/milena/sandbox/green
+#LOADLIBES= -lboost_filesystem
+INCLUDES1= -I$(HOME)/git/olena/scribo/sandbox/green
+INCLUDES2= -I$(HOME)/git/olena/milena
+INCLUDES= $(INCLUDES1) $(INCLUDES2)
CXXFLAGS= -ggdb -O0 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+#CXXFLAGS= -DNDEBUG -O1 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
+#CXXFLAGS= -DNDEBUG -O3 -Wall -W -pedantic -ansi -pipe $(INCLUDES)
ECHO= echo
RM= rm
MKDIR= mkdir -p
@@ -20,10 +25,10 @@ BUILD__PATTERN= green/build/tests
ifeq ($(findstring $(BUILD__PATTERN),$(PWD)), $(BUILD__PATTERN))
# Case where make is done from build directory.
SOURCE_DIR= $(subst $(BUILD__PATTERN),$(SOURCE_PATTERN),$(PWD))
-BUILD__DIR= $(PWD)
+BUILD__DIR= $(PWD)/
else
# Case where make is done from source directory.
-SOURCE_DIR= $(PWD)
+SOURCE_DIR= $(PWD)/
BUILD__DIR= $(subst $(SOURCE_PATTERN),$(BUILD__PATTERN),$(PWD))
endif
@@ -60,7 +65,7 @@ $(BUILD__DIR):
# Copy, if nessary, all the files, except the Makefile.am
$(BUILD__F_PATH): $(SOURCE_F_PATH)
- $(CP) $(addprefix $(SOURCE_DIR)/,$(@F)) $@
+ $(CP) $(addprefix $(SOURCE_DIR),$(@F)) $@
# Copy if nessary, the Makefile.am into Makefile
$(BUILD__M_PATH): $(SOURCE_M_PATH)
diff --git a/scribo/sandbox/green/tests/io/plot/save_image_sh/save_image_sh.cc b/scribo/sandbox/green/tests/io/plot/save_image_sh/save_image_sh.cc
index c9c817b..c60533e 100644
--- a/scribo/sandbox/green/tests/io/plot/save_image_sh/save_image_sh.cc
+++ b/scribo/sandbox/green/tests/io/plot/save_image_sh/save_image_sh.cc
@@ -1,4 +1,36 @@
-/// TEST SAVE_IMAGE_SH.HH
+// Copyright (C) 2007,2008,2009,2010 EPITA LRDE
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief This source manages unitary testing on gnuplot shell export library.
+///
+/// Tests are performed in various image format, such as image1d, image2d<bool>,
+/// image2d<int_u8>, image2d<int_u16>, image2d<int_s8>, image2d<int_s16>,
+/// image2d<float>, image2d<double>, image2d<rgb8>, image2d<rgb16>,
+/// image2d<hsl_f>, image2d<hsl_d>, image2d<hsi_f>, image2d<hsi_d>, image3d.
#include <iostream>
#include <limits.h>
@@ -32,9 +64,13 @@
#include <mln/literal/colors.hh>
#include <mln/debug/println.hh>
-//------------------------------------------------------------------------------
-// TEST TO SAVE UNSIGNED 8 BITS 1D GRAYSCALE IMAGE
-//------------------------------------------------------------------------------
+
+/// image1d<int_u8>.
+/// \{
+/// \brief Test saving a grayscale image1d.
+///
+/// As working on the image1d interface is something extremely rare, we need
+/// to use the plot interface to first load some datas and then export them.
mln::image1d<mln::value::int_u8>
convert_array_to_image1d(const mln::util::array<mln::value::int_u8>& array)
@@ -64,7 +100,7 @@ void test_save_image_sh_1d()
image1d img;
array1d array;
-
+
mln::io::plot::load(array, OLENA_IMG_PATH"/fly.plot");
img = convert_array_to_image1d(array);
@@ -73,16 +109,20 @@ void test_save_image_sh_1d()
// Save it where we have the full permissions.
bool ref_true = mln::io::plot::save_image_sh(img, "fly1d.sh");
-
+
mln_assertion(true == ref_true);
mln_assertion(false == ref_false);
std::cout << "save image 1d : ok" << std::endl;
}
-//------------------------------------------------------------------------------
-// Test to save image2d<bool>
-//------------------------------------------------------------------------------
+/// \}
+/// image2d<bool>.
+/// \{
+/// \brief Test saving an image2d<bool>.
+///
+/// Boolean image2d are extremly convenient for storing mask. We have a lots
+/// of example in milena.
void test_save_image2d_bool()
{
@@ -93,22 +133,26 @@ void test_save_image2d_bool()
image2d_bool img_bool;
mln::io::pbm::load(img_bool, OLENA_IMG_PATH"/lena.pbm");
-
+
// Save it were it is impossible to do it !!
bool ref_false = mln::io::plot::save_image_sh(img_bool, null_lena);
// Save it where we have the full permissions.
bool ref_true = mln::io::plot::save_image_sh(img_bool, lena);
-
+
mln_assertion(true == ref_true);
mln_assertion(false == ref_false);
std::cout << "save image2d<bool>: ok" << std::endl;
}
-//------------------------------------------------------------------------------
-// Test to save image2d<int_u8>
-//------------------------------------------------------------------------------
+/// \}
+/// image2d<int_u8>.
+/// \{
+/// \brief Test saving a grayscale image2d.
+///
+/// Grayscale image2d are very popular in image processing. It's the test we do
+/// not fail!
void test_save_image2d_int_u8()
{
@@ -120,27 +164,36 @@ void test_save_image2d_int_u8()
image2d_int_u8 img_int_u8;
mln::io::pgm::load(img_int_u8, OLENA_IMG_PATH"/lena.pgm");
-
+
// Save it were it is impossible to do it !!
bool ref_false = mln::io::plot::save_image_sh(img_int_u8, null_lena);
// Save it where we have the full permissions.
bool ref_true = mln::io::plot::save_image_sh(img_int_u8, lena);
-
+
mln_assertion(true == ref_true);
mln_assertion(false == ref_false);
std::cout << "save image2d<int_u8>: ok" << std::endl;
}
-//------------------------------------------------------------------------------
-// Test to save image2d<int_u16>
-//------------------------------------------------------------------------------
+/// \}
+
+/// image2d<int_u16>.
+/// \{
+/// \brief Test saving an extended grayscale image2d.
+///
+/// This kind of image are not so current. But for medical use, we can get now,
+/// some dicom in 12 bits and new generation bring us 16 bits. As 16 bits is a
+/// strange format for image processing people, there is not a common
+/// acceptation for the underline format. Xv or imageMagick doesn't agree for
+/// the representation of the file.
+
struct int_u16_to_int_u8 : mln::Function_v2v< int_u16_to_int_u8 >
{
typedef mln::value::int_u16 argument;
typedef mln::value::int_u8 result;
-
+
result operator()(const argument& c) const
{
result res(c / 256);
@@ -170,22 +223,28 @@ void test_save_image2d_int_u16()
// Save it where we have the full permissions.
bool ref_true = mln::io::plot::save_image_sh(img_int_u16, lena);
-
+
mln_assertion(true == ref_true);
mln_assertion(false == ref_false);
std::cout << "save image2d<int_u16> : ok" << std::endl;
}
+/// \}
+
+/// image2d<int_s8>.
+/// \{
+/// \brief Test saving an signed image2d.
+///
+/// This kind of image are very artificial. It is given for exhaustivity of
+/// testing. In fact, this kind of image traduces some step in a computing
+/// chain.
-//------------------------------------------------------------------------------
-// Test to save image2d<int_s8>
-//------------------------------------------------------------------------------
struct int_u8_to_int_s8 : mln::Function_v2v< int_u8_to_int_s8 >
{
typedef mln::value::int_u8 argument;
typedef mln::value::int_s8 result;
-
+
result operator()(const argument& c) const
{
argument tmp_int_u8;
@@ -197,7 +256,7 @@ struct int_u8_to_int_s8 : mln::Function_v2v< int_u8_to_int_s8 >
{
res = SCHAR_MAX;
}
- else if (SCHAR_MAX < c)
+ else if (static_cast<unsigned>(SCHAR_MAX) < c)
{
tmp_int_u8 = c - SCHAR_MAX;
res = static_cast<mln::value::int_s8>(tmp_int_u8);
@@ -226,28 +285,34 @@ void test_save_image2d_int_s8()
image2d_int_u8 img_int_u8;
mln::io::pgm::load(img_int_u8, OLENA_IMG_PATH"/lena.pgm");
- img_int_s8 = mln::data::transform(img_int_u8, int_u8_to_int_s8());
-
+ img_int_s8 = mln::data::transform(img_int_u8, int_u8_to_int_s8());
+
// Save it were it is impossible to do it !!
bool ref_false = mln::io::plot::save_image_sh(img_int_s8, null_lena);
// Save it where we have the full permissions.
bool ref_true = mln::io::plot::save_image_sh(img_int_s8, lena);
-
+
mln_assertion(true == ref_true);
mln_assertion(false == ref_false);
std::cout << "save image2d<int_s8>: ok" << std::endl;
}
-//------------------------------------------------------------------------------
-// Test to save image2d<int_s16>
-//------------------------------------------------------------------------------
+/// \}
+
+/// image2d<int_s16>.
+/// \{
+/// \brief Test saving an extended image2d.
+///
+/// This kind of image are very artificial. It is given for exhaustivity of
+/// testing. In fact, this kind of image traduces some step in a computing
+/// chain.
struct int_u16_to_int_s16 : mln::Function_v2v< int_u16_to_int_s16 >
{
typedef mln::value::int_u16 argument;
typedef mln::value::int_s16 result;
-
+
result operator()(const argument& c) const
{
argument tmp_int_u16;
@@ -258,7 +323,7 @@ struct int_u16_to_int_s16 : mln::Function_v2v< int_u16_to_int_s16 >
{
res = SHRT_MAX;
}
- else if (SHRT_MAX < c)
+ else if (static_cast<unsigned>(SHRT_MAX) < c)
{
tmp_int_u16 = c - SHRT_MAX;
res = static_cast<mln::value::int_s16>(tmp_int_u16);
@@ -286,29 +351,33 @@ void test_save_image2d_int_s16()
image2d_int_u16 img_int_u16;
mln::io::pgm::load(img_int_u16, OLENA_IMG_PATH"/lena_16_gnuplot.pgm");
- img_int_s16 = mln::data::transform(img_int_u16, int_u16_to_int_s16());
+ img_int_s16 = mln::data::transform(img_int_u16, int_u16_to_int_s16());
// Save it were it is impossible to do it !!
bool ref_false = mln::io::plot::save_image_sh(img_int_s16, null_lena);
// Save it where we have the full permissions.
bool ref_true = mln::io::plot::save_image_sh(img_int_s16, lena);
-
+
mln_assertion(true == ref_true);
mln_assertion(false == ref_false);
std::cout << "save image2d<int_s16> : ok" << std::endl;
}
+/// \}
-//------------------------------------------------------------------------------
-// Test to save image2d<float>
-//------------------------------------------------------------------------------
+/// image2d<float>.
+/// \{
+/// \brief Test saving a float image2d.
+///
+/// This kind of image is a common way to save some attributes localized on
+/// pixels.
struct int_u8_to_float : mln::Function_v2v< int_u8_to_float >
{
typedef mln::value::int_u8 argument;
typedef float result;
-
+
result operator()(const argument& c) const
{
result res = static_cast<float>(c)/3;
@@ -330,27 +399,32 @@ void test_save_image2d_float()
mln::io::pgm::load(img_int_u8, OLENA_IMG_PATH"/lena.pgm");
img_float = mln::data::transform(img_int_u8, int_u8_to_float());
-
+
// Save it were it is impossible to do it !!
bool ref_false = mln::io::plot::save_image_sh(img_float, null_lena);
// Save it where we have the full permissions.
bool ref_true = mln::io::plot::save_image_sh(img_float, lena);
-
+
mln_assertion(true == ref_true);
mln_assertion(false == ref_false);
std::cout << "save image2d<float> : ok" << std::endl;
}
-//------------------------------------------------------------------------------
-// Test to save image2d<double>
-//------------------------------------------------------------------------------
+/// \}
+
+/// image2d<double>.
+/// \{
+/// \brief Test saving a double image2d.
+///
+/// This kind of image is a common way to save some attributes localized on
+/// pixels.
struct int_u16_to_double : mln::Function_v2v< int_u16_to_double >
{
typedef mln::value::int_u16 argument;
typedef double result;
-
+
result operator()(const argument& c) const
{
result res = static_cast<float>(c)/256;
@@ -372,23 +446,25 @@ void test_save_image2d_double()
mln::io::pgm::load(img_int_u16, OLENA_IMG_PATH"/lena_16_gnuplot.pgm");
img_double = mln::data::transform(img_int_u16, int_u16_to_double());
-
+
// Save it were it is impossible to do it !!
bool ref_false = mln::io::plot::save_image_sh(img_double, null_lena);
// Save it where we have the full permissions.
bool ref_true = mln::io::plot::save_image_sh(img_double, lena);
-
+
mln_assertion(true == ref_true);
mln_assertion(false == ref_false);
std::cout << "save image2d<double> : ok" << std::endl;
}
+/// \}
-
-//------------------------------------------------------------------------------
-// Test to save image2d<rgb8>
-//------------------------------------------------------------------------------
+/// image2d<rgb8>.
+/// \{
+/// \brief Test saving a RGB color image2d.
+///
+/// This kind of format is extremely popular in image, and in photography.
void test_save_image2d_rgb8()
{
@@ -400,28 +476,33 @@ void test_save_image2d_rgb8()
image2d_rgb8 img_rgb8;
mln::io::ppm::load(img_rgb8, OLENA_IMG_PATH"/lena.ppm");
-
+
// Save it were it is impossible to do it !!
bool ref_false = mln::io::plot::save_image_sh(img_rgb8, null_lena);
// Save it where we have the full permissions.
bool ref_true = mln::io::plot::save_image_sh(img_rgb8, lena);
-
+
mln_assertion(true == ref_true);
mln_assertion(false == ref_false);
std::cout << "save image2d<rgb8> : ok" << std::endl;
}
-//------------------------------------------------------------------------------
-// Test to save image2d<rgb16>
-//------------------------------------------------------------------------------
+/// \}
+
+/// image2d<rgb16>.
+/// \{
+/// \brief Test saving a 16 bits RGB color image2d.
+///
+/// As this kind of image is less popular, the library enable this export by
+/// the will of exhaustivity.
struct rgb16_to_int_u16 : mln::Function_v2v< rgb16_to_int_u16 >
{
typedef mln::value::rgb16 argument;
typedef mln::value::int_u16 result;
-
+
result operator()(const argument& c) const
{
result res((c.red() + c.green() + c.blue())/3);
@@ -447,23 +528,28 @@ void test_save_image2d_rgb16()
mln::io::ppm::load(img_rgb16, OLENA_IMG_PATH"/lena_16.ppm");
//img_int_u16 = mln::data::transform(img_rgb16, rgb16_to_int_u16());
//mln::io::pgm::save(img_int_u16, "lena_16.pgm");
-
+
// Save it were it is impossible to do it !!
bool ref_false=mln::io::plot::save_image_sh(img_rgb16, null_lena);
// Save it where we have the full permissions.
bool ref_true = mln::io::plot::save_image_sh(img_rgb16, lena);
// mln::io::plot::save_image_sh(img_int_u16, lena2);
-
+
mln_assertion(true == ref_true);
mln_assertion(false == ref_false);
std::cout << "save image2d<rgb16> : ok" << std::endl;
}
+/// \}
-//------------------------------------------------------------------------------
-// Test to save image2d<hsl_f>
-//------------------------------------------------------------------------------
+/// image2d<hsl_f>.
+/// \{
+/// \brief Test saving a HSL float color image2d.
+///
+/// This kind of image allow to show the power of gnuplot. Raw data
+/// are hsl, then hsl equations are integrated in the gnuplot shell
+/// file. So decoding needs more time.
void test_save_image2d_hsl_f()
{
@@ -484,21 +570,27 @@ void test_save_image2d_hsl_f()
//mln::data::fill(img_rgb8, mln::literal::blue);
img_hsl_f = mln::data::transform(img_rgb8, rgb_to_hsl());
-
+
// Save it were it is impossible to do it !!
bool ref_false = mln::io::plot::save_image_sh(img_hsl_f, null_lena);
// Save it where we have the full permissions.
bool ref_true = mln::io::plot::save_image_sh(img_hsl_f, lena);
-
+
mln_assertion(true == ref_true);
mln_assertion(false == ref_false);
std::cout << "save image2d<hsl_f> : ok" << std::endl;
}
-//------------------------------------------------------------------------------
-// Test to save image2d<hsl_d>
-//------------------------------------------------------------------------------
+/// \}
+
+/// image2d<hsl_d>.
+/// \{
+/// \brief Test saving a HSL double color image2d.
+///
+/// This kind of image allow to show the power of gnuplot. Raw data
+/// are hsl, then hsl equations are integrated in the gnuplot shell
+/// file. So decoding needs more time.
void test_save_image2d_hsl_d()
{
@@ -519,22 +611,27 @@ void test_save_image2d_hsl_d()
//mln::data::fill(img_rgb16, mln::literal::blue);
img_hsl_d = mln::data::transform(img_rgb16, rgb_to_hsl());
-
+
// Save it were it is impossible to do it !!
bool ref_false = mln::io::plot::save_image_sh(img_hsl_d, null_lena);
// Save it where we have the full permissions.
bool ref_true = mln::io::plot::save_image_sh(img_hsl_d, lena);
-
+
mln_assertion(true == ref_true);
mln_assertion(false == ref_false);
std::cout << "save image2d<hsl_d> : ok" << std::endl;
}
+/// \}
-//------------------------------------------------------------------------------
-// Test to save image2d<hsi_f>
-//------------------------------------------------------------------------------
+/// image2d<hsi_f>.
+/// \{
+/// \brief Test saving a HSI float color image2d.
+///
+/// This kind of image allow to show the power of gnuplot. Raw data
+/// are hsi, then hsi equations are integrated in the gnuplot shell
+/// file. So decoding needs more time.
void test_save_image2d_hsi_f()
{
@@ -555,21 +652,27 @@ void test_save_image2d_hsi_f()
//mln::data::fill(img_rgb8, mln::literal::blue);
img_hsi_f = mln::data::transform(img_rgb8, rgb_to_hsi());
-
+
// Save it were it is impossible to do it !!
bool ref_false = mln::io::plot::save_image_sh(img_hsi_f, null_lena);
// Save it where we have the full permissions.
bool ref_true = mln::io::plot::save_image_sh(img_hsi_f, lena);
-
+
mln_assertion(true == ref_true);
mln_assertion(false == ref_false);
std::cout << "save image2d<hsi_f> : ok" << std::endl;
}
-//------------------------------------------------------------------------------
-// Test to save image2d<hsi_d>
-//------------------------------------------------------------------------------
+/// \}
+
+/// image2d<hsi_d>.
+/// \{
+/// \brief Test saving a HSI double color image2d.
+///
+/// This kind of image allow to show the power of gnuplot. Raw data
+/// are hsi, then hsi equations are integrated in the gnuplot shell
+/// file. So decoding needs more time.
void test_save_image2d_hsi_d()
{
@@ -590,21 +693,28 @@ void test_save_image2d_hsi_d()
//mln::data::fill(img_rgb16, mln::literal::blue);
img_hsi_d = mln::data::transform(img_rgb16, rgb_to_hsi());
-
+
// Save it were it is impossible to do it !!
bool ref_false = mln::io::plot::save_image_sh(img_hsi_d, null_lena);
// Save it where we have the full permissions.
bool ref_true = mln::io::plot::save_image_sh(img_hsi_d, lena);
-
+
mln_assertion(true == ref_true);
mln_assertion(false == ref_false);
std::cout << "save image2d<hsi_d> : ok" << std::endl;
}
-//------------------------------------------------------------------------------
-// TEST TO SAVE 8 BITS 3D RGB IMAGE
-//------------------------------------------------------------------------------
+/// \}
+
+/// image3d<int_8>.
+/// \{
+/// \brief Test saving a grayscale image3d.
+///
+/// It seems important to be able to export in 3d, but it's not so popular
+/// in the team. We try to simulate this functionnality.
+///
+/// \fixme The data visualization is very hard in 3d compact with gnuplot.
void test_save_image_sh_3d()
{
@@ -619,18 +729,20 @@ void test_save_image_sh_3d()
array.append(OLENA_IMG_PATH"/fly.pgm");
mln::io::pgms::load(img, array);
-
+
// Save it were it is impossible to do it !!
bool ref_false = mln::io::plot::save_image_sh(img, "/dev/null/fly3d.sh");
// Save it where we have the full permissions.
bool ref_true = mln::io::plot::save_image_sh(img, "fly3d.sh");
-
+
mln_assertion(true == ref_true);
mln_assertion(false == ref_false);
std::cout << "save image 3d : ok" << std::endl;
}
+/// \}
+
int main()
{
@@ -649,7 +761,7 @@ int main()
test_save_image2d_rgb8();
test_save_image2d_rgb16();
-
+
test_save_image2d_hsl_f();
test_save_image2d_hsl_d();
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am b/scribo/sandbox/green/use/io/plot/save_image_sh/Makefile.am
similarity index 100%
copy from scribo/sandbox/green/use/accu/stat/histo1d/Makefile.am
copy to scribo/sandbox/green/use/io/plot/save_image_sh/Makefile.am
diff --git a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc b/scribo/sandbox/green/use/io/plot/save_image_sh/save_image_sh.cc
similarity index 91%
copy from scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
copy to scribo/sandbox/green/use/io/plot/save_image_sh/save_image_sh.cc
index af39d94..bd4b84f 100644
--- a/scribo/sandbox/green/use/accu/stat/histo1d/histo1d.cc
+++ b/scribo/sandbox/green/use/io/plot/save_image_sh/save_image_sh.cc
@@ -25,7 +25,7 @@
/// \file
///
-/// \brief Minimal code for building 1d image histogram version.
+/// \brief Example of code using the gnuplot shell export library.
///
#include <mln/accu/stat/histo1d.hh>
@@ -34,6 +34,7 @@
#include <mln/core/image/image2d.hh>
#include <mln/img_path.hh>
#include <mln/io/pgm/load.hh>
+#include <mln/io/plot/save_image_sh.hh>
#include <mln/value/int_u8.hh>
@@ -46,6 +47,7 @@ int main()
mln::io::pgm::load(img, OLENA_IMG_PATH"/lena.pgm");
histo = mln::data::compute(mln::accu::meta::stat::histo1d(), img);
+ mln::io::plot::save_image_sh(histo, "histo.sh");
return 0;
}
--
1.5.6.5
1
0
last-svn-commit-23-ge164d64 Build translation table between number of pixels and percentage of pixels in image for the scribo database.
by Yann Jacquelet 15 Nov '10
by Yann Jacquelet 15 Nov '10
15 Nov '10
* green/demo/labeling/regional_maxima/threshold.txt: New translation
table.
---
milena/sandbox/ChangeLog | 8 ++++++++
.../demo/labeling/regional_maxima/thresholds.txt | 15 +++++++++++++++
2 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/milena/sandbox/ChangeLog b/milena/sandbox/ChangeLog
index 6b0a1ac..d6aa439 100644
--- a/milena/sandbox/ChangeLog
+++ b/milena/sandbox/ChangeLog
@@ -1,5 +1,13 @@
2010-01-05 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+ Build translation table between number of pixels and percentage of
+ pixels in image for the scribo database.
+
+ * green/demo/labeling/regional_maxima/threshold.txt: New translation
+ table.
+
+2010-01-05 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
Split the regional maxima binary in small atomic binaries.
* green/tools/annotating/histo: New directory.
diff --git a/milena/sandbox/green/demo/labeling/regional_maxima/thresholds.txt b/milena/sandbox/green/demo/labeling/regional_maxima/thresholds.txt
index ddf5ca7..58f3e6a 100644
--- a/milena/sandbox/green/demo/labeling/regional_maxima/thresholds.txt
+++ b/milena/sandbox/green/demo/labeling/regional_maxima/thresholds.txt
@@ -5,9 +5,24 @@ image = 1169 x 1567 = 1831823
-----------------------
0.05 % | 1000.00
1.00 % | 18318.23
+ 2.00 % | 36636.46
+ 3.00 % | 54954.69
+ 4.00 % | 73272.92
5.00 % | 91591.15
+ 6.00 % | 109909.38
+ 7.00 % | 128227.61
+ 8.00 % | 146545.84
+ 9.00 % | 164864.07
10.00 % | 183182.30
+ 11.00 % | 201500.53
+ 12.00 % | 219818.76
+ 13.00 % | 238136.99
+ 14.00 % | 256455.22
15.00 % | 274773.45
+ 16.00 % | 293091.68
+ 17.00 % | 311409.91
+ 18.00 % | 329728.14
+ 19.00 % | 348046.37
20.00 % | 366364.60
25.00 % | 457955.75
30.00 % | 549546.90
--
1.5.6.5
1
0
last-svn-commit-24-gcfa660b Extend the histogram visualization tools for new projection concept.
by Yann Jacquelet 15 Nov '10
by Yann Jacquelet 15 Nov '10
15 Nov '10
* green/mln/display/project_histo.hh (project2_histo): New functions
that keep the max of the histogram or the class associate to it while
projecting along a direction.
* green/mln/display/project_histo.hh (project3_histo): New functions
that keep the color of the class associate to the histogram maximum
while projecting along a direction.
* green/mln/display/display_histo.hh: New interface functions for
project2_histo and project3_histo.
---
milena/sandbox/ChangeLog | 13 +
milena/sandbox/green/mln/display/display_histo.hh | 50 +++
milena/sandbox/green/mln/display/project_histo.hh | 344 +++++++++++++++++++++
3 files changed, 407 insertions(+), 0 deletions(-)
diff --git a/milena/sandbox/ChangeLog b/milena/sandbox/ChangeLog
index d6aa439..ed75bd1 100644
--- a/milena/sandbox/ChangeLog
+++ b/milena/sandbox/ChangeLog
@@ -1,5 +1,18 @@
2010-01-05 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+ Extend the histogram visualization tools for new projection concept.
+
+ * green/mln/display/project_histo.hh (project2_histo): New functions
+ that keep the max of the histogram or the class associate to it while
+ projecting along a direction.
+ * green/mln/display/project_histo.hh (project3_histo): New functions
+ that keep the color of the class associate to the histogram maximum
+ while projecting along a direction.
+ * green/mln/display/display_histo.hh: New interface functions for
+ project2_histo and project3_histo.
+
+2010-01-05 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
Build translation table between number of pixels and percentage of
pixels in image for the scribo database.
diff --git a/milena/sandbox/green/mln/display/display_histo.hh b/milena/sandbox/green/mln/display/display_histo.hh
index 1fd5da4..2ba0b61 100644
--- a/milena/sandbox/green/mln/display/display_histo.hh
+++ b/milena/sandbox/green/mln/display/display_histo.hh
@@ -33,6 +33,8 @@
# include <mln/display/project_histo.hh>
# include <mln/fun/v2v/log.hh>
# include <mln/value/int_u8.hh>
+# include <mln/value/rgb8.hh>
+# include <mln/value/label_8.hh>
/// \file
@@ -55,6 +57,20 @@ namespace mln
image2d<value::int_u8>
display_histo3d_unsigned(const image3d<unsigned>& histo);
+ image2d<value::int_u8>
+ display2_histo3d_unsigned(const image3d<unsigned>& histo);
+
+ image2d<value::label_8>
+ display2_histo3d_unsigned(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label);
+
+ image2d<value::rgb8>
+ display3_histo3d_unsigned(const image3d<unsigned>& histo);
+
+ image2d<value::rgb8>
+ display3_histo3d_unsigned(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label);
+
#ifndef MLN_INCLUDE_ONLY
/// \brief Allow the visualization of a 3d histogram by projection.
@@ -86,6 +102,40 @@ namespace mln
return proj_int;
}
+ image2d<value::int_u8>
+ display2_histo3d_unsigned(const image3d<unsigned>& histo)
+ {
+ image2d<value::int_u8> proj = project2_histo<0>(histo);
+
+ return proj;
+ }
+
+ image2d<value::label_8>
+ display2_histo3d_unsigned(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label)
+ {
+ image2d<value::label_8> proj = project2_histo<0>(histo, label);
+
+ return proj;
+ }
+
+ image2d<value::rgb8>
+ display3_histo3d_unsigned(const image3d<unsigned>& histo)
+ {
+ image2d<value::rgb8> proj = project3_histo<0>(histo);
+
+ return proj;
+ }
+
+ image2d<value::rgb8>
+ display3_histo3d_unsigned(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label)
+ {
+ image2d<value::rgb8> proj = project3_histo<0>(histo, label);
+
+ return proj;
+ }
+
#endif // ! MLN_INCLUDE_ONLY
diff --git a/milena/sandbox/green/mln/display/project_histo.hh b/milena/sandbox/green/mln/display/project_histo.hh
index f0e6858..d842c70 100644
--- a/milena/sandbox/green/mln/display/project_histo.hh
+++ b/milena/sandbox/green/mln/display/project_histo.hh
@@ -37,6 +37,12 @@
# include <mln/accu/image/take.hh>
# include <mln/accu/image/to_result.hh>
+# include <mln/opt/at.hh>
+
+# include <mln/value/int_u8.hh>
+# include <mln/value/rgb8.hh>
+# include <mln/value/label_8.hh>
+
/// \file
///
/// \brief Allow the visualization of 3d histogram.
@@ -54,6 +60,10 @@ namespace mln
image2d<mln_result(A)>
project_histo(const image3d<V>& histo);
+ template <typename A, unsigned direction, typename V>
+ image2d<mln_result(A)>
+ project2_histo(const image3d<V>& histo);
+
# ifndef MLN_INCLUDE_ONLY
/// \brief Allow the visualization of 3d histogram.
@@ -86,6 +96,340 @@ namespace mln
return accu::image::to_result(histo_accu);
}
+ template <unsigned direction>
+ image2d<value::int_u8>
+ project2_histo(const image3d<unsigned>& histo)
+ {
+ image2d<value::int_u8> result;
+
+ if (0 == direction) // blue
+ {
+ image2d<value::int_u8> arg_max(histo.ncols(), histo.nslices());
+
+ for (unsigned j = 0; j < histo.ncols(); ++j)
+ for (unsigned i = 0; i < histo.nslices(); ++i)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (unsigned k = 0; k < histo.nrows(); ++k)
+ {
+ if (max <= opt::at(histo,i,j,k))
+ {
+ max = opt::at(histo,i,j,k);
+ pos = k;
+ }
+ }
+
+ opt::at(arg_max,i,j) = pos;
+ }
+
+ result = arg_max;
+ }
+ else if (1 == direction) // red
+ {
+ image2d<value::int_u8> arg_max(histo.nrows(), histo.nslices());
+
+ for (unsigned j = 0; j < histo.nslices(); ++j)
+ for (unsigned i = 0; i < histo.nrows(); ++i)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (unsigned k = 0; k < histo.ncols(); ++k)
+ {
+ if (max <= opt::at(histo,i,j,k))
+ {
+ max = opt::at(histo,i,j,k);
+ pos = k;
+ }
+ }
+
+ opt::at(arg_max,i,j) = pos;
+ }
+
+ result = arg_max;
+ }
+ else // 2 == direction // green
+ {
+ image2d<value::int_u8> arg_max(histo.nrows(), histo.ncols());
+
+ for (unsigned j = 0; j < histo.ncols(); ++j)
+ for (unsigned i = 0; i < histo.nrows(); ++i)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (unsigned k = 0; k < histo.nslices(); ++k)
+ {
+ if (max <= opt::at(histo,i,j,k))
+ {
+ max = opt::at(histo,i,j,k);
+ pos = k;
+ }
+ }
+
+ opt::at(arg_max,i,j) = pos;
+ }
+
+ result = arg_max;
+ }
+
+ return result;
+ }
+
+ template <unsigned direction>
+ image2d<value::label_8>
+ project2_histo(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label)
+ {
+ image2d<value::label_8> result;
+
+ if (0 == direction) // blue
+ {
+ image2d<value::label_8> arg_max(histo.ncols(), histo.nslices());
+
+ for (unsigned j = 0; j < histo.ncols(); ++j)
+ for (unsigned i = 0; i < histo.nslices(); ++i)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (unsigned k = 0; k < histo.nrows(); ++k)
+ {
+ if (max <= opt::at(histo,i,j,k))
+ {
+ max = opt::at(histo,i,j,k);
+ pos = k;
+ }
+ }
+
+ opt::at(arg_max,i,j) = opt::at(label,i,j,pos);
+ }
+
+ result = arg_max;
+ }
+ else if (1 == direction) // red
+ {
+ image2d<value::label_8> arg_max(histo.nrows(), histo.nslices());
+
+ for (unsigned j = 0; j < histo.nslices(); ++j)
+ for (unsigned i = 0; i < histo.nrows(); ++i)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (unsigned k = 0; k < histo.ncols(); ++k)
+ {
+ if (max <= opt::at(histo,i,j,k))
+ {
+ max = opt::at(histo,i,j,k);
+ pos = k;
+ }
+ }
+
+ opt::at(arg_max,i,j) = opt::at(label,pos,i,j);
+ }
+
+ result = arg_max;
+ }
+ else // 2 == direction // green
+ {
+ image2d<value::label_8> arg_max(histo.nrows(), histo.ncols());
+
+ for (unsigned j = 0; j < histo.ncols(); ++j)
+ for (unsigned i = 0; i < histo.nrows(); ++i)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (unsigned k = 0; k < histo.nslices(); ++k)
+ {
+ if (max <= opt::at(histo,i,j,k))
+ {
+ max = opt::at(histo,i,j,k);
+ pos = k;
+ }
+ }
+
+ opt::at(arg_max,i,j) = opt::at(label,i,pos,j);
+ }
+
+ result = arg_max;
+ }
+
+ return result;
+ }
+
+
+ // FIXME ... determine the color of each class.
+ template <unsigned direction>
+ image2d<value::rgb8>
+ project3_histo(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label)
+ {
+ image2d<value::rgb8> result;
+
+ if (0 == direction) // blue
+ {
+ image2d<value::rgb8> arg_max(histo.ncols(), histo.nslices());
+
+ for (unsigned j = 0; j < histo.ncols(); ++j)
+ for (unsigned i = 0; i < histo.nslices(); ++i)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (unsigned k = 0; k < histo.nrows(); ++k)
+ {
+ if (max <= opt::at(histo,i,j,k))
+ {
+ max = opt::at(histo,i,j,k);
+ pos = k;
+ }
+ }
+
+ opt::at(arg_max,i,j) = value::rgb8(i,j,pos);
+ }
+
+ result = arg_max;
+ }
+ else if (1 == direction) // red
+ {
+ image2d<value::rgb8> arg_max(histo.nrows(), histo.nslices());
+
+ for (unsigned j = 0; j < histo.nslices(); ++j)
+ for (unsigned i = 0; i < histo.nrows(); ++i)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (unsigned k = 0; k < histo.ncols(); ++k)
+ {
+ if (max <= opt::at(histo,i,j,k))
+ {
+ max = opt::at(histo,i,j,k);
+ pos = k;
+ }
+ }
+
+ opt::at(arg_max,i,j) = value::rgb8(pos,i,j);
+ }
+
+ result = arg_max;
+ }
+ else // 2 == direction // green
+ {
+ image2d<value::rgb8> arg_max(histo.nrows(), histo.ncols());
+
+ for (unsigned j = 0; j < histo.ncols(); ++j)
+ for (unsigned i = 0; i < histo.nrows(); ++i)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (unsigned k = 0; k < histo.nslices(); ++k)
+ {
+ if (max <= opt::at(histo,i,j,k))
+ {
+ max = opt::at(histo,i,j,k);
+ pos = k;
+ }
+ }
+
+ // FIXME ... how to fix the n of rgb
+ opt::at(arg_max,i,j) = value::rgb8(i,pos,j);
+ }
+
+ result = arg_max;
+ }
+
+ return result;
+ }
+
+ template <unsigned direction>
+ image2d<value::rgb8>
+ project3_histo(const image3d<unsigned>& histo)
+ {
+ image2d<value::rgb8> result;
+
+ if (0 == direction) // blue
+ {
+ image2d<value::rgb8> arg_max(histo.ncols(), histo.nslices());
+
+ for (unsigned j = 0; j < histo.ncols(); ++j)
+ for (unsigned i = 0; i < histo.nslices(); ++i)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (unsigned k = 0; k < histo.nrows(); ++k)
+ {
+ if (max <= opt::at(histo,i,j,k))
+ {
+ max = opt::at(histo,i,j,k);
+ pos = k;
+ }
+ }
+
+ opt::at(arg_max,i,j) = value::rgb8(i,j,pos);
+ }
+
+ result = arg_max;
+ }
+ else if (1 == direction) // red
+ {
+ image2d<value::rgb8> arg_max(histo.nrows(), histo.nslices());
+
+ for (unsigned j = 0; j < histo.nslices(); ++j)
+ for (unsigned i = 0; i < histo.nrows(); ++i)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (unsigned k = 0; k < histo.ncols(); ++k)
+ {
+ if (max <= opt::at(histo,i,j,k))
+ {
+ max = opt::at(histo,i,j,k);
+ pos = k;
+ }
+ }
+
+ opt::at(arg_max,i,j) = value::rgb8(pos,i,j);
+ }
+
+ result = arg_max;
+ }
+ else // 2 == direction // green
+ {
+ image2d<value::rgb8> arg_max(histo.nrows(), histo.ncols());
+
+ for (unsigned j = 0; j < histo.ncols(); ++j)
+ for (unsigned i = 0; i < histo.nrows(); ++i)
+ {
+ unsigned max = 0; // minimum as possible
+ signed pos = -1;
+
+ for (unsigned k = 0; k < histo.nslices(); ++k)
+ {
+ if (max <= opt::at(histo,i,j,k))
+ {
+ max = opt::at(histo,i,j,k);
+ pos = k;
+ }
+ }
+
+ // FIXME ... how to fix the n of rgb
+ opt::at(arg_max,i,j) = value::rgb8(i,pos,j);
+ }
+
+ result = arg_max;
+ }
+
+ return result;
+ }
+
# endif // ! MLN_INCLUDE_ONLY
--
1.5.6.5
1
0
last-svn-commit-25-g0d8376d Fix last details in the image processing chain.
by Yann Jacquelet 15 Nov '10
by Yann Jacquelet 15 Nov '10
15 Nov '10
* green/tools/annotating/histo/histo.cc: Manage new inputs/outputs.
* green/tools/annotating/opening/opening.cc: Manage new inputs/outputs.
* green/tools/annotating/iz/Makefile.am: New Makefile.
* green/tools/annotating/iz/iz.cc: New file.
* green/tools/annotating/regmax/regmax.cc: Manage new inputs/outputs.
---
milena/sandbox/ChangeLog | 10 +
.../sandbox/green/tools/annotating/histo/histo.cc | 84 +++--
.../tools/annotating/{histo => iz}/Makefile.am | 0
milena/sandbox/green/tools/annotating/iz/iz.cc | 373 ++++++++++++++++++++
.../green/tools/annotating/opening/opening.cc | 76 +++--
.../green/tools/annotating/regmax/regmax.cc | 253 ++++++++++++--
6 files changed, 714 insertions(+), 82 deletions(-)
copy milena/sandbox/green/tools/annotating/{histo => iz}/Makefile.am (100%)
create mode 100644 milena/sandbox/green/tools/annotating/iz/iz.cc
diff --git a/milena/sandbox/ChangeLog b/milena/sandbox/ChangeLog
index ed75bd1..0968186 100644
--- a/milena/sandbox/ChangeLog
+++ b/milena/sandbox/ChangeLog
@@ -1,3 +1,13 @@
+2010-02-10 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Fix last details in the image processing chain.
+
+ * green/tools/annotating/histo/histo.cc: Manage new inputs/outputs.
+ * green/tools/annotating/opening/opening.cc: Manage new inputs/outputs.
+ * green/tools/annotating/iz/Makefile.am: New Makefile.
+ * green/tools/annotating/iz/iz.cc: New file.
+ * green/tools/annotating/regmax/regmax.cc: Manage new inputs/outputs.
+
2010-01-05 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
Extend the histogram visualization tools for new projection concept.
diff --git a/milena/sandbox/green/tools/annotating/histo/histo.cc b/milena/sandbox/green/tools/annotating/histo/histo.cc
index ab0b8af..8037e1a 100644
--- a/milena/sandbox/green/tools/annotating/histo/histo.cc
+++ b/milena/sandbox/green/tools/annotating/histo/histo.cc
@@ -16,14 +16,14 @@
#include <mln/fun/v2v/rgb8_to_rgbn.hh>
-#include <mln/io/dump/save.hh>
#include <mln/io/pbm/load.hh>
-#include <mln/io/pbm/save.hh>
-#include <mln/io/pgm/load.hh>
-#include <mln/io/pgm/save.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>
@@ -33,15 +33,19 @@
template <unsigned n>
-void mk_histo(const std::string& input,
- const std::string& output,
- const std::string& histo,
- const std::string& mask)
+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;
@@ -54,7 +58,9 @@ void mk_histo(const std::string& input,
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_histo; // histo proj
+ 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());
@@ -72,9 +78,13 @@ void mk_histo(const std::string& input,
// END OF IMAGE PROCESSING CHAIN
// BEGIN DUMPING
- p1_histo = mln::display::display_histo3d_unsigned(h1_input);
+ 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_histo, output.c_str());
+ mln::io::pgm::save(p1_histo1, proj1.c_str());
+ mln::io::ppm::save(p1_histo2, proj2.c_str());
// END DUMPING
}
@@ -82,35 +92,47 @@ void mk_histo(const std::string& input,
void usage()
{
std::cout << std::endl;
- std::cout << "histo input.ppm q out.ppm histo.dump [msk.pbm]" << std::endl;
- std::cout << "where" << std::endl;
- std::cout << "input.ppm is the 8 bits color ppm image" << std::endl;
- std::cout << "q is the degree of quanification {2,3,4,5,6,7,8}" << std::endl;
- std::cout << "out.pgm is the r/g projection of the histogram" << std::endl;
- std::cout << "out.dump is the quantified color histogram" << std::endl;
- std::cout << "msk.pbm is the mask which select the pixels" << 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;
}
int main(int argc, char* args[])
{
- if (5 == argc || 6 == argc)
+ if (7 == argc || 8 == argc)
{
- const std::string input(args[1]);
- const char q = args[2][0];
- const std::string output(args[3]);
- const std::string histo(args[4]);
- const std::string mask(6 == argc? args[5] : "");
+ 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, output, histo, mask); break;
- case '3': mk_histo<3>(input, output, histo, mask); break;
- case '4': mk_histo<4>(input, output, histo, mask); break;
- case '5': mk_histo<5>(input, output, histo, mask); break;
- case '6': mk_histo<6>(input, output, histo, mask); break;
- case '7': mk_histo<7>(input, output, histo, mask); break;
- case '8': mk_histo<8>(input, output, histo, mask); break;
+ 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;
}
}
diff --git a/milena/sandbox/green/tools/annotating/histo/Makefile.am b/milena/sandbox/green/tools/annotating/iz/Makefile.am
similarity index 100%
copy from milena/sandbox/green/tools/annotating/histo/Makefile.am
copy to milena/sandbox/green/tools/annotating/iz/Makefile.am
diff --git a/milena/sandbox/green/tools/annotating/iz/iz.cc b/milena/sandbox/green/tools/annotating/iz/iz.cc
new file mode 100644
index 0000000..07e5dd9
--- /dev/null
+++ b/milena/sandbox/green/tools/annotating/iz/iz.cc
@@ -0,0 +1,373 @@
+// TOOLS ==> influence zone transformation
+
+#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/value/int_u8.hh>
+
+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;
+ }
+};
+
+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();
+}
+
+bool expect(std::istream& stream, const std::string expected)
+{
+ bool result;
+ std::string got;
+
+ stream >> got;
+
+ result = (got == expected);
+
+ return result;
+}
+
+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;
+}
+
+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();
+}
+
+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(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
+}
+
+
+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;
+}
+
+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/milena/sandbox/green/tools/annotating/opening/opening.cc b/milena/sandbox/green/tools/annotating/opening/opening.cc
index 3e1dbf2..cdd37fb 100644
--- a/milena/sandbox/green/tools/annotating/opening/opening.cc
+++ b/milena/sandbox/green/tools/annotating/opening/opening.cc
@@ -15,36 +15,47 @@
#include <mln/io/dump/load.hh>
#include <mln/io/dump/save.hh>
-#include <mln/io/pgm/load.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>
-void mk_opening(const std::string& input,
- const unsigned min_vol,
- const std::string& output,
- const std::string& opened)
+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_histo; // histo proj
+ 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, input.c_str());
+ 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_histo = mln::display::display_histo3d_unsigned(h2_input);
+ 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_histo, output.c_str());
+ mln::io::pgm::save(p1_histo1, proj1.c_str());
+ mln::io::ppm::save(p1_histo2, proj2.c_str());
// END DUMPING
}
@@ -52,25 +63,46 @@ void mk_opening(const std::string& input,
void usage()
{
std::cout << std::endl;
- std::cout << "opening input.dump v out.dump out.ppm" << std::endl;
- std::cout << "where" << std::endl;
- std::cout << "input.dump is the 3d color input histo" << std::endl;
- std::cout << "v is the minimum size of each composant" << std::endl;
- std::cout << "out.pgm is the r/g proj of the opened histogram" << std::endl;
- std::cout << "out.dump is the opened histogram" << 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;
}
int main(int argc, char* args[])
{
- if (5 == argc)
+ if (7 == argc)
{
- const std::string input(args[1]);
- const unsigned min_vol = atoi(args[2]);
- const std::string output(args[3]);
- const std::string opened(args[4]);
-
- mk_opening(input, min_vol, output, opened);
+ 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();
diff --git a/milena/sandbox/green/tools/annotating/regmax/regmax.cc b/milena/sandbox/green/tools/annotating/regmax/regmax.cc
index 2079bc4..0ff4d2e 100644
--- a/milena/sandbox/green/tools/annotating/regmax/regmax.cc
+++ b/milena/sandbox/green/tools/annotating/regmax/regmax.cc
@@ -1,8 +1,13 @@
// TOOLS ==> regmax on histo
#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>
@@ -18,9 +23,14 @@
#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>
@@ -28,6 +38,8 @@
#include <mln/value/int_u8.hh>
#include <mln/value/rgb8.hh>
+#include <mln/util/array.hh>
+
template <unsigned n>
struct t_labeling_rgbn : mln::Function_v2v< t_labeling_rgbn<n> >
{
@@ -49,19 +61,134 @@ struct t_labeling_rgbn : mln::Function_v2v< t_labeling_rgbn<n> >
}
};
-void mk_regmax(const std::string& input,
- const std::string& quant,
- const std::string& histo,
- const std::string& label,
- const std::string& output)
+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();
+}
+
+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();
+}
+
+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::rgbn t_rgbn;
+ 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;
@@ -71,60 +198,128 @@ void mk_regmax(const std::string& input,
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_int_u8 p2_label; // histo proj
- t_image2d_lbl8 p2_label; // histo proj
-// t_image2d_rgb8 p2_label; // histo proj
+ t_image2d_rgb8 p2_label; // histo proj
t_image3d_lbl8 l2_histo; // label histo
- t_mean_array m2_label; // palette
+ 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(h2_input, histo.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, mln::c6(), n_lbl);
+ l2_histo = mln::labeling::regional_maxima(h2_input, nbh, n_lbl);
// END IMAGE PROCESSING
// BEGIN SAVING
- mln::debug::println(h2_input);
mln::io::dump::save(l2_histo, labeled.c_str());
l2_input = mln::data::transform(i1_input, t_labeling_rgbn<n>(l2_histo));
- m2_label = mln::labeling::compute(t_mean(), i0_input, l2_input, n_labels);
- p2_label =mln::display::display3_histo3d_unsigned(h2_input,l2_histo,m2_label);
+ 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);
-// mln::io::pgm::save(p2_label, output.c_str());
- mln::io::ppm::save(p2_label, output.c_str());
- std::cout << "Nb classes : " << n_lbl << std::endl;
// END SAVING
}
-
void usage()
{
std::cout << std::endl;
- std::cout << "regmax input.dump out.dump out.ppm" << std::endl;
- std::cout << "where" << std::endl;
- std::cout << "input.dump is opened histo" << std::endl;
- std::cout << "out.pgm is the r/g proj of the opened histogram" << std::endl;
- std::cout << "out.dump is the labeled histogram" << 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;
}
int main(int argc, char* args[])
{
- if (4 == argc)
+ if (11 == argc || 12 == argc)
{
- const std::string input(args[1]);
- const std::string output(args[2]);
- const std::string labeled(args[3]);
+ 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)
+ {
- mk_regmax(input, output, labeled);
+ 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();
--
1.5.6.5
1
0
last-svn-commit-26-g4fd694b Fix bugs in the histogram visualization tools.
by Yann Jacquelet 15 Nov '10
by Yann Jacquelet 15 Nov '10
15 Nov '10
* green/mln/display/display_histo.cc: Add new vizualisations.
* green/mln/display/project_histo.cc: Add new color projections.
---
milena/sandbox/ChangeLog | 7 +
milena/sandbox/green/mln/display/display_histo.hh | 75 ++++--
milena/sandbox/green/mln/display/project_histo.hh | 341 +++++++++++++--------
3 files changed, 279 insertions(+), 144 deletions(-)
diff --git a/milena/sandbox/ChangeLog b/milena/sandbox/ChangeLog
index 0968186..6f08caf 100644
--- a/milena/sandbox/ChangeLog
+++ b/milena/sandbox/ChangeLog
@@ -1,5 +1,12 @@
2010-02-10 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+ Fix bugs in the histogram visualization tools.
+
+ * green/mln/display/display_histo.cc: Add new vizualisations.
+ * green/mln/display/project_histo.cc: Add new color projections.
+
+2010-02-10 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
Fix last details in the image processing chain.
* green/tools/annotating/histo/histo.cc: Manage new inputs/outputs.
diff --git a/milena/sandbox/green/mln/display/display_histo.hh b/milena/sandbox/green/mln/display/display_histo.hh
index 2ba0b61..ef47182 100644
--- a/milena/sandbox/green/mln/display/display_histo.hh
+++ b/milena/sandbox/green/mln/display/display_histo.hh
@@ -29,12 +29,14 @@
# define MLN_DISPLAY_DISPLAY_HISTO_HH
# include <mln/accu/math/sum.hh>
+# include <mln/algebra/vec.hh>
# include <mln/data/stretch.hh>
# include <mln/display/project_histo.hh>
# include <mln/fun/v2v/log.hh>
# include <mln/value/int_u8.hh>
# include <mln/value/rgb8.hh>
# include <mln/value/label_8.hh>
+# include <mln/util/array.hh>
/// \file
@@ -57,19 +59,28 @@ namespace mln
image2d<value::int_u8>
display_histo3d_unsigned(const image3d<unsigned>& histo);
- image2d<value::int_u8>
- display2_histo3d_unsigned(const image3d<unsigned>& histo);
+ template <unsigned n>
+ image2d< value::int_u<n> >
+ display2_histo3d_unsigned(const image3d<unsigned>& histo,
+ const value::int_u<n> ambiguous_color);
+ template <unsigned n>
image2d<value::label_8>
display2_histo3d_unsigned(const image3d<unsigned>& histo,
- const image3d<value::label_8>& label);
+ const image3d<value::label_8>& label,
+ const value::label_8 ambiguous_label);
- image2d<value::rgb8>
- display3_histo3d_unsigned(const image3d<unsigned>& histo);
+ template <unsigned n>
+ image2d< value::rgb<n> >
+ display3_histo3d_unsigned(const image3d<unsigned>& histo,
+ const value::rgb<n> ambiguous_color);
- image2d<value::rgb8>
- display3_histo3d_unsigned(const image3d<unsigned>& histo,
- const image3d<value::label_8>& label);
+ template <unsigned n>
+ image2d< value::rgb8 >
+ display3_histo3d_unsigned(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label,
+ const util::array< algebra::vec<3,float> >& pal,
+ const value::rgb8 ambiguous_color);
#ifndef MLN_INCLUDE_ONLY
@@ -87,7 +98,7 @@ namespace mln
/// \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)
{
@@ -102,40 +113,62 @@ namespace mln
return proj_int;
}
- image2d<value::int_u8>
- display2_histo3d_unsigned(const image3d<unsigned>& histo)
+ // FIXME : display_color [in int_un]
+ template <unsigned n>
+ image2d< value::int_u<n> >
+ display2_histo3d_unsigned(const image3d<unsigned>& histo,
+ const value::int_u<n> ambiguous_color)
{
- image2d<value::int_u8> proj = project2_histo<0>(histo);
+ image2d< value::int_u<n> > proj = project2_histo<n,0>(histo,
+ ambiguous_color);
return proj;
}
+ // FIXME : display_label [in label]
+ template <unsigned n>
image2d<value::label_8>
display2_histo3d_unsigned(const image3d<unsigned>& histo,
- const image3d<value::label_8>& label)
+ const image3d<value::label_8>& label,
+ const value::label_8 ambiguous_label)
{
- image2d<value::label_8> proj = project2_histo<0>(histo, label);
+ image2d<value::label_8> proj = project2_histo<n,0>(histo,
+ label,
+ ambiguous_label);
return proj;
}
- image2d<value::rgb8>
- display3_histo3d_unsigned(const image3d<unsigned>& histo)
+ // FIXME : display_color [in color]
+ template <unsigned n>
+ image2d< value::rgb<n> >
+ display3_histo3d_unsigned(const image3d<unsigned>& histo,
+ const value::rgb<n> ambiguous_color)
{
- image2d<value::rgb8> proj = project3_histo<0>(histo);
+ image2d< value::rgb<n> > proj = project3_histo<n,0>(histo,
+ ambiguous_color);
return proj;
}
- image2d<value::rgb8>
- display3_histo3d_unsigned(const image3d<unsigned>& histo,
- const image3d<value::label_8>& label)
+
+ // FIXME : display_label [in color]
+ template <unsigned n>
+ image2d< value::rgb8 >
+ display3_histo3d_unsigned(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label,
+ const util::array<algebra::vec<3,float> >& pal,
+ const value::rgb8 ambiguous_color)
{
- image2d<value::rgb8> proj = project3_histo<0>(histo, label);
+ image2d< value::rgb8 > proj = project3_histo<n,0>(histo,
+ label,
+ pal,
+ ambiguous_color);
return proj;
}
+
#endif // ! MLN_INCLUDE_ONLY
diff --git a/milena/sandbox/green/mln/display/project_histo.hh b/milena/sandbox/green/mln/display/project_histo.hh
index d842c70..30bcd6d 100644
--- a/milena/sandbox/green/mln/display/project_histo.hh
+++ b/milena/sandbox/green/mln/display/project_histo.hh
@@ -37,12 +37,16 @@
# include <mln/accu/image/take.hh>
# include <mln/accu/image/to_result.hh>
+# include <mln/algebra/vec.hh>
+
# include <mln/opt/at.hh>
# include <mln/value/int_u8.hh>
# include <mln/value/rgb8.hh>
# include <mln/value/label_8.hh>
+# include <mln/util/array.hh>
+
/// \file
///
/// \brief Allow the visualization of 3d histogram.
@@ -60,9 +64,30 @@ namespace mln
image2d<mln_result(A)>
project_histo(const image3d<V>& histo);
- template <typename A, unsigned direction, typename V>
+ template <typename A, unsigned n, unsigned direction, typename V>
image2d<mln_result(A)>
- project2_histo(const image3d<V>& histo);
+ project2_histo(const image3d<V>& histo,
+ const value::int_u<n>& ambiguous_color);
+
+ template <unsigned n, unsigned direction, typename V>
+ image2d<V>
+ project2_histo(const image3d<unsigned>& histo,
+ const image3d<V>& label);
+
+ template <unsigned n, unsigned direction>
+ image2d< value::rgb<n> >
+ project3_histo(const image3d<unsigned>& histo,
+ const value::rgb<n> ambiguous_color);
+
+ template <unsigned n, unsigned direction>
+ image2d< value::rgb8 >
+ project3_histo(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label,
+ const util::array<algebra::vec<3, float> >& pal,
+ const value::rgb8 ambiguous_color);
+ // FIXME ==> palette must be 1d-image not an array !!
+
+
# ifndef MLN_INCLUDE_ONLY
@@ -96,80 +121,96 @@ namespace mln
return accu::image::to_result(histo_accu);
}
- template <unsigned direction>
- image2d<value::int_u8>
- project2_histo(const image3d<unsigned>& histo)
+ // 0 ==> blue
+ // 1 ==> red
+ // 2 ==> green
+
+ // mln::opt::at(histo, blue, red, green)
+
+ template <unsigned n, unsigned direction>
+ image2d< value::int_u<n> >
+ project2_histo(const image3d<unsigned>& histo,
+ const value::int_u<n>& ambiguous_color)
{
- image2d<value::int_u8> result;
+ image2d< value::int_u<n> > result;
if (0 == direction) // blue
{
- image2d<value::int_u8> arg_max(histo.ncols(), histo.nslices());
+ image2d< value::int_u<n> > arg_max(histo.nrows(), histo.ncols());
- for (unsigned j = 0; j < histo.ncols(); ++j)
- for (unsigned i = 0; i < histo.nslices(); ++i)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
- unsigned max = 0; // minimum as possible
- signed pos = -1;
+ unsigned max = 0; // minimum as possible
+ def::coord pos = -1;
- for (unsigned k = 0; k < histo.nrows(); ++k)
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
{
- if (max <= opt::at(histo,i,j,k))
+ if (max < opt::at(histo,blue,red,green))
{
- max = opt::at(histo,i,j,k);
- pos = k;
+ max = opt::at(histo,blue,red,green);
+ pos = blue;
}
}
- opt::at(arg_max,i,j) = pos;
+ if (-1 == pos)
+ opt::at(arg_max,red,green) = ambiguous_color;
+ else
+ opt::at(arg_max,red,green) = pos;
}
result = arg_max;
}
else if (1 == direction) // red
{
- image2d<value::int_u8> arg_max(histo.nrows(), histo.nslices());
+ image2d< value::int_u<n> > arg_max(histo.ncols(), histo.nslices());
- for (unsigned j = 0; j < histo.nslices(); ++j)
- for (unsigned i = 0; i < histo.nrows(); ++i)
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
- for (unsigned k = 0; k < histo.ncols(); ++k)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
- if (max <= opt::at(histo,i,j,k))
+ if (max < opt::at(histo,blue,red,green))
{
- max = opt::at(histo,i,j,k);
- pos = k;
+ max = opt::at(histo,blue,red,green);
+ pos = red;
}
}
- opt::at(arg_max,i,j) = pos;
+ if (-1 == pos)
+ opt::at(arg_max,green,blue) = ambiguous_color;
+ else
+ opt::at(arg_max,green,blue) = pos;
}
result = arg_max;
}
else // 2 == direction // green
{
- image2d<value::int_u8> arg_max(histo.nrows(), histo.ncols());
+ image2d< value::int_u<n> > arg_max(histo.nrows(), histo.nslices());
- for (unsigned j = 0; j < histo.ncols(); ++j)
- for (unsigned i = 0; i < histo.nrows(); ++i)
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
- for (unsigned k = 0; k < histo.nslices(); ++k)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
{
- if (max <= opt::at(histo,i,j,k))
+ if (max < opt::at(histo,blue,red,green))
{
- max = opt::at(histo,i,j,k);
- pos = k;
+ max = opt::at(histo,blue,red,green);
+ pos = green;
}
}
- opt::at(arg_max,i,j) = pos;
+ if (-1 == pos)
+ opt::at(arg_max,red,blue) = ambiguous_color;
+ else
+ opt::at(arg_max,red,blue) = pos;
}
result = arg_max;
@@ -178,81 +219,91 @@ namespace mln
return result;
}
- template <unsigned direction>
+ template <unsigned n, unsigned direction>
image2d<value::label_8>
project2_histo(const image3d<unsigned>& histo,
- const image3d<value::label_8>& label)
+ const image3d<value::label_8>& label,
+ const value::label_8 ambiguous_label)
{
image2d<value::label_8> result;
if (0 == direction) // blue
{
- image2d<value::label_8> arg_max(histo.ncols(), histo.nslices());
+ image2d<value::label_8> arg_max(histo.nrows(), histo.ncols());
- for (unsigned j = 0; j < histo.ncols(); ++j)
- for (unsigned i = 0; i < histo.nslices(); ++i)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
- unsigned max = 0; // minimum as possible
- signed pos = -1;
+ unsigned max = 0; // minimum as possible
+ def::coord pos = -1;
- for (unsigned k = 0; k < histo.nrows(); ++k)
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
{
- if (max <= opt::at(histo,i,j,k))
+ if (max < opt::at(histo,blue,red,green))
{
- max = opt::at(histo,i,j,k);
- pos = k;
+ max = opt::at(histo,blue,red,green);
+ pos = blue;
}
}
- opt::at(arg_max,i,j) = opt::at(label,i,j,pos);
+ if (-1 == pos)
+ opt::at(arg_max,red,green) = ambiguous_label;
+ else
+ opt::at(arg_max,red,green) = opt::at(label, pos, red, green);
}
result = arg_max;
}
else if (1 == direction) // red
{
- image2d<value::label_8> arg_max(histo.nrows(), histo.nslices());
+ image2d<value::label_8> arg_max(histo.ncols(), histo.nslices());
- for (unsigned j = 0; j < histo.nslices(); ++j)
- for (unsigned i = 0; i < histo.nrows(); ++i)
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
- for (unsigned k = 0; k < histo.ncols(); ++k)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
- if (max <= opt::at(histo,i,j,k))
+ if (max < opt::at(histo,blue,red,green))
{
- max = opt::at(histo,i,j,k);
- pos = k;
+ max = opt::at(histo,blue,red,green);
+ pos = red;
}
}
- opt::at(arg_max,i,j) = opt::at(label,pos,i,j);
+ if (-1 == pos)
+ opt::at(arg_max,green,blue) = ambiguous_label;
+ else
+ opt::at(arg_max,green,blue) = opt::at(label, blue, pos, green);
}
result = arg_max;
}
else // 2 == direction // green
{
- image2d<value::label_8> arg_max(histo.nrows(), histo.ncols());
+ image2d<value::label_8> arg_max(histo.nrows(), histo.nslices());
- for (unsigned j = 0; j < histo.ncols(); ++j)
- for (unsigned i = 0; i < histo.nrows(); ++i)
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
- for (unsigned k = 0; k < histo.nslices(); ++k)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
{
- if (max <= opt::at(histo,i,j,k))
+ if (max < opt::at(histo,blue,red,green))
{
- max = opt::at(histo,i,j,k);
- pos = k;
+ max = opt::at(histo,blue,red,green);
+ pos = green;
}
}
- opt::at(arg_max,i,j) = opt::at(label,i,pos,j);
+ if (-1 == pos)
+ opt::at(arg_max,red,blue) = ambiguous_label;
+ else
+ opt::at(arg_max,red,blue) = opt::at(label, blue, red, pos);
}
result = arg_max;
@@ -262,83 +313,117 @@ namespace mln
}
+
+
// FIXME ... determine the color of each class.
- template <unsigned direction>
- image2d<value::rgb8>
- project3_histo(const image3d<unsigned>& histo,
- const image3d<value::label_8>& label)
+ // FIXME la palette est supposée en 8 bits
+ template <unsigned n, unsigned direction>
+ image2d< value::rgb8 >
+ project3_histo(const image3d<unsigned>& histo,
+ const image3d<value::label_8>& label,
+ const util::array<algebra::vec<3,float> >& pal,
+ const value::rgb8 ambiguous_color)
{
- image2d<value::rgb8> result;
+ image2d< value::rgb8 > result;
if (0 == direction) // blue
{
- image2d<value::rgb8> arg_max(histo.ncols(), histo.nslices());
+ image2d< value::rgb8 > arg_max(histo.nrows(), histo.ncols());
- for (unsigned j = 0; j < histo.ncols(); ++j)
- for (unsigned i = 0; i < histo.nslices(); ++i)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
- unsigned max = 0; // minimum as possible
- signed pos = -1;
+ unsigned max = 0; // minimum as possible
+ def::coord pos = -1;
- for (unsigned k = 0; k < histo.nrows(); ++k)
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
{
- if (max <= opt::at(histo,i,j,k))
+ if (max < opt::at(histo,blue,red,green))
{
- max = opt::at(histo,i,j,k);
- pos = k;
+ max = opt::at(histo,blue,red,green);
+ pos = blue;
}
}
- opt::at(arg_max,i,j) = value::rgb8(i,j,pos);
+ if (-1 == pos)
+ opt::at(arg_max,red,green) = ambiguous_color;
+ else
+ {
+ value::int_u8 r = pal[opt::at(label,pos,red,green)][0];
+ value::int_u8 g = pal[opt::at(label,pos,red,green)][1];
+ value::int_u8 b = pal[opt::at(label,pos,red,green)][2];
+ value::rgb8 color(r,g,b);
+
+ opt::at(arg_max,red,green) = color;
+ }
}
result = arg_max;
}
else if (1 == direction) // red
{
- image2d<value::rgb8> arg_max(histo.nrows(), histo.nslices());
+ image2d< value::rgb8 > arg_max(histo.ncols(), histo.nslices());
- for (unsigned j = 0; j < histo.nslices(); ++j)
- for (unsigned i = 0; i < histo.nrows(); ++i)
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
- for (unsigned k = 0; k < histo.ncols(); ++k)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
- if (max <= opt::at(histo,i,j,k))
+ if (max < opt::at(histo,blue,red,green))
{
- max = opt::at(histo,i,j,k);
- pos = k;
+ max = opt::at(histo,blue,red,green);
+ pos = red;
}
}
- opt::at(arg_max,i,j) = value::rgb8(pos,i,j);
+ if (-1 == pos)
+ opt::at(arg_max,green,blue) = ambiguous_color;
+ else
+ {
+ value::int_u8 r = pal[opt::at(label,blue,pos,green)][0];
+ value::int_u8 g = pal[opt::at(label,blue,pos,green)][1];
+ value::int_u8 b = pal[opt::at(label,blue,pos,green)][2];
+ value::rgb8 color(r,g,b);
+
+ opt::at(arg_max,green,blue) = color;
+ }
}
result = arg_max;
}
else // 2 == direction // green
{
- image2d<value::rgb8> arg_max(histo.nrows(), histo.ncols());
+ image2d< value::rgb8 > arg_max(histo.nrows(), histo.nslices());
- for (unsigned j = 0; j < histo.ncols(); ++j)
- for (unsigned i = 0; i < histo.nrows(); ++i)
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
- for (unsigned k = 0; k < histo.nslices(); ++k)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
{
- if (max <= opt::at(histo,i,j,k))
+ if (max < opt::at(histo,blue,red,green))
{
- max = opt::at(histo,i,j,k);
- pos = k;
+ max = opt::at(histo,blue,red,green);
+ pos = green;
}
}
- // FIXME ... how to fix the n of rgb
- opt::at(arg_max,i,j) = value::rgb8(i,pos,j);
+ if (-1 == pos)
+ opt::at(arg_max,red,blue) = ambiguous_color;
+ else
+ {
+ value::int_u8 r = pal[opt::at(label,blue,red,pos)][0];
+ value::int_u8 g = pal[opt::at(label,blue,red,pos)][1];
+ value::int_u8 b = pal[opt::at(label,blue,red,pos)][2];
+ value::rgb8 color(r,g,b);
+
+ opt::at(arg_max,red,blue) = color;
+ }
}
result = arg_max;
@@ -347,81 +432,91 @@ namespace mln
return result;
}
- template <unsigned direction>
- image2d<value::rgb8>
- project3_histo(const image3d<unsigned>& histo)
+
+ template <unsigned n, unsigned direction>
+ image2d< value::rgb<n> >
+ project3_histo(const image3d<unsigned>& histo,
+ const value::rgb<n> ambiguous_color)
{
- image2d<value::rgb8> result;
+ image2d< value::rgb<n> > result;
if (0 == direction) // blue
{
- image2d<value::rgb8> arg_max(histo.ncols(), histo.nslices());
+ image2d< value::rgb<n> > arg_max(histo.nrows(), histo.ncols());
- for (unsigned j = 0; j < histo.ncols(); ++j)
- for (unsigned i = 0; i < histo.nslices(); ++i)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
- unsigned max = 0; // minimum as possible
- signed pos = -1;
+ unsigned max = 0; // minimum as possible
+ def::coord pos = -1;
- for (unsigned k = 0; k < histo.nrows(); ++k)
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
{
- if (max <= opt::at(histo,i,j,k))
+ if (max < opt::at(histo,blue,red,green))
{
- max = opt::at(histo,i,j,k);
- pos = k;
+ max = opt::at(histo,blue,red,green);
+ pos = blue;
}
}
- opt::at(arg_max,i,j) = value::rgb8(i,j,pos);
+ if (-1 == pos)
+ opt::at(arg_max,red,green) = ambiguous_color;
+ else
+ opt::at(arg_max,red,green) = value::rgb<n>(red,green,pos);
}
result = arg_max;
}
else if (1 == direction) // red
{
- image2d<value::rgb8> arg_max(histo.nrows(), histo.nslices());
+ image2d< value::rgb<n> > arg_max(histo.ncols(), histo.nslices());
- for (unsigned j = 0; j < histo.nslices(); ++j)
- for (unsigned i = 0; i < histo.nrows(); ++i)
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
- for (unsigned k = 0; k < histo.ncols(); ++k)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
- if (max <= opt::at(histo,i,j,k))
+ if (max < opt::at(histo,blue,red,green))
{
- max = opt::at(histo,i,j,k);
- pos = k;
+ max = opt::at(histo,blue,red,green);
+ pos = red;
}
}
- opt::at(arg_max,i,j) = value::rgb8(pos,i,j);
+ if (-1 == pos)
+ opt::at(arg_max,green,blue) = ambiguous_color;
+ else
+ opt::at(arg_max,green,blue) = value::rgb<n>(pos,green,blue);;
}
result = arg_max;
}
else // 2 == direction // green
{
- image2d<value::rgb8> arg_max(histo.nrows(), histo.ncols());
+ image2d< value::rgb<n> > arg_max(histo.nrows(), histo.nslices());
- for (unsigned j = 0; j < histo.ncols(); ++j)
- for (unsigned i = 0; i < histo.nrows(); ++i)
+ for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
+ for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
- for (unsigned k = 0; k < histo.nslices(); ++k)
+ for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
{
- if (max <= opt::at(histo,i,j,k))
+ if (max < opt::at(histo,blue,red,green))
{
- max = opt::at(histo,i,j,k);
- pos = k;
+ max = opt::at(histo,blue,red,green);
+ pos = green;
}
}
- // FIXME ... how to fix the n of rgb
- opt::at(arg_max,i,j) = value::rgb8(i,pos,j);
+ if (-1 == pos)
+ opt::at(arg_max,red,blue) = ambiguous_color;
+ else
+ opt::at(arg_max,red,blue) = value::rgb<n>(red,pos,blue);
}
result = arg_max;
--
1.5.6.5
1
0
15 Nov '10
* milena/img/BUG_lean_ascii.pgm.gz: Delete this file.
---
milena/img/BUG_lean_ascii.pgm.gz | Bin 75726 -> 0 bytes
1 files changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 milena/img/BUG_lean_ascii.pgm.gz
diff --git a/milena/img/BUG_lean_ascii.pgm.gz b/milena/img/BUG_lean_ascii.pgm.gz
deleted file mode 100644
index 7ba3e9d1b02e3a41704448faf72a6c7afe2e8259..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 75726
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
--
1.5.6.5
1
0