
* fabien/igr/plot_label.hh: Implement plot_label() for fixed segmentation. * fabien/igr/seg_fixed.cc: Add plot_label() calls. --- milena/sandbox/ChangeLog | 7 ++++ milena/sandbox/fabien/igr/plot_label.hh | 58 +++++++++++++++++++++++++++++++ milena/sandbox/fabien/igr/seg_fixed.cc | 45 +++++++++++++++++++---- 3 files changed, 102 insertions(+), 8 deletions(-) create mode 100644 milena/sandbox/fabien/igr/plot_label.hh diff --git a/milena/sandbox/ChangeLog b/milena/sandbox/ChangeLog index 3cffc50..880ff36 100644 --- a/milena/sandbox/ChangeLog +++ b/milena/sandbox/ChangeLog @@ -1,3 +1,10 @@ +2009-05-11 Fabien Freling <fabien.freling@lrde.epita.fr> + + Plot labels in fixed watershed. + * fabien/igr/plot_label.hh: Implement plot_label() for + fixed segmentation. + * fabien/igr/seg_fixed.cc: Add plot_label() calls. + 2009-05-10 Edwin Carlinet <carlinet@lrde.epita.fr> Make clean in tree files and procedures. diff --git a/milena/sandbox/fabien/igr/plot_label.hh b/milena/sandbox/fabien/igr/plot_label.hh new file mode 100644 index 0000000..47fefdb --- /dev/null +++ b/milena/sandbox/fabien/igr/plot_label.hh @@ -0,0 +1,58 @@ +#ifndef PLOT_LABEL_HH +# define PLOT_LABEL_HH + +#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/geom/bbox.hh> + +#include <mln/io/plot/save.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> + + +using namespace mln; + + + +template <typename I, typename L, typename V> +inline +void plot_label(image3d<I>& ima, image2d<L>& ima_labels, V lbl) +{ + typedef image_if<image2d<L>, mln::fun::eq_p2b_expr_<pw::value_<image2d<L> >, pw::cst_<V> > > Lx; + Lx ima_label = ima_labels | pw::value(ima_labels) == pw::cst(lbl); + util::array<float> arr; + int sli_min = geom::bbox(ima).pmin().sli(); + int sli_max = geom::bbox(ima).pmax().sli(); + + for (int sli = sli_min; sli <= sli_max; ++sli) + { + image2d<I> slice_ima = duplicate(slice(ima, sli)); + accu::mean<I> accu_mean; + float mean = level::compute(accu_mean, slice_ima | ima_label.domain()); + arr.append(mean); + } + + std::ostringstream slabel; + slabel << "label_"; + if (lbl < 100) + slabel << "0"; + if (lbl < 10) + slabel << "0"; + // FIXME: insert label location + slabel << lbl << ".plot"; + io::plot::save(arr, slabel.str()); +} + + + +#endif // ! PLOT_LABEL_HH diff --git a/milena/sandbox/fabien/igr/seg_fixed.cc b/milena/sandbox/fabien/igr/seg_fixed.cc index 2f2acbe..ca89c84 100644 --- a/milena/sandbox/fabien/igr/seg_fixed.cc +++ b/milena/sandbox/fabien/igr/seg_fixed.cc @@ -25,7 +25,9 @@ #include <mln/data/paste.hh> #include <mln/debug/quiet.hh> #include <mln/convert/from_to.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> @@ -41,11 +43,13 @@ #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/is_pixel.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; @@ -152,7 +156,7 @@ dist_on_edges(image2d<util::array<I> >& ima_arr) // Dummy. -/////////////////////////////////////////////////////////////////////////////// +//------- template <typename I, typename N> inline image2d<int> @@ -194,13 +198,14 @@ struct dist_t : Function_vv2v<dist_t> 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_ima); - float sum_v2 = 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); @@ -282,10 +287,34 @@ int main(int argc, char* argv[]) L nbasins; mln_VAR(wst, morpho::watershed::flooding(clo, world::inter_pixel::e2e(), nbasins)); - mln_VAR(w, wst.unmorph_()); - data::fill((w | (!world::inter_pixel::is_separator())).rw(), nbasins.next()); - io::ppm::save(labeling::colorize(value::rgb8(), w, nbasins.next()), "result.ppm"); + 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), "result_labels.pgm"); + + + // Plots. + image2d<L> w_simple = world::inter_pixel::full2image(w_all); + plot_label(input, w_simple, 166u); + plot_label(input, w_simple, 182u); + plot_label(input, w_simple, 188u); + plot_label(input, w_simple, 189u); + plot_label(input, w_simple, 193u); + plot_label(input, w_simple, 195u); + plot_label(input, w_simple, 196u); + plot_label(input, w_simple, 198u); + plot_label(input, w_simple, 199u); + plot_label(input, w_simple, 200u); + plot_label(input, w_simple, 201u); -- 1.6.1.2