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