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_LAPLACIAN_HH
00027 # define MLN_MORPHO_LAPLACIAN_HH
00028
00036 # include <mln/morpho/includes.hh>
00037
00038
00039 namespace mln
00040 {
00041
00042 namespace morpho
00043 {
00044
00049 template <typename I, typename W, typename O>
00050 void laplacian(const Image<I>& input, const Window<W>& win,
00051 Image<O>& output);
00052
00053
00054 template <typename I, typename W>
00055 mln_trait_op_minus_twice(mln_concrete(I))
00056 laplacian(const Image<I>& input, const Window<W>& win);
00057
00058
00059 # ifndef MLN_INCLUDE_ONLY
00060
00061 template <typename I, typename W, typename O>
00062 inline
00063 void laplacian(const Image<I>& input, const Window<W>& win, Image<O>& output)
00064 {
00065 trace::entering("morpho::laplacian");
00066 mln_precondition(exact(output).domain() == exact(input).domain());
00067 mln_precondition(! exact(win).is_empty());
00068
00069 mln_concrete(I)
00070 d_I = morpho::minus(dilation(input, win), input),
00071 e_I = morpho::minus(input, erosion(input, win));
00072 data::fill(output, d_I - e_I);
00073
00074 trace::exiting("morpho::laplacian");
00075 }
00076
00077 template <typename I, typename W>
00078 inline
00079 mln_trait_op_minus_twice(mln_concrete(I))
00080 laplacian(const Image<I>& input, const Window<W>& win)
00081 {
00082 trace::entering("morpho::laplacian");
00083 mln_precondition(exact(input).is_valid());
00084 mln_precondition(! exact(win).is_empty());
00085
00086 mln_trait_op_minus_twice(mln_concrete(I)) output;
00087 initialize(output, input);
00088 laplacian(input, win, output);
00089
00090 trace::exiting("morpho::laplacian");
00091 return output;
00092 }
00093
00094 # endif // ! MLN_INCLUDE_ONLY
00095
00096 }
00097
00098 }
00099
00100
00101 #endif // ! MLN_MORPHO_LAPLACIAN_HH