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_THICKENING_HH
00027 # define MLN_MORPHO_THICKENING_HH
00028
00034 # include <mln/morpho/hit_or_miss.hh>
00035
00036
00037 namespace mln
00038 {
00039
00040 namespace morpho
00041 {
00042
00043
00048 template <typename I, typename Wfg, typename Wbg>
00049 mln_concrete(I)
00050 thickening(const Image<I>& input,
00051 const Window<Wfg>& win_fg, const Window<Wbg>& win_bg);
00052
00053
00054 # ifndef MLN_INCLUDE_ONLY
00055
00056 namespace internal
00057 {
00058
00059 template <typename I, typename Wfg, typename Wbg>
00060 inline
00061 void
00062 thickening_tests(const Image<I>& input_,
00063 const Window<Wfg>& win_fg_,
00064 const Window<Wbg>& win_bg_)
00065 {
00066 const I& input = exact(input_);
00067 const Wfg& win_fg = exact(win_fg_);
00068 const Wbg& win_bg = exact(win_bg_);
00069
00070
00071 mln_precondition(input.is_valid());
00072 mln_precondition(win_bg.is_centered());
00073 mln_precondition(! win_fg.is_empty());
00074 mln_precondition((win_fg && win_bg).is_empty());
00075
00076
00077 (void) input_;
00078 (void) win_fg_;
00079 (void) win_bg_;
00080 }
00081
00082 }
00083
00084
00085 template <typename I, typename Wfg, typename Wbg>
00086 inline
00087 mln_concrete(I)
00088 thickening(const Image<I>& input,
00089 const Window<Wfg>& win_fg, const Window<Wbg>& win_bg)
00090 {
00091 trace::entering("morpho::thickening");
00092
00093 internal::thickening_tests(input, win_fg, win_bg);
00094
00095 mln_concrete(I) output = morpho::plus( input,
00096 hit_or_miss(input, win_fg, win_bg) );
00097
00098 trace::exiting("morpho::thickening");
00099 return output;
00100 }
00101
00102 # endif // ! MLN_INCLUDE_ONLY
00103
00104 }
00105
00106 }
00107
00108
00109 #endif // ! MLN_MORPHO_THICKENING_HH