URL:
https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox
ChangeLog:
2009-05-15 Fabien Freling <fabien.freling(a)lrde.epita.fr>
Create mean and deviation images.
* fabien/igr/fixed_seg/Makefile: New target for building
fixed segmentation.
* fabien/igr/fixed_seg/main.cc: Create mean image.
* fabien/igr/smooth_fixed_seg/main.cc: Small update, on hold.
---
fixed_seg/Makefile | 9 +
fixed_seg/main.cc | 271 +++++++++++++++++++++++++++++++++++++++++++++++
smooth_fixed_seg/main.cc | 59 +++++++++-
3 files changed, 332 insertions(+), 7 deletions(-)
Index: trunk/milena/sandbox/fabien/igr/smooth_fixed_seg/main.cc
===================================================================
--- trunk/milena/sandbox/fabien/igr/smooth_fixed_seg/main.cc (revision 3796)
+++ trunk/milena/sandbox/fabien/igr/smooth_fixed_seg/main.cc (revision 3797)
@@ -34,8 +34,8 @@
#include <mln/morpho/dilation.hh>
#include <mln/morpho/erosion.hh>
#include <mln/morpho/closing/structural.hh>
+#include <mln/morpho/closing/volume.hh>
#include <mln/morpho/opening/structural.hh>
-#include <mln/morpho/elementary/gradient.hh>
#include <mln/morpho/watershed/flooding.hh>
#include <mln/pw/all.hh>
#include <mln/util/array.hh>
@@ -46,9 +46,7 @@
#include <mln/world/inter_pixel/neighb2d.hh>
#include <mln/world/inter_pixel/all.hh>
-#include <mln/labeling/colorize.hh>
-#include <mln/debug/println.hh>
-#include <mln/trace/quiet.hh>
+#include "../plot_label.hh"
using namespace mln;
@@ -133,13 +131,13 @@
int usage(const char* bin)
{
- std::cout << "Usage: " << bin << " input.dump"
<< std::endl;
+ std::cout << "Usage: " << bin << " input.dump
closing_lambda" << std::endl;
return 1;
}
int main(int argc, char* argv[])
{
- if (argc != 2)
+ if (argc != 3)
return usage(argv[0]);
@@ -159,7 +157,6 @@
// Edges image creation.
- //image2d<float> edges = dist_on_edges(ima_arr);
typedef image_if<I, world::inter_pixel::is_pixel> Ix;
Ix imax = world::inter_pixel::immerse(ima_arr);
@@ -172,6 +169,54 @@
io::pgm::save(level::stretch(int_u8(), display_ima), "edges.pgm");
}
+ // Type change.
+ mln_VAR(e, level::stretch(int_u8(), edges));
+
+
+ // Closing.
+ mln_VAR(clo, morpho::closing::volume(e, world::inter_pixel::e2e(), atoi(argv[2])));
+
+ {
+ // Display.
+ mln_VAR(display_clo, world::inter_pixel::display_edge(clo.unmorph_(), 0.0, 3));
+ io::pgm::save(level::stretch(int_u8(), display_clo), "closing.pgm");
+ }
+
+
+ // Watershed.
+ typedef label_16 L;
+ L nbasins;
+ mln_VAR(wst, morpho::watershed::flooding(clo, world::inter_pixel::e2e(), nbasins));
+
+ std::cout << "nbasins: " << nbasins << std::endl;
+
+ mln_VAR(w_all, wst.unmorph_());
+ //data::fill((w | (!world::inter_pixel::is_separator())).rw(), nbasins.next());
+ mln_VAR(w_pixels, w_all | world::inter_pixel::is_pixel());
+ data::paste(morpho::dilation(extend(w_pixels, pw::value(w_all)), c4().win()), w_all);
+ // edges -> dots
+ mln_VAR(w_dots, w_all | world::inter_pixel::dim2::is_dot());
+ data::paste(morpho::erosion(extend(w_dots, pw::value(w_all)), c4().win()), w_all);
+
+ //io::ppm::save(labeling::colorize(value::rgb8(), w, nbasins.next()),
"result.ppm");
+ io::pgm::save(labeling::wrap(int_u8(), w_all), "watershed.pgm");
+
+
+ // Plots.
+ image2d<L> w_simple = world::inter_pixel::full2image(w_all);
+ plot_label(input, w_simple, 248u);
+ plot_label(input, w_simple, 241u);
+ plot_label(input, w_simple, 238u);
+ plot_label(input, w_simple, 251u);
+ plot_label(input, w_simple, 250u);
+ plot_label(input, w_simple, 249u);
+ plot_label(input, w_simple, 247u);
+ plot_label(input, w_simple, 232u);
+ plot_label(input, w_simple, 252u);
+ plot_label(input, w_simple, 246u);
+ plot_label(input, w_simple, 240u);
+ plot_label(input, w_simple, 237u);
+
return 0;
}
Index: trunk/milena/sandbox/fabien/igr/fixed_seg/main.cc
===================================================================
--- trunk/milena/sandbox/fabien/igr/fixed_seg/main.cc (revision 0)
+++ trunk/milena/sandbox/fabien/igr/fixed_seg/main.cc (revision 3797)
@@ -0,0 +1,271 @@
+#include <algorithm>
+
+#include <mln/core/image/image1d.hh>
+#include <mln/core/image/image2d.hh>
+#include <mln/core/alias/neighb2d.hh>
+#include <mln/core/image/image3d.hh>
+#include <mln/core/image/slice_image.hh>
+#include <mln/core/image/image_if.hh>
+#include <mln/core/routine/duplicate.hh>
+#include <mln/core/routine/extend.hh>
+#include <mln/core/var.hh>
+
+#include <mln/io/dump/all.hh>
+#include <mln/io/pgm/save.hh>
+#include <mln/io/ppm/save.hh>
+
+#include <mln/value/int_u8.hh>
+#include <mln/value/int_u12.hh>
+#include <mln/value/label_16.hh>
+#include <mln/value/rgb8.hh>
+#include <mln/value/float01_8.hh>
+
+#include <mln/accu/sum.hh>
+#include <mln/accu/mean.hh>
+#include <mln/accu/stat/deviation.hh>
+#include <mln/data/fill.hh>
+#include <mln/data/paste.hh>
+#include <mln/debug/quiet.hh>
+#include <mln/convert/from_to.hh>
+#include <mln/fun/v2v/fit.hh>
+#include <mln/labeling/compute.hh>
+#include <mln/labeling/wrap.hh>
+#include <mln/level/compute.hh>
+#include <mln/level/convert.hh>
+#include <mln/level/stretch.hh>
+#include <mln/make/image2d.hh>
+#include <mln/math/diff_abs.hh>
+#include <mln/morpho/dilation.hh>
+#include <mln/morpho/erosion.hh>
+#include <mln/morpho/closing/area.hh>
+#include <mln/morpho/elementary/gradient.hh>
+#include <mln/morpho/watershed/flooding.hh>
+#include <mln/pw/all.hh>
+#include <mln/util/array.hh>
+
+#include <mln/world/inter_pixel/display_edge.hh>
+#include <mln/world/inter_pixel/compute.hh>
+#include <mln/world/inter_pixel/immerse.hh>
+#include <mln/world/inter_pixel/neighb2d.hh>
+#include <mln/world/inter_pixel/all.hh>
+
+#include <mln/labeling/colorize.hh>
+#include <mln/debug/println.hh>
+#include <mln/trace/quiet.hh>
+
+#include "../plot_label.hh"
+
+using namespace mln;
+using value::int_u8;
+using value::int_u12;
+using value::label_16;
+using value::float01_8;
+
+#define SATURATION 0.6
+
+
+
+
+
+// Distance function.
+//-------------------
+
+struct dist_t : Function_vv2v<dist_t>
+{
+ typedef float result;
+
+ template <typename V>
+ float operator()(util::array<V> v1, util::array<V> v2) const
+ {
+ float res = 0.f;
+
+ for (unsigned i = 0; i < v1.nelements(); ++i)
+ res += std::min(v1[i], v2[i]);
+
+ image1d<V> tmp_ima;
+ image1d<V> tmp_ima2;
+ accu::sum<V> accu_sum;
+
+ convert::from_to(v1, tmp_ima);
+ float sum_v1 = level::compute(accu_sum, tmp_ima);
+
+ convert::from_to(v2, tmp_ima2);
+ float sum_v2 = level::compute(accu_sum, tmp_ima2);
+
+ res /= std::max(sum_v1, sum_v2);
+
+ return 1 - res;
+ }
+} dist;
+
+
+
+
+
+
+
+
+int usage(const char* bin)
+{
+ std::cout << "Usage: " << bin << " input.dump
closing" << std::endl;
+ return 1;
+}
+
+int main(int argc, char* argv[])
+{
+ if (argc != 3)
+ return usage(argv[0]);
+
+
+ // Initialization.
+ image3d<int_u12> input;
+ io::dump::load(input, argv[1]);
+ typedef image2d<util::array<int_u12> > I;
+ I ima_arr;
+ initialize(ima_arr, slice(input, 0));
+ for (unsigned int i = 0; i < input.nslices(); ++i)
+ {
+ image2d<int_u12> tmp_slice = duplicate(slice(input, i));
+ mln_piter_(image2d<int_u12>) p(tmp_slice.domain());
+ for_all(p)
+ ima_arr(p).append(tmp_slice(p));
+ }
+
+
+ // Edges image creation.
+ typedef image_if<I, world::inter_pixel::is_pixel> Ix;
+ Ix imax = world::inter_pixel::immerse(ima_arr);
+
+ // Edges distance computation.
+ mln_VAR(edges, world::inter_pixel::compute(imax, dist));
+ mln_VAR(e, level::transform(edges, fun::v2v::fit<float>(SATURATION)));
+ typedef int_u12 E_TYPE;
+
+ {
+ // Display.
+ mln_VAR(display_ima, world::inter_pixel::display_edge(e.unmorph_(), 0.0, 3));
+ io::pgm::save(level::stretch(int_u8(), display_ima), "01_edges.pgm");
+ }
+
+
+
+ // Closing.
+ mln_VAR(clo, morpho::closing::area(e, world::inter_pixel::e2e(), atoi(argv[2])));
+
+ {
+ // Display.
+ mln_VAR(display_clo, world::inter_pixel::display_edge(clo.unmorph_(), 0.0, 3));
+ io::pgm::save(level::stretch(int_u8(), display_clo), "03_closing.pgm");
+ }
+
+
+ // Watershed.
+ typedef label_16 L;
+ L nbasins;
+ mln_VAR(wst, morpho::watershed::flooding(clo, world::inter_pixel::e2e(), nbasins));
+
+ std::cout << "nbasins: " << nbasins << std::endl;
+
+
+ mln_VAR(w_all, wst.unmorph_());
+ //data::fill((w | (!world::inter_pixel::is_separator())).rw(), nbasins.next());
+ mln_VAR(w_pixels, w_all | world::inter_pixel::is_pixel());
+ data::paste(morpho::dilation(extend(w_pixels, pw::value(w_all)), c4().win()), w_all);
+ // edges -> dots
+ mln_VAR(w_dots, w_all | world::inter_pixel::dim2::is_dot());
+ data::paste(morpho::erosion(extend(w_dots, pw::value(w_all)), c4().win()), w_all);
+
+ //io::ppm::save(labeling::colorize(value::rgb8(), w, nbasins.next()),
"result.ppm");
+ io::pgm::save(labeling::wrap(int_u8(), w_all), "watershed.pgm");
+
+
+
+ // Mean distance.
+ accu::mean<E_TYPE> accu_mean;
+ util::array<float> means = labeling::compute(accu_mean, e, wst, nbasins);
+
+ // Display.
+ {
+ typedef image_if<image2d<float>, world::inter_pixel::is_separator> Fsx;
+ Fsx ima_means;
+ initialize(ima_means, wst);
+ data::paste(wst, ima_means);
+ for (unsigned i = 1; i < means.nelements(); ++i)
+ data::fill((ima_means | pw::value(ima_means) == pw::cst(i)).rw(), means[i]);
+ mln_VAR(display_means, world::inter_pixel::display_edge(ima_means.unmorph_(), 0.0,
3));
+ io::pgm::save(level::stretch(int_u8(), display_means), "04_means.pgm");
+ }
+
+
+
+ // Deviation.
+ util::array<accu::stat::deviation<float> > arr_dev;
+ for (unsigned i = 0; i < means.nelements(); ++i)
+ arr_dev.append(accu::stat::deviation<float> (means[i]));
+ util::array<float> deviations = labeling::compute(arr_dev, e, wst, nbasins);
+
+ // Display.
+ {
+ typedef image_if<image2d<float>, world::inter_pixel::is_separator> Fsx;
+ Fsx ima_dev;
+ initialize(ima_dev, wst);
+ data::paste(wst, ima_dev);
+ for (unsigned i = 1; i < deviations.nelements(); ++i)
+ data::fill((ima_dev | pw::value(ima_dev) == pw::cst(i)).rw(), deviations[i]);
+ mln_VAR(display_dev, world::inter_pixel::display_edge(ima_dev.unmorph_(), 0.0, 3));
+ io::pgm::save(level::stretch(int_u8(), display_dev), "05_dev.pgm");
+ }
+
+
+
+ // Plots labels.
+ image2d<L> w_simple = world::inter_pixel::full2image(w_all);
+ plot_label(input, w_simple, 191u);
+ plot_label(input, w_simple, 171u);
+ plot_label(input, w_simple, 188u);
+
+ plot_label(input, w_simple, 16u);
+
+ plot_label(input, w_simple, 187u);
+
+
+
+
+
+
+
+
+
+ /*mln_VAR(clo, morpho::closing::volume(edges | world::inter_pixel::dim2::is_edge(),
world::inter_pixel::e2e(), atoi(argv[2])));
+
+ // Debug.
+ //debug::println("clo", clo);
+
+ // Display.
+ image2d<float> display_ima2 = world::inter_pixel::display_edge(clo.unmorph_(),
0.0, 3);
+ io::pgm::save(level::stretch(int_u8(), display_ima2), "edges2.pgm");
+
+ // Watershed.
+ typedef label_16 L;
+ L nbasins;
+ mln_VAR(wst, morpho::watershed::flooding(clo, world::inter_pixel::e2e(), nbasins));
+
+ // Debug.
+ //debug::println("wst", wst);
+
+ // Extension.
+ image2d<L> w_all = wst.unmorph_();
+ // edges -> pixel
+ mln_VAR(w_pixels, w_all | world::inter_pixel::dim2::is_pixel());
+ data::paste(morpho::dilation(extend(w_pixels, pw::value(w_all)), c4().win()), w_all);
+ // edges -> dots
+ mln_VAR(w_dots, w_all | world::inter_pixel::dim2::is_dot());
+ data::paste(morpho::erosion(extend(w_dots, pw::value(w_all)), c4().win()), w_all);
+
+
+ // Save labels map.
+ std::cout << "nbasins: " << nbasins << std::endl;
+ io::dump::save(wst.unmorph_(), "watershed_fixed.dump");*/
+
+ return 0;
+}
Index: trunk/milena/sandbox/fabien/igr/fixed_seg/Makefile
===================================================================
--- trunk/milena/sandbox/fabien/igr/fixed_seg/Makefile (revision 0)
+++ trunk/milena/sandbox/fabien/igr/fixed_seg/Makefile (revision 3797)
@@ -0,0 +1,9 @@
+include ../Makefile.rules
+
+all: main.cc
+ ${CXX} -I../../../../ ${CXXFLAGS} $^ -o fixed_seg
+
+
+clean:
+ rm -rf *.dump *.p?m *.plot *.log *.csv *.dSYM
+ rm seg_fixed