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_MAX_HH
00027 # define MLN_MORPHO_TREE_FILTER_MAX_HH
00028
00029 # include <mln/core/concept/function.hh>
00030 # include <mln/morpho/tree/data.hh>
00031
00040 namespace mln
00041 {
00042
00043 namespace morpho
00044 {
00045
00046 namespace tree
00047 {
00048
00049 namespace filter
00050 {
00051
00061 template <typename T, typename F, typename P>
00062 inline
00063 void
00064 max(const T& tree, Image<F>& f_, const Function_v2b<P>& pred_);
00065
00066
00067
00068
00069 # ifndef MLN_INCLUDE_ONLY
00070
00071 template <typename T, typename F, typename P>
00072 inline
00073 void
00074 max(const T& tree, Image<F>& f_, const Function_v2b<P>& pred_)
00075 {
00076 F& f = exact(f_);
00077 const P& pred = exact(pred_);
00078
00079 trace::entering("mln::morpho::tree::filter::max");
00080
00081 mln_ch_value(F, bool) mark;
00082 initialize(mark, f);
00083 mln::data::fill(mark, true);
00084
00085 {
00086 mln_up_node_piter(T) n(tree);
00087 for_all(n)
00088 if (!mark(n))
00089 mark(tree.parent(n)) = false;
00090 else if (pred(n))
00091 {
00092 mark(tree.parent(n)) = false;
00093 mark(n) = false;
00094 }
00095 }
00096
00097 {
00098 mln_dn_node_piter(T) n(tree);
00099 for_all(n)
00100 if (mark(n))
00101 f(n) = f(tree.parent(n));
00102 }
00103
00104 trace::exiting("mln::morpho::tree::filter::max");
00105 }
00106
00107 # endif // ! MLN_INCLUDE_ONLY
00108
00109 }
00110
00111 }
00112
00113 }
00114
00115 }
00116
00117 #endif // ! MLN_MORPHO_TREE_FILTER_MAX_HH