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_SUBTRACTIVE_HH
00027 # define MLN_MORPHO_TREE_FILTER_SUBTRACTIVE_HH
00028
00029 # include <mln/core/concept/function.hh>
00030 # include <mln/fun/ops.hh>
00031
00032 # include <mln/morpho/tree/data.hh>
00033 # include <mln/morpho/tree/propagate_if.hh>
00034
00043 namespace mln
00044 {
00045
00046 namespace morpho
00047 {
00048
00049 namespace tree
00050 {
00051
00052 namespace filter
00053 {
00054
00064 template <typename T, typename F, typename P>
00065 inline
00066 void
00067 subtractive(const T& tree, Image<F>& f_, const Function_v2b<P>& pred_);
00068
00069
00070
00071
00072 # ifndef MLN_INCLUDE_ONLY
00073
00074 template <typename T, typename F, typename P>
00075 inline
00076 void
00077 subtractive(const T& tree, Image<F>& f_, const Function_v2b<P>& pred_)
00078 {
00079 F& f = exact(f_);
00080 const P& pred = exact(pred_);
00081
00082 trace::entering("mln::morpho::tree::filter::subtractive");
00083
00084 morpho::tree::propagate_if(tree, f, morpho::tree::desc_propagation (), !pred);
00085
00086 mln_up_node_piter(T) n(tree);
00087 for_all(n)
00088 if (!pred(n))
00089 f(n) = f(tree.parent(n));
00090
00091 trace::exiting("mln::morpho::tree::filter::subtractive");
00092 }
00093
00094 # endif // ! MLN_INCLUDE_ONLY
00095
00096 }
00097 }
00098 }
00099 }
00100
00101 #endif // ! MLN_MORPHO_TREE_FILTER_SUBTRACTIVE_HH