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_EXTERNAL_HH
00027 # define MLN_MORPHO_ELEMENTARY_GRADIENT_EXTERNAL_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_external(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_ext
00058         {
00059           template <typename V, typename A>
00060           V operator()(const V& input_p, const A& a) const
00061           {
00062             return a.to_result() - input_p;
00063           }
00064         };
00065 
00066         
00067 
00068         template <typename I, typename N>
00069         mln_concrete(I)
00070         gradient_external_dispatch(trait::image::kind::any,
00071                          const Image<I>& input, const Neighborhood<N>& nbh)
00072         {
00073           return like_ero_fun(accu::meta::stat::max(), f_grad_ext(), input, nbh);
00074         }
00075 
00076         template <typename I, typename N>
00077         mln_concrete(I)
00078         gradient_external_dispatch(trait::image::kind::logic,
00079                                    const Image<I>& input, const Neighborhood<N>& nbh)
00080         {
00081           bool val[] =
00082             {
00083               0, 
00084               0, 
00085               0, 
00086               1, 
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_external_dispatch(const Image<I>& input, const Neighborhood<N>& nbh)
00095         {
00096           return gradient_external_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_external(const Image<I>& input, const Neighborhood<N>& nbh)
00108       {
00109         trace::entering("morpho::elementary::gradient_external");
00110 
00111         mln_precondition(exact(input).is_valid());
00112         mln_precondition(exact(nbh).is_valid());
00113 
00114         mln_concrete(I) output = internal::gradient_external_dispatch(input, nbh);
00115 
00116         trace::exiting("morpho::elementary::gradient_external");
00117         return output;
00118       }
00119 
00120 # endif // ! MLN_INCLUDE_ONLY
00121 
00122     } 
00123 
00124   } 
00125 
00126 } 
00127 
00128 
00129 #endif // ! MLN_MORPHO_ELEMENTARY_GRADIENT_EXTERNAL_HH