00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_MORPHO_TREE_FILTER_MIN_HH
00027 # define MLN_MORPHO_TREE_FILTER_MIN_HH
00028
00029 # include <mln/core/concept/function.hh>
00030 # include <mln/morpho/tree/data.hh>
00031
00032
00041 namespace mln
00042 {
00043
00044 namespace morpho
00045 {
00046
00047 namespace tree
00048 {
00049
00050 namespace filter
00051 {
00052
00053
00062 template <typename T, typename F, typename P>
00063 inline
00064 void
00065 min(const T& tree, Image<F>& f_, const Function_v2b<P>& pred_);
00066
00067
00068
00069
00070 # ifndef MLN_INCLUDE_ONLY
00071
00072 template <typename T, typename F, typename P>
00073 inline
00074 void
00075 min(const T& tree, Image<F>& f_, const Function_v2b<P>& pred_)
00076 {
00077 F& f = exact(f_);
00078 const P& pred = exact(pred_);
00079
00080 trace::entering("mln::morpho::tree::filter::min");
00081
00082 mln_ch_value(F, bool) mark;
00083 initialize(mark, f);
00084 mln::data::fill(mark, false);
00085
00086 mln_dn_node_piter(T) n(tree);
00087 for_all(n)
00088 if (mark(tree.parent(n)) || !pred(n))
00089 {
00090 f(n) = f(tree.parent(n));
00091 mark(n) = true;
00092 }
00093
00094 trace::exiting("mln::morpho::tree::filter::min");
00095 }
00096
00097 # endif // ! MLN_INCLUDE_ONLY
00098
00099 }
00100
00101 }
00102
00103 }
00104
00105 }
00106
00107 #endif // ! MLN_MORPHO_TREE_FILTER_MIN_HH