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_ELEMENTARY_GRADIENT_INTERNAL_HH
00027 # define MLN_MORPHO_ELEMENTARY_GRADIENT_INTERNAL_HH
00028 
00032 
00033 # include <mln/morpho/elementary/like_ero_fun.hh>
00034 # include <mln/morpho/elementary/like_ero_set.hh>
00035 
00036 
00037 namespace mln
00038 {
00039 
00040   namespace morpho
00041   {
00042 
00043     namespace elementary
00044     {
00045 
00046 
00047       template <typename I, typename N>
00048       mln_concrete(I)
00049       gradient_internal(const Image<I>& input, const Neighborhood<N>& nbh);
00050 
00051 
00052 # ifndef MLN_INCLUDE_ONLY
00053 
00054       namespace internal
00055       {
00056 
00057         struct f_grad_int
00058         {
00059           template <typename V, typename A>
00060           V operator()(const V& input_p, const A& a) const
00061           {
00062             return input_p - a.to_result();
00063           }
00064         };
00065 
00066         
00067 
00068         template <typename I, typename N>
00069         mln_concrete(I)
00070         gradient_internal_dispatch(trait::image::kind::any,
00071                          const Image<I>& input, const Neighborhood<N>& nbh)
00072         {
00073           return like_ero_fun(accu::meta::stat::min(), f_grad_int(), input, nbh);
00074         }
00075 
00076         template <typename I, typename N>
00077         mln_concrete(I)
00078         gradient_internal_dispatch(trait::image::kind::logic,
00079                                    const Image<I>& input, const Neighborhood<N>& nbh)
00080         {
00081           bool val[] =
00082             {
00083               1, 
00084               0, 
00085               1, 
00086               0, 
00087               1, 
00088             };
00089           return like_ero_set(val, input, nbh);
00090         }
00091 
00092         template <typename I, typename N>
00093         mln_concrete(I)
00094         gradient_internal_dispatch(const Image<I>& input, const Neighborhood<N>& nbh)
00095         {
00096           return gradient_internal_dispatch(mln_trait_image_kind(I)(),
00097                                             input, nbh);
00098         }
00099 
00100       } 
00101 
00102 
00103       
00104 
00105       template <typename I, typename N>
00106       mln_concrete(I)
00107       gradient_internal(const Image<I>& input, const Neighborhood<N>& nbh)
00108       {
00109         trace::entering("morpho::elementary::gradient_internal");
00110 
00111         mln_precondition(exact(input).is_valid());
00112         mln_precondition(exact(nbh).is_valid());
00113 
00114         mln_concrete(I) output = internal::gradient_internal_dispatch(input, nbh);
00115 
00116         mln_postcondition(output <= input);
00117         trace::exiting("morpho::elementary::gradient_internal");
00118         return output;
00119       }
00120 
00121 # endif // ! MLN_INCLUDE_ONLY
00122 
00123     } 
00124 
00125   } 
00126 
00127 } 
00128 
00129 
00130 #endif // ! MLN_MORPHO_ELEMENTARY_GRADIENT_INTERNAL_HH