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_GRADIENT_HH
00027 # define MLN_MORPHO_GRADIENT_HH
00028
00039
00040 # include <mln/morpho/includes.hh>
00041
00042
00043 namespace mln
00044 {
00045
00046 namespace morpho
00047 {
00048
00052 template <typename I, typename W>
00053 mln_concrete(I) gradient(const Image<I>& input, const Window<W>& win);
00054
00055
00059 template <typename I, typename W>
00060 mln_concrete(I) gradient_internal(const Image<I>& input, const Window<W>& win);
00061
00062
00066 template <typename I, typename W>
00067 mln_concrete(I) gradient_external(const Image<I>& input, const Window<W>& win);
00068
00069
00070
00071 # ifndef MLN_INCLUDE_ONLY
00072
00073
00074 template <typename I, typename W>
00075 inline
00076 mln_concrete(I) gradient(const Image<I>& input, const Window<W>& win)
00077 {
00078 trace::entering("morpho::gradient");
00079 mln_precondition(exact(input).is_valid());
00080 mln_precondition(! exact(win).is_empty());
00081
00082 mln_concrete(I) output = morpho::minus(dilation(input, win),
00083 erosion(input, win));
00084
00085 mln_postcondition(test::positive(output));
00086 trace::exiting("morpho::gradient");
00087 return output;
00088 }
00089
00090
00091 template <typename I, typename W>
00092 inline
00093 mln_concrete(I) gradient_internal(const Image<I>& input, const Window<W>& win)
00094 {
00095 trace::entering("morpho::gradient_internal");
00096 mln_precondition(exact(input).is_valid());
00097 mln_precondition(! exact(win).is_empty());
00098
00099 mln_concrete(I) output = morpho::minus(input,
00100 erosion(input, win));
00101
00102 mln_postcondition(test::positive(output));
00103 trace::exiting("morpho::gradient_internal");
00104 return output;
00105 }
00106
00107
00108 template <typename I, typename W>
00109 inline
00110 mln_concrete(I) gradient_external(const Image<I>& input, const Window<W>& win)
00111 {
00112 trace::entering("morpho::gradient_external");
00113 mln_precondition(exact(input).is_valid());
00114 mln_precondition(! exact(win).is_empty());
00115
00116 mln_concrete(I) output = morpho::minus(dilation(input, win),
00117 input);
00118
00119 mln_postcondition(test::positive(output));
00120 trace::exiting("morpho::gradient_external");
00121 return output;
00122 }
00123
00124 # endif // ! MLN_INCLUDE_ONLY
00125
00126 }
00127
00128 }
00129
00130
00131 #endif // ! MLN_MORPHO_GRADIENT_HH