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