r3799: Inim fix bugs related to word croping

URL: https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox ChangeLog: 2009-05-15 Edwin Carlinet <carlinet@lrde.epita.fr> Inim fix bugs related to word croping. * edwin/inim/inim.cc: Add height closing to avoid word to be cropped. * edwin/mln/morpho/tree/filter.hh: Add generic filter to replace filtered components by a user value instead of predefined values. * edwin/rush/exo2/test.cc: Minor fixes. * edwin/rush/exo2/wst_from_tree.cc: Test corrected sharpness with wst. * inim/2011/fredwin: New. --- inim/inim.cc | 62 +++++++++++++++++++++------------------------ mln/morpho/tree/filter.hh | 33 +++++++++++++++++++++++ rush/exo2/test.cc | 29 ++++++++++----------- rush/exo2/wst_from_tree.cc | 42 +++++++++++++++++++++++------- 4 files changed, 109 insertions(+), 57 deletions(-) Index: trunk/milena/sandbox/edwin/rush/exo2/Makefile (deleted) =================================================================== Index: trunk/milena/sandbox/edwin/rush/exo2/test.cc =================================================================== --- trunk/milena/sandbox/edwin/rush/exo2/test.cc (revision 3798) +++ trunk/milena/sandbox/edwin/rush/exo2/test.cc (revision 3799) @@ -1,6 +1,7 @@ #include <mln/morpho/attribute/volume.hh> #include <mln/morpho/attribute/height.hh> -#include <mln/morpho/attribute/sharpness.hh> +#include <mln/morpho/attribute/mysharpness.hh> + #include <mln/morpho/tree/data.hh> #include <mln/morpho/tree/compute_attribute_image.hh> #include <mln/level/sort_psites.hh> @@ -12,8 +13,8 @@ #include <mln/core/alias/neighb1d.hh> #include <mln/value/int_u8.hh> -#include "../../tree/components.hh" -#include "../../tree/propagate.hh" +#include <mln/morpho/tree/components.hh> +#include <mln/morpho/tree/propagate.hh> #include <mln/fun/p2v/ternary.hh> #include <mln/pw/all.hh> @@ -104,28 +105,28 @@ { typedef mln_ch_value_(I, double) A; - typedef morpho::attribute::sharpness<I> attribute_t; A a, component_img; // Attribute Pruning - a = morpho::tree::compute_attribute_image(attribute_t (), t); + a = morpho::attribute::mysharpness(t); + morpho::tree::propagate_representative(t, a); debug::println("sharpness", a); // Component filtering - a = duplicate((fun::p2v::ternary(pw::value(height) > pw::cst(2), - pw::value(a), - pw::cst(0.0))) | a.domain()); + // a = duplicate((fun::p2v::ternary(pw::value(height) > pw::cst(2), +// pw::value(a), +// pw::cst(0.0))) | a.domain()); - debug::println("sharpness", a); + //debug::println("sharpness", a); - p_array< mln_psite_(A) > obj_array; - obj_array = morpho::tree::get_components(t, a); - std::cout << obj_array.nsites() << std::endl; +// p_array< mln_psite_(A) > obj_array; +// obj_array = morpho::tree::get_components(t, a); +// std::cout << obj_array.nsites() << std::endl; - component_img = morpho::tree::propagate_components(a, t, obj_array, 0); +// component_img = morpho::tree::propagate_components(a, t, obj_array, 0); - debug::println("sharpness", component_img); +// debug::println("sharpness", component_img); } Index: trunk/milena/sandbox/edwin/rush/exo2/wst_from_tree.cc =================================================================== --- trunk/milena/sandbox/edwin/rush/exo2/wst_from_tree.cc (revision 3798) +++ trunk/milena/sandbox/edwin/rush/exo2/wst_from_tree.cc (revision 3799) @@ -53,11 +53,12 @@ /* Tree computation */ #include <mln/level/sort_psites.hh> #include <mln/morpho/tree/data.hh> -#include "../../tree/propagate.hh" -#include "../../tree/components.hh" +#include <mln/morpho/tree/propagate.hh> +#include <mln/morpho/tree/propagate_if.hh> +#include <mln/morpho/tree/components.hh> #include <mln/morpho/tree/compute_attribute_image.hh> -#include <mln/morpho/attribute/sharpness.hh> +#include <mln/morpho/attribute/mysharpness.hh> /* pw */ #include <mln/core/concept/function.hh> @@ -103,6 +104,27 @@ { return height_wrapper_<P2V>(f); } + + template <typename T, typename F, typename P2B> + inline + void + mymin(const T& tree, Image<F>& f_, const Function_p2b<P2B>& pred_) + { + F& f = exact(f_); + const P2B& pred = exact(pred_); + + mln_ch_value(F, bool) mark; + initialize(mark, f); + mln::data::fill(mark, false); + + mln_dn_node_piter(T) n(tree); + for_all(n) + if (mark(tree.parent(n)) || !pred(tree.parent(n))) + { + f(n) = 0.0; + mark(n) = true; + } + } } @@ -176,17 +198,17 @@ typedef mln_ch_value_(I, double) A; A a; { - typedef morpho::attribute::sharpness<I> sharp_t; - typedef mln_ch_value_(I, sharp_t) B; + typedef mln_ch_value_(I, unsigned) H; // Attribute Pruning - B a_img; - a = morpho::tree::compute_attribute_image(sharp_t (), t, &a_img); + H h_img; + a = morpho::attribute::mysharpness(t, &h_img); // Component filtering - a = duplicate((fun::p2v::ternary(height_wrapper(pw::value(a_img)) > pw::cst(lambda_h), - pw::value(a), - pw::cst(0.0))) | a.domain()); + + // this should use a filter from morpho/tree/filter with the predicate on the height of the parent + // so use function composition but ... + mymin(t, a, pw::value(h_img) > pw::cst(lambda_h)); } /************************************************/ Index: trunk/milena/sandbox/edwin/mln/morpho/tree/filter.hh =================================================================== --- trunk/milena/sandbox/edwin/mln/morpho/tree/filter.hh (revision 3798) +++ trunk/milena/sandbox/edwin/mln/morpho/tree/filter.hh (revision 3799) @@ -37,7 +37,7 @@ ** predicate as well. In this case, all strategies have the same ** result but min filter or direct filter should be used in term ** of performance. If a predicate test is not enough fast, then -** prefer the min filter that minimizes call to predicate. +** prefer the min filter that minimizes calls to predicate. */ # include <mln/core/concept/function.hh> @@ -49,11 +49,19 @@ namespace tree { namespace filter { + + template <typename T, typename F, typename P2B> + inline + void + filter(const T& tree, Image<F>& f_, const Function_p2b<P2B>& pred_, const mln_value(F)& v); + + template <typename T, typename F, typename P2B> inline void min(const T& tree, Image<F>& f_, const Function_p2b<P2B>& pred_); + template <typename T, typename F, typename P2B> inline void @@ -102,6 +110,29 @@ } + template <typename T, typename F, typename P2B> + inline + void + filter(const T& tree, Image<F>& f_, const Function_p2b<P2B>& pred_, const mln_value(F)& v) + { + F& f = exact(f_); + const P2B& pred = exact(pred_); + + //FIXME precondition + mln_ch_value(F, bool) mark; + initialize(mark, f); + mln::data::fill(mark, false); + + mln_dn_node_piter(T) n(tree); + for_all(n) + if (mark(tree.parent(n)) || !pred(n)) + { + f(n) = v; + mark(n) = true; + } + //FIXME postcondition + } + template <typename T, typename F, typename P2B> inline Index: trunk/milena/sandbox/edwin/inim/inim.cc =================================================================== --- trunk/milena/sandbox/edwin/inim/inim.cc (revision 3798) +++ trunk/milena/sandbox/edwin/inim/inim.cc (revision 3799) @@ -20,12 +20,13 @@ #include <mln/morpho/tree/compute_attribute_image.hh> #include <mln/morpho/tree/propagate.hh> #include <mln/morpho/tree/components.hh> +#include <mln/morpho/tree/filter.hh> /* Attributes */ #include <mln/transform/distance_front.hh> #include <mln/morpho/attribute/bbox.hh> #include <mln/morpho/attribute/card.hh> -#include <mln/morpho/attribute/volume.hh> +#include <mln/morpho/attribute/height.hh> #include <mln/make/w_window2d_int.hh> /* io */ @@ -60,7 +61,7 @@ void usage(char** argv) { - std::cerr << "usage: " << argv[0] << " input [--debug] [-n nbr_components | -t treshold] [-c card]" << std::endl; + std::cerr << "usage: " << argv[0] << " input [--debug] [-n nbr_components | -t treshold] [-h height]" << std::endl; abort(); } @@ -112,7 +113,7 @@ std::string arg; unsigned nb_components = 0; - unsigned card = 0; + unsigned height = 15; double treshold = 0; if (argc < 2) @@ -127,8 +128,8 @@ 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 == "-h" && i != argc) + height = atoi(argv[++i]); else if (arg == "--trace") trace::quiet = false; else @@ -142,6 +143,10 @@ image2d<bool> input_; io::pbm::load(input_, argv[1]); + if (mydebug) { + dsp("Distance geodesic"); + } + /* Work on geodesic distance image */ I input; { @@ -156,8 +161,7 @@ } if (mydebug) { - dsp("Distance geodesic"); - + dsp("Component tree computation"); } /* Component tree creation */ @@ -167,36 +171,32 @@ S sorted_sites = level::sort_psites_decreasing(input); tree_t tree(input, sorted_sites, c4()); + + if (mydebug) { + dsp("Attribute image computation"); + } + /* Compute Attribute On Image */ typedef morpho::attribute::bbox<I> bbox_t; - typedef morpho::attribute::volume<I> card_t; + typedef morpho::attribute::card<I> card_t; + typedef morpho::attribute::height<I> height_t; typedef mln_ch_value_(I, double) A; mln_VAR(attr_image, morpho::tree::compute_attribute_image(bbox_t (), tree)); 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()); - - if (card) - { - if (mydebug) - dsp("Image card attribute"); - - a = duplicate((fun::p2v::ternary(pw::value(card_image) > pw::cst(card), - pw::value(a), - pw::cst(0.0))) | a.domain()); - } - - if (mydebug) { - dsp("Image sharp attribute"); - } + mln_VAR(height_image, morpho::tree::compute_attribute_image(height_t (), tree)); + A a = duplicate(ratio(pw::value(attr_image), pw::value(card_image)) | attr_image.domain()); + if (height) + morpho::tree::filter::filter(tree, a, pw::value(height_image) > pw::cst(height), 0.0); /* Run max accumulator */ p_array< mln_psite_(A) > obj_array; // Array of object components. if (mydebug) { - std::stringstream s("Run max accumulator, look for ", std::stringstream::out|std::stringstream::in| + std::stringstream s("Run max accumulator, look for ", + std::stringstream::out|std::stringstream::in| std::stringstream::ate); if (nb_components) s << nb_components << " components."; @@ -224,20 +224,16 @@ std::cout << c; } - /* Now Back Propagate to component */ - typedef mln_ch_value_(I, bool) M; - M mask = morpho::tree::set_value_to_components(tree, obj_array, true, false); - - // mask now contains all nodes related to objects if (mydebug) { dsp("Create mask and propagate"); } - a = morpho::tree::propagate_components(a, tree, obj_array, 0); - mln_VAR(output_, level::stretch(int_u8(), a)); //adapt to 0-255 - io::pgm::save(output_, "components.pgm"); + /* Now Back Propagate to component */ + typedef mln_ch_value_(I, bool) M; + M mask = morpho::tree::set_value_to_components(tree, obj_array, true, false); + a = morpho::tree::propagate_components(a, tree, obj_array, 0); /* Labeling */ typedef mln_ch_value_(I, value::label<8>) L; @@ -245,6 +241,7 @@ value::label_8 nlabel; L label = labeling::blobs(mask, c4(), nlabel); O output = labeling::colorize(value::rgb8(), label, nlabel); + if (mydebug) io::ppm::save(output, "label.pgm"); /* Now store output image image */ @@ -259,6 +256,7 @@ for_all(it) { std::cout << it << " :: " << attr_image(it).pmin() << " -> " << a(it) + << " (h: " << height_image(it) << ")" << std::endl; draw::box(out, attr_image(it), literal::red_t ());
participants (1)
-
Edwin Carlinet