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_THIN_FIT_HH
00027 # define MLN_MORPHO_THIN_FIT_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 thin_fit(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 thin_fit_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_fg.is_centered());
00073 mln_precondition((win_fg && win_bg).is_empty());
00074
00075
00076 (void) input_;
00077 (void) win_fg_;
00078 (void) win_bg_;
00079 }
00080
00081 }
00082
00083
00084 template <typename I, typename Wfg, typename Wbg>
00085 inline
00086 mln_concrete(I)
00087 thin_fit(const Image<I>& input,
00088 const Window<Wfg>& win_fg, const Window<Wbg>& win_bg)
00089 {
00090 trace::entering("morpho::thin_fit");
00091
00092 internal::thin_fit_tests(input, win_fg, win_bg);
00093
00094 mln_concrete(I)
00095 output = morpho::minus( input,
00096 hit_or_miss_opening(input,
00097 win_fg, win_bg) );
00098
00099 trace::exiting("morpho::thin_fit");
00100 return output;
00101 }
00102
00103 # endif // ! MLN_INCLUDE_ONLY
00104
00105 }
00106
00107 }
00108
00109
00110 #endif // ! MLN_MORPHO_THIN_FIT_HH