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_CLOSING_LEVELING_HH
00027 # define MLN_MORPHO_CLOSING_LEVELING_HH
00028 
00032 
00033 # include <mln/morpho/includes.hh>
00034 # include <mln/morpho/leveling_filter.hh>
00035 
00036 
00037 namespace mln
00038 {
00039 
00040   namespace morpho
00041   {
00042 
00043     namespace closing
00044     {
00045 
00047       template <typename I, typename N, typename A>
00048       mln_concrete(I)
00049       leveling(const Image<I>& input, const Neighborhood<N>& nbh,
00050                const Accumulator<A>& accu, const mln_result(A)& lambda);
00051 
00052 
00053 
00054 
00055 # ifndef MLN_INCLUDE_ONLY
00056 
00057 
00058       template <typename I, typename N, typename A>
00059       inline
00060       mln_concrete(I)
00061       leveling(const Image<I>& input, const Neighborhood<N>& nbh,
00062           const Accumulator<A>& accu, const mln_result(A)& lambda)
00063       {
00064         trace::entering("morpho::closing::leveling");
00065 
00066         mln_precondition(exact(input).is_valid());
00067         mln_precondition(mlc_not_equal(mln_trait_accumulator_when_pix(A),
00068               trait::accumulator::when_pix::not_ok)::value);
00069 
00070         mln_concrete(I) output;
00071         output = leveling_filter(input, nbh, accu, lambda,
00072              true);
00073 
00074         mln_postcondition(output >= input);
00075 
00076         trace::exiting("morpho::closing::leveling");
00077         return output;
00078       }
00079 
00080 
00081 # endif // ! MLN_INCLUDE_ONLY
00082 
00083     } 
00084 
00085   } 
00086 
00087 } 
00088 
00089 
00090 #endif // ! MLN_MORPHO_CLOSING_LEVELING_HH