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
[PATCH 04/10] Allow the comparison of faces of different dimensions using `<'.
by Roland Levillain 06 Apr '09
by Roland Levillain 06 Apr '09
06 Apr '09
* mln/topo/face.hh (operator< (const face<D>&, const face<D>&)):
Here.
This way, a standard container relying on operator< can accept
faces of different dimensions.
---
milena/ChangeLog | 9 +++++++++
milena/mln/topo/face.hh | 5 ++---
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index d49139e..ce5e952 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,5 +1,14 @@
2009-04-06 Roland Levillain <roland(a)lrde.epita.fr>
+ Allow the comparison of faces of different dimensions using `<'.
+
+ * mln/topo/face.hh (operator< (const face<D>&, const face<D>&)):
+ Here.
+ This way, a standard container relying on operator< can accept
+ faces of different dimensions.
+
+2009-04-06 Roland Levillain <roland(a)lrde.epita.fr>
+
Add some simple triangle meshes.
* mesh/one-triangle.off:
diff --git a/milena/mln/topo/face.hh b/milena/mln/topo/face.hh
index 74077f1..9c9872f 100644
--- a/milena/mln/topo/face.hh
+++ b/milena/mln/topo/face.hh
@@ -405,9 +405,8 @@ namespace mln
{
// Ensure LHS and RHS belong to the same complex.
mln_precondition(lhs.cplx() == rhs.cplx());
- // Ensure LHS and RHS have the same dimension.
- mln_precondition(lhs.n() == rhs.n());
- return lhs.face_id() < rhs.face_id();
+ return lhs.n() < rhs.n() ||
+ (lhs.n() == rhs.n() && lhs.face_id() < rhs.face_id());
}
--
1.6.1.2
1
0
* mesh/one-triangle.off:
* mesh/two-triangles.off:
* mesh/three-triangles.off:
New.
---
milena/ChangeLog | 9 +++++++++
milena/mesh/one-triangle.off | 6 ++++++
milena/mesh/three-triangles.off | 10 ++++++++++
milena/mesh/two-triangles.off | 8 ++++++++
4 files changed, 33 insertions(+), 0 deletions(-)
create mode 100644 milena/mesh/one-triangle.off
create mode 100644 milena/mesh/three-triangles.off
create mode 100644 milena/mesh/two-triangles.off
diff --git a/milena/ChangeLog b/milena/ChangeLog
index aab403c..d49139e 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,5 +1,14 @@
2009-04-06 Roland Levillain <roland(a)lrde.epita.fr>
+ Add some simple triangle meshes.
+
+ * mesh/one-triangle.off:
+ * mesh/two-triangles.off:
+ * mesh/three-triangles.off:
+ New.
+
+2009-04-06 Roland Levillain <roland(a)lrde.epita.fr>
+
Aesthetic changes in the output of the save routine for OFF file.
* mln/io/off/save.hh
diff --git a/milena/mesh/one-triangle.off b/milena/mesh/one-triangle.off
new file mode 100644
index 0000000..947d460
--- /dev/null
+++ b/milena/mesh/one-triangle.off
@@ -0,0 +1,6 @@
+OFF
+3 1 3
+0.0 1.0 0.0
+2.0 0.0 0.0
+2.0 2.0 0.0
+3 1 0 2
diff --git a/milena/mesh/three-triangles.off b/milena/mesh/three-triangles.off
new file mode 100644
index 0000000..2889413
--- /dev/null
+++ b/milena/mesh/three-triangles.off
@@ -0,0 +1,10 @@
+OFF
+5 3 7
+0.0 1.0 0.0
+2.0 0.0 0.0
+2.0 2.0 0.0
+0.0 3.0 0.0
+2.0 4.0 0.0
+3 1 0 2 0.75 0.75 0.75 1.0
+3 2 0 3 0.50 0.50 0.50 1.0
+3 2 3 4 0.25 0.25 0.25 1.0
diff --git a/milena/mesh/two-triangles.off b/milena/mesh/two-triangles.off
new file mode 100644
index 0000000..2225ecf
--- /dev/null
+++ b/milena/mesh/two-triangles.off
@@ -0,0 +1,8 @@
+OFF
+4 2 5
+0.0 1.0 0.0
+2.0 0.0 0.0
+2.0 2.0 0.0
+0.0 3.0 0.0
+3 1 0 2
+3 2 0 3
--
1.6.1.2
1
0
[PATCH 02/10] Aesthetic changes in the output of the save routine for OFF file.
by Roland Levillain 06 Apr '09
by Roland Levillain 06 Apr '09
06 Apr '09
* mln/io/off/save.hh
(mln::io::off::internal::float_off_saver::write_face_data)
(mln::io::off::internal::rgb8_off_saver::write_face_data):
Do not print extra blank lines.
---
milena/ChangeLog | 9 +++++++++
milena/mln/io/off/save.hh | 5 ++---
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 423ebb4..aab403c 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,5 +1,14 @@
2009-04-06 Roland Levillain <roland(a)lrde.epita.fr>
+ Aesthetic changes in the output of the save routine for OFF file.
+
+ * mln/io/off/save.hh
+ (mln::io::off::internal::float_off_saver::write_face_data)
+ (mln::io::off::internal::rgb8_off_saver::write_face_data):
+ Do not print extra blank lines.
+
+2009-04-06 Roland Levillain <roland(a)lrde.epita.fr>
+
Add a load routine for color (RGB) OFF (surface mesh) files.
* mln/io/off/load.hh
diff --git a/milena/mln/io/off/save.hh b/milena/mln/io/off/save.hh
index 7bb4292..e983525 100644
--- a/milena/mln/io/off/save.hh
+++ b/milena/mln/io/off/save.hh
@@ -127,7 +127,6 @@ namespace mln
void write_face_data(std::ostream& ostr, const value& v) const;
};
-
struct int_u8_off_saver
: public off_saver< int_u8_2complex_image3df, int_u8_off_saver >
{
@@ -423,7 +422,7 @@ namespace mln
mln_assertion(0.0f <= v);
mln_assertion(v <= 1.0f);
ostr << ' ' << v << ' ' << v << ' ' << v
- << ' ' << 1.0f << std::endl;
+ << ' ' << 1.0f;
}
void
@@ -436,7 +435,7 @@ namespace mln
the range 0..255. A fourth channel, A, controls the
transparency. */
ostr << ' ' << v.red() << ' ' << v.green() << ' ' << v.blue()
- << ' ' << 1.0f << std::endl;
+ << ' ' << 1.0f;
}
/* \} */
--
1.6.1.2
1
0
[PATCH 01/10] Add a load routine for color (RGB) OFF (surface mesh) files.
by Roland Levillain 06 Apr '09
by Roland Levillain 06 Apr '09
06 Apr '09
* mln/io/off/load.hh
(mln::io::off::load(rgb8_2complex_image3df, const std::string&)):
New function.
(mln::io::off::internal::rgb8_off_loader): New class.
---
milena/ChangeLog | 9 +++++
milena/mln/io/off/load.hh | 84 ++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 92 insertions(+), 1 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 3fc4587..423ebb4 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,12 @@
+2009-04-06 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add a load routine for color (RGB) OFF (surface mesh) files.
+
+ * mln/io/off/load.hh
+ (mln::io::off::load(rgb8_2complex_image3df, const std::string&)):
+ New function.
+ (mln::io::off::internal::rgb8_off_loader): New class.
+
2009-04-03 Fabien Freling <fabien.freling(a)lrde.epita.fr>
Add optional paramater for plot::save().
diff --git a/milena/mln/io/off/load.hh b/milena/mln/io/off/load.hh
index 03fc3f3..1f8fefe 100644
--- a/milena/mln/io/off/load.hh
+++ b/milena/mln/io/off/load.hh
@@ -1,4 +1,4 @@
-// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
+// Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
@@ -41,6 +41,8 @@
# include <string>
+# include <mln/literal/black.hh>
+
# include <mln/core/concept/object.hh>
# include <mln/core/alias/complex_image.hh>
@@ -63,6 +65,9 @@ namespace mln
existence of faces. */
void load(bin_2complex_image3df& ima, const std::string& filename);
+ // FIXME: Implement a load routine for for
+ // int_u8_2complex_image3df.
+
/** Load a floating-point OFF image into a complex image.
\param[out] ima A reference to the image to construct.
@@ -72,6 +77,15 @@ namespace mln
1-faces and 0-faces are set to 0.0f. */
void load(float_2complex_image3df& ima, const std::string& filename);
+ /** Load a 3x8-bit RGB (color) OFF image into a complex image.
+
+ \param[out] ima A reference to the image to construct.
+ \param[in] filename The name of the file to load.
+
+ Read floating-point data is attached to 2-faces only;
+ 1-faces and 0-faces are set to 0.0f. */
+ void load(rgb8_2complex_image3df& ima, const std::string& filename);
+
namespace internal
{
@@ -118,6 +132,10 @@ namespace mln
};
+ /* Factor float_off_loader::reserve and rgb8_off_loader::reserve
+ and float_off_loader::assign and rgb8_off_loader::assign
+ by introducing an intermediate class. */
+
struct float_off_loader
: public off_loader< float_2complex_image3df, float_off_loader >
{
@@ -134,6 +152,23 @@ namespace mln
std::vector<float> face_value;
};
+
+ struct rgb8_off_loader
+ : public off_loader< rgb8_2complex_image3df, rgb8_off_loader >
+ {
+ /// Read face data.
+ void read_face_data(std::istream& istr);
+
+ /// Pre-allocate data.
+ void reserve(unsigned nvertices, unsigned nedges, unsigned nfaces);
+
+ /// Assign values to image.
+ void assign(values& vs, const domain& s);
+
+ /// 2-face floating-point values.
+ std::vector<value::rgb8> face_value;
+ };
+
} // end of namespace mln::io::off::internal
@@ -160,6 +195,15 @@ namespace mln
trace::exiting("mln::io::off::load");
}
+ void
+ load(rgb8_2complex_image3df& ima, const std::string& filename)
+ {
+ trace::entering("mln::io::off::load");
+ internal::rgb8_off_loader()(ima, filename);
+ trace::exiting("mln::io::off::load");
+ }
+
+
/*-------------------------.
| Actual implementations. |
@@ -485,6 +529,25 @@ namespace mln
mln_assertion(0.0f <= a); mln_assertion(a <= 1.0f);
face_value.push_back(r);
}
+
+ void
+ rgb8_off_loader::read_face_data(std::istream& istr)
+ {
+ /* We just use R, G, and B and ignore A (transparency) when
+ considering the value (``color'') associated to a face.
+
+ R must (and G, B and A should) be floating-point values
+ between 0 and 1, according to the OFF file format
+ definition. */
+ // FIXME: `A' should be optional.
+ float r, g, b, a;
+ istr >> r >> g >> b >> a;
+ mln_assertion(0.0f <= r); mln_assertion(r <= 1.0f);
+ mln_assertion(0.0f <= g); mln_assertion(g <= 1.0f);
+ mln_assertion(0.0f <= b); mln_assertion(b <= 1.0f);
+ mln_assertion(0.0f <= a); mln_assertion(a <= 1.0f);
+ face_value.push_back(value::rgb8(r, g, b));
+ }
/* \} */
@@ -506,6 +569,15 @@ namespace mln
void
+ rgb8_off_loader::reserve(unsigned /* nvertices */,
+ unsigned /* nedges */,
+ unsigned nfaces)
+ {
+ face_value.reserve(nfaces);
+ }
+
+
+ void
bin_off_loader::assign(values& vs, const domain& s)
{
// Default values.
@@ -523,6 +595,16 @@ namespace mln
vs[D] = face_value;
}
+ void
+ rgb8_off_loader::assign(values& vs, const domain& s)
+ {
+ // Default values for n-face with n in [0, D[.
+ for (unsigned i = 0; i < D; ++i)
+ vs[i].insert(vs[i].begin(), s.cplx().nfaces(i), literal::black);
+ // Values for D-faces.
+ vs[D] = face_value;
+ }
+
// --------- //
// Helpers. //
--
1.6.1.2
1
0
URL: https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox
ChangeLog:
2009-04-06 Edwin Carlinet <carlinet(a)lrde.epita.fr>
Consider box cardinality for line detection criteria.
* edwin/tree/test.cc: Consider box cardinality for line
detection criteria.
---
Makefile | 1813 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
configure | 7
test.cc | 103 ---
3 files changed, 1839 insertions(+), 84 deletions(-)
Index: trunk/milena/sandbox/edwin/tree/configure
===================================================================
--- trunk/milena/sandbox/edwin/tree/configure (revision 3608)
+++ trunk/milena/sandbox/edwin/tree/configure (revision 3609)
@@ -1,13 +1,12 @@
#! /bin/bash
-
for arg in "$@"; do
if [ "$arg" == "--debug" ]; then
debug=1;
- fi
-
- if [ "$arg" == "--release" ]; then
+ elif [ "$arg" == "--release" ]; then
release=1;
+ elif [ "${arg#--mln_dir=}" ]; then
+ MLN_DIR=${arg#--mln_dir=}
fi
done
@@ -19,3 +18,4 @@
if [ "$release" ]; then
echo 'RELEASE=1' > makefile.rules
fi
\ No newline at end of file
+echo "MLN_DIR = $MLN_DIR" > makefile.rules
\ No newline at end of file
Index: trunk/milena/sandbox/edwin/tree/test.cc
===================================================================
--- trunk/milena/sandbox/edwin/tree/test.cc (revision 3608)
+++ trunk/milena/sandbox/edwin/tree/test.cc (revision 3609)
@@ -2,9 +2,12 @@
#include <mln/core/image/image2d.hh>
#include <mln/core/image/image_if.hh>
#include <mln/core/alias/neighb2d.hh>
-#include <mln/core/routine/duplicate.hh>
#include <mln/core/alias/window2d.hh>
+#include <mln/core/alias/w_window2d_int.hh>
+#include <mln/core/routine/duplicate.hh>
#include <mln/core/var.hh>
+
+/* mln value */
#include <mln/value/int_u16.hh>
/* Site set */
@@ -18,24 +21,17 @@
#include "run.hh"
#include "accumulator/arg_max.hh"
-/* morpho closing */
-// #include <mln/morpho/opening/structural.hh>
-// #include <mln/morpho/closing/structural.hh>
/* Attributes */
-// #include <mln/transform/distance_geodesic.hh>
-#include <mln/core/alias/window2d.hh>
-#include <mln/core/alias/w_window2d_int.hh>
#include <mln/transform/distance_front.hh>
-#include <mln/morpho/attribute/card.hh>
#include "../attributes/bbox.hh"
+#include <mln/morpho/attribute/card.hh>
#include <mln/make/w_window2d_int.hh>
/* io */
#include <mln/io/pbm/load.hh>
#include <mln/io/pgm/save.hh>
#include <mln/io/ppm/save.hh>
-//#include <../../theo/color/change_attributes.hh>
/* data & pw */
#include <mln/core/concept/function.hh>
@@ -55,6 +51,7 @@
/* std */
#include <string>
#include <iostream>
+#include <cmath>
bool mydebug = false;
@@ -72,30 +69,33 @@
<< "*********************" << std::endl;
}
-template <typename P2V>
-struct ratio_ : public mln::Function_p2v< ratio_<P2V> >
+template <typename P2V, typename G>
+struct ratio_ : public mln::Function_p2v< ratio_<P2V, G> >
{
typedef double result;
- ratio_(const P2V& f) :
- f_ (f)
+ ratio_(const P2V& f, const G& g) :
+ f_ (f), g_ (g)
{
}
template <typename P>
double operator() (const P& p) const
{
- return (double) (f_(p).len(1)) / (double)(f_(p).len(0));
+ mln_VAR(box, f_(p));
+ double a = (double) (box.len(1)) / (double)(box.len(0));
+ return a * std::log(g_(p));
}
protected:
const P2V& f_;
+ const G& g_;
};
-template <typename P2V>
-ratio_<P2V> ratio(const mln::Function_p2v<P2V>& f)
+template <typename P2V, typename G>
+ratio_<P2V, G> ratio(const mln::Function_p2v<P2V>& f, const mln::Function_p2v<G>& g)
{
- return ratio_<P2V>(exact(f));
+ return ratio_<P2V, G>(exact(f), exact(g));
}
@@ -104,7 +104,6 @@
int main(int argc, char* argv[])
{
using namespace mln;
-// using value::int_u8;
using value::int_u16;
std::string arg;
@@ -140,7 +139,6 @@
io::pbm::load(input_, argv[1]);
/* Work on geodesic distance image */
-// I input = transform::distance_geodesic(input_, c8(), mln_max(int_u8));
I input;
{
const int weights[9] =
@@ -153,29 +151,9 @@
input = transform::distance_front(input_, c8(), win, mln_max(int_u16));
}
- if (mydebug)
+ if (mydebug) {
dsp("Distance geodesic");
-
- /* Closing */
- {
- bool w[3][1];
-
- for (int i = 0; i < 3; i++)
- for (int j = 0; j < 1; j++)
- w[i][j] = 1;
-
-// input = morpho::closing::structural(input, convert::to<window2d>(w));
- }
-
- /* Opening */
- {
- bool w[1][15];
-
- for (int i = 0; i < 1; i++)
- for (int j = 0; j < 15; j++)
- w[i][j] = 1;
-
-// input = morpho::opening::structural(input, convert::to<window2d>(w));
+ io::pgm::save(input, "distance.pgm");
}
/* Component tree creation */
@@ -185,42 +163,20 @@
S sorted_sites = level::sort_psites_decreasing(input);
tree_t tree(input, sorted_sites, c4());
-
- io::pgm::save(input, "distance.pgm");
-
/* Compute Attribute On Image */
typedef morpho::attribute::bbox<I> bbox_t;
+ typedef morpho::attribute::card<I> card_t;
typedef mln_ch_value_(I, double) A;
mln_VAR(attr_image, morpho::tree::compute_attribute_image(bbox_t (), tree));
- A a = duplicate(ratio(pw::value(attr_image)) | attr_image.domain());
+ mln_VAR(card_image, morpho::tree::compute_attribute_image(card_t (), tree));
+ A a = duplicate(ratio(pw::value(attr_image), pw::value(card_image)) | attr_image.domain());
morpho::tree::propagate_representant(tree, a);
if (mydebug) {
dsp("Image sharp attribute");
}
- /* We don't want little components */
-
- // So we compute card attribute and we filter big components
- // FIXME: some attributes are compositions of attributes, here
- // sharpness can give area so, it would be fine if we could give an
- // optional extra argument to compute_attribute where the
- // accumulators image will be stored.
-
-// typedef morpho::attribute::card<I> card_t;
-// typedef mln_ch_value_(tree_t::function, mln_result_(card_t)) B;
-
-// B b = morpho::tree::compute_attribute_image(card_t (), tree);
-// morpho::tree::propagate_representant(tree, b);
-
-// if (mydebug) {
-// dsp("Image card attribute"); display_tree_attributes(tree, b);
-// }
-
-// a = duplicate((fun::p2v::ternary(pw::value(b) > pw::cst(2), pw::value(a), pw::cst(0.0))) | a.domain());
-
-
/* Run max accumulator */
accumulator::arg_max<A> argmax(a);
p_array< mln_psite_(A) > obj_array; // Array of object components.
@@ -271,22 +227,21 @@
/* Labeling */
typedef mln_ch_value_(I, value::label<8>) L;
+ typedef mln_ch_value_(I, value::rgb<8>) O;
value::label<8> nlabel;
L label = labeling::blobs(mask, c4(), nlabel);
- io::ppm::save(debug::colorize(value::rgb8(), label, nlabel), "label.pgm");
+ O output = debug::colorize(value::rgb8(), label, nlabel);
+ io::ppm::save(output, "label.pgm");
/* Now store output image image */
- I out;
+ O out;
initialize(out, input);
- data::fill(out, 0);
- data::paste(input | pw::value(mask), out);
+ data::fill(out, literal::black_t());
+ data::paste(output | pw::value(input_), out);
if (mydebug) {
- mln_fwd_piter_(p_array< mln_psite_(I) >) c(obj_array);
- for_all(c)
- draw::box(out, attr_image(c), mln_max(int_u16));
dsp("Mask input");
}
- io::pgm::save(out, "output.pgm");
+ io::ppm::save(out, "output.pgm");
}
Index: trunk/milena/sandbox/edwin/tree/Makefile
===================================================================
--- trunk/milena/sandbox/edwin/tree/Makefile (revision 3608)
+++ trunk/milena/sandbox/edwin/tree/Makefile (revision 3609)
@@ -1,7 +1,10 @@
include makefile.rules
-TARGET=sharp
-SRC=sharp.cc
-OBJS=${SRC:.cc=.o}
+TARGET=test
+sharp_SRC=sharp.cc
+sharp_OBJS=${sharp_SRC:.cc=.o}
+
+test_SRC=test.cc
+test_OBJS=${test_SRC:.cc=.o}
OLENADIR=$(MLN_DIR)/..
MILENADIR=$(OLENADIR)/milena
@@ -16,11 +19,11 @@
LD=g++
LDFLAGS=
-all: clean $(TARGET)
+all: $(TARGET)
-$(TARGET): $(OBJS) $(SRC)
- $(LD) $(LDFLAGS) -o $@ $(OBJS)
+$(TARGET): $($(TARGET)_OBJS) $($(TARGET)_SRC)
+ $(LD) $(LDFLAGS) -o $@ $($(TARGET)_OBJS)
%.o: %.cc
$(CXX) $(CXXFLAGS) -c $<
@@ -28,7 +31,1805 @@
%.o: %.hh
$(CXX) $(CXXFLAGS) -c $<
+depend:
+ makedepend -- $(CXXFLAGS) -- -v $($(TARGET)_SRC)
+
clean:
rm -f *.o $(TARGET)
#rm -f *.pbm
#find -name "*.pgm" \! -regex ".*/affiche2?.pgm" -delete
+# DO NOT DELETE
+
+test.o: /work/carlinet/trunk/milena/mln/core/image/image2d.hh
+# /work/carlinet/trunk/milena/mln/core/image/image2d.hh includes:
+# mln/core/internal/image_primary.hh
+# mln/core/internal/fixme.hh
+# mln/core/alias/box2d.hh
+# mln/core/routine/init.hh
+# mln/border/thickness.hh
+# mln/value/set.hh
+# mln/fun/i2v/all_to.hh
+# mln/core/trait/pixter.hh
+# mln/core/dpoints_pixter.hh
+# mln/core/pixter2d.hh
+# mln/make/image.hh
+# mln/make/image2d.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/image_primary.hh
+# /work/carlinet/trunk/milena/mln/core/internal/image_primary.hh includes:
+# mln/core/internal/image_base.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/image_base.hh
+# /work/carlinet/trunk/milena/mln/core/internal/image_base.hh includes:
+# mln/core/concept/image.hh
+# mln/core/grids.hh
+# mln/core/trait/qlf_value.hh
+# mln/core/internal/check/image_all.hh
+# mln/core/internal/data.hh
+# mln/core/internal/morpher_lvalue.hh
+# mln/util/tracked_ptr.hh
+# mln/value/set.hh
+# mln/value/super_value.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/image.hh
+# /work/carlinet/trunk/milena/mln/core/concept/image.hh includes:
+# mln/core/concept/site_set.hh
+# mln/core/concept/mesh.hh
+# mln/core/trait/all.hh
+# mln/core/macros.hh
+# mln/core/site_set/box.hh
+# mln/trait/concrete.hh
+# mln/trait/images.hh
+# mln/metal/is_a.hh
+# mln/metal/equal.hh
+# mln/tag/init.hh
+# mln/core/routine/initialize.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/site_set.hh
+# /work/carlinet/trunk/milena/mln/core/concept/site_set.hh includes:
+# mln/core/concept/site_iterator.hh
+# mln/trait/site_sets.hh
+# mln/metal/not_equal.hh
+# mln/metal/is_a.hh
+# mln/metal/is_unqualif.hh
+# mln/util/ord.hh
+# mln/core/site_set/operators.hh
+# mln/core/routine/ops.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/site_iterator.hh
+# /work/carlinet/trunk/milena/mln/core/concept/site_iterator.hh includes:
+# mln/core/concept/site_proxy.hh
+# mln/core/concept/iterator.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/site_proxy.hh
+# /work/carlinet/trunk/milena/mln/core/concept/site_proxy.hh includes:
+# mln/core/concept/proxy.hh
+# mln/metal/is_a.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/proxy.hh
+# /work/carlinet/trunk/milena/mln/core/concept/proxy.hh includes:
+# mln/core/concept/object.hh
+# mln/value/ops.hh
+# mln/convert/from_to.hxx
+# mln/core/concept/proxy.hxx
+test.o: /work/carlinet/trunk/milena/mln/core/concept/object.hh
+# /work/carlinet/trunk/milena/mln/core/concept/object.hh includes:
+# mln/core/macros.hh
+# mln/core/category.hh
+# mln/core/contract.hh
+# mln/core/internal/fixme.hh
+# mln/trace/all.hh
+# mln/metal/abort.hh
+# mln/metal/is_a.hh
+# mln/metal/is_not_a.hh
+# mln/metal/is.hh
+# mln/metal/is_not.hh
+# mln/metal/equal.hh
+# mln/metal/not_equal.hh
+# mln/metal/converts_to.hh
+# mln/metal/ret.hh
+# mln/metal/unqualif.hh
+# mln/metal/math/all.hh
+# mln/core/routine/exact.hh
+# mln/core/routine/ops.hh
+test.o: /work/carlinet/trunk/milena/mln/core/macros.hh
+test.o: /work/carlinet/trunk/milena/mln/core/category.hh
+# /work/carlinet/trunk/milena/mln/core/category.hh includes:
+# mln/metal/equal.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/equal.hh
+# /work/carlinet/trunk/milena/mln/metal/equal.hh includes:
+# mln/metal/bool.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/bool.hh
+# /work/carlinet/trunk/milena/mln/metal/bool.hh includes:
+# mln/metal/bexpr.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/bexpr.hh
+# /work/carlinet/trunk/milena/mln/metal/bexpr.hh includes:
+# mln/metal/bool.hh
+test.o: /work/carlinet/trunk/milena/mln/core/contract.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/fixme.hh
+test.o: /work/carlinet/trunk/milena/mln/trace/all.hh
+# /work/carlinet/trunk/milena/mln/trace/all.hh includes:
+# mln/trace/quiet.hh
+# mln/trace/entering.hh
+# mln/trace/exiting.hh
+# mln/trace/stop.hh
+# mln/trace/resume.hh
+# mln/trace/warning.hh
+test.o: /work/carlinet/trunk/milena/mln/trace/quiet.hh
+# /work/carlinet/trunk/milena/mln/trace/quiet.hh includes:
+# sys/time.h
+test.o: /usr/include/sys/time.h
+# /usr/include/sys/time.h includes:
+# features.h
+# bits/types.h
+# time.h
+# bits/time.h
+# sys/select.h
+test.o: /usr/include/features.h
+# /usr/include/features.h includes:
+# sys/cdefs.h
+# gnu/stubs.h
+test.o: /usr/include/sys/cdefs.h
+# /usr/include/sys/cdefs.h includes:
+# bits/wordsize.h
+test.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h
+# /usr/include/gnu/stubs.h includes:
+# bits/wordsize.h
+# gnu/stubs-32.h
+test.o: /usr/include/gnu/stubs-32.h /usr/include/bits/types.h
+# /usr/include/bits/types.h includes:
+# features.h
+# bits/wordsize.h
+# bits/typesizes.h
+test.o: /usr/include/bits/typesizes.h /usr/include/time.h
+# /usr/include/time.h includes:
+# bits/types.h
+test.o: /usr/include/bits/time.h
+# /usr/include/bits/time.h includes:
+# bits/types.h
+test.o: /usr/include/sys/select.h
+# /usr/include/sys/select.h includes:
+# features.h
+# bits/types.h
+# bits/select.h
+# bits/sigset.h
+# time.h
+# bits/time.h
+test.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
+test.o: /work/carlinet/trunk/milena/mln/trace/entering.hh
+# /work/carlinet/trunk/milena/mln/trace/entering.hh includes:
+# mln/trace/quiet.hh
+test.o: /work/carlinet/trunk/milena/mln/trace/exiting.hh
+# /work/carlinet/trunk/milena/mln/trace/exiting.hh includes:
+# mln/core/contract.hh
+# mln/trace/quiet.hh
+test.o: /work/carlinet/trunk/milena/mln/trace/stop.hh
+# /work/carlinet/trunk/milena/mln/trace/stop.hh includes:
+# mln/trace/quiet.hh
+test.o: /work/carlinet/trunk/milena/mln/trace/resume.hh
+# /work/carlinet/trunk/milena/mln/trace/resume.hh includes:
+# mln/trace/quiet.hh
+test.o: /work/carlinet/trunk/milena/mln/trace/warning.hh
+# /work/carlinet/trunk/milena/mln/trace/warning.hh includes:
+# mln/trace/quiet.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/abort.hh
+# /work/carlinet/trunk/milena/mln/metal/abort.hh includes:
+# mln/metal/bool.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/is_a.hh
+# /work/carlinet/trunk/milena/mln/metal/is_a.hh includes:
+# mln/metal/bool.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/is_not_a.hh
+# /work/carlinet/trunk/milena/mln/metal/is_not_a.hh includes:
+# mln/metal/is_a.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/is.hh
+# /work/carlinet/trunk/milena/mln/metal/is.hh includes:
+# mln/metal/is_a.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/is_not.hh
+# /work/carlinet/trunk/milena/mln/metal/is_not.hh includes:
+# mln/metal/is.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/not_equal.hh
+# /work/carlinet/trunk/milena/mln/metal/not_equal.hh includes:
+# mln/metal/bool.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/converts_to.hh
+# /work/carlinet/trunk/milena/mln/metal/converts_to.hh includes:
+# mln/metal/is_a.hh
+# mln/metal/const.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/const.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/ret.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/unqualif.hh
+# /work/carlinet/trunk/milena/mln/metal/unqualif.hh includes:
+# mln/metal/unconst.hh
+# mln/metal/unref.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/unconst.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/unref.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/math/all.hh
+# /work/carlinet/trunk/milena/mln/metal/math/all.hh includes:
+# mln/metal/math/pow.hh
+# mln/metal/math/root.hh
+# mln/metal/math/sqrt.hh
+# mln/metal/math/max.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/math/pow.hh
+# /work/carlinet/trunk/milena/mln/metal/math/pow.hh includes:
+# mln/metal/bool.hh
+# mln/metal/int.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/int.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/math/root.hh
+# /work/carlinet/trunk/milena/mln/metal/math/root.hh includes:
+# mln/metal/math/pow.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/math/sqrt.hh
+# /work/carlinet/trunk/milena/mln/metal/math/sqrt.hh includes:
+# mln/metal/bool.hh
+# mln/metal/int.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/math/max.hh
+# /work/carlinet/trunk/milena/mln/metal/math/max.hh includes:
+# mln/metal/bool.hh
+# mln/metal/int.hh
+test.o: /work/carlinet/trunk/milena/mln/core/routine/exact.hh
+# /work/carlinet/trunk/milena/mln/core/routine/exact.hh includes:
+# mln/core/internal/exact.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/exact.hh
+# /work/carlinet/trunk/milena/mln/core/internal/exact.hh includes:
+# mln/core/concept/object.hh
+test.o: /work/carlinet/trunk/milena/mln/core/routine/ops.hh
+# /work/carlinet/trunk/milena/mln/core/routine/ops.hh includes:
+# mln/trait/op/all.hh
+# mln/core/concept/object.hh
+# mln/metal/converts_to.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/all.hh
+# /work/carlinet/trunk/milena/mln/trait/op/all.hh includes:
+# mln/trait/op/plus.hh
+# mln/trait/op/minus.hh
+# mln/trait/op/times.hh
+# mln/trait/op/div.hh
+# mln/trait/op/mod.hh
+# mln/trait/op/uplus.hh
+# mln/trait/op/uminus.hh
+# mln/trait/op/preinc.hh
+# mln/trait/op/postinc.hh
+# mln/trait/op/predec.hh
+# mln/trait/op/postdec.hh
+# mln/trait/op/eq.hh
+# mln/trait/op/neq.hh
+# mln/trait/op/less.hh
+# mln/trait/op/leq.hh
+# mln/trait/op/geq.hh
+# mln/trait/op/greater.hh
+# mln/trait/op/and.hh
+# mln/trait/op/or.hh
+# mln/trait/op/xor.hh
+# mln/trait/op/lor.hh
+# mln/trait/op/not.hh
+# mln/trait/op/ord.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/plus.hh
+# /work/carlinet/trunk/milena/mln/trait/op/plus.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/promote.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/decl.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/promote.hh
+# /work/carlinet/trunk/milena/mln/trait/promote.hh includes:
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/solve.hh
+# /work/carlinet/trunk/milena/mln/trait/solve.hh includes:
+# mln/core/category.hh
+# mln/metal/equal.hh
+# mln/metal/if.hh
+# mln/metal/ret.hh
+# mln/trait/solve_unary.hh
+# mln/trait/solve_binary.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/if.hh
+# /work/carlinet/trunk/milena/mln/metal/if.hh includes:
+# mln/metal/bool.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/solve_unary.hh
+# /work/carlinet/trunk/milena/mln/trait/solve_unary.hh includes:
+# mln/core/category.hh
+# mln/core/routine/exact.hh
+# mln/metal/equal.hh
+# mln/metal/if.hh
+# mln/metal/ret.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/solve_binary.hh
+# /work/carlinet/trunk/milena/mln/trait/solve_binary.hh includes:
+# mln/core/category.hh
+# mln/core/routine/exact.hh
+# mln/metal/equal.hh
+# mln/metal/if.hh
+# mln/metal/ret.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/minus.hh
+# /work/carlinet/trunk/milena/mln/trait/op/minus.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/promote.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/times.hh
+# /work/carlinet/trunk/milena/mln/trait/op/times.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/div.hh
+# /work/carlinet/trunk/milena/mln/trait/op/div.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/promote.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/mod.hh
+# /work/carlinet/trunk/milena/mln/trait/op/mod.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/promote.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/uplus.hh
+# /work/carlinet/trunk/milena/mln/trait/op/uplus.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/uminus.hh
+# /work/carlinet/trunk/milena/mln/trait/op/uminus.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/preinc.hh
+# /work/carlinet/trunk/milena/mln/trait/op/preinc.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/postinc.hh
+# /work/carlinet/trunk/milena/mln/trait/op/postinc.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/predec.hh
+# /work/carlinet/trunk/milena/mln/trait/op/predec.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/postdec.hh
+# /work/carlinet/trunk/milena/mln/trait/op/postdec.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/eq.hh
+# /work/carlinet/trunk/milena/mln/trait/op/eq.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/neq.hh
+# /work/carlinet/trunk/milena/mln/trait/op/neq.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/less.hh
+# /work/carlinet/trunk/milena/mln/trait/op/less.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/leq.hh
+# /work/carlinet/trunk/milena/mln/trait/op/leq.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/geq.hh
+# /work/carlinet/trunk/milena/mln/trait/op/geq.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/greater.hh
+# /work/carlinet/trunk/milena/mln/trait/op/greater.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/and.hh
+# /work/carlinet/trunk/milena/mln/trait/op/and.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/or.hh
+# /work/carlinet/trunk/milena/mln/trait/op/or.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/xor.hh
+# /work/carlinet/trunk/milena/mln/trait/op/xor.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/lor.hh
+# /work/carlinet/trunk/milena/mln/trait/op/lor.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/not.hh
+# /work/carlinet/trunk/milena/mln/trait/op/not.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/op/ord.hh
+# /work/carlinet/trunk/milena/mln/trait/op/ord.hh includes:
+# mln/trait/op/decl.hh
+# mln/trait/solve.hh
+# mln/util/ord.hh
+test.o: /work/carlinet/trunk/milena/mln/util/ord.hh
+# /work/carlinet/trunk/milena/mln/util/ord.hh includes:
+# mln/core/concept/object.hh
+# mln/trait/op/ord.hh
+test.o: /work/carlinet/trunk/milena/mln/value/ops.hh
+# /work/carlinet/trunk/milena/mln/value/ops.hh includes:
+# mln/trait/op/all.hh
+# mln/value/builtin/all.hh
+# mln/value/concept/all.hh
+# mln/value/equiv.hh
+# mln/trait/value_.hh
+# mln/literal/zero.hh
+# mln/literal/one.hh
+# mln/literal/ops.hh
+# mln/metal/ret.hh
+test.o: /work/carlinet/trunk/milena/mln/value/builtin/all.hh
+# /work/carlinet/trunk/milena/mln/value/builtin/all.hh includes:
+# mln/value/builtin/carrays.hh
+# mln/value/builtin/integers.hh
+# mln/value/builtin/floatings.hh
+# mln/value/builtin/symbolics.hh
+# mln/value/builtin/promotions.hh
+# mln/value/builtin/ops.hh
+test.o: /work/carlinet/trunk/milena/mln/value/builtin/carrays.hh
+# /work/carlinet/trunk/milena/mln/value/builtin/carrays.hh includes:
+# mln/value/concept/built_in.hh
+# mln/value/concept/vectorial.hh
+# mln/trait/value_.hh
+test.o: /work/carlinet/trunk/milena/mln/value/concept/built_in.hh
+# /work/carlinet/trunk/milena/mln/value/concept/built_in.hh includes:
+# mln/core/category.hh
+test.o: /work/carlinet/trunk/milena/mln/value/concept/vectorial.hh
+# /work/carlinet/trunk/milena/mln/value/concept/vectorial.hh includes:
+# mln/core/concept/value.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/value.hh
+# /work/carlinet/trunk/milena/mln/core/concept/value.hh includes:
+# mln/core/concept/object.hh
+# mln/trait/value_.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/value_.hh
+# /work/carlinet/trunk/milena/mln/trait/value_.hh includes:
+# mln/metal/int.hh
+# mln/metal/math/pow.hh
+# mln/metal/if.hh
+# mln/trait/value/all.hh
+# mln/core/def/low_quant_nbits.hh
+# mln/trait/value/print.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/value/all.hh
+# /work/carlinet/trunk/milena/mln/trait/value/all.hh includes:
+# mln/trait/undef.hh
+# mln/trait/value/nature.hh
+# mln/trait/value/kind.hh
+# mln/trait/value/quant.hh
+# mln/trait/value/internal/all.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/undef.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/value/nature.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/value/kind.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/value/quant.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/value/internal/all.hh
+# /work/carlinet/trunk/milena/mln/trait/value/internal/all.hh includes:
+# mln/trait/value/internal/comp.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/value/internal/comp.hh
+# /work/carlinet/trunk/milena/mln/trait/value/internal/comp.hh includes:
+# mln/metal/bool.hh
+# mln/metal/if.hh
+test.o: /work/carlinet/trunk/milena/mln/core/def/low_quant_nbits.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/value/print.hh
+# /work/carlinet/trunk/milena/mln/trait/value/print.hh includes:
+# mln/trait/value_.hh
+# mln/metal/is_a.hh
+test.o: /work/carlinet/trunk/milena/mln/value/builtin/integers.hh
+# /work/carlinet/trunk/milena/mln/value/builtin/integers.hh includes:
+# mln/value/internal/limits.hh
+# mln/value/concept/built_in.hh
+# mln/value/concept/integer.hh
+# mln/trait/value_.hh
+# mln/metal/int.hh
+# mln/metal/if.hh
+# mln/metal/bool.hh
+test.o: /work/carlinet/trunk/milena/mln/value/internal/limits.hh
+test.o: /work/carlinet/trunk/milena/mln/value/concept/integer.hh
+# /work/carlinet/trunk/milena/mln/value/concept/integer.hh includes:
+# mln/value/concept/scalar.hh
+test.o: /work/carlinet/trunk/milena/mln/value/concept/scalar.hh
+# /work/carlinet/trunk/milena/mln/value/concept/scalar.hh includes:
+# mln/core/concept/value.hh
+# mln/literal/one.hh
+test.o: /work/carlinet/trunk/milena/mln/literal/one.hh
+# /work/carlinet/trunk/milena/mln/literal/one.hh includes:
+# mln/core/concept/literal.hh
+# mln/metal/converts_to.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/literal.hh
+# /work/carlinet/trunk/milena/mln/core/concept/literal.hh includes:
+# mln/core/concept/object.hh
+test.o: /work/carlinet/trunk/milena/mln/value/builtin/floatings.hh
+# /work/carlinet/trunk/milena/mln/value/builtin/floatings.hh includes:
+# mln/value/internal/limits.hh
+# mln/value/concept/built_in.hh
+# mln/value/concept/floating.hh
+# mln/trait/value_.hh
+test.o: /work/carlinet/trunk/milena/mln/value/concept/floating.hh
+# /work/carlinet/trunk/milena/mln/value/concept/floating.hh includes:
+# mln/value/concept/scalar.hh
+test.o: /work/carlinet/trunk/milena/mln/value/builtin/symbolics.hh
+# /work/carlinet/trunk/milena/mln/value/builtin/symbolics.hh includes:
+# mln/value/concept/built_in.hh
+# mln/value/concept/symbolic.hh
+# mln/trait/value_.hh
+test.o: /work/carlinet/trunk/milena/mln/value/concept/symbolic.hh
+# /work/carlinet/trunk/milena/mln/value/concept/symbolic.hh includes:
+# mln/core/concept/value.hh
+test.o: /work/carlinet/trunk/milena/mln/value/builtin/promotions.hh
+# /work/carlinet/trunk/milena/mln/value/builtin/promotions.hh includes:
+# mln/trait/promote.hh
+# mln/metal/ret.hh
+test.o: /work/carlinet/trunk/milena/mln/value/builtin/ops.hh
+# /work/carlinet/trunk/milena/mln/value/builtin/ops.hh includes:
+# mln/value/scalar.hh
+# mln/trait/op/all.hh
+# mln/value/builtin/promotions.hh
+test.o: /work/carlinet/trunk/milena/mln/value/scalar.hh
+# /work/carlinet/trunk/milena/mln/value/scalar.hh includes:
+# mln/value/concept/scalar.hh
+# mln/metal/is_a.hh
+# mln/metal/if.hh
+test.o: /work/carlinet/trunk/milena/mln/value/concept/all.hh
+# /work/carlinet/trunk/milena/mln/value/concept/all.hh includes:
+# mln/value/concept/built_in.hh
+# mln/value/concept/data.hh
+# mln/value/concept/floating.hh
+# mln/value/concept/integer.hh
+# mln/value/concept/scalar.hh
+# mln/value/concept/structured.hh
+# mln/value/concept/symbolic.hh
+# mln/value/concept/vectorial.hh
+test.o: /work/carlinet/trunk/milena/mln/value/concept/data.hh
+# /work/carlinet/trunk/milena/mln/value/concept/data.hh includes:
+# mln/core/concept/value.hh
+test.o: /work/carlinet/trunk/milena/mln/value/concept/structured.hh
+# /work/carlinet/trunk/milena/mln/value/concept/structured.hh includes:
+# mln/core/concept/value.hh
+test.o: /work/carlinet/trunk/milena/mln/value/equiv.hh
+# /work/carlinet/trunk/milena/mln/value/equiv.hh includes:
+# mln/core/concept/value.hh
+# mln/value/cast.hh
+test.o: /work/carlinet/trunk/milena/mln/value/cast.hh
+# /work/carlinet/trunk/milena/mln/value/cast.hh includes:
+# mln/core/concept/value.hh
+# mln/value/equiv.hh
+test.o: /work/carlinet/trunk/milena/mln/literal/zero.hh
+# /work/carlinet/trunk/milena/mln/literal/zero.hh includes:
+# mln/core/concept/literal.hh
+# mln/metal/converts_to.hh
+test.o: /work/carlinet/trunk/milena/mln/literal/ops.hh
+# /work/carlinet/trunk/milena/mln/literal/ops.hh includes:
+# mln/core/concept/literal.hh
+# mln/trait/all.hh
+# mln/metal/equal.hh
+# mln/metal/converts_to.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/all.hh
+# /work/carlinet/trunk/milena/mln/trait/all.hh includes:
+# mln/trait/solve.hh
+# mln/trait/promote.hh
+# mln/trait/op/all.hh
+test.o: /work/carlinet/trunk/milena/mln/convert/from_to.hxx
+# /work/carlinet/trunk/milena/mln/convert/from_to.hxx includes:
+# mln/core/def/all.hh
+# mln/core/grids.hh
+test.o: /work/carlinet/trunk/milena/mln/core/def/all.hh
+# /work/carlinet/trunk/milena/mln/core/def/all.hh includes:
+# mln/core/def/coord.hh
+# mln/core/def/coordf.hh
+# mln/core/def/low_quant_nbits.hh
+test.o: /work/carlinet/trunk/milena/mln/core/def/coord.hh
+test.o: /work/carlinet/trunk/milena/mln/core/def/coordf.hh
+test.o: /work/carlinet/trunk/milena/mln/core/grids.hh
+# /work/carlinet/trunk/milena/mln/core/grids.hh includes:
+# mln/core/concept/regular_grid.hh
+# mln/core/def/coord.hh
+# mln/metal/bool.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/regular_grid.hh
+# /work/carlinet/trunk/milena/mln/core/concept/regular_grid.hh includes:
+# mln/core/concept/mesh.hh
+# mln/metal/bool.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/mesh.hh
+# /work/carlinet/trunk/milena/mln/core/concept/mesh.hh includes:
+# mln/core/concept/object.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/proxy.hxx
+# /work/carlinet/trunk/milena/mln/core/concept/proxy.hxx includes:
+# mln/core/internal/force_exact.hh
+# mln/metal/unqualif.hh
+# mln/metal/is_a.hh
+# mln/metal/if.hh
+# mln/metal/is_const.hh
+# mln/metal/const.hh
+# mln/metal/unconst.hh
+# mln/metal/is_not_ref.hh
+# mln/metal/ref.hh
+# mln/metal/fix_return.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/force_exact.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/is_const.hh
+# /work/carlinet/trunk/milena/mln/metal/is_const.hh includes:
+# mln/metal/bool.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/is_not_ref.hh
+# /work/carlinet/trunk/milena/mln/metal/is_not_ref.hh includes:
+# mln/metal/bool.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/ref.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/fix_return.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/iterator.hh
+# /work/carlinet/trunk/milena/mln/core/concept/iterator.hh includes:
+# mln/core/concept/object.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/site_sets.hh
+# /work/carlinet/trunk/milena/mln/trait/site_sets.hh includes:
+# mln/trait/undef.hh
+# mln/trait/site_set/props.hh
+# mln/trait/site_set/print.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/site_set/props.hh
+# /work/carlinet/trunk/milena/mln/trait/site_set/props.hh includes:
+# mln/trait/undef.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/site_set/print.hh
+# /work/carlinet/trunk/milena/mln/trait/site_set/print.hh includes:
+# mln/trait/site_sets.hh
+# mln/metal/is_a.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/is_unqualif.hh
+# /work/carlinet/trunk/milena/mln/metal/is_unqualif.hh includes:
+# mln/metal/equal.hh
+# mln/metal/unqualif.hh
+test.o: /work/carlinet/trunk/milena/mln/core/site_set/operators.hh
+# /work/carlinet/trunk/milena/mln/core/site_set/operators.hh includes:
+# mln/core/concept/site_set.hh
+test.o: /work/carlinet/trunk/milena/mln/core/trait/all.hh
+# /work/carlinet/trunk/milena/mln/core/trait/all.hh includes:
+# mln/core/trait/op_mult.hh
+# mln/core/trait/pixter.hh
+# mln/core/trait/qlf_value.hh
+test.o: /work/carlinet/trunk/milena/mln/core/trait/op_mult.hh
+test.o: /work/carlinet/trunk/milena/mln/core/trait/pixter.hh
+# /work/carlinet/trunk/milena/mln/core/trait/pixter.hh includes:
+# mln/metal/none.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/none.hh
+test.o: /work/carlinet/trunk/milena/mln/core/trait/qlf_value.hh
+# /work/carlinet/trunk/milena/mln/core/trait/qlf_value.hh includes:
+# mln/core/macros.hh
+test.o: /work/carlinet/trunk/milena/mln/core/site_set/box.hh
+# /work/carlinet/trunk/milena/mln/core/site_set/box.hh includes:
+# mln/core/concept/box.hh
+# mln/core/internal/box_impl.hh
+# mln/core/point.hh
+# mln/literal/origin.hh
+# mln/core/site_set/box_piter.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/box.hh
+# /work/carlinet/trunk/milena/mln/core/concept/box.hh includes:
+# mln/core/concept/site_set.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/box_impl.hh
+# /work/carlinet/trunk/milena/mln/core/internal/box_impl.hh includes:
+# mln/core/internal/force_exact.hh
+test.o: /work/carlinet/trunk/milena/mln/core/point.hh
+# /work/carlinet/trunk/milena/mln/core/point.hh includes:
+# mln/core/def/coord.hh
+# mln/core/concept/proxy.hh
+# mln/core/concept/gpoint.hh
+# mln/core/internal/coord_impl.hh
+# mln/fun/i2v/all_to.hh
+# mln/metal/bool.hh
+# mln/metal/is_not.hh
+# mln/algebra/vec.hh
+# mln/metal/converts_to.hh
+# mln/algebra/h_vec.hh
+# mln/util/yes.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/gpoint.hh
+# /work/carlinet/trunk/milena/mln/core/concept/gpoint.hh includes:
+# mln/core/concept/site.hh
+# mln/core/concept/gdpoint.hh
+# mln/value/concept/scalar.hh
+# mln/algebra/vec.hh
+# mln/util/ord.hh
+# mln/debug/format.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/site.hh
+# /work/carlinet/trunk/milena/mln/core/concept/site.hh includes:
+# mln/core/concept/object.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/gdpoint.hh
+# /work/carlinet/trunk/milena/mln/core/concept/gdpoint.hh includes:
+# mln/core/concept/object.hh
+# mln/core/grids.hh
+# mln/trait/all.hh
+# mln/value/scalar.hh
+# mln/debug/format.hh
+test.o: /work/carlinet/trunk/milena/mln/debug/format.hh
+test.o: /work/carlinet/trunk/milena/mln/algebra/vec.hh
+# /work/carlinet/trunk/milena/mln/algebra/vec.hh includes:
+# mln/core/concept/object.hh
+# mln/literal/zero.hh
+# mln/literal/origin.hh
+# mln/norm/l2.hh
+# mln/trait/all.hh
+# mln/trait/value_.hh
+# mln/fun/i2v/all_to.hh
+# mln/debug/format.hh
+# mln/value/ops.hh
+# mln/make/vec.hh
+test.o: /work/carlinet/trunk/milena/mln/literal/origin.hh
+# /work/carlinet/trunk/milena/mln/literal/origin.hh includes:
+# mln/core/concept/literal.hh
+test.o: /work/carlinet/trunk/milena/mln/norm/l2.hh
+# /work/carlinet/trunk/milena/mln/norm/l2.hh includes:
+# mln/math/sqr.hh
+# mln/math/sqrt.hh
+# mln/algebra/vec.hh
+# mln/value/ops.hh
+test.o: /work/carlinet/trunk/milena/mln/math/sqr.hh
+test.o: /work/carlinet/trunk/milena/mln/math/sqrt.hh
+test.o: /work/carlinet/trunk/milena/mln/fun/i2v/all_to.hh
+# /work/carlinet/trunk/milena/mln/fun/i2v/all_to.hh includes:
+# mln/core/concept/function.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/function.hh
+# /work/carlinet/trunk/milena/mln/core/concept/function.hh includes:
+# mln/core/concept/object.hh
+test.o: /work/carlinet/trunk/milena/mln/make/vec.hh
+# /work/carlinet/trunk/milena/mln/make/vec.hh includes:
+# mln/algebra/vec.hh
+# mln/core/concept/function.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/coord_impl.hh
+# /work/carlinet/trunk/milena/mln/core/internal/coord_impl.hh includes:
+# mln/core/internal/force_exact.hh
+test.o: /work/carlinet/trunk/milena/mln/algebra/h_vec.hh
+# /work/carlinet/trunk/milena/mln/algebra/h_vec.hh includes:
+# mln/algebra/vec.hh
+# mln/literal/one.hh
+test.o: /work/carlinet/trunk/milena/mln/util/yes.hh
+# /work/carlinet/trunk/milena/mln/util/yes.hh includes:
+# mln/core/concept/object.hh
+# mln/core/routine/ops.hh
+test.o: /work/carlinet/trunk/milena/mln/core/site_set/box_piter.hh
+# /work/carlinet/trunk/milena/mln/core/site_set/box_piter.hh includes:
+# mln/core/internal/site_set_iterator_base.hh
+# mln/core/concept/box.hh
+# mln/core/site_set/box.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/site_set_iterator_base.hh
+# /work/carlinet/trunk/milena/mln/core/internal/site_set_iterator_base.hh includes:
+# mln/core/internal/site_iterator_base.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/site_iterator_base.hh
+# /work/carlinet/trunk/milena/mln/core/internal/site_iterator_base.hh includes:
+# mln/core/concept/site_iterator.hh
+# mln/core/concept/pseudo_site.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/pseudo_site.hh
+# /work/carlinet/trunk/milena/mln/core/concept/pseudo_site.hh includes:
+# mln/core/concept/site_proxy.hh
+# mln/metal/is_a.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/concrete.hh
+# /work/carlinet/trunk/milena/mln/trait/concrete.hh includes:
+# mln/trait/ch_value.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/ch_value.hh
+# /work/carlinet/trunk/milena/mln/trait/ch_value.hh includes:
+# mln/tag/skeleton.hh
+# mln/trait/image_from_grid.hh
+# mln/trait/ch_function_value.hh
+test.o: /work/carlinet/trunk/milena/mln/tag/skeleton.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/image_from_grid.hh
+# /work/carlinet/trunk/milena/mln/trait/image_from_grid.hh includes:
+# mln/core/grids.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/ch_function_value.hh
+# /work/carlinet/trunk/milena/mln/trait/ch_function_value.hh includes:
+# mln/fun/v2v/ch_function_value.hh
+test.o: /work/carlinet/trunk/milena/mln/fun/v2v/ch_function_value.hh
+# /work/carlinet/trunk/milena/mln/fun/v2v/ch_function_value.hh includes:
+# mln/core/concept/function.hh
+# mln/fun/internal/ch_function_value_impl.hh
+test.o: /work/carlinet/trunk/milena/mln/fun/internal/ch_function_value_impl.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/images.hh
+# /work/carlinet/trunk/milena/mln/trait/images.hh includes:
+# mln/trait/undef.hh
+# mln/trait/image/props.hh
+# mln/trait/value_.hh
+# mln/metal/bexpr.hh
+# mln/metal/equal.hh
+# mln/metal/if.hh
+# mln/metal/is_const.hh
+# mln/trait/image/print.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/image/props.hh
+# /work/carlinet/trunk/milena/mln/trait/image/props.hh includes:
+# mln/trait/undef.hh
+# mln/trait/value/kind.hh
+# mln/core/def/coord.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/image/print.hh
+# /work/carlinet/trunk/milena/mln/trait/image/print.hh includes:
+# mln/trait/images.hh
+# mln/metal/is_a.hh
+test.o: /work/carlinet/trunk/milena/mln/tag/init.hh
+test.o: /work/carlinet/trunk/milena/mln/core/routine/initialize.hh
+# /work/carlinet/trunk/milena/mln/core/routine/initialize.hh includes:
+# mln/core/concept/image.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/check/image_all.hh
+# /work/carlinet/trunk/milena/mln/core/internal/check/image_all.hh includes:
+# mln/trait/images.hh
+# mln/core/internal/check/image_fastest.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/check/image_fastest.hh
+# /work/carlinet/trunk/milena/mln/core/internal/check/image_fastest.hh includes:
+# mln/metal/bool.hh
+# mln/core/macros.hh
+# mln/core/trait/pixter.hh
+# mln/core/trait/qlf_value.hh
+# mln/core/internal/force_exact.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/data.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/morpher_lvalue.hh
+# /work/carlinet/trunk/milena/mln/core/internal/morpher_lvalue.hh includes:
+# mln/core/macros.hh
+test.o: /work/carlinet/trunk/milena/mln/util/tracked_ptr.hh
+# /work/carlinet/trunk/milena/mln/util/tracked_ptr.hh includes:
+# mln/core/contract.hh
+test.o: /work/carlinet/trunk/milena/mln/value/set.hh
+# /work/carlinet/trunk/milena/mln/value/set.hh includes:
+# mln/value/internal/iterable_set.hh
+# mln/trait/value_.hh
+test.o: /work/carlinet/trunk/milena/mln/value/internal/iterable_set.hh
+# /work/carlinet/trunk/milena/mln/value/internal/iterable_set.hh includes:
+# mln/core/concept/value_set.hh
+# mln/trait/value_.hh
+# mln/value/builtin/all.hh
+# mln/value/internal/convert.hh
+# mln/value/viter.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/value_set.hh
+# /work/carlinet/trunk/milena/mln/core/concept/value_set.hh includes:
+# mln/core/concept/value_iterator.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/value_iterator.hh
+# /work/carlinet/trunk/milena/mln/core/concept/value_iterator.hh includes:
+# mln/core/concept/iterator.hh
+test.o: /work/carlinet/trunk/milena/mln/value/internal/convert.hh
+# /work/carlinet/trunk/milena/mln/value/internal/convert.hh includes:
+# mln/core/contract.hh
+# mln/trait/value_.hh
+test.o: /work/carlinet/trunk/milena/mln/value/viter.hh
+# /work/carlinet/trunk/milena/mln/value/viter.hh includes:
+# mln/core/concept/value_iterator.hh
+# mln/core/concept/value_set.hh
+test.o: /work/carlinet/trunk/milena/mln/value/super_value.hh
+# /work/carlinet/trunk/milena/mln/value/super_value.hh includes:
+# mln/value/sign.hh
+test.o: /work/carlinet/trunk/milena/mln/value/sign.hh
+# /work/carlinet/trunk/milena/mln/value/sign.hh includes:
+# mln/value/internal/integer.hh
+# mln/trait/value_.hh
+# mln/literal/zero.hh
+# mln/literal/one.hh
+# mln/debug/format.hh
+test.o: /work/carlinet/trunk/milena/mln/value/internal/integer.hh
+# /work/carlinet/trunk/milena/mln/value/internal/integer.hh includes:
+# mln/value/concept/scalar.hh
+test.o: /work/carlinet/trunk/milena/mln/core/alias/box2d.hh
+# /work/carlinet/trunk/milena/mln/core/alias/box2d.hh includes:
+# mln/core/site_set/box.hh
+# mln/core/alias/point2d.hh
+# mln/make/box2d.hh
+test.o: /work/carlinet/trunk/milena/mln/core/alias/point2d.hh
+# /work/carlinet/trunk/milena/mln/core/alias/point2d.hh includes:
+# mln/core/point.hh
+# mln/core/concept/site_proxy.hh
+# mln/core/internal/force_exact.hh
+# mln/core/alias/dpoint2d.hh
+test.o: /work/carlinet/trunk/milena/mln/core/alias/dpoint2d.hh
+# /work/carlinet/trunk/milena/mln/core/alias/dpoint2d.hh includes:
+# mln/core/dpoint.hh
+# mln/core/def/coord.hh
+# mln/core/alias/point2d.hh
+test.o: /work/carlinet/trunk/milena/mln/core/dpoint.hh
+# /work/carlinet/trunk/milena/mln/core/dpoint.hh includes:
+# mln/core/def/coord.hh
+# mln/core/concept/gdpoint.hh
+# mln/core/internal/coord_impl.hh
+# mln/fun/i2v/all.hh
+# mln/algebra/vec.hh
+# mln/metal/converts_to.hh
+test.o: /work/carlinet/trunk/milena/mln/fun/i2v/all.hh
+# /work/carlinet/trunk/milena/mln/fun/i2v/all.hh includes:
+# mln/fun/i2v/all_to.hh
+# mln/fun/i2v/array.hh
+test.o: /work/carlinet/trunk/milena/mln/fun/i2v/array.hh
+# /work/carlinet/trunk/milena/mln/fun/i2v/array.hh includes:
+# mln/core/concept/function.hh
+# mln/fun/internal/array_base.hh
+# mln/util/array.hh
+# mln/metal/equal.hh
+test.o: /work/carlinet/trunk/milena/mln/fun/internal/array_base.hh
+# /work/carlinet/trunk/milena/mln/fun/internal/array_base.hh includes:
+# mln/util/array.hh
+# mln/tag/init.hh
+test.o: /work/carlinet/trunk/milena/mln/util/array.hh
+# /work/carlinet/trunk/milena/mln/util/array.hh includes:
+# mln/core/concept/proxy.hh
+# mln/core/concept/iterator.hh
+test.o: /work/carlinet/trunk/milena/mln/make/box2d.hh
+# /work/carlinet/trunk/milena/mln/make/box2d.hh includes:
+# mln/core/alias/box2d.hh
+test.o: /work/carlinet/trunk/milena/mln/core/routine/init.hh
+# /work/carlinet/trunk/milena/mln/core/routine/init.hh includes:
+# mln/tag/init.hh
+# mln/geom/bbox.hh
+# mln/border/find.hh
+# mln/core/routine/init.hxx
+test.o: /work/carlinet/trunk/milena/mln/geom/bbox.hh
+# /work/carlinet/trunk/milena/mln/geom/bbox.hh includes:
+# mln/core/site_set/box.hh
+# mln/core/concept/image.hh
+# mln/core/concept/window.hh
+# mln/core/concept/weighted_window.hh
+# mln/literal/zero.hh
+# mln/accu/bbox.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/window.hh
+# /work/carlinet/trunk/milena/mln/core/concept/window.hh includes:
+# mln/core/concept/object.hh
+# mln/core/concept/iterator.hh
+# mln/trait/windows.hh
+# mln/core/site_set/p_array.hh
+# mln/core/internal/geom_bbox.hh
+# mln/convert/from_to.hxx
+# mln/util/array.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/windows.hh
+# /work/carlinet/trunk/milena/mln/trait/windows.hh includes:
+# mln/trait/undef.hh
+# mln/trait/window/props.hh
+# mln/trait/window/print.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/window/props.hh
+# /work/carlinet/trunk/milena/mln/trait/window/props.hh includes:
+# mln/trait/undef.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/window/print.hh
+# /work/carlinet/trunk/milena/mln/trait/window/print.hh includes:
+# mln/trait/windows.hh
+# mln/metal/is_a.hh
+# mln/metal/bexpr.hh
+test.o: /work/carlinet/trunk/milena/mln/core/site_set/p_array.hh
+# /work/carlinet/trunk/milena/mln/core/site_set/p_array.hh includes:
+# mln/core/internal/site_set_base.hh
+# mln/core/internal/site_set_iterator_base.hh
+# mln/core/internal/pseudo_site_base.hh
+# mln/util/index.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/site_set_base.hh
+# /work/carlinet/trunk/milena/mln/core/internal/site_set_base.hh includes:
+# mln/core/concept/site_set.hh
+# mln/core/concept/site_proxy.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/pseudo_site_base.hh
+# /work/carlinet/trunk/milena/mln/core/internal/pseudo_site_base.hh includes:
+# mln/core/concept/pseudo_site.hh
+test.o: /work/carlinet/trunk/milena/mln/util/index.hh
+# /work/carlinet/trunk/milena/mln/util/index.hh includes:
+# mln/core/concept/object.hh
+# mln/util/dindex.hh
+test.o: /work/carlinet/trunk/milena/mln/util/dindex.hh
+# /work/carlinet/trunk/milena/mln/util/dindex.hh includes:
+# mln/util/index.hh
+# mln/literal/zero.hh
+# mln/literal/one.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/geom_bbox.hh
+# /work/carlinet/trunk/milena/mln/core/internal/geom_bbox.hh includes:
+# mln/accu/bbox.hh
+# mln/literal/origin.hh
+test.o: /work/carlinet/trunk/milena/mln/accu/bbox.hh
+# /work/carlinet/trunk/milena/mln/accu/bbox.hh includes:
+# mln/core/site_set/box.hh
+# mln/core/concept/meta_accumulator.hh
+# mln/accu/internal/base.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/meta_accumulator.hh
+# /work/carlinet/trunk/milena/mln/core/concept/meta_accumulator.hh includes:
+# mln/core/concept/object.hh
+# mln/core/concept/accumulator.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/accumulator.hh
+# /work/carlinet/trunk/milena/mln/core/concept/accumulator.hh includes:
+# mln/core/concept/proxy.hh
+# mln/metal/fix_return.hh
+# mln/metal/const.hh
+# mln/trait/accumulators.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/accumulators.hh
+# /work/carlinet/trunk/milena/mln/trait/accumulators.hh includes:
+# mln/trait/accumulator/props.hh
+# mln/trait/undef.hh
+# mln/trait/accumulator/print.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/accumulator/props.hh
+test.o: /work/carlinet/trunk/milena/mln/trait/accumulator/print.hh
+# /work/carlinet/trunk/milena/mln/trait/accumulator/print.hh includes:
+# mln/trait/accumulators.hh
+# mln/metal/is_a.hh
+test.o: /work/carlinet/trunk/milena/mln/accu/internal/base.hh
+# /work/carlinet/trunk/milena/mln/accu/internal/base.hh includes:
+# mln/core/concept/accumulator.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/weighted_window.hh
+# /work/carlinet/trunk/milena/mln/core/concept/weighted_window.hh includes:
+# mln/core/concept/object.hh
+# mln/core/concept/iterator.hh
+# mln/trait/windows.hh
+test.o: /work/carlinet/trunk/milena/mln/border/find.hh
+# /work/carlinet/trunk/milena/mln/border/find.hh includes:
+# mln/core/internal/image_morpher.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/image_morpher.hh
+# /work/carlinet/trunk/milena/mln/core/internal/image_morpher.hh includes:
+# mln/core/internal/image_base.hh
+# mln/metal/const.hh
+# mln/metal/is_const.hh
+# mln/metal/is_not_const.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/is_not_const.hh
+# /work/carlinet/trunk/milena/mln/metal/is_not_const.hh includes:
+# mln/metal/bool.hh
+test.o: /work/carlinet/trunk/milena/mln/core/routine/init.hxx
+test.o: /work/carlinet/trunk/milena/mln/border/thickness.hh
+test.o: /work/carlinet/trunk/milena/mln/core/dpoints_pixter.hh
+# /work/carlinet/trunk/milena/mln/core/dpoints_pixter.hh includes:
+# mln/core/concept/proxy.hh
+# mln/core/concept/pixel_iterator.hh
+# mln/core/internal/pixel_impl.hh
+# mln/metal/converts_to.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/pixel_iterator.hh
+# /work/carlinet/trunk/milena/mln/core/concept/pixel_iterator.hh includes:
+# mln/core/concept/iterator.hh
+# mln/core/concept/generalized_pixel.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/generalized_pixel.hh
+# /work/carlinet/trunk/milena/mln/core/concept/generalized_pixel.hh includes:
+# mln/core/concept/object.hh
+# mln/core/internal/force_exact.hh
+# mln/core/trait/qlf_value.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/pixel_impl.hh
+# /work/carlinet/trunk/milena/mln/core/internal/pixel_impl.hh includes:
+# mln/core/concept/image.hh
+# mln/core/internal/force_exact.hh
+# mln/util/pix.hh
+test.o: /work/carlinet/trunk/milena/mln/util/pix.hh
+# /work/carlinet/trunk/milena/mln/util/pix.hh includes:
+# mln/core/concept/image.hh
+# mln/make/pix.hh
+test.o: /work/carlinet/trunk/milena/mln/make/pix.hh
+# /work/carlinet/trunk/milena/mln/make/pix.hh includes:
+# mln/util/pix.hh
+test.o: /work/carlinet/trunk/milena/mln/core/pixter2d.hh
+# /work/carlinet/trunk/milena/mln/core/pixter2d.hh includes:
+# mln/core/internal/pixel_iterator_base.hh
+# mln/core/alias/point2d.hh
+# mln/geom/size2d.hh
+# mln/opt/at.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/pixel_iterator_base.hh
+# /work/carlinet/trunk/milena/mln/core/internal/pixel_iterator_base.hh includes:
+# mln/core/concept/pixel_iterator.hh
+# mln/core/internal/pixel_impl.hh
+# mln/core/trait/qlf_value.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/size2d.hh
+# /work/carlinet/trunk/milena/mln/geom/size2d.hh includes:
+# mln/geom/nrows.hh
+# mln/geom/ncols.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/nrows.hh
+# /work/carlinet/trunk/milena/mln/geom/nrows.hh includes:
+# mln/geom/min_row.hh
+# mln/geom/max_row.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/min_row.hh
+# /work/carlinet/trunk/milena/mln/geom/min_row.hh includes:
+# mln/core/concept/image.hh
+# mln/geom/bbox.hh
+# mln/metal/bexpr.hh
+# mln/metal/int.hh
+# mln/metal/equal.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/max_row.hh
+# /work/carlinet/trunk/milena/mln/geom/max_row.hh includes:
+# mln/core/concept/image.hh
+# mln/geom/bbox.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/ncols.hh
+# /work/carlinet/trunk/milena/mln/geom/ncols.hh includes:
+# mln/geom/min_col.hh
+# mln/geom/max_col.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/min_col.hh
+# /work/carlinet/trunk/milena/mln/geom/min_col.hh includes:
+# mln/core/concept/image.hh
+# mln/geom/bbox.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/max_col.hh
+# /work/carlinet/trunk/milena/mln/geom/max_col.hh includes:
+# mln/core/concept/image.hh
+# mln/geom/bbox.hh
+test.o: /work/carlinet/trunk/milena/mln/opt/at.hh
+# /work/carlinet/trunk/milena/mln/opt/at.hh includes:
+# mln/core/concept/image.hh
+# mln/trait/images.hh
+# mln/trace/all.hh
+# mln/core/alias/point1d.hh
+# mln/core/alias/point2d.hh
+# mln/core/alias/point3d.hh
+test.o: /work/carlinet/trunk/milena/mln/core/alias/point1d.hh
+# /work/carlinet/trunk/milena/mln/core/alias/point1d.hh includes:
+# mln/core/point.hh
+# mln/core/concept/site_proxy.hh
+# mln/core/internal/force_exact.hh
+# mln/core/alias/dpoint1d.hh
+test.o: /work/carlinet/trunk/milena/mln/core/alias/dpoint1d.hh
+# /work/carlinet/trunk/milena/mln/core/alias/dpoint1d.hh includes:
+# mln/core/dpoint.hh
+# mln/core/grids.hh
+# mln/core/def/coord.hh
+# mln/core/alias/point1d.hh
+test.o: /work/carlinet/trunk/milena/mln/core/alias/point3d.hh
+# /work/carlinet/trunk/milena/mln/core/alias/point3d.hh includes:
+# mln/core/point.hh
+# mln/core/concept/site_proxy.hh
+# mln/core/internal/force_exact.hh
+# mln/core/alias/dpoint3d.hh
+test.o: /work/carlinet/trunk/milena/mln/core/alias/dpoint3d.hh
+# /work/carlinet/trunk/milena/mln/core/alias/dpoint3d.hh includes:
+# mln/core/dpoint.hh
+# mln/core/grids.hh
+# mln/core/def/coord.hh
+# mln/core/alias/point3d.hh
+test.o: /work/carlinet/trunk/milena/mln/make/image.hh
+# /work/carlinet/trunk/milena/mln/make/image.hh includes:
+# mln/core/image/image1d.hh
+# mln/core/image/image2d.hh
+# mln/core/image/image3d.hh
+# mln/opt/at.hh
+test.o: /work/carlinet/trunk/milena/mln/core/image/image1d.hh
+# /work/carlinet/trunk/milena/mln/core/image/image1d.hh includes:
+# mln/core/internal/fixme.hh
+# mln/core/internal/image_primary.hh
+# mln/core/alias/box1d.hh
+# mln/border/thickness.hh
+# mln/value/set.hh
+# mln/fun/i2v/all_to.hh
+# mln/core/trait/pixter.hh
+# mln/core/dpoints_pixter.hh
+# mln/core/pixter1d.hh
+# mln/core/w_window.hh
+# mln/make/image.hh
+test.o: /work/carlinet/trunk/milena/mln/core/alias/box1d.hh
+# /work/carlinet/trunk/milena/mln/core/alias/box1d.hh includes:
+# mln/core/site_set/box.hh
+# mln/core/alias/point1d.hh
+# mln/make/box1d.hh
+test.o: /work/carlinet/trunk/milena/mln/make/box1d.hh
+# /work/carlinet/trunk/milena/mln/make/box1d.hh includes:
+# mln/core/alias/box1d.hh
+test.o: /work/carlinet/trunk/milena/mln/core/pixter1d.hh
+# /work/carlinet/trunk/milena/mln/core/pixter1d.hh includes:
+# mln/core/internal/pixel_iterator_base.hh
+# mln/core/alias/point1d.hh
+# mln/geom/size1d.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/size1d.hh
+# /work/carlinet/trunk/milena/mln/geom/size1d.hh includes:
+# mln/geom/ninds.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/ninds.hh
+# /work/carlinet/trunk/milena/mln/geom/ninds.hh includes:
+# mln/geom/min_ind.hh
+# mln/geom/max_ind.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/min_ind.hh
+# /work/carlinet/trunk/milena/mln/geom/min_ind.hh includes:
+# mln/core/concept/image.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/max_ind.hh
+# /work/carlinet/trunk/milena/mln/geom/max_ind.hh includes:
+# mln/core/concept/image.hh
+test.o: /work/carlinet/trunk/milena/mln/core/w_window.hh
+# /work/carlinet/trunk/milena/mln/core/w_window.hh includes:
+# mln/core/internal/weighted_window_base.hh
+# mln/core/concept/image.hh
+# mln/core/site_set/box.hh
+# mln/core/window.hh
+# mln/core/dpsites_piter.hh
+# mln/value/ops.hh
+# mln/util/ord.hh
+# mln/geom/bbox.hh
+# mln/literal/zero.hh
+# mln/convert/to.hh
+# mln/make/w_window.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/weighted_window_base.hh
+# /work/carlinet/trunk/milena/mln/core/internal/weighted_window_base.hh includes:
+# mln/core/concept/weighted_window.hh
+test.o: /work/carlinet/trunk/milena/mln/core/window.hh
+# /work/carlinet/trunk/milena/mln/core/window.hh includes:
+# mln/core/internal/window_base.hh
+# mln/core/concept/gdpoint.hh
+# mln/metal/is_a.hh
+# mln/util/set.hh
+# mln/fun/i2v/all_to.hh
+# mln/norm/linfty.hh
+# mln/literal/zero.hh
+# mln/core/dpsites_piter.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/window_base.hh
+# /work/carlinet/trunk/milena/mln/core/internal/window_base.hh includes:
+# mln/core/concept/window.hh
+test.o: /work/carlinet/trunk/milena/mln/util/set.hh
+# /work/carlinet/trunk/milena/mln/util/set.hh includes:
+# mln/core/concept/proxy.hh
+# mln/util/ord.hh
+test.o: /work/carlinet/trunk/milena/mln/norm/linfty.hh
+# /work/carlinet/trunk/milena/mln/norm/linfty.hh includes:
+# mln/math/abs.hh
+# mln/algebra/vec.hh
+test.o: /work/carlinet/trunk/milena/mln/math/abs.hh
+# /work/carlinet/trunk/milena/mln/math/abs.hh includes:
+# mln/value/int_u.hh
+test.o: /work/carlinet/trunk/milena/mln/value/int_u.hh
+# /work/carlinet/trunk/milena/mln/value/int_u.hh includes:
+# mln/trait/all.hh
+# mln/value/ops.hh
+# mln/metal/math/pow.hh
+# mln/value/internal/value_like.hh
+# mln/value/internal/encoding.hh
+# mln/value/concept/integer.hh
+# mln/trait/value_.hh
+# mln/debug/format.hh
+test.o: /work/carlinet/trunk/milena/mln/value/internal/value_like.hh
+# /work/carlinet/trunk/milena/mln/value/internal/value_like.hh includes:
+# mln/core/concept/value.hh
+# mln/core/internal/force_exact.hh
+test.o: /work/carlinet/trunk/milena/mln/value/internal/encoding.hh
+test.o: /work/carlinet/trunk/milena/mln/core/dpsites_piter.hh
+# /work/carlinet/trunk/milena/mln/core/dpsites_piter.hh includes:
+# mln/core/internal/site_relative_iterator_base.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/site_relative_iterator_base.hh
+# /work/carlinet/trunk/milena/mln/core/internal/site_relative_iterator_base.hh includes:
+# mln/core/internal/site_iterator_base.hh
+# mln/metal/converts_to.hh
+test.o: /work/carlinet/trunk/milena/mln/convert/to.hh
+# /work/carlinet/trunk/milena/mln/convert/to.hh includes:
+# mln/core/routine/exact.hh
+# mln/metal/equal.hh
+# mln/trace/all.hh
+# mln/convert/from_to.hh
+# mln/convert/from_to.hxx
+test.o: /work/carlinet/trunk/milena/mln/convert/from_to.hh
+# /work/carlinet/trunk/milena/mln/convert/from_to.hh includes:
+# mln/convert/impl/all.hh
+# mln/convert/from_to.hxx
+# mln/metal/abort.hh
+# mln/metal/converts_to.hh
+# mln/metal/is.hh
+# mln/metal/is_a.hh
+test.o: /work/carlinet/trunk/milena/mln/convert/impl/all.hh
+# /work/carlinet/trunk/milena/mln/convert/impl/all.hh includes:
+# mln/convert/impl/from_double_to_value.hh
+# mln/convert/impl/from_float_to_value.hh
+# mln/convert/impl/from_image_to_site_set.hh
+# mln/convert/impl/from_int_to_value.hh
+# mln/convert/impl/from_site_set_to_image.hh
+# mln/convert/impl/from_unsigned_to_value.hh
+# mln/convert/impl/from_value_to_value.hh
+test.o: /work/carlinet/trunk/milena/mln/convert/impl/from_double_to_value.hh
+# /work/carlinet/trunk/milena/mln/convert/impl/from_double_to_value.hh includes:
+# mln/value/concept/integer.hh
+# mln/value/concept/floating.hh
+# mln/core/concept/value.hh
+# mln/math/round.hh
+test.o: /work/carlinet/trunk/milena/mln/math/round.hh
+# /work/carlinet/trunk/milena/mln/math/round.hh includes:
+# mln/core/concept/function.hh
+test.o: /work/carlinet/trunk/milena/mln/convert/impl/from_float_to_value.hh
+# /work/carlinet/trunk/milena/mln/convert/impl/from_float_to_value.hh includes:
+# mln/value/concept/integer.hh
+# mln/value/concept/floating.hh
+# mln/core/concept/value.hh
+# mln/math/round.hh
+test.o: /work/carlinet/trunk/milena/mln/convert/impl/from_image_to_site_set.hh
+# /work/carlinet/trunk/milena/mln/convert/impl/from_image_to_site_set.hh includes:
+# mln/core/site_set/p_run.hh
+# mln/core/site_set/p_array.hh
+# mln/metal/converts_to.hh
+test.o: /work/carlinet/trunk/milena/mln/core/site_set/p_run.hh
+# /work/carlinet/trunk/milena/mln/core/site_set/p_run.hh includes:
+# mln/core/internal/site_set_base.hh
+# mln/core/site_set/box.hh
+# mln/core/internal/pseudo_site_base.hh
+# mln/util/index.hh
+# mln/core/site_set/p_run_piter.hh
+test.o: /work/carlinet/trunk/milena/mln/core/site_set/p_run_piter.hh
+# /work/carlinet/trunk/milena/mln/core/site_set/p_run_piter.hh includes:
+# mln/core/site_set/p_run.hh
+# mln/core/internal/site_set_iterator_base.hh
+test.o: /work/carlinet/trunk/milena/mln/convert/impl/from_int_to_value.hh
+# /work/carlinet/trunk/milena/mln/convert/impl/from_int_to_value.hh includes:
+# mln/value/concept/integer.hh
+# mln/core/concept/value.hh
+# mln/math/round.hh
+test.o: /work/carlinet/trunk/milena/mln/convert/impl/from_site_set_to_image.hh
+# /work/carlinet/trunk/milena/mln/convert/impl/from_site_set_to_image.hh includes:
+# mln/core/image/sub_image.hh
+# mln/geom/bbox.hh
+# mln/trait/image_from_grid.hh
+# mln/data/fill.hh
+test.o: /work/carlinet/trunk/milena/mln/core/image/sub_image.hh
+# /work/carlinet/trunk/milena/mln/core/image/sub_image.hh includes:
+# mln/core/internal/image_domain_morpher.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/image_domain_morpher.hh
+# /work/carlinet/trunk/milena/mln/core/internal/image_domain_morpher.hh includes:
+# mln/core/internal/image_morpher.hh
+test.o: /work/carlinet/trunk/milena/mln/data/fill.hh
+# /work/carlinet/trunk/milena/mln/data/fill.hh includes:
+# mln/core/concept/function.hh
+# mln/pw/image.hh
+# mln/convert/to_fun.hh
+# mln/data/fill_with_image.hh
+# mln/data/fill_with_value.hh
+test.o: /work/carlinet/trunk/milena/mln/pw/image.hh
+# /work/carlinet/trunk/milena/mln/pw/image.hh includes:
+# mln/core/internal/image_primary.hh
+# mln/core/concept/function.hh
+# mln/value/set.hh
+# mln/metal/unqualif.hh
+# mln/metal/not_equal.hh
+test.o: /work/carlinet/trunk/milena/mln/convert/to_fun.hh
+# /work/carlinet/trunk/milena/mln/convert/to_fun.hh includes:
+# mln/pw/value.hh
+# mln/fun/c.hh
+test.o: /work/carlinet/trunk/milena/mln/pw/value.hh
+# /work/carlinet/trunk/milena/mln/pw/value.hh includes:
+# mln/fun/internal/selector.hh
+# mln/core/concept/image.hh
+test.o: /work/carlinet/trunk/milena/mln/fun/internal/selector.hh
+# /work/carlinet/trunk/milena/mln/fun/internal/selector.hh includes:
+# mln/core/concept/function.hh
+# mln/core/concept/site.hh
+# mln/core/concept/pseudo_site.hh
+# mln/metal/unqualif.hh
+# mln/metal/if.hh
+# mln/metal/is_a.hh
+# mln/algebra/vec.hh
+test.o: /work/carlinet/trunk/milena/mln/fun/c.hh
+# /work/carlinet/trunk/milena/mln/fun/c.hh includes:
+# mln/fun/internal/selector.hh
+# mln/metal/unqualif.hh
+test.o: /work/carlinet/trunk/milena/mln/data/fill_with_image.hh
+# /work/carlinet/trunk/milena/mln/data/fill_with_image.hh includes:
+# mln/core/concept/image.hh
+# mln/data/fill_with_image.spe.hh
+test.o: /work/carlinet/trunk/milena/mln/data/fill_with_image.spe.hh
+# /work/carlinet/trunk/milena/mln/data/fill_with_image.spe.hh includes:
+# mln/data/memcpy_.hh
+# mln/data/fill_with_value.hh
+# mln/core/pixel.hh
+# mln/core/box_runstart_piter.hh
+# mln/border/get.hh
+# mln/opt/value.hh
+# mln/opt/element.hh
+test.o: /work/carlinet/trunk/milena/mln/data/memcpy_.hh
+# /work/carlinet/trunk/milena/mln/data/memcpy_.hh includes:
+# mln/core/concept/image.hh
+# mln/core/pixel.hh
+# mln/metal/is_not_const.hh
+# mln/opt/element.hh
+test.o: /work/carlinet/trunk/milena/mln/core/pixel.hh
+# /work/carlinet/trunk/milena/mln/core/pixel.hh includes:
+# mln/core/concept/generalized_pixel.hh
+# mln/core/internal/pixel_impl.hh
+# mln/make/pixel.hh
+test.o: /work/carlinet/trunk/milena/mln/make/pixel.hh
+# /work/carlinet/trunk/milena/mln/make/pixel.hh includes:
+# mln/core/concept/image.hh
+# mln/core/pixel.hh
+test.o: /work/carlinet/trunk/milena/mln/opt/element.hh
+# /work/carlinet/trunk/milena/mln/opt/element.hh includes:
+# mln/core/concept/image.hh
+# mln/trait/images.hh
+test.o: /work/carlinet/trunk/milena/mln/data/fill_with_value.hh
+# /work/carlinet/trunk/milena/mln/data/fill_with_value.hh includes:
+# mln/core/concept/image.hh
+# mln/data/fill_with_value.spe.hh
+test.o: /work/carlinet/trunk/milena/mln/data/fill_with_value.spe.hh
+# /work/carlinet/trunk/milena/mln/data/fill_with_value.spe.hh includes:
+# mln/data/memset_.hh
+# mln/opt/value.hh
+# mln/opt/element.hh
+test.o: /work/carlinet/trunk/milena/mln/data/memset_.hh
+# /work/carlinet/trunk/milena/mln/data/memset_.hh includes:
+# mln/core/concept/image.hh
+# mln/core/pixel.hh
+# mln/metal/is_not_const.hh
+# mln/opt/element.hh
+test.o: /work/carlinet/trunk/milena/mln/opt/value.hh
+# /work/carlinet/trunk/milena/mln/opt/value.hh includes:
+# mln/core/concept/image.hh
+# mln/trait/images.hh
+test.o: /work/carlinet/trunk/milena/mln/core/box_runstart_piter.hh
+# /work/carlinet/trunk/milena/mln/core/box_runstart_piter.hh includes:
+# mln/core/internal/site_iterator_base.hh
+# mln/core/site_set/box.hh
+test.o: /work/carlinet/trunk/milena/mln/border/get.hh
+# /work/carlinet/trunk/milena/mln/border/get.hh includes:
+# mln/trait/images.hh
+# mln/trace/all.hh
+test.o: /work/carlinet/trunk/milena/mln/convert/impl/from_unsigned_to_value.hh
+# /work/carlinet/trunk/milena/mln/convert/impl/from_unsigned_to_value.hh includes:
+# mln/value/concept/integer.hh
+# mln/core/concept/value.hh
+# mln/value/label.hh
+# mln/math/round.hh
+test.o: /work/carlinet/trunk/milena/mln/value/label.hh
+# /work/carlinet/trunk/milena/mln/value/label.hh includes:
+# mln/debug/format.hh
+# mln/metal/math/pow.hh
+# mln/trait/value_.hh
+# mln/value/concept/symbolic.hh
+# mln/value/internal/value_like.hh
+# mln/value/internal/convert.hh
+# mln/value/internal/encoding.hh
+test.o: /work/carlinet/trunk/milena/mln/convert/impl/from_value_to_value.hh
+# /work/carlinet/trunk/milena/mln/convert/impl/from_value_to_value.hh includes:
+# mln/core/concept/image.hh
+# mln/core/concept/site_set.hh
+# mln/value/concept/all.hh
+# mln/core/site_set/p_run.hh
+# mln/metal/converts_to.hh
+# mln/convert/from_to.hxx
+test.o: /work/carlinet/trunk/milena/mln/make/w_window.hh
+# /work/carlinet/trunk/milena/mln/make/w_window.hh includes:
+# mln/core/concept/window.hh
+# mln/core/concept/function.hh
+# mln/core/w_window.hh
+test.o: /work/carlinet/trunk/milena/mln/core/image/image3d.hh
+# /work/carlinet/trunk/milena/mln/core/image/image3d.hh includes:
+# mln/core/internal/fixme.hh
+# mln/core/internal/image_primary.hh
+# mln/core/alias/box3d.hh
+# mln/border/thickness.hh
+# mln/value/set.hh
+# mln/fun/i2v/all_to.hh
+# mln/core/trait/pixter.hh
+# mln/core/dpoints_pixter.hh
+# mln/core/pixter3d.hh
+# mln/core/w_window.hh
+test.o: /work/carlinet/trunk/milena/mln/core/alias/box3d.hh
+# /work/carlinet/trunk/milena/mln/core/alias/box3d.hh includes:
+# mln/core/site_set/box.hh
+# mln/core/alias/point3d.hh
+# mln/make/box3d.hh
+test.o: /work/carlinet/trunk/milena/mln/make/box3d.hh
+# /work/carlinet/trunk/milena/mln/make/box3d.hh includes:
+# mln/core/alias/box3d.hh
+test.o: /work/carlinet/trunk/milena/mln/core/pixter3d.hh
+# /work/carlinet/trunk/milena/mln/core/pixter3d.hh includes:
+# mln/core/internal/pixel_iterator_base.hh
+# mln/core/alias/point3d.hh
+# mln/geom/size3d.hh
+# mln/opt/at.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/size3d.hh
+# /work/carlinet/trunk/milena/mln/geom/size3d.hh includes:
+# mln/geom/nslis.hh
+# mln/geom/nrows.hh
+# mln/geom/ncols.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/nslis.hh
+# /work/carlinet/trunk/milena/mln/geom/nslis.hh includes:
+# mln/geom/min_sli.hh
+# mln/geom/max_sli.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/min_sli.hh
+# /work/carlinet/trunk/milena/mln/geom/min_sli.hh includes:
+# mln/core/concept/image.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/max_sli.hh
+# /work/carlinet/trunk/milena/mln/geom/max_sli.hh includes:
+# mln/core/concept/image.hh
+test.o: /work/carlinet/trunk/milena/mln/make/image2d.hh
+# /work/carlinet/trunk/milena/mln/make/image2d.hh includes:
+# mln/core/image/image2d.hh
+test.o: /work/carlinet/trunk/milena/mln/core/image/image_if.hh
+# /work/carlinet/trunk/milena/mln/core/image/image_if.hh includes:
+# mln/core/internal/image_domain_morpher.hh
+# mln/core/site_set/p_if.hh
+# mln/pw/all.hh
+# mln/convert/to_fun.hh
+test.o: /work/carlinet/trunk/milena/mln/core/site_set/p_if.hh
+# /work/carlinet/trunk/milena/mln/core/site_set/p_if.hh includes:
+# mln/core/internal/site_set_base.hh
+# mln/core/concept/function.hh
+# mln/core/site_set/p_if_piter.hh
+test.o: /work/carlinet/trunk/milena/mln/core/site_set/p_if_piter.hh
+# /work/carlinet/trunk/milena/mln/core/site_set/p_if_piter.hh includes:
+# mln/core/internal/piter_adaptor.hh
+# mln/core/site_set/p_if.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/piter_adaptor.hh
+# /work/carlinet/trunk/milena/mln/core/internal/piter_adaptor.hh includes:
+# mln/core/internal/site_iterator_base.hh
+test.o: /work/carlinet/trunk/milena/mln/pw/all.hh
+# /work/carlinet/trunk/milena/mln/pw/all.hh includes:
+# mln/pw/cst.hh
+# mln/pw/image.hh
+# mln/pw/value.hh
+# mln/pw/var.hh
+# mln/fun/ops.hh
+test.o: /work/carlinet/trunk/milena/mln/pw/cst.hh
+# /work/carlinet/trunk/milena/mln/pw/cst.hh includes:
+# mln/fun/internal/selector.hh
+test.o: /work/carlinet/trunk/milena/mln/pw/var.hh
+# /work/carlinet/trunk/milena/mln/pw/var.hh includes:
+# mln/core/concept/function.hh
+test.o: /work/carlinet/trunk/milena/mln/fun/ops.hh
+# /work/carlinet/trunk/milena/mln/fun/ops.hh includes:
+# mln/core/concept/function.hh
+# mln/fun/internal/selector.hh
+# mln/trait/all.hh
+test.o: /work/carlinet/trunk/milena/mln/core/alias/neighb2d.hh
+# /work/carlinet/trunk/milena/mln/core/alias/neighb2d.hh includes:
+# mln/core/alias/window2d.hh
+# mln/core/neighb.hh
+# mln/convert/from_to.hh
+test.o: /work/carlinet/trunk/milena/mln/core/alias/window2d.hh
+# /work/carlinet/trunk/milena/mln/core/alias/window2d.hh includes:
+# mln/core/window.hh
+# mln/core/alias/dpoint2d.hh
+# mln/metal/math/sqrt.hh
+# mln/convert/from_to.hxx
+test.o: /work/carlinet/trunk/milena/mln/core/neighb.hh
+# /work/carlinet/trunk/milena/mln/core/neighb.hh includes:
+# mln/core/internal/neighborhood_base.hh
+# mln/core/internal/site_relative_iterator_base.hh
+# mln/core/internal/neighb_niter_impl.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/neighborhood_base.hh
+# /work/carlinet/trunk/milena/mln/core/internal/neighborhood_base.hh includes:
+# mln/core/concept/neighborhood.hh
+# mln/core/concept/window.hh
+test.o: /work/carlinet/trunk/milena/mln/core/concept/neighborhood.hh
+# /work/carlinet/trunk/milena/mln/core/concept/neighborhood.hh includes:
+# mln/core/concept/window.hh
+# mln/trait/windows.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/neighb_niter_impl.hh
+# /work/carlinet/trunk/milena/mln/core/internal/neighb_niter_impl.hh includes:
+# mln/core/macros.hh
+# mln/core/internal/force_exact.hh
+test.o: /work/carlinet/trunk/milena/mln/core/routine/duplicate.hh
+# /work/carlinet/trunk/milena/mln/core/routine/duplicate.hh includes:
+# mln/core/concept/image.hh
+# mln/core/routine/init.hh
+# mln/data/fill.hh
+test.o: /work/carlinet/trunk/milena/mln/core/var.hh
+# /work/carlinet/trunk/milena/mln/core/var.hh includes:
+# mln/core/macros.hh
+test.o: /work/carlinet/trunk/milena/mln/level/sort_psites.hh
+# /work/carlinet/trunk/milena/mln/level/sort_psites.hh includes:
+# mln/core/concept/image.hh
+# mln/convert/to_p_array.hh
+# mln/histo/compute.hh
+# mln/util/ord.hh
+# mln/geom/nsites.hh
+test.o: /work/carlinet/trunk/milena/mln/convert/to_p_array.hh
+# /work/carlinet/trunk/milena/mln/convert/to_p_array.hh includes:
+# mln/core/site_set/p_array.hh
+# mln/core/concept/image.hh
+# mln/core/concept/window.hh
+test.o: /work/carlinet/trunk/milena/mln/histo/compute.hh
+# /work/carlinet/trunk/milena/mln/histo/compute.hh includes:
+# mln/core/concept/image.hh
+# mln/histo/array.hh
+# mln/histo/compute.spe.hh
+test.o: /work/carlinet/trunk/milena/mln/histo/array.hh
+# /work/carlinet/trunk/milena/mln/histo/array.hh includes:
+# mln/value/set.hh
+test.o: /work/carlinet/trunk/milena/mln/histo/compute.spe.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/nsites.hh
+# /work/carlinet/trunk/milena/mln/geom/nsites.hh includes:
+# mln/core/concept/image.hh
+# mln/set/card.hh
+test.o: /work/carlinet/trunk/milena/mln/set/card.hh
+# /work/carlinet/trunk/milena/mln/set/card.hh includes:
+# mln/core/concept/site_set.hh
+test.o: /work/carlinet/trunk/milena/mln/morpho/tree/data.hh
+# /work/carlinet/trunk/milena/mln/morpho/tree/data.hh includes:
+# mln/morpho/tree/compute_parent.hh
+# mln/core/site_set/p_array.hh
+# mln/core/internal/site_set_iterator_base.hh
+# mln/core/internal/piter_identity.hh
+test.o: /work/carlinet/trunk/milena/mln/morpho/tree/compute_parent.hh
+# /work/carlinet/trunk/milena/mln/morpho/tree/compute_parent.hh includes:
+# mln/core/concept/image.hh
+# mln/core/concept/neighborhood.hh
+# mln/data/fill.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/piter_identity.hh
+# /work/carlinet/trunk/milena/mln/core/internal/piter_identity.hh includes:
+# mln/core/internal/piter_adaptor.hh
+test.o: /work/carlinet/trunk/milena/mln/morpho/tree/compute_attribute_image.hh
+# /work/carlinet/trunk/milena/mln/morpho/tree/compute_attribute_image.hh includes:
+# mln/core/concept/image.hh
+# mln/morpho/tree/data.hh
+# mln/trait/accumulators.hh
+# mln/util/pix.hh
+# mln/data/fill.hh
+test.o: propagate.hh
+# propagate.hh includes:
+# mln/morpho/tree/data.hh
+test.o: run.hh
+# run.hh includes:
+# mln/core/concept/accumulator.hh
+# mln/core/concept/image.hh
+# mln/core/concept/function.hh
+# mln/core/site_set/p_array.hh
+# mln/util/pix.hh
+# mln/trace/entering.hh
+# mln/trace/exiting.hh
+# propagate_node.hh
+test.o: propagate_node.hh
+# propagate_node.hh includes:
+# mln/morpho/tree/data.hh
+# mln/core/site_set/p_array.hh
+test.o: accumulator/arg_max.hh
+# accumulator/arg_max.hh includes:
+# mln/core/concept/image.hh
+# mln/accu/internal/base.hh
+# mln/util/pix.hh
+test.o: /work/carlinet/trunk/milena/mln/transform/distance_geodesic.hh
+# /work/carlinet/trunk/milena/mln/transform/distance_geodesic.hh includes:
+# mln/canvas/distance_geodesic.hh
+# mln/transform/internal/distance_functor.hh
+test.o: /work/carlinet/trunk/milena/mln/canvas/distance_geodesic.hh
+# /work/carlinet/trunk/milena/mln/canvas/distance_geodesic.hh includes:
+# mln/core/concept/image.hh
+# mln/core/concept/neighborhood.hh
+# mln/core/routine/duplicate.hh
+# mln/core/site_set/p_queue_fast.hh
+# mln/data/fill.hh
+# mln/extension/adjust_fill.hh
+test.o: /work/carlinet/trunk/milena/mln/core/site_set/p_queue_fast.hh
+# /work/carlinet/trunk/milena/mln/core/site_set/p_queue_fast.hh includes:
+# mln/core/site_set/p_array.hh
+test.o: /work/carlinet/trunk/milena/mln/extension/adjust_fill.hh
+# /work/carlinet/trunk/milena/mln/extension/adjust_fill.hh includes:
+# mln/extension/adjust.hh
+# mln/extension/fill.hh
+test.o: /work/carlinet/trunk/milena/mln/extension/adjust.hh
+# /work/carlinet/trunk/milena/mln/extension/adjust.hh includes:
+# mln/border/adjust.hh
+# mln/core/concept/window.hh
+# mln/core/concept/weighted_window.hh
+# mln/core/concept/neighborhood.hh
+# mln/geom/delta.hh
+test.o: /work/carlinet/trunk/milena/mln/border/adjust.hh
+# /work/carlinet/trunk/milena/mln/border/adjust.hh includes:
+# mln/border/resize.hh
+test.o: /work/carlinet/trunk/milena/mln/border/resize.hh
+# /work/carlinet/trunk/milena/mln/border/resize.hh includes:
+# mln/core/concept/image.hh
+# mln/core/routine/duplicate.hh
+# mln/core/routine/primary.hh
+# mln/border/get.hh
+# mln/data/fill.hh
+test.o: /work/carlinet/trunk/milena/mln/core/routine/primary.hh
+# /work/carlinet/trunk/milena/mln/core/routine/primary.hh includes:
+# mln/core/concept/image.hh
+test.o: /work/carlinet/trunk/milena/mln/geom/delta.hh
+# /work/carlinet/trunk/milena/mln/geom/delta.hh includes:
+# mln/core/concept/window.hh
+# mln/core/concept/weighted_window.hh
+# mln/core/concept/neighborhood.hh
+test.o: /work/carlinet/trunk/milena/mln/extension/fill.hh
+# /work/carlinet/trunk/milena/mln/extension/fill.hh includes:
+# mln/core/concept/image.hh
+# mln/trait/image/props.hh
+# mln/border/fill.hh
+# mln/data/fill_with_value.hh
+test.o: /work/carlinet/trunk/milena/mln/border/fill.hh
+# /work/carlinet/trunk/milena/mln/border/fill.hh includes:
+# mln/core/concept/image.hh
+# mln/core/box_runstart_piter.hh
+# mln/opt/element.hh
+test.o: /work/carlinet/trunk/milena/mln/transform/internal/distance_functor.hh
+# /work/carlinet/trunk/milena/mln/transform/internal/distance_functor.hh includes:
+# mln/core/macros.hh
+test.o: /work/carlinet/trunk/milena/mln/morpho/attribute/card.hh
+# /work/carlinet/trunk/milena/mln/morpho/attribute/card.hh includes:
+# mln/accu/internal/base.hh
+# mln/util/pix.hh
+test.o: ../attributes/bbox.hh
+# ../attributes/bbox.hh includes:
+# mln/core/concept/box.hh
+test.o: /work/carlinet/trunk/milena/mln/io/pbm/load.hh
+# /work/carlinet/trunk/milena/mln/io/pbm/load.hh includes:
+# mln/core/image/image2d.hh
+# mln/core/image/image3d.hh
+# mln/io/pnm/load_header.hh
+# mln/make/image3d.hh
+test.o: /work/carlinet/trunk/milena/mln/io/pnm/load_header.hh
+test.o: /work/carlinet/trunk/milena/mln/make/image3d.hh
+# /work/carlinet/trunk/milena/mln/make/image3d.hh includes:
+# mln/core/image/image3d.hh
+# mln/core/image/image2d.hh
+# mln/core/image/slice_image.hh
+# mln/data/paste.hh
+# mln/util/array.hh
+test.o: /work/carlinet/trunk/milena/mln/core/image/slice_image.hh
+# /work/carlinet/trunk/milena/mln/core/image/slice_image.hh includes:
+# mln/core/internal/image_domain_morpher.hh
+# mln/core/alias/box3d.hh
+# mln/core/alias/box2d.hh
+test.o: /work/carlinet/trunk/milena/mln/data/paste.hh
+# /work/carlinet/trunk/milena/mln/data/paste.hh includes:
+# mln/core/concept/image.hh
+# mln/data/paste.spe.hh
+test.o: /work/carlinet/trunk/milena/mln/data/paste.spe.hh
+# /work/carlinet/trunk/milena/mln/data/paste.spe.hh includes:
+# mln/core/pixel.hh
+# mln/data/fill_with_value.hh
+# mln/data/memcpy_.hh
+# mln/core/box_runstart_piter.hh
+# mln/border/get.hh
+# mln/opt/value.hh
+# mln/opt/element.hh
+test.o: /work/carlinet/trunk/milena/mln/io/pgm/save.hh
+# /work/carlinet/trunk/milena/mln/io/pgm/save.hh includes:
+# mln/io/pnm/save.hh
+# mln/geom/size2d.hh
+# mln/metal/bexpr.hh
+# mln/metal/is_not_a.hh
+# mln/value/concept/vectorial.hh
+test.o: /work/carlinet/trunk/milena/mln/io/pnm/save.hh
+# /work/carlinet/trunk/milena/mln/io/pnm/save.hh includes:
+# mln/core/concept/image.hh
+# mln/core/alias/point2d.hh
+# mln/value/concept/scalar.hh
+# mln/value/rgb.hh
+# mln/value/rgb8.hh
+# mln/value/int_u8.hh
+# mln/metal/templated_by.hh
+# mln/metal/not_equal.hh
+# mln/io/pnm/save_header.hh
+# mln/io/pnm/macros.hh
+# mln/geom/size2d.hh
+test.o: /work/carlinet/trunk/milena/mln/value/rgb.hh
+# /work/carlinet/trunk/milena/mln/value/rgb.hh includes:
+# mln/value/ops.hh
+# mln/value/concept/vectorial.hh
+# mln/value/int_u.hh
+# mln/algebra/vec.hh
+# mln/fun/v2v/rgb_to_hsl.hh
+test.o: /work/carlinet/trunk/milena/mln/fun/v2v/rgb_to_hsl.hh
+# /work/carlinet/trunk/milena/mln/fun/v2v/rgb_to_hsl.hh includes:
+# mln/math/round.hh
+# mln/math/max.hh
+# mln/math/min.hh
+# mln/trait/value_.hh
+# mln/value/rgb.hh
+test.o: /work/carlinet/trunk/milena/mln/math/max.hh
+test.o: /work/carlinet/trunk/milena/mln/math/min.hh
+test.o: /work/carlinet/trunk/milena/mln/value/rgb8.hh
+# /work/carlinet/trunk/milena/mln/value/rgb8.hh includes:
+# mln/value/rgb.hh
+test.o: /work/carlinet/trunk/milena/mln/value/int_u8.hh
+# /work/carlinet/trunk/milena/mln/value/int_u8.hh includes:
+# mln/value/int_u.hh
+test.o: /work/carlinet/trunk/milena/mln/metal/templated_by.hh
+# /work/carlinet/trunk/milena/mln/metal/templated_by.hh includes:
+# mln/metal/bool.hh
+test.o: /work/carlinet/trunk/milena/mln/io/pnm/save_header.hh
+# /work/carlinet/trunk/milena/mln/io/pnm/save_header.hh includes:
+# mln/io/pnm/max_component.hh
+# mln/value/rgb.hh
+# mln/geom/nrows.hh
+# mln/geom/ncols.hh
+test.o: /work/carlinet/trunk/milena/mln/io/pnm/max_component.hh
+# /work/carlinet/trunk/milena/mln/io/pnm/max_component.hh includes:
+# mln/value/rgb.hh
+# mln/value/int_u.hh
+test.o: /work/carlinet/trunk/milena/mln/io/pnm/macros.hh
+test.o: /work/carlinet/trunk/milena/mln/io/ppm/save.hh
+# /work/carlinet/trunk/milena/mln/io/ppm/save.hh includes:
+# mln/core/concept/image.hh
+# mln/metal/templated_by.hh
+# mln/io/pnm/save.hh
+test.o: ./../../theo/color/change_attributes.hh
+test.o: /work/carlinet/trunk/milena/mln/fun/p2v/ternary.hh
+# /work/carlinet/trunk/milena/mln/fun/p2v/ternary.hh includes:
+# mln/fun/internal/selector.hh
+test.o: /work/carlinet/trunk/milena/mln/labeling/blobs.hh
+# /work/carlinet/trunk/milena/mln/labeling/blobs.hh includes:
+# mln/core/concept/image.hh
+# mln/core/concept/neighborhood.hh
+# mln/data/fill.hh
+# mln/core/site_set/p_queue_fast.hh
+test.o: /work/carlinet/trunk/milena/mln/debug/colorize.hh
+# /work/carlinet/trunk/milena/mln/debug/colorize.hh includes:
+# mln/core/concept/image.hh
+# mln/fun/i2v/array.hh
+# mln/value/rgb8.hh
+# mln/literal/black.hh
+# mln/level/transform.hh
+test.o: /work/carlinet/trunk/milena/mln/literal/black.hh
+# /work/carlinet/trunk/milena/mln/literal/black.hh includes:
+# mln/core/concept/literal.hh
+test.o: /work/carlinet/trunk/milena/mln/level/transform.hh
+# /work/carlinet/trunk/milena/mln/level/transform.hh includes:
+# mln/core/concept/image.hh
+# mln/core/concept/function.hh
+# mln/value/set.hh
+# mln/level/transform.spe.hh
+test.o: /work/carlinet/trunk/milena/mln/level/transform.spe.hh
+# /work/carlinet/trunk/milena/mln/level/transform.spe.hh includes:
+# mln/core/concept/image.hh
+# mln/core/concept/function.hh
+# mln/data/fill_with_value.hh
+# mln/value/set.hh
+# mln/value/lut_vec.hh
+# mln/opt/value.hh
+test.o: /work/carlinet/trunk/milena/mln/value/lut_vec.hh
+# /work/carlinet/trunk/milena/mln/value/lut_vec.hh includes:
+# mln/core/concept/value_set.hh
+# mln/core/concept/function.hh
+# mln/trait/value_.hh
+# mln/value/viter.hh
+test.o: /work/carlinet/trunk/milena/mln/draw/box.hh
+# /work/carlinet/trunk/milena/mln/draw/box.hh includes:
+# mln/core/concept/image.hh
+# mln/core/alias/box2d.hh
+# mln/data/paste.hh
+# mln/draw/line.hh
+# mln/pw/image.hh
+# mln/pw/cst.hh
+test.o: /work/carlinet/trunk/milena/mln/draw/line.hh
+# /work/carlinet/trunk/milena/mln/draw/line.hh includes:
+# mln/core/concept/image.hh
+# mln/core/site_set/p_line2d.hh
+# mln/core/image/safe.hh
+# mln/data/paste.hh
+# mln/pw/image.hh
+# mln/pw/cst.hh
+test.o: /work/carlinet/trunk/milena/mln/core/site_set/p_line2d.hh
+# /work/carlinet/trunk/milena/mln/core/site_set/p_line2d.hh includes:
+# mln/core/site_set/p_array.hh
+# mln/core/alias/box2d.hh
+# mln/math/sign.hh
+# mln/math/abs.hh
+# mln/math/min.hh
+# mln/math/max.hh
+test.o: /work/carlinet/trunk/milena/mln/math/sign.hh
+test.o: /work/carlinet/trunk/milena/mln/core/image/safe.hh
+# /work/carlinet/trunk/milena/mln/core/image/safe.hh includes:
+# mln/core/internal/image_identity.hh
+test.o: /work/carlinet/trunk/milena/mln/core/internal/image_identity.hh
+# /work/carlinet/trunk/milena/mln/core/internal/image_identity.hh includes:
+# mln/core/internal/image_morpher.hh
1
0
https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Rename ICDAR-HSC 'input to lines' source.
* icdar/2009/hsc/main.cc: Rename as...
* icdar/2009/hsc/input_to_lines.cc: ...this.
(usage): Fix text.
input_to_lines.cc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: icdar/2009/hsc/input_to_lines.cc
--- icdar/2009/hsc/input_to_lines.cc (revision 3607)
+++ icdar/2009/hsc/input_to_lines.cc (working copy)
@@ -267,7 +267,7 @@
std::cerr << "usage: " << argv[0] << " input.pbm output.pgm" << std::endl
<< " HSC @ ICDAR'2009" << std::endl
<< " input.pbm: input 2D binary image (text is black; background is white)" << std::endl
- << " output.dump: output image where line components are labeled (int_u8)" << std::endl
+ << " output.pgm: output image where line components are labeled (int_u8)" << std::endl
<< " 0 is the background label." << std::endl;
std::abort();
}
1
0
https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Make a common room for ICDAR.
* icdar: New directory.
* icdar/2009: New directory.
* icdar/2009/hsc: New directory.
* theo/icdar/hsc/main.cc (tmp_clo): New debug image.
Copy to...
* icdar/2009/hsc/main.cc: ...this new file.
(output): Update.
* theo/exec/diff_abs.cc: New.
Propagate Edwin's modifications.
* theo/esiee/laurent/presentation/wst_edge.cc: Update.
* theo/color/change_attributes.hh: Update.
* theo/color/segment.hh: Update.
* theo/color/segment_rgb_pixels.cc: Update.
* theo/color/filter_rgb_pixels.cc: New.
* theo/color/filter_blen_rgb_edges.cc: New.
* lazzara/icdar/quasi.cc: New.
* lazzara/icdar/binarization.cc: Augment.
icdar/2009/hsc/main.cc | 25 -
lazzara/icdar/binarization.cc | 664 +++++++++++++++++++++++++---
lazzara/icdar/quasi.cc | 180 +++++++
theo/color/change_attributes.hh | 10
theo/color/filter_blen_rgb_edges.cc | 387 ++++++++++++++++
theo/color/filter_rgb_pixels.cc | 227 +++++++++
theo/color/segment.hh | 78 ++-
theo/color/segment_rgb_pixels.cc | 28 -
theo/esiee/laurent/presentation/wst_edge.cc | 4
theo/exec/diff_abs.cc | 38 +
theo/icdar/hsc/main.cc | 4
11 files changed, 1552 insertions(+), 93 deletions(-)
Index: icdar/2009/hsc/main.cc
--- icdar/2009/hsc/main.cc (revision 0)
+++ icdar/2009/hsc/main.cc (working copy)
@@ -264,8 +264,11 @@
void usage(char* argv[])
{
- std::cerr << "usage: " << argv[0] << " input.pbm output.pgm [output.ppm]" << std::endl
- << " ICDAR'2009: HSC." << std::endl;
+ std::cerr << "usage: " << argv[0] << " input.pbm output.pgm" << std::endl
+ << " HSC @ ICDAR'2009" << std::endl
+ << " input.pbm: input 2D binary image (text is black; background is white)" << std::endl
+ << " output.dump: output image where line components are labeled (int_u8)" << std::endl
+ << " 0 is the background label." << std::endl;
std::abort();
}
@@ -277,7 +280,7 @@
using value::int_u8;
using value::rgb8;
- if (argc != 3 && argc != 4)
+ if (argc != 3)
usage(argv);
@@ -331,6 +334,10 @@
clo = morpho::closing::structural(fuzzy, win::rectangle2d(height, width));
+# ifdef LOG
+ io::pgm::save(clo, "tmp_clo.pgm");
+# endif
+
int_u8 n_basins;
ws = morpho::watershed::flooding(clo, c4(), n_basins);
@@ -358,26 +365,14 @@
{
image2d<int_u8> output(input.domain());
- image2d<rgb8>
- cool = debug::colorize(rgb8(), spc, n_basins),
- lab(input.domain());
-
mln_piter_(box2d) p(input.domain());
for_all(p)
if (input(p))
- {
output(p) = 0;
- lab(p) = literal::black;
- }
else
- {
output(p) = spc.at_(p.row() / subsampling_factor, p.col() / subsampling_factor);
- lab(p) = cool.at_(p.row() / subsampling_factor, p.col() / subsampling_factor);
- }
io::pgm::save(output, argv[2]);
- if (argc == 4)
- io::ppm::save(lab, argv[3]);
}
Property changes on: icdar/2009/hsc/main.cc
___________________________________________________________________
Added: svn:mergeinfo
Index: theo/icdar/hsc/main.cc
--- theo/icdar/hsc/main.cc (revision 3606)
+++ theo/icdar/hsc/main.cc (working copy)
@@ -331,6 +331,10 @@
clo = morpho::closing::structural(fuzzy, win::rectangle2d(height, width));
+# ifdef LOG
+ io::pgm::save(clo, "tmp_clo.pgm");
+# endif
+
int_u8 n_basins;
ws = morpho::watershed::flooding(clo, c4(), n_basins);
Index: theo/exec/diff_abs.cc
--- theo/exec/diff_abs.cc (revision 0)
+++ theo/exec/diff_abs.cc (revision 0)
@@ -0,0 +1,38 @@
+#include "filetype.hh"
+
+#include <mln/fun/vv2v/diff_abs.hh>
+#include <mln/level/transform.hh>
+
+
+
+void usage(char* argv[])
+{
+ std::cerr << "usage: " << argv[0] << " input1.pgm input2.pgm output.pgm" << std::endl
+ << " Point-wise diff abs." << std::endl;
+ std::abort();
+}
+
+
+
+int main(int argc, char* argv[])
+{
+ using namespace mln;
+ using value::int_u8;
+
+ if (argc != 4)
+ usage(argv);
+
+
+ trace::entering("main");
+
+ image2d<int_u8> input1, input2;
+ io::pgm::load(input1, argv[1]);
+ io::pgm::load(input2, argv[2]);
+
+ io::pgm::save(level::transform(input1,
+ input2,
+ fun::vv2v::diff_abs<int_u8>()),
+ argv[3]);
+
+ trace::exiting("main");
+}
Index: theo/esiee/laurent/presentation/wst_edge.cc
--- theo/esiee/laurent/presentation/wst_edge.cc (revision 3606)
+++ theo/esiee/laurent/presentation/wst_edge.cc (working copy)
@@ -33,7 +33,7 @@
# include <mln/extension/fill.hh>
# include <mln/morpho/meyer_wst.hh>
-# include <mln/morpho/closing_volume.hh>
+# include <mln/morpho/closing/volume.hh>
# include <mln/opt/at.hh>
@@ -318,7 +318,7 @@
}
- data::paste( morpho::closing_volume(edge, e2e, lambda), edge );
+ data::paste( morpho::closing::volume(edge, e2e, lambda), edge );
image2d<unsigned> label(ima.bbox(), 0);
Index: theo/color/segment.hh
--- theo/color/segment.hh (revision 3606)
+++ theo/color/segment.hh (working copy)
@@ -16,7 +16,7 @@
#include <mln/pw/all.hh>
#include <mln/morpho/tree/data.hh>
-#include <mln/morpho/closing_attribute.hh>
+#include <mln/morpho/closing/leveling.hh>
#include "change_attributes.hh"
@@ -120,7 +120,7 @@
// Propagate attribute from a site to its parent.
{
- mln_fwd_piter(T) p(t.domain());
+ mln_up_site_piter(T) p(t); // WAS: mln_fwd_piter(T) p(t.domain());
for_all(p)
if (! t.is_root(p))
acc(t.parent(p)).take(acc(p));
@@ -131,12 +131,11 @@
// Change accumulator into its result.
{
initialize(attr, acc);
- typedef typename T::nodes_t N;
- mln_piter(N) p(t.nodes());
- for_all(p)
+ mln_node_piter(T) n(t);
+ for_all(n)
{
- mln_invariant(t.is_a_node(p));
- attr(p) = acc(p).to_result();
+ mln_invariant(t.is_a_node(n));
+ attr(n) = acc(n).to_result();
}
}
@@ -213,14 +212,22 @@
data::fill(nchildren, 0);
{
- mln_fwd_piter(T) p(t.domain());
- // Propagate attribute from a site to its parent.
- for_all(p)
- if (t.is_a_non_root_node(p))
- {
- mln_invariant(t.is_a_node(t.parent(p)));
- ++nchildren(t.parent(p)); // so parent(p) is a node
- }
+ mln_up_node_piter(T) n(t);
+ for_all(n)
+ if (! t.is_root(n))
+ {
+ mln_invariant(t.is_a_node(t.parent(n)));
+ ++nchildren(t.parent(n)); // so parent(n) is a node
+ }
+
+ // WAS:
+// mln_fwd_piter(T) p(t.domain());
+// for_all(p)
+// if (t.is_a_non_root_node(p))
+// {
+// mln_invariant(t.is_a_node(t.parent(p)));
+// ++nchildren(t.parent(p)); // so parent(p) is a node
+// }
}
return nchildren;
@@ -325,7 +332,10 @@
mln_concrete(I) g;
{
initialize(g, t.f());
- mln_bkd_piter(T) p(t.domain());
+
+// mln_bkd_piter(T) p(t.domain());
+
+ mln_dn_site_piter(T) p(t);
for_all(p)
if (t.is_a_node(p) && a(p) >= lambda)
g(p) = t.f(p);
@@ -357,7 +367,7 @@
unsigned n_objects, unsigned less,
bool echo = false)
{
- mln_concrete(I) g_ref = morpho::closing_attribute<A>(f, nbh, lambda);
+ mln_concrete(I) g_ref = morpho::closing::leveling(f, nbh, A(), lambda);
unsigned n_regmins_g_ref;
mln_ch_value(I, unsigned) regmin_g_ref = labeling::regional_minima(g_ref, nbh, n_regmins_g_ref);
@@ -402,6 +412,40 @@
+
+
+
+ template <typename A, typename T, typename N>
+ inline
+ mln_concrete(typename T::function)
+ do_filter(A& a, const T& t, const N& nbh,
+ const mln_value(A)& lambda)
+ {
+ typedef typename T::function I;
+
+ const typename T::parent_t& par = t.parent_image();
+
+ // No need for attributes back propagation since we process the
+ // tree downwards: nodes are set *before* their children nodes and
+ // their related (non-nodes) sites.
+
+ mln_concrete(I) g;
+ initialize(g, t.f());
+
+ mln_dn_site_piter(T) p(t);
+ for_all(p)
+ if (t.is_a_node(p) && a(p) >= lambda)
+ g(p) = t.f(p);
+ else
+ g(p) = g(par(p));
+
+ return g;
+ }
+
+
+
+
+
// Filter facade.
template <typename F, typename N, typename A>
Index: theo/color/segment_rgb_pixels.cc
--- theo/color/segment_rgb_pixels.cc (revision 3606)
+++ theo/color/segment_rgb_pixels.cc (working copy)
@@ -14,7 +14,8 @@
#include <mln/io/pbm/save.hh>
#include <mln/level/convert.hh>
-#include <mln/morpho/meyer_wst.hh>
+#include <mln/morpho/watershed/flooding.hh>
+#include <mln/morpho/attribute/card.hh>
#include "mean_rgb_pix.hh"
#include "segment.hh"
@@ -75,8 +76,7 @@
mln_ch_value(A, value::int_u8) d;
initialize(d, a);
- typedef typename T::nodes_t N;
- mln_fwd_piter(N) n(t.nodes());
+ mln_up_node_piter(T) n(t);
for_all(n)
d(n) = dist(a(n), a(t.parent(n)));
@@ -98,6 +98,7 @@
{
std::cerr << "usage: " << argv[0] << " input.ppm n echo output.ppm" << std::endl;
std::cerr << "color version on pixels (without edges)" << std::endl;
+ std::cerr << "attribute is 'card'" << std::endl;
std::cerr << " n >= 2" << std::endl;
std::cerr << " echo = 0 (mute) or 1 (verbose)" << std::endl;
abort();
@@ -147,11 +148,22 @@
typedef morpho::tree::data<F,S> tree_t;
tree_t t(f, s, c4());
+
+ morpho::attribute::card<F> a_;
+ mln_VAR(a, compute_attribute_on_nodes(a_, t));
+
+ unsigned lambda;
+ unsigned less;
+ image2d<int_u8> g = run_filter(a, t, c4(), n_objects, // input
+ less, lambda, // output
+ echo);
+
+ /*
+
accu::rgb_image_ = input;
accu::mean_rgb_pix< util::pix<F> > a_;
mln_VAR(a, compute_attribute_on_nodes(a_, t));
-
mln_VAR(d, dists_from_means(t, a, echo));
make_attribute_grow(t, d);
if (echo)
@@ -160,19 +172,21 @@
display_tree_attributes(t, d);
}
-
// BAD: extinct_attributes(t, d, echo);
-
int_u8 lambda;
unsigned less;
image2d<int_u8> g = run_filter(d, t, c4(), n_objects, // input
less, lambda, // output
echo);
+ */
+
+
io::pbm::save( (pw::value(g) != pw::value(f)) | f.domain(),
"temp_activity.pbm" );
+
// if (echo)
// debug::println("activity (g != f) = ", (pw::value(g) != pw::value(f)) | f.domain());
@@ -181,7 +195,7 @@
typedef value::label_16 L;
L nbasins;
- mln_ch_value_(I, L) w = morpho::meyer_wst(g, c4(), nbasins);
+ mln_ch_value_(I, L) w = morpho::watershed::flooding(g, c4(), nbasins);
std::cout << "n basins = " << nbasins << std::endl;
image2d<rgb8> output = duplicate(input);
Index: theo/color/filter_rgb_pixels.cc
--- theo/color/filter_rgb_pixels.cc (revision 0)
+++ theo/color/filter_rgb_pixels.cc (revision 0)
@@ -0,0 +1,227 @@
+
+#include <mln/core/image/image2d.hh>
+#include <mln/core/image/image_if.hh>
+#include <mln/core/alias/neighb2d.hh>
+
+#include <mln/value/int_u8.hh>
+#include <mln/value/label_16.hh>
+#include <mln/value/rgb8.hh>
+#include <mln/literal/colors.hh>
+
+#include <mln/io/ppm/load.hh>
+#include <mln/io/ppm/save.hh>
+#include <mln/io/pgm/save.hh>
+#include <mln/io/pbm/save.hh>
+#include <mln/level/convert.hh>
+
+#include <mln/morpho/watershed/flooding.hh>
+
+#include "mean_rgb_pix.hh"
+#include "segment.hh"
+
+
+
+namespace mln
+{
+
+
+ // Distance, stored on pixels, of neighboring colors.
+
+ template <typename N>
+ image2d<value::int_u8>
+ dist_on_pixels(const image2d<value::rgb8>& input, const N& nbh)
+ {
+ using value::int_u8;
+ image2d<int_u8> output(input.domain());
+
+ mln_piter(box2d) p(input.domain());
+ mln_niter(N) n(nbh, p);
+ for_all(p)
+ {
+ int_u8 d = 0u;
+ for_all(n) if (input.domain().has(n))
+ {
+ int_u8 d_ = dist(input(p), input(n));
+ if (d_ > d)
+ d = d_;
+ }
+ output(p) = d;
+ }
+
+ io::pgm::save(output, "temp_dist.pgm");
+
+ return output;
+ }
+
+
+
+ // Distance between 2 rgb8 colors.
+ // -----------------------------------------------------------
+
+
+ value::int_u8 dist_mean(const value::rgb8& c1, const value::rgb8& c2)
+ {
+ unsigned d = 0;
+ d += (math::diff_abs(c1.red(), c2.red()) + 2) / 3;
+ d += (math::diff_abs(c1.green(), c2.green()) + 2) / 3;
+ d += (math::diff_abs(c1.blue(), c2.blue()) + 2) / 3;
+ if (d > 255)
+ d = 255;
+ return d;
+ }
+
+ value::int_u8 dist_sat(const value::rgb8& c1, const value::rgb8& c2)
+ {
+ unsigned d = 0;
+ d += math::diff_abs(c1.red(), c2.red());
+ d += math::diff_abs(c1.green(), c2.green());
+ d += math::diff_abs(c1.blue(), c2.blue());
+ if (d > 255)
+ d = 255;
+ return d;
+ }
+
+ value::int_u8 dist_max(const value::rgb8& c1, const value::rgb8& c2)
+ {
+ unsigned d = 0, d_;
+ d_ = math::diff_abs(c1.red(), c2.red());
+ if (d_ > d) d = d_;
+ d_ = math::diff_abs(c1.green(), c2.green());
+ if (d_ > d) d = d_;
+ d_ = math::diff_abs(c1.blue(), c2.blue());
+ if (d_ > d) d = d_;
+ return d;
+ }
+
+
+
+ // From 'mean color' attributes to 'mean difference p/par(p)'.
+ // -----------------------------------------------------------
+
+
+ template <typename T, typename A>
+ inline
+ mln_ch_value(A, value::int_u8)
+ dists_from_means(const T& t, const A& a, bool echo = false)
+ {
+ if (echo)
+ {
+ std::cout << "means:" << std::endl;
+ display_tree_attributes(t, a);
+ }
+
+ mln_ch_value(A, value::int_u8) d;
+ initialize(d, a);
+
+ mln_up_node_piter(T) n(t);
+ for_all(n)
+ d(n) = dist_max(a(n), a(t.parent(n)));
+
+ if (echo)
+ {
+ std::cout << "dists:" << std::endl;
+ display_tree_attributes(t, d);
+ }
+
+ return d;
+ }
+
+
+
+
+
+} // mln
+
+
+
+void usage(char* argv[])
+{
+ std::cerr << "usage: " << argv[0] << " input.ppm lambda echo output.ppm" << std::endl;
+ std::cerr << "color version on pixels (without edges)" << std::endl;
+ std::cerr << "attribute is 'distance of color means'" << std::endl;
+ std::cerr << " lambda >= 0 and <= 255" << std::endl;
+ std::cerr << " echo = 0 (mute) or 1 (verbose)" << std::endl;
+ abort();
+}
+
+
+
+int main(int argc, char* argv[])
+{
+ using namespace mln;
+
+ using value::int_u8;
+ using value::rgb8;
+
+
+ if (argc != 5)
+ usage(argv);
+
+
+ // Color debase (on pixels, not edges) version.
+ // --------------------------------------------
+
+
+ typedef image2d<rgb8> I;
+
+ I input;
+ io::ppm::load(input, argv[1]);
+
+ int lambda = atoi(argv[2]);
+ if (lambda < 0 || lambda > 255)
+ usage(argv);
+
+ bool echo = atoi(argv[3]);
+
+
+ // Neighborhood.
+ mln_VAR(nbh, c4());
+
+
+ // Changing input into 'f'.
+
+ typedef image2d<int_u8> F;
+ F f = dist_on_pixels(input, c4());
+
+
+ typedef p_array<mln_psite_(F)> S;
+ S s = level::sort_psites_decreasing(f);
+
+ typedef morpho::tree::data<F,S> tree_t;
+ tree_t t(f, s, c4());
+
+
+ accu::rgb_image_ = input;
+ accu::mean_rgb_pix< util::pix<F> > a_;
+ mln_VAR(a, compute_attribute_on_nodes(a_, t));
+
+ mln_VAR(d, dists_from_means(t, a, echo));
+ make_attribute_grow(t, d);
+ if (echo)
+ {
+ std::cout << "dists growing:" << std::endl;
+ display_tree_attributes(t, d);
+ }
+
+ image2d<int_u8> g = do_filter(d, t, c4(), lambda);
+
+
+ io::pbm::save( (pw::value(g) != pw::value(f)) | f.domain(),
+ "temp_activity.pbm" );
+
+
+// debug::println("activity (g != f) = ", (pw::value(g) != pw::value(f)) | f.domain());
+
+
+ // Watershed transform.
+
+ typedef value::label_16 L;
+ L nbasins;
+ mln_ch_value_(I, L) w = morpho::watershed::flooding(g, c4(), nbasins);
+ std::cout << "n basins = " << nbasins << std::endl;
+
+ image2d<rgb8> output = duplicate(input);
+ data::fill((output | (pw::value(w) == 0)).rw(), literal::black);
+
+ io::ppm::save(output, argv[4]);
+}
Index: theo/color/change_attributes.hh
--- theo/color/change_attributes.hh (revision 3606)
+++ theo/color/change_attributes.hh (working copy)
@@ -16,8 +16,11 @@
initialize(deja_vu, a);
data::fill(deja_vu, false);
- typedef typename T::nodes_t nodes_t;
- mln_fwd_piter(nodes_t) p(t.nodes());
+ // WAS:
+ // typedef typename T::nodes_t nodes_t;
+ // mln_fwd_piter(nodes_t) p(t.nodes());
+
+ mln_up_node_piter(T) p(t);
for_all(p)
{
if (deja_vu(p))
@@ -91,7 +94,8 @@
void
back_propagate(const T& t, A& a)
{
- mln_fwd_piter(T) p(t.domain());
+ // WAS: mln_fwd_piter(T) p(t.domain());
+ mln_site_piter(T) p(t);
for_all(p)
if (! t.is_a_node(p))
{
Index: theo/color/filter_blen_rgb_edges.cc
--- theo/color/filter_blen_rgb_edges.cc (revision 0)
+++ theo/color/filter_blen_rgb_edges.cc (revision 0)
@@ -0,0 +1,387 @@
+
+#include <mln/core/image/image2d.hh>
+#include <mln/core/alias/box3d.hh>
+
+#include <mln/core/alias/neighb2d.hh>
+#include <mln/make/double_neighb2d.hh>
+
+#include <mln/value/label_8.hh>
+#include <mln/value/label_16.hh>
+
+#include <mln/core/image/image_if.hh>
+#include <mln/core/routine/extend.hh>
+#include <mln/core/routine/duplicate.hh>
+#include <mln/data/paste.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/debug/colorize.hh>
+
+#include <mln/morpho/dilation.hh>
+#include <mln/morpho/erosion.hh>
+#include <mln/morpho/watershed/flooding.hh>
+#include <mln/labeling/compute.hh>
+
+#include <mln/accu/count.hh>
+#include <mln/accu/volume.hh>
+#include <mln/accu/mean.hh>
+
+#include "sum_pix.hh"
+#include "segment.hh"
+
+
+
+namespace mln
+{
+
+ point3d color2point(const value::rgb8& c)
+ {
+ point3d p(c.red(), c.green(), c.blue());
+ return p;
+ }
+
+
+ image2d<value::rgb8> blen_image;
+
+
+ template <typename B>
+ void accu_blen_take(B& b, const point2d& e)
+ {
+ if (e.row() % 2)
+ {
+ b.take(color2point(blen_image(e + up)));
+ b.take(color2point(blen_image(e + down)));
+ }
+ else
+ {
+ b.take(color2point(blen_image(e + left)));
+ b.take(color2point(blen_image(e + right)));
+ }
+ }
+
+}
+
+#include "blen_pix.hh"
+
+
+
+
+namespace mln
+{
+
+ // Functions.
+
+ inline
+ bool is_row_odd(const point2d& p)
+ {
+ return p.row() % 2;
+ }
+
+ inline
+ bool is_square(const point2d& p)
+ {
+ return p.row() % 2 == 0 && p.col() % 2 == 0;
+ }
+
+ inline
+ bool is_edge(const point2d& p)
+ {
+ return p.row() % 2 + p.col() % 2 == 1;
+ }
+
+ inline
+ bool is_point(const point2d& p)
+ {
+ return p.row() % 2 && p.col() % 2;
+ }
+
+
+ // Neighborhoods.
+
+ typedef neighb< win::multiple<window2d, bool(*)(const point2d&)> > dbl_neighb2d;
+
+ const dbl_neighb2d& e2c()
+ {
+ static bool e2c_h[] = { 0, 1, 0,
+ 0, 0, 0,
+ 0, 1, 0 };
+ static bool e2c_v[] = { 0, 0, 0,
+ 1, 0, 1,
+ 0, 0, 0 };
+ static dbl_neighb2d nbh = make::double_neighb2d(is_row_odd, e2c_h, e2c_v);
+ return nbh;
+ }
+
+ const dbl_neighb2d& e2e()
+ {
+ static bool e2e_h[] = { 0, 0, 1, 0, 0,
+ 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0,
+ 0, 1, 0, 1, 0,
+ 0, 0, 1, 0, 0 };
+ static bool e2e_v[] = { 0, 0, 0, 0, 0,
+ 0, 1, 0, 1, 0,
+ 1, 0, 0, 0, 1,
+ 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0 };
+ static dbl_neighb2d nbh = make::double_neighb2d(is_row_odd, e2e_h, e2e_v);
+ return nbh;
+ }
+
+
+ // Transforms.
+
+ template <typename T>
+ image2d<T>
+ image2full(const image2d<T>& input)
+ {
+ image2d<T> output(2 * input.nrows() - 1,
+ 2 * input.ncols() - 1);
+ for (int row = 0; row < input.nrows(); ++row)
+ for (int col = 0; col < input.ncols(); ++col)
+ opt::at(output, 2 * row, 2 * col) = opt::at(input, row, col);
+ return output;
+ }
+
+ template <typename T>
+ image2d<T>
+ full2image(const image2d<T>& input)
+ {
+ image2d<T> output((input.nrows() + 1) / 2,
+ (input.ncols() + 1) / 2);
+ for (int row = 0; row < input.nrows(); row += 2)
+ for (int col = 0; col < input.ncols(); col += 2)
+ opt::at(output, row / 2, col / 2) =
+ opt::at(input, row, col);
+ return output;
+ }
+
+
+ // Display.
+
+ template <typename I>
+ I display_edge(const I& ima, mln_value(I) bg, unsigned zoom)
+ {
+ unsigned nrows = ima.nrows() / 2 + 1;
+ unsigned ncols = ima.ncols() / 2 + 1;
+ I output(nrows * (zoom + 1) - 1,
+ ncols * (zoom + 1) - 1);
+ data::fill(output, bg);
+ mln_VAR( edge, ima | is_edge );
+ mln_piter(edge_t) p(edge.domain());
+ for_all(p)
+ if (p.row() % 2) // horizontal edge
+ {
+ unsigned row = (p.row() / 2 + 1) * (zoom + 1) - 1;
+ unsigned col = (p.col() / 2) * (zoom + 1);
+ for (unsigned i = 0; i < zoom; ++i)
+ opt::at(output, row, col + i) = ima(p);
+ }
+ else // vertical edge
+ {
+ unsigned row = (p.row() / 2) * (zoom + 1);
+ unsigned col = (p.col() / 2 + 1) * (zoom + 1) - 1;
+ for (unsigned i = 0; i < zoom; ++i)
+ opt::at(output, row + i, col) = ima(p);
+ }
+ return output;
+ }
+
+
+
+ // Distance, stored on edges, of a couple of colors.
+
+ template <typename I, typename N>
+ image2d<value::int_u8>
+ dist_on_edges(const I& input, const N& nbh)
+ {
+ image2d<value::int_u8> output;
+ initialize(output, input);
+ data::fill(output, 0);
+
+ mln_piter(I) p(input.domain());
+ mln_niter(N) n(nbh, p);
+ for_all(p)
+ {
+ n.start();
+ value::rgb8 c1 = input(n);
+ n.next();
+ value::rgb8 c2 = input(n);
+ output(p) = dist(c1, c2);
+ }
+
+ io::pgm::save(output, "temp_dist.pgm");
+
+ return output;
+ }
+
+
+ value::int_u8 L_to_int_u8(unsigned l)
+ {
+ return l == 0 ?
+ 0 : // wshed line
+ 1 + (l - 1) % 255; // basin
+ }
+
+
+} // mln
+
+
+
+void usage(char* argv[])
+{
+ std::cerr << "usage: " << argv[0] << " input.ppm lambda echo output.ppm" << std::endl;
+ std::cerr << " lambda >= 0" << std::endl;
+ std::cerr << " echo = 0 (mute) or 1 (verbose)" << std::endl;
+ abort();
+}
+
+
+
+int main(int argc, char* argv[])
+{
+ using namespace mln;
+ using value::int_u8;
+ using value::rgb8;
+
+ if (argc != 5)
+ usage(argv);
+
+
+ // Color version.
+ // --------------
+
+
+ image2d<rgb8> input;
+ io::ppm::load(input, argv[1]);
+
+
+ int lambda = atoi(argv[2]);
+ if (lambda < 0)
+ usage(argv);
+
+ bool echo = atoi(argv[3]);
+
+
+ // Changing input into 'f on edges'.
+
+ image2d<int_u8> f_;
+ image2d<rgb8> input_ = image2full(input);
+ {
+ f_ = dist_on_edges(extend(input_ | is_edge, pw::value(input_)),
+ e2c());
+ }
+ mln_VAR(f, f_ | is_edge);
+ typedef f_t I;
+
+
+ typedef p_array<mln_psite_(I)> S;
+ S s = level::sort_psites_decreasing(f);
+
+ typedef morpho::tree::data<I,S> tree_t;
+ tree_t t(f, s, e2e());
+
+
+ blen_image = input_;
+ accu::blen_pix<I> a_;
+ mln_VAR(a, compute_attribute_on_nodes(a_, t));
+
+
+ f_t g = do_filter(a, t, e2e(), lambda);
+
+
+ if (echo)
+ debug::println("activity (g != f) = ", (pw::value(g) != pw::value(f)) | f.domain());
+
+ // Watershed transform.
+
+ typedef value::label_16 L;
+ L nbasins;
+ mln_ch_value_(f_t, L) w = morpho::watershed::flooding(g, e2e(), nbasins);
+
+ std::cout << "n basins = " << nbasins << std::endl;
+
+ io::pgm::save(display_edge(w.unmorph_(), 0, 3), "temp_w.pgm");
+
+ if (echo)
+ {
+ image2d<int_u8> g_(f_.domain());
+
+ data::fill(g_, 0);
+ data::paste(g | (pw::value(w) != 0), g_);
+ debug::println("g | basins = ", g_ | is_edge);
+
+ data::fill(g_, 0);
+ data::paste(g | (pw::value(w) == 0), g_);
+ debug::println("g | w line = ", g_ | is_edge);
+ }
+
+ image2d<L> w_all = w.unmorph_();
+
+ // edges -> squares
+ mln_VAR(w_squares, w_all | is_square);
+ data::paste(morpho::dilation(extend(w_squares, pw::value(w_all)),
+ c4().win()),
+ w_all);
+ // edges -> points
+ mln_VAR(w_points, w_all | is_point);
+ data::paste(morpho::erosion(extend(w_points, pw::value(w_all)),
+ c4().win()),
+ w_all);
+
+
+ io::ppm::save(debug::colorize(rgb8(),
+ w_all,
+ nbasins),
+ "temp_w_all.ppm");
+
+
+ // Outputing.
+ // ----------
+
+ image2d<L> out_w = full2image(w_all);
+
+// io::ppm::save(debug::colorize(rgb8(),
+// out_w,
+// nbasins),
+// argv[4]);
+
+
+ typedef algebra::vec<3,float> vec3f;
+
+ util::array<vec3f> m_3f = labeling::compute(accu::mean<rgb8>(),
+ input,
+ full2image(w_all),
+ nbasins);
+ m_3f[0] = vec3f::zero;
+
+ util::array<rgb8> m(m_3f.nelements());
+ // convert::from_to(m_3f, m); // FIXME: Do not work!
+ for (unsigned i = 0; i < m_3f.nelements(); ++i)
+ m[i] = rgb8(m_3f[i][0], m_3f[i][1], m_3f[i][2]);
+
+
+ io::ppm::save( level::transform(out_w,
+ convert::to< fun::i2v::array<rgb8> >(m) ),
+ argv[4] );
+
+
+// io::ppm::save( level::transform(w_all,
+// convert::to< fun::i2v::array<rgb8> >(m) ),
+// argv[4] );
+
+
+// debug::println("input_", input_);
+// debug::println("w_squares", w_squares);
+
+// FIXME: The code below does not work!
+
+// util::array<vec3f> m_3f = labeling::compute(accu::mean<rgb8>(),
+// input_,
+// w_squares,
+// nbasins);
+
+}
Index: lazzara/icdar/quasi.cc
--- lazzara/icdar/quasi.cc (revision 0)
+++ lazzara/icdar/quasi.cc (revision 0)
@@ -0,0 +1,180 @@
+#include <mln/core/image/image2d.hh>
+#include <mln/core/alias/neighb2d.hh>
+
+#include <mln/pw/all.hh>
+#include <mln/core/image/image_if.hh>
+
+#include <mln/core/site_set/p_queue.hh>
+#include <mln/core/site_set/p_array.hh>
+
+#include <mln/data/fill.hh>
+
+#include <mln/io/pgm/load.hh>
+#include <mln/io/pgm/save.hh>
+#include <mln/value/int_u8.hh>
+#include <mln/io/pbm/save.hh>
+
+#include <mln/debug/colorize.hh>
+#include <mln/fun/i2v/array.hh>
+
+#include <mln/labeling/regional_minima.hh>
+#include <mln/labeling/wrap.hh>
+
+#include <mln/level/transform.hh>
+#include <mln/level/convert.hh>
+
+#include <mln/math/diff_abs.hh>
+
+
+
+
+
+namespace mln
+{
+
+ float
+ sim(unsigned v1, unsigned v2)
+ {
+ if (v1 == 0 && v2 == 0)
+ return 1.f;
+ return v1 < v2 ? float(v1) / float(v2) : float(v2) / float(v1); // min / max
+ }
+
+
+ template <typename I, typename N, typename L>
+ mln_ch_value(I, bool)
+ labeling__quasi_regional_minima(const Image<I>& input_, const Neighborhood<N>& nbh_,
+ unsigned threshold,
+ L& cur_lab)
+ {
+ trace::entering("labeling__quasi_regional_minima");
+
+ const I& input = exact(input_);
+ const N& nbh = exact(nbh_);
+ mln_precondition(input.is_valid());
+
+ typedef mln_psite(I) P;
+ p_array<P> s = level::sort_psites_increasing(input);
+
+ std::vector<bool> valid;
+ valid.push_back(false); // For valid[0] where 0 is the non-label value.
+
+ mln_ch_value(I, L) lab;
+ initialize(lab, input);
+ data::fill(lab, 0);
+
+ cur_lab = 0;
+ unsigned
+ n_stop_unknown,
+ n_stop_object,
+ n_stop_background;
+
+ p_queue<P> q;
+ P p_;
+ mln_niter(N) n(nbh, p_);
+
+ mln_piter(p_array<P>) p(s);
+ for_all(p)
+ {
+ if (lab(p) != 0)
+ continue;
+
+ mln_invariant(q.is_empty());
+
+ // Initialization.
+ ++cur_lab;
+ n_stop_unknown = 0;
+ n_stop_object = 0;
+ n_stop_background = 0;
+
+ mln_value(I) input_p = input(p);
+ lab(p) = cur_lab;
+ q.push(p);
+
+ while (! q.is_empty())
+ {
+ p_ = q.pop_front();
+ mln_invariant(lab(p_) != 0); // Already seen.
+ for_all(n) if (input.domain().has(n))
+ {
+ if (lab(n) == cur_lab)
+ continue;
+ if (lab(n) == 0)
+ {
+// if (sim(input(n), input(p_)) > 0.7
+// &&
+// sim(input(n), input_p) > 0.8)
+ if (math::diff_abs(input(n), input(p_)) < threshold
+ &&
+ math::diff_abs(input(n), input_p) < 2 * threshold)
+ {
+ lab(n) = cur_lab;
+ q.push(n);
+ }
+ else
+ ++n_stop_unknown; // Stop because of threshold.
+ continue;
+ }
+ mln_invariant(lab(n) != 0 && lab(n) != cur_lab); // Another component.
+
+ if (valid[lab(n)])
+ ++n_stop_object;
+ else
+ ++n_stop_background;
+ }
+ }
+
+ if (n_stop_object + n_stop_background <= n_stop_unknown / 4)
+ {
+ valid.push_back(true);
+ continue;
+ }
+ valid.push_back(false);
+ }
+
+ fun::i2v::array<bool> f_valid;
+ convert::from_to(valid, f_valid);
+
+ mln_ch_value(I, bool) out = level::transform(lab, f_valid);
+
+ io::pgm::save(labeling::wrap(value::int_u8(), lab),
+ "tmp_lab.pgm");
+
+ trace::exiting("labeling__quasi_regional_minima");
+ return out;
+ }
+
+
+} // end of namespace mln
+
+
+
+int main(int argc, char *argv[])
+{
+ using namespace mln;
+ using namespace value;
+
+ // trace::quiet = false;
+
+ if (argc != 4)
+ {
+ std::cout << argv[0] << " input.pgm threshold output.pbm" << std::endl;
+ return 1;
+ }
+
+ int threshold = std::atoi(argv[2]);
+
+
+ image2d<int_u8> input;
+ io::pgm::load(input, argv[1]);
+
+ unsigned n_regions;
+ image2d<bool> output = labeling__quasi_regional_minima(input,
+ c4(),
+ threshold,
+ n_regions);
+
+ std::cout << n_regions << std::endl;
+
+ io::pbm::save(output, argv[3]);
+}
Index: lazzara/icdar/binarization.cc
--- lazzara/icdar/binarization.cc (revision 3606)
+++ lazzara/icdar/binarization.cc (working copy)
@@ -1,34 +1,67 @@
+#include <mln/core/var.hh>
+
+#include <mln/core/image/image1d.hh>
+#include <mln/core/alias/neighb1d.hh>
+
#include <mln/core/image/image2d.hh>
-#include <mln/core/site_set/box.hh>
-#include <mln/data/fill.hh>
-#include <mln/core/alias/dpoint2d.hh>
-#include <mln/core/macros.hh>
-#include <mln/core/concept/function.hh>
#include <mln/core/alias/neighb2d.hh>
+#include <mln/make/double_neighb2d.hh>
+
+#include <mln/pw/all.hh>
+#include <mln/core/image/image_if.hh>
+#include <mln/core/site_set/p_queue.hh>
+
+#include <mln/core/routine/extend.hh>
+#include <mln/core/routine/duplicate.hh>
+#include <mln/data/fill.hh>
+
#include <mln/core/site_set/p_edges.hh>
#include <mln/core/site_set/p_vertices.hh>
+#include <mln/core/image/graph_elt_neighborhood.hh>
+
#include <mln/io/essential.hh>
#include <mln/value/int_u8.hh>
#include <mln/value/int_u16.hh>
+#include <mln/value/label_8.hh>
#include <mln/value/label_16.hh>
#include <mln/value/rgb8.hh>
+#include <mln/literal/colors.hh>
+
+#include <mln/histo/compute.hh>
+
+#include <mln/morpho/erosion.hh>
+#include <mln/morpho/dilation.hh>
#include <mln/morpho/elementary/gradient_internal.hh>
#include <mln/morpho/closing/volume.hh>
+#include <mln/morpho/closing/height.hh>
#include <mln/morpho/watershed/flooding.hh>
+
#include <mln/make/rag_and_labeled_wsl.hh>
#include <mln/util/graph.hh>
#include <mln/util/couple.hh>
#include <mln/debug/colorize.hh>
#include <mln/fun/i2v/array.hh>
+
#include <mln/labeling/compute.hh>
+#include <mln/labeling/regional_minima.hh>
+#include <mln/labeling/wrap.hh>
+
+#include <mln/level/transform.hh>
+#include <mln/level/convert.hh>
+
+#include <mln/linear/gaussian_1d.hh>
+
#include <mln/accu/center.hh>
#include <mln/accu/median_h.hh>
#include <mln/accu/mean.hh>
-#include <mln/pw/cst.hh>
+
#include <mln/math/abs.hh>
-#include <mln/literal/colors.hh>
#include <mln/debug/draw_graph.hh>
+
+
+
+
namespace mln
{
@@ -202,6 +235,339 @@
} // end of namespace mln::make
+ int
+ find_threshold(const histo::array<value::int_u8>& h)
+ {
+
+ const float sigma = 5; // FIXME: hard-coded!
+
+ util::array<point1d> c;
+ value::label_8 n;
+
+ {
+ image1d<unsigned> h_, hs_;
+ image1d<value::label_8> l;
+
+ convert::from_to(h, h_);
+ hs_ = linear::gaussian_1d(h_, sigma, 0);
+ l = labeling::regional_minima(hs_, c2(), n);
+
+ {
+// debug::println("l", l);
+// debug::histo(h, "tmp_h.txt");
+
+// std::ofstream file("tmp_hs.txt");
+// mln_piter_(box1d) p(h_.domain());
+// for_all(p)
+// file << p.ind() << ' ' << hs_(p) << std::endl;
+// file.close();
+ }
+
+ accu::center<point1d, point1d> a;
+ c = labeling::compute(a, l, n);
+
+ c[0] = point1d(0); // Force a neutral value for the non-label value (0).
+
+ // std::cout << "c = " << c << std::endl;
+ }
+
+
+ int threshold;
+
+ {
+ std::vector<int> v;
+ for (unsigned i = 0; i <= n; ++i)
+ v.push_back(c[i].ind());
+ std::sort(v.begin(), v.end());
+
+ for (unsigned i = 0; i <= n; ++i)
+ if (v[i] != 0)
+ {
+ threshold = v[i];
+ break;
+ }
+
+ std::cout << "threshold = " << threshold << std::endl;
+ }
+
+ return threshold;
+ }
+
+
+ image2d<bool> contours(const image2d<value::int_u8>& f, unsigned& threshold)
+ {
+ using value::int_u8;
+ typedef int_u8 V;
+ histo::array<V> h;
+
+ image2d<int_u8> g;
+ g = morpho::elementary::gradient_internal(f, c4());
+ g = morpho::closing::height(g, c4(), 3); // FIXME: hard-coded!
+
+ unsigned nbasins;
+ image2d<unsigned> w = morpho::watershed::flooding(g, c4(), nbasins);
+
+ h = histo::compute(g | (pw::value(w) == pw::cst(0)));
+
+ threshold = find_threshold(h);
+
+ return duplicate((pw::value(g) > pw::cst(threshold)) | f.domain());
+ }
+
+
+ // Distances.
+
+ value::int_u8 dist(const value::int_u8& g1, const value::int_u8& g2)
+ {
+ return math::diff_abs(g1, g2);
+ }
+
+ value::int_u8 dist(const value::rgb8& c1, const value::rgb8& c2)
+ {
+ unsigned d = math::diff_abs(c1.red(), c2.red());
+ unsigned d_;
+ d_ = math::diff_abs(c1.green(), c2.green());
+ if (d_ > d)
+ d = d_;
+ d_ = math::diff_abs(c1.blue(), c2.blue());
+ if (d_ > d)
+ d = d_;
+ return d;
+ }
+
+
+ // Functions.
+
+ inline
+ bool is_row_odd(const point2d& p)
+ {
+ return p.row() % 2;
+ }
+
+ inline
+ bool is_square(const point2d& p)
+ {
+ return p.row() % 2 == 0 && p.col() % 2 == 0;
+ }
+
+ inline
+ bool is_edge(const point2d& p)
+ {
+ return p.row() % 2 + p.col() % 2 == 1;
+ }
+
+ inline
+ bool is_point(const point2d& p)
+ {
+ return p.row() % 2 && p.col() % 2;
+ }
+
+
+ // Neighborhoods.
+
+ typedef neighb< win::multiple<window2d, bool(*)(const point2d&)> > dbl_neighb2d;
+
+ const dbl_neighb2d& e2c()
+ {
+ static bool e2c_h[] = { 0, 1, 0,
+ 0, 0, 0,
+ 0, 1, 0 };
+ static bool e2c_v[] = { 0, 0, 0,
+ 1, 0, 1,
+ 0, 0, 0 };
+ static dbl_neighb2d nbh = make::double_neighb2d(is_row_odd, e2c_h, e2c_v);
+ return nbh;
+ }
+
+ const dbl_neighb2d& e2e()
+ {
+ static bool e2e_h[] = { 0, 0, 1, 0, 0,
+ 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0,
+ 0, 1, 0, 1, 0,
+ 0, 0, 1, 0, 0 };
+ static bool e2e_v[] = { 0, 0, 0, 0, 0,
+ 0, 1, 0, 1, 0,
+ 1, 0, 0, 0, 1,
+ 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0 };
+ static dbl_neighb2d nbh = make::double_neighb2d(is_row_odd, e2e_h, e2e_v);
+ return nbh;
+ }
+
+
+ // Transforms.
+
+ template <typename T>
+ image2d<T>
+ image2full(const image2d<T>& input)
+ {
+ image2d<T> output(2 * input.nrows() - 1,
+ 2 * input.ncols() - 1);
+ for (int row = 0; row < input.nrows(); ++row)
+ for (int col = 0; col < input.ncols(); ++col)
+ opt::at(output, 2 * row, 2 * col) = opt::at(input, row, col);
+ return output;
+ }
+
+ template <typename T>
+ image2d<T>
+ full2image(const image2d<T>& input)
+ {
+ image2d<T> output((input.nrows() + 1) / 2,
+ (input.ncols() + 1) / 2);
+ for (int row = 0; row < input.nrows(); row += 2)
+ for (int col = 0; col < input.ncols(); col += 2)
+ opt::at(output, row / 2, col / 2) =
+ opt::at(input, row, col);
+ return output;
+ }
+
+
+ // Display.
+
+ template <typename I>
+ I display_edge(const I& ima, mln_value(I) bg, unsigned zoom)
+ {
+ unsigned nrows = ima.nrows() / 2 + 1;
+ unsigned ncols = ima.ncols() / 2 + 1;
+ I output(nrows * (zoom + 1) - 1,
+ ncols * (zoom + 1) - 1);
+ data::fill(output, bg);
+ mln_VAR( edge, ima | is_edge );
+ mln_piter(edge_t) p(edge.domain());
+ for_all(p)
+ if (p.row() % 2) // horizontal edge
+ {
+ unsigned row = (p.row() / 2 + 1) * (zoom + 1) - 1;
+ unsigned col = (p.col() / 2) * (zoom + 1);
+ for (unsigned i = 0; i < zoom; ++i)
+ opt::at(output, row, col + i) = ima(p);
+ }
+ else // vertical edge
+ {
+ unsigned row = (p.row() / 2) * (zoom + 1);
+ unsigned col = (p.col() / 2 + 1) * (zoom + 1) - 1;
+ for (unsigned i = 0; i < zoom; ++i)
+ opt::at(output, row + i, col) = ima(p);
+ }
+ return output;
+ }
+
+
+
+ // Distance, stored on edges, of a couple of colors.
+
+ template <typename I, typename N>
+ image2d<value::int_u8>
+ dist_on_edges(const I& input, const N& nbh)
+ {
+ image2d<value::int_u8> output;
+ initialize(output, input);
+ data::fill(output, 0);
+
+ mln_piter(I) p(input.domain());
+ mln_niter(N) n(nbh, p);
+ for_all(p)
+ {
+ n.start();
+ mln_value(I) c1 = input(n);
+ n.next();
+ mln_value(I) c2 = input(n);
+ output(p) = dist(c1, c2);
+ }
+
+ // io::pgm::save(output, "temp_dist.pgm");
+
+ return output;
+ }
+
+
+ value::int_u8 L_to_int_u8(unsigned l)
+ {
+ return l == 0 ?
+ 0 : // wshed line
+ 1 + (l - 1) % 255; // basin
+ }
+
+
+
+
+ template <typename I, typename N, typename L>
+ mln_ch_value(I, bool)
+ labeling__quasi_regional_minima(const Image<I>& input_, const Neighborhood<N>& nbh_,
+ unsigned threshold,
+ L& nlabels)
+ {
+ trace::entering("labeling__quasi_regional_minima");
+
+ const I& input = exact(input_);
+ const N& nbh = exact(nbh_);
+ mln_precondition(input.is_valid());
+
+ typedef mln_psite(I) P;
+ p_array<P> s = level::sort_psites_increasing(input);
+
+ std::vector<bool> valid;
+ valid.push_back(false); // For valid[0] where 0 is the non-label value.
+
+ mln_ch_value(I, L) lab;
+ initialize(lab, input);
+ data::fill(lab, 0);
+
+ L cur_lab = 0;
+
+ p_queue<P> q;
+ P p_;
+ mln_niter(N) n(nbh, p_);
+
+ mln_piter(p_array<P>) p(s);
+ for_all(p)
+ {
+ if (lab(p) != 0)
+ continue;
+
+ mln_invariant(q.is_empty());
+
+ // Initialization.
+ ++cur_lab;
+ valid.push_back(true);
+ mln_invariant(valid[cur_lab] == true);
+ lab(p) = cur_lab;
+ q.push(p);
+
+ while (! q.is_empty())
+ {
+ p_ = q.pop_front();
+ mln_invariant(lab(p_) != 0); // Already seen.
+ for_all(n)
+ {
+ if (lab(n) == cur_lab)
+ continue;
+ if (lab(n) == 0)
+ if (math::diff_abs(input(n), input(p_)) < threshold)
+ {
+ lab(n) = cur_lab;
+ q.push(n);
+ continue;
+ }
+ mln_invariant(lab(n) != 0 && lab(n) != cur_lab);
+ if (valid[cur_lab])
+ valid[cur_lab] = false; // Invalidation.
+ }
+ }
+ }
+
+ fun::i2v::array<bool> f_valid;
+ convert::from_to(valid, f_valid);
+
+ mln_ch_value(I, bool) out = level::transform(lab, f_valid);
+
+ trace::exiting("labeling__quasi_regional_minima");
+ return out;
+ }
+
+
} // end of namespace mln
@@ -211,63 +577,263 @@
using namespace mln;
using namespace value;
- if (argc < 2)
+ // trace::quiet = false;
+
+ if (argc != 5)
+ {
+ std::cout << argv[0] << " input.pgm lambda echo output.pbm" << std::endl;
+ return 1;
+ }
+
+ int lambda_grad = std::atoi(argv[2]);
+ int echo = std::atoi(argv[3]);
+
+
+ if (echo != 0 && echo != 1)
{
- std::cout << argv[0] << " <input.pgm> " << std::endl;
+ std::cout << argv[0] << " input.pgm lambda echo output.pbm" << std::endl;
return 1;
}
+
image2d<int_u8> input;
io::pgm::load(input, argv[1]);
- image2d<int_u8> grad = morpho::elementary::gradient_internal(input, c4());
- io::pgm::save(grad, "binarization_grad.pgm");
+ image2d<int_u8> input_ = image2full(input); // Larger to make room to edges.
+
+ image2d<int_u8> grad_;
+ {
+ grad_ = dist_on_edges(extend(input_ | is_edge, pw::value(input_)),
+ e2c());
+ }
+
+ // io::pgm::save(grad_, "grad_.pgm");
+
+ mln_VAR(grad, grad_ | is_edge);
+ typedef grad_t E;
+
+ grad = morpho::closing::volume(grad,
+ e2e(),
+ lambda_grad);
+
+ // io::pgm::save(grad.unmorph_(), "grad.pgm");
+
+ typedef label_16 L; // Label type.
+
+ L nbasins;
+
+ typedef mln_ch_value_(E, L) EL;
+
+ EL wst = morpho::watershed::flooding(grad,
+ e2e(),
+ nbasins);
+
+ std::cout << "n basins = " << nbasins << std::endl;
+
+
+ if (echo)
+ {
+ io::ppm::save(display_edge(debug::colorize(rgb8(),
+ wst,
+ nbasins).unmorph_(),
+ literal::black,
+ 3),
+ "temp_wst_edges.ppm");
+ }
+
+
+ image2d<L> w_all = wst.unmorph_();
+
+ // edges -> squares
+ mln_VAR(w_squares, w_all | is_square);
+ data::paste(morpho::dilation(extend(w_squares, pw::value(w_all)),
+ c4().win()),
+ w_all);
+ // edges -> points
+ mln_VAR(w_points, w_all | is_point);
+ data::paste(morpho::erosion(extend(w_points, pw::value(w_all)),
+ c4().win()),
+ w_all);
+
+ image2d<L> ws = full2image(w_all);
+
+ if (echo)
+ {
+ io::ppm::save(debug::colorize(rgb8(), ws, nbasins),
+ "temp_ws.ppm");
+ }
+
+ util::couple<util::graph, image2d<L> >
+ rag_data = make::rag_and_labeled_wsl(w_all, c8(), nbasins);
+
+ if (echo)
+ io::pgm::save(labeling::wrap(int_u8(),
+ rag_data.second()),
+ "temp_lwsl.pgm");
+
- image2d<int_u8> clo_vol = morpho::closing::volume(grad, c4(), 500);
- io::pgm::save(clo_vol, "binarization_clo.pgm");
+ unsigned threshold;
+ contours(input, threshold);
- label_16 nbasins;
- image2d<label_16> wst = morpho::watershed::flooding(clo_vol, c4(), nbasins);
- io::ppm::save(debug::colorize(rgb8(), wst, nbasins), "binarization_wst.ppm");
+ typedef accu::median_h<int_u8> A;
+ typedef fun::i2v::array<point2d> F;
- util::couple<util::graph, image2d<label_16> >
- rag_data = make::rag_and_labeled_wsl(wst, c4(), nbasins);
- io::pgm::save(rag_data.second(), "binarization_lwsl.pgm");
- io::ppm::save(debug::colorize(rgb8(), rag_data.second(), nbasins), "binarization_lwsl.ppm");
+ util::array<int_u8> basin_med = labeling::compute(A(), input, ws, nbasins);
+ basin_med[0] = 0;
+
+
+
+ if (echo)
+ io::ppm::save(debug::colorize(rgb8(), w_all, nbasins),
+ "temp_w_all.ppm");
+
+
+
+ // ----------------------------- R A G --------------------------------
+
+
+ util::graph& gr = rag_data.first();
+
+ fun::i2v::array<int_u8> f_med;
+ convert::from_to(basin_med, f_med);
+
+ if (echo)
+ {
+ io::pgm::save(level::transform(w_all, f_med),
+ "temp_w_all.pgm");
+ io::pgm::save(level::transform(ws, f_med), "temp_basin_med.pgm");
+ }
p_vertices<util::graph, fun::i2v::array<point2d> >
- pv = make::common_pvertices(wst, nbasins, rag_data.first());
+ pv = make::common_pvertices(ws, nbasins, rag_data.first());
+
+ mln_VAR( med, f_med | pv );
+
+
+ typedef graph_elt_neighborhood<util::graph, F> N;
+ N nbh;
+
+ threshold = 25; // FIXME
+
+ L n_objects;
+ mln_VAR( lab, labeling__quasi_regional_minima(med, nbh, threshold, n_objects) );
+
+
+ io::pbm::save(pw::value(level::transform(ws, lab.function()))
+ | input.domain(),
+ argv[4]);
+
+// io::pbm::save((pw::value(level::transform(ws,
+// lab.function())) != pw::cst(0))
+// | input.domain(),
+// argv[4]);
+
+
+ /*
+
+ int_u8
+ object = 255,
+ background = 0,
+ unknown = 128;
+
+ med_t out;
+ initialize(out, med);
+ data::fill(out, unknown);
+
+ // Initialization.
+
+ mln_piter_(med_t) p(med.domain());
+ mln_niter_(N) n(nbh, p);
+ for_all(p)
+ for_all(n)
+ {
+ int d = math::diff_abs(med(p), med(n));
+ // if (2 * d > 3 * threshold)
+ if (d > threshold)
+ {
+ if (med(p) < med(n))
+ {
+ out(p) = object;
+ out(n) = background;
+ }
+ else
+ {
+ out(n) = object;
+ out(p) = background;
+ }
+ break;
+ }
+ }
+
+ if (echo)
+ {
+ io::pgm::save(level::transform(ws, out.function()),
+ "temp_out.pgm");
+ }
+
+
+ // Enqueuing.
+
+ typedef mln_psite_(med_t) P;
+ p_queue<P> q;
+
+ for_all(p)
+ {
+ if (out(p) != unknown)
+ continue;
+ for_all(n)
+ if (out(n) != unknown)
+ {
+ q.insert(p);
+ break;
+ }
+ }
+
+ // Propagation.
+
+ P p_;
+ mln_niter_(N) n_(nbh, p_);
+ while (! q.is_empty())
+ {
+ p_ = q.pop_front();
+
+ if (out(p_) != unknown)
+ continue; // std::cerr << "oops! (1)" << std::endl;
+
+ unsigned d = 256, id;
+ for_all(n_)
+ {
+ if (out(n_) == unknown)
+ {
+ q.insert(n_);
+ continue;
+ }
+ unsigned d_ = math::diff_abs(med(p_), med(n_));
+ if (d_ < d)
+ {
+ d = d_;
+ id = out(n_);
+ }
+ }
+ if (d == 256)
+ std::cerr << "oops! (2)" << std::endl;
+
+ out(p_) = id; // object or background.
+ }
+
+ if (echo)
+ {
+ io::pgm::save(level::transform(ws, out.function()),
+ "temp_out_2.pgm");
+ }
- pw::image<fun::i2v::array<int_u8>,
- p_vertices<util::graph, fun::i2v::array<point2d> > >
- ima_v = make::vertex_image(accu::mean<int_u8>(), pv, input, wst, nbasins);
-
- pw::image<fun::i2v::array<int_u8>,
- p_edges<util::graph,pw::cst_<literal::origin_t> > >
- ima_e = make::edge_image(ima_v,
- make::dummy_pedges(rag_data.first(),literal::origin),
- edge_values());
-
-
- io::pgm::save(make::debug_graph_image(input,ima_v, ima_e, 4, 0), "binarization_graph.ppm");
-
- // FIXME: we should use the following line instead. We cannot since currently
- // graph edges are numbered from 0 and we must use mln_max() - 1 as
- // background id.
- //
- //label_16 nelts = rag.first().e_nmax();
- label_16 nelts = mln_max(label_16).prev();
-
- util::array<int_u8> median_grad = labeling::compute(accu::meta::median_h(),
- grad,
- rag_data.second(),
- nelts);
- fun::i2v::array<int_u8> f;
- convert::from_to(median_grad, f);
+ io::pbm::save((pw::value(level::transform(ws,
+ out.function())) == pw::cst(255))
+ | input.domain(),
+ argv[4]);
- image2d<int_u8> med = level::transform(rag_data.second(), f);
+ */
- io::pgm::save(med, "binarization_median_grad.pgm");
}
1
0
05 Apr '09
URL: https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox
ChangeLog:
2009-04-05 Frederic Bour <bour(a)lrde.epita.fr>
Update to our line recognition using component trees..
* edwin/tree/test.cc: Now use weighted distance front.
---
test.cc | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 91 insertions(+), 18 deletions(-)
Index: trunk/milena/sandbox/edwin/tree/test.cc
===================================================================
--- trunk/milena/sandbox/edwin/tree/test.cc (revision 3604)
+++ trunk/milena/sandbox/edwin/tree/test.cc (revision 3605)
@@ -3,7 +3,9 @@
#include <mln/core/image/image_if.hh>
#include <mln/core/alias/neighb2d.hh>
#include <mln/core/routine/duplicate.hh>
+#include <mln/core/alias/window2d.hh>
#include <mln/core/var.hh>
+#include <mln/value/int_u16.hh>
/* Site set */
#include <mln/core/site_set/p_array.hh>
@@ -16,16 +18,24 @@
#include "run.hh"
#include "accumulator/arg_max.hh"
+/* morpho closing */
+// #include <mln/morpho/opening/structural.hh>
+// #include <mln/morpho/closing/structural.hh>
+
/* Attributes */
-#include <mln/transform/distance_geodesic.hh>
+// #include <mln/transform/distance_geodesic.hh>
+#include <mln/core/alias/window2d.hh>
+#include <mln/core/alias/w_window2d_int.hh>
+#include <mln/transform/distance_front.hh>
#include <mln/morpho/attribute/card.hh>
#include "../attributes/bbox.hh"
+#include <mln/make/w_window2d_int.hh>
/* io */
#include <mln/io/pbm/load.hh>
#include <mln/io/pgm/save.hh>
#include <mln/io/ppm/save.hh>
-#include <../../theo/color/change_attributes.hh>
+//#include <../../theo/color/change_attributes.hh>
/* data & pw */
#include <mln/core/concept/function.hh>
@@ -48,14 +58,13 @@
bool mydebug = false;
-
void usage(char** argv)
{
- std::cerr << "usage: " << argv[0] << " input [--debug]" << std::endl;
+ std::cerr << "usage: " << argv[0] << " input [--debug] [-n nbr_components | -s sharpness] [-c card]" << std::endl;
abort();
}
-void dsp(const char* str)
+void dsp(const std::string& str)
{
std::cout << std::endl
<< "*********************" << std::endl
@@ -95,27 +104,79 @@
int main(int argc, char* argv[])
{
using namespace mln;
- using value::int_u8;
+// using value::int_u8;
+ using value::int_u16;
+
+ std::string arg;
+ unsigned nb_components = 0;
+ unsigned card = 0;
+ double treshold = 0;
if (argc < 2)
usage(argv);
- mydebug = (argc >= 3 && std::string(argv[2]) == "--debug");
+ for (int i = 2; i < argc; i++)
+ {
+ arg = std::string(argv[i]);
+ if (arg == "--debug")
+ mydebug = true;
+ else if (arg == "-n" && i != argc)
+ nb_components = atoi(argv[++i]);
+ else if (arg == "-t" && i != argc)
+ treshold = atof(argv[++i]);
+ else if (arg == "-c" && i != argc)
+ card = atoi(argv[++i]);
+ else if (arg == "--trace")
+ trace::quiet = false;
+ else
+ usage (argv);
+ }
/* Image loadin' */
- typedef image2d<int_u8> I;
+ typedef image2d<int_u16> I;
image2d<bool> input_;
io::pbm::load(input_, argv[1]);
/* Work on geodesic distance image */
- I input = transform::distance_geodesic(input_, c8(), mln_max(int_u8));
+// I input = transform::distance_geodesic(input_, c8(), mln_max(int_u8));
+ I input;
+ {
+ const int weights[9] =
+ { 10, 9, 10,
+ 1, 0, 1,
+ 10, 9, 10 };
+
+ w_window2d_int win;
+ mln::convert::from_to(weights, win);
+ input = transform::distance_front(input_, c8(), win, mln_max(int_u16));
+ }
if (mydebug)
dsp("Distance geodesic");
- io::pgm::save(input, "distance.pgm");
+ /* Closing */
+ {
+ bool w[3][1];
+
+ for (int i = 0; i < 3; i++)
+ for (int j = 0; j < 1; j++)
+ w[i][j] = 1;
+
+// input = morpho::closing::structural(input, convert::to<window2d>(w));
+ }
+
+ /* Opening */
+ {
+ bool w[1][15];
+
+ for (int i = 0; i < 1; i++)
+ for (int j = 0; j < 15; j++)
+ w[i][j] = 1;
+
+// input = morpho::opening::structural(input, convert::to<window2d>(w));
+ }
/* Component tree creation */
typedef p_array< mln_site_(I) > S;
@@ -124,6 +185,9 @@
S sorted_sites = level::sort_psites_decreasing(input);
tree_t tree(input, sorted_sites, c4());
+
+ io::pgm::save(input, "distance.pgm");
+
/* Compute Attribute On Image */
typedef morpho::attribute::bbox<I> bbox_t;
typedef mln_ch_value_(I, double) A;
@@ -133,7 +197,7 @@
morpho::tree::propagate_representant(tree, a);
if (mydebug) {
- dsp("Image sharp attribute"); display_tree_attributes(tree, a);
+ dsp("Image sharp attribute");
}
/* We don't want little components */
@@ -161,11 +225,20 @@
accumulator::arg_max<A> argmax(a);
p_array< mln_psite_(A) > obj_array; // Array of object components.
- mln_VAR(predicate, pw::value(a) > pw::cst(0.5));
- obj_array = morpho::tree::run_while(tree, a, argmax, predicate);
-
if (mydebug) {
- dsp("Run max accumulator, lk 4 5 objs"); display_tree_attributes(tree, a);
+ std::stringstream s("Run max accumulator, look for ");
+ if (nb_components)
+ s << nb_components << " components.";
+ else
+ s << "components whose treshold > " << treshold;
+ dsp(s.str());
+ }
+
+ if (!nb_components) {
+ mln_VAR(predicate, pw::value(a) > pw::cst(treshold));
+ obj_array = morpho::tree::run_while(tree, a, argmax, predicate);
+ } else {
+ obj_array = morpho::tree::run_ntimes(tree, a, argmax, nb_components);
}
/* Print them */
@@ -193,7 +266,7 @@
// mask now contains all nodes related to objects
if (mydebug) {
- dsp("Create mask and propagate"); display_tree_attributes(tree, mask);
+ dsp("Create mask and propagate");
}
/* Labeling */
@@ -211,8 +284,8 @@
if (mydebug) {
mln_fwd_piter_(p_array< mln_psite_(I) >) c(obj_array);
for_all(c)
- draw::box(out, attr_image(c), mln_max(int_u8));
- dsp("Mask input"); display_tree_attributes(tree, out);
+ draw::box(out, attr_image(c), mln_max(int_u16));
+ dsp("Mask input");
}
io::pgm::save(out, "output.pgm");
1
0
URL: https://svn.lrde.epita.fr/svn/oln/trunk/milena
ChangeLog:
2009-04-03 Fabien Freling <fabien.freling(a)lrde.epita.fr>
Add optional paramater for plot::save().
* mln/io/plot/save.hh: Add optional parameter for save().
---
save.hh | 32 ++++++++++++++++++++------------
1 file changed, 20 insertions(+), 12 deletions(-)
Index: trunk/milena/mln/io/plot/save.hh
===================================================================
--- trunk/milena/mln/io/plot/save.hh (revision 3603)
+++ trunk/milena/mln/io/plot/save.hh (revision 3604)
@@ -51,21 +51,27 @@
/*! Save a Milena 1D image in a plot file.
*
- * \param[out] ima A reference to the image to save.
- * \param[in] filename The output file.
+ * \param[in] ima A reference to the image to save.
+ * \param[out] filename The output file.
+ * \param[in] start_value The start index value of the plot
+ * (optional).
*/
template <typename I>
void save(image1d<I>& ima,
- const std::string& filename);
+ const std::string& filename,
+ int start_value = 0);
/*! Save a Milena array in a plot file.
*
- * \param[out] ima A reference to the array to save.
- * \param[in] filename The output file.
+ * \param[in] arr A reference to the array to save.
+ * \param[out] filename The output file.
+ * \param[in] start_value The start index value of the plot
+ * (optional).
*/
template <typename I>
void save(util::array<I>& arr,
- const std::string& filename);
+ const std::string& filename,
+ int start_value = 0);
# ifndef MLN_INCLUDE_ONLY
@@ -73,26 +79,28 @@
template <typename I>
inline
- void save(image1d<I>& ima, const std::string& filename)
+ void save(image1d<I>& ima, const std::string& filename,
+ int start_value = 0)
{
trace::entering("mln::io::plot::save");
std::ofstream file_out(filename.c_str());
- for (unsigned i = 0; i < ima.ninds(); ++i)
- file_out << i << ", " << ima.at_(i) << std::endl;
+ for (int i = 0; i < ima.ninds(); ++i)
+ file_out << start_value + i << ", " << ima.at_(i) << std::endl;
trace::exiting("mln::io::plot::save");
}
template <typename I>
inline
- void save(util::array<I>& arr, const std::string& filename)
+ void save(util::array<I>& arr, const std::string& filename,
+ int start_value = 0)
{
trace::entering("mln::io::plot::save");
std::ofstream file_out(filename.c_str());
- for (unsigned i = 0; i < arr.nelements(); ++i)
- file_out << i << ", " << arr[i] << std::endl;
+ for (int i = 0; i < arr.nelements(); ++i)
+ file_out << start_value + i << ", " << arr[i] << std::endl;
trace::exiting("mln::io::plot::save");
}
1
0
URL: https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox
ChangeLog:
2009-04-03 Fabien Freling <fabien.freling(a)lrde.epita.fr>
Create plot files depending on labels.
* fabien/igr/Makefile: Add new targets.
* fabien/igr/check.sh: Update.
* fabien/igr/clo_vol.cc: Minor update, helped for debug.
* fabien/igr/fun_labels.cc: Create plot files with labels value.
* fabien/igr/fun_labels.sh: New script file for testing fun_labels.
* fabien/igr/time_smooth/linear.cc: Update tumeur point.
---
TODO | 4 -
igr/Makefile | 13 +--
igr/check.sh | 12 +--
igr/clo_vol.cc | 14 +++
igr/fun_labels.cc | 163 ++++++++++++++++++++++++++++++++++++++++++++++
igr/fun_labels.sh | 20 +++++
igr/time_smooth/linear.cc | 8 +-
7 files changed, 211 insertions(+), 23 deletions(-)
Index: trunk/milena/sandbox/fabien/igr/clo_vol.cc
===================================================================
--- trunk/milena/sandbox/fabien/igr/clo_vol.cc (revision 3602)
+++ trunk/milena/sandbox/fabien/igr/clo_vol.cc (revision 3603)
@@ -16,6 +16,13 @@
+
+
+#include <mln/canvas/morpho/attribute_filter.hh>
+#include <mln/morpho/attribute/volume.hh>
+
+
+
///////////////////
// //
// Main Function //
@@ -53,9 +60,12 @@
}
else
{
- image3d<int_u12> input;
+ typedef image3d<int_u12> I;
+
+ I input;
io::dump::load(input, argv[1]);
- image3d<int_u12> clo = morpho::closing::volume(input, c6(), closure_lambda);
+
+ I clo = morpho::closing::volume(input, c6(), closure_lambda);
io::dump::save(clo, "clo_vol.dump");
}
Index: trunk/milena/sandbox/fabien/igr/fun_labels.sh
===================================================================
--- trunk/milena/sandbox/fabien/igr/fun_labels.sh (revision 0)
+++ trunk/milena/sandbox/fabien/igr/fun_labels.sh (revision 3603)
@@ -0,0 +1,20 @@
+#!/bin/zsh
+
+process_file ()
+{
+ echo "Processing $3..."
+ input=$1
+ dim=$2
+
+ ./grad $input $dim
+ for lambda_closing in 5000; do
+ echo " for lambda_closing = ${lambda_closing}";
+ ./clo_vol grad.dump $dim ${lambda_closing}
+ nbasins=`./wst clo_vol.dump $dim`
+ echo " nbasins = $nbasins"
+#../bin/dumpl32_to_colorize wst.dump $dim $nbasins colorize_${3}_${lambda_closing}.ppm
+ ./fun_labels wst.dump $dim $input $nbasins
+ done
+}
+
+process_file "/Users/HiSoKa/Work/IGR/souris18/irm/IM_0052.dcm" 3 "52"
Property changes on: trunk/milena/sandbox/fabien/igr/fun_labels.sh
___________________________________________________________________
Name: svn:executable
+ *
Index: trunk/milena/sandbox/fabien/igr/check.sh
===================================================================
--- trunk/milena/sandbox/fabien/igr/check.sh (revision 3602)
+++ trunk/milena/sandbox/fabien/igr/check.sh (revision 3603)
@@ -15,7 +15,7 @@
echo " nbasins = $nbasins"
../bin/dumpl32_to_colorize wst.dump $dim $nbasins results/colorize_${3}_${lambda_closing}.ppm
median=`./med wst.dump $dim $input $nbasins`
-#echo " median = $median"
+ echo " median = $median"
threshold=$(($median / 2))
../bin/dumpi12_to_pgm med.dump $dim results/median_${3}_${lambda_closing}.pgm
./thres med.dump $dim $threshold
@@ -38,9 +38,9 @@
# rm *.dump
}
-process_file "/Users/HiSoKa/Work/IGR/souris18/irm/IM_0049.dcm" 2 "49"
+#process_file "/Users/HiSoKa/Work/IGR/souris18/irm/IM_0049.dcm" 2 "49"
process_file "/Users/HiSoKa/Work/IGR/souris18/irm/IM_0052.dcm" 3 "52"
-process_file "/Users/HiSoKa/Work/IGR/souris18/irm/IM_0055.dcm" 2 "55"
-process_file "/Users/HiSoKa/Work/IGR/souris18/irm/IM_0058.dcm" 2 "58"
-process_file "/Users/HiSoKa/Work/IGR/souris18/irm/IM_0061.dcm" 3 "61"
-process_file "/Users/HiSoKa/Work/IGR/souris18/irm/IM_0064.dcm" 3 "64"
+#process_file "/Users/HiSoKa/Work/IGR/souris18/irm/IM_0055.dcm" 2 "55"
+#process_file "/Users/HiSoKa/Work/IGR/souris18/irm/IM_0058.dcm" 2 "58"
+#process_file "/Users/HiSoKa/Work/IGR/souris18/irm/IM_0061.dcm" 3 "61"
+#process_file "/Users/HiSoKa/Work/IGR/souris18/irm/IM_0064.dcm" 3 "64"
Index: trunk/milena/sandbox/fabien/igr/time_smooth/linear.cc
===================================================================
--- trunk/milena/sandbox/fabien/igr/time_smooth/linear.cc (revision 3602)
+++ trunk/milena/sandbox/fabien/igr/time_smooth/linear.cc (revision 3603)
@@ -66,11 +66,11 @@
// Outputs //
// //
/////////////
- io::plot::save(ima_arr(point2d(160, 120)), "ref_tumeur.plot");
- io::plot::save(ima_linear(point2d(160, 120)), "linear_tumeur.plot");
- io::plot::save(ima_arr(point2d(34, 94)), "ref_air.plot");
+ //io::plot::save(ima_arr(point2d(160, 120)), "ref_tumeur.plot");
+ io::plot::save(ima_linear(point2d(156, 114)), "linear_tumeur.plot");
+ //io::plot::save(ima_arr(point2d(34, 94)), "ref_air.plot");
io::plot::save(ima_linear(point2d(34, 94)), "linear_air.plot");
- io::plot::save(ima_arr(point2d(122, 115)), "ref_poumon.plot");
+ //io::plot::save(ima_arr(point2d(122, 115)), "ref_poumon.plot");
io::plot::save(ima_linear(point2d(122, 115)), "linear_poumon.plot");
return 0;
Index: trunk/milena/sandbox/fabien/igr/fun_labels.cc
===================================================================
--- trunk/milena/sandbox/fabien/igr/fun_labels.cc (revision 0)
+++ trunk/milena/sandbox/fabien/igr/fun_labels.cc (revision 3603)
@@ -0,0 +1,163 @@
+#include <iostream>
+#include <sstream>
+#include <mln/core/image/image2d.hh>
+#include <mln/core/image/image3d.hh>
+#include <mln/core/image/image_if.hh>
+#include <mln/core/image/slice_image.hh>
+#include <mln/core/routine/duplicate.hh>
+
+#include <mln/core/alias/neighb2d.hh>
+#include <mln/core/alias/window2d.hh>
+#include <mln/core/alias/neighb3d.hh>
+#include <mln/core/alias/window3d.hh>
+
+#include <mln/geom/nslis.hh>
+
+#include <mln/io/dump/all.hh>
+#include <mln/io/dicom/load.hh>
+#include <mln/io/plot/save.hh>
+
+#include <mln/value/int_u8.hh>
+#include <mln/value/int_u12.hh>
+#include <mln/value/label_16.hh>
+#include <mln/value/label_32.hh>
+
+#include <mln/accu/mean.hh>
+#include <mln/accu/median_h.hh>
+#include <mln/level/compute.hh>
+#include <mln/pw/all.hh>
+#include <mln/util/array.hh>
+#include <mln/util/set.hh>
+
+
+
+using namespace mln;
+using value::int_u8;
+using value::int_u12;
+using value::label_16;
+using value::label_32;
+
+
+template <typename I, typename L, typename V>
+inline
+void plot_label(I ima, L ima_labels, V lbl)
+{
+ I ima_spe = duplicate(ima | pw::value(ima_labels) == pw::cst(lbl));
+ util::array<float> arr;
+ for (int i = 0; i < ima_spe.domain().pmin().sli(); ++i)
+ arr.append(0.0);
+ for (int sli = ima_spe.domain().pmin().sli(); sli <= ima_spe.domain().pmax().sli(); ++sli)
+ {
+ image2d<int_u12> tmp_slice = duplicate(slice(ima_spe, sli));
+ accu::mean<int_u12> accu_mean;
+ float mean = level::compute(accu_mean, tmp_slice);
+ arr.append(mean);
+ }
+ for (int i = ima_spe.domain().pmax().sli() + 1; i <= ima.domain().pmax().sli(); ++i)
+ arr.append(0.0);
+ std::ostringstream slabel;
+ slabel << "label_" << lbl << ".plot";
+ io::plot::save(arr, slabel.str());
+}
+
+
+template <typename I, typename L>
+inline
+void plot_point(I ima, L ima_labels, point2d point, const char* desc)
+{
+ util::array<float> arr;
+ label_32 prev_lbl;
+ int start = 0;
+ int count = 1;
+ for (unsigned sli = 0; sli < geom::nslis(ima); ++sli)
+ {
+ image2d<int_u12> ima_slice = duplicate(slice(ima, sli));
+ image2d<label_32> lbl_slice = duplicate(slice(ima_labels, sli));
+ if (sli == 0)
+ prev_lbl = lbl_slice(point);
+ if (lbl_slice(point) != prev_lbl)
+ {
+ std::ostringstream slabel;
+ slabel << desc << "_" << count << "_label_" << prev_lbl << ".plot";
+ count++;
+ io::plot::save(arr, slabel.str(), start);
+ arr.clear();
+ start = sli + 1;
+ }
+ // Taking the mean value of the region.
+ accu::mean<int_u12> accu_mean;
+ float mean = level::compute(accu_mean, ima_slice | pw::value(lbl_slice) == pw::cst(lbl_slice(point)));
+ arr.append(mean);
+ prev_lbl = lbl_slice(point);
+ }
+ if (!arr.is_empty())
+ {
+ std::ostringstream slabel;
+ slabel << desc << "_" << count << "_label_" << prev_lbl << ".plot";
+ io::plot::save(arr, slabel.str(), start);
+ }
+}
+
+
+///////////////////
+// //
+// Main Function //
+// //
+///////////////////
+
+
+int main(int argc, char *argv[])
+{
+ typedef label_32 L;
+
+ if (argc != 5)
+ {
+ std::cout << "Usage: " << argv[0] << " <ima.dump> <dimensions> <ima.dcm> <nbasins>"
+ << std::endl;
+ return 1;
+ }
+
+ unsigned dim = atoi(argv[2]);
+ if (dim != 2 && dim != 3)
+ {
+ std::cout << "<dimensions> invalid" << std::endl;
+ return 1;
+ }
+
+ L nlabels = atoi(argv[4]);
+
+ if (dim == 2)
+ {
+ // FIXME
+ }
+ else
+ {
+ point2d p_tumeur(156, 114);
+ point2d p_air(34, 94);
+ point2d p_poumon(122, 115);
+ image3d<L> ima_labels;
+ io::dump::load(ima_labels, argv[1]);
+ image3d<int_u12> ima;
+ io::dicom::load(ima, argv[3]);
+
+ plot_point(ima, ima_labels, p_tumeur, "tumeur");
+ plot_point(ima, ima_labels, p_air, "air");
+ plot_point(ima, ima_labels, p_poumon, "poumon");
+ /*util::set<L> lbl_set;
+ for (int sli = 0; sli < geom::nslis(ima_labels); ++sli)
+ {
+ image2d<L> tmp_slice = duplicate(slice(ima_labels, sli));
+ lbl_set.insert(tmp_slice(p_tumeur));
+ lbl_set.insert(tmp_slice(p_air));
+ lbl_set.insert(tmp_slice(p_poumon));
+ }
+
+ util::set_fwd_iter<L> siter(lbl_set);
+ for_all(siter)
+ {
+ plot_label(ima, ima_labels, siter.element());
+ }*/
+ }
+
+ return 0;
+}
Index: trunk/milena/sandbox/fabien/igr/Makefile
===================================================================
--- trunk/milena/sandbox/fabien/igr/Makefile (revision 3602)
+++ trunk/milena/sandbox/fabien/igr/Makefile (revision 3603)
@@ -1,12 +1,4 @@
-CXX = llvm-g++
-CXXFLAGS = -DNDEBUG -O4
-
-DICOM_INC = -I/usr/local/include/gdcm-2.0
-DICOM_LIBS = -lgdcmCommon -lgdcmDICT -lgdcmDSED -lgdcmIOD -lgdcmMSFF -lgdcmexpat -lgdcmjpeg12 -lgdcmjpeg16 -lgdcmjpeg8 -lgdcmopenjpeg -lgdcmuuid -lgdcmzlib \
- -framework CoreFoundation
-DICOM = ${DICOM_INC} ${DICOM_LIBS}
-
-MAGICK = `Magick++-config --cppflags --ldflags --libs`
+include Makefile.rules
seg2d: seg_vol_irm.hh seg2d.cc
${CXX} -I../../../ ${DICOM} ${CXXFLAGS} seg2d.cc -o seg2d
@@ -50,6 +42,9 @@
first_slice_dicom: first_slice_dicom.cc
${CXX} -I../../../ ${DICOM} ${MAGICK} ${CXXFLAGS} -lm $^ -o first_slice_dicom
+fun_labels: fun_labels.cc
+ ${CXX} -I../../../ ${DICOM} ${CXXFLAGS} $^ -o fun_labels
+
clean:
rm -rf *.dump *.p?m *.plot *.log *.csv *.dSYM
rm seg2d seg3d wsd2d wsd3d nbasins_finder grad clo_vol wst graph med thres matlab time_max first_slice_dicom
Index: trunk/milena/sandbox/fabien/TODO
===================================================================
--- trunk/milena/sandbox/fabien/TODO (revision 3602)
+++ trunk/milena/sandbox/fabien/TODO (revision 3603)
@@ -38,9 +38,9 @@
[ ] Profile for performance
[X] ImageMagick support
[ ] Integrate external libraries (GDCM, IM)
-[ ] Send result images to lrde account
+[X] Send result images to lrde account
[X] Translate Matlab code
[X] Subsample binary images
[X] Fast projected histogram
[ ] Triple histogram
-[ ] Create plot for each kind of point with each method
+[X] Create plot for each kind of point with each method
1
0