27 #ifndef MLN_MORPHO_APPROX_EROSION_HH
28 # define MLN_MORPHO_APPROX_EROSION_HH
34 # include <mln/morpho/approx/dilation.hh>
35 # include <mln/logical/not.hh>
52 template <
typename I,
typename W>
54 erosion(const Image<I>& input, const Window<W>&
win);
58 # ifndef MLN_INCLUDE_ONLY
71 erosion_by_distance_thresholding_2d(const Image<I>& input_,
72 const Window< win::disk2d >& win_)
74 mln_trace(
"morpho::approx::impl::erosion_by_distance_thresholding_2d");
76 const I& input =
exact(input_);
77 const win::disk2d& win =
exact(win_);
79 mln_precondition(input.is_valid());
80 mln_precondition(win.is_valid());
82 int ws[] = { 00, 11, 0, 11, 0,
87 const unsigned coef = 5;
90 radius = coef * win.diameter() / 2,
96 c4(), make::w_window2d_int(ws),
98 mln_concrete(I) output;
99 output =
duplicate((pw::
value(dmap) > pw::cst(radius)) | input.domain());
106 template <typename I>
108 erosion_by_distance_thresholding_3d(const Image<I>& input_,
109 const Window< win::sphere3d >& win_)
111 mln_trace(
"morpho::approx::impl::erosion_by_distance_thresholding_3d");
113 const I& input =
exact(input_);
114 const win::sphere3d& win =
exact(win_);
116 mln_precondition(input.is_valid());
117 mln_precondition(win.is_valid());
119 int ws[] = { 00, 21, 00,
130 const unsigned coef = 12;
133 radius = coef * win.diameter() / 2,
136 mln_concrete(I) background = logical::
not_(input);
138 c6(), make::w_window3d_int(ws),
140 mln_concrete(I) output;
141 output =
duplicate((pw::
value(dmap) > pw::cst(radius)) | input.domain());
156 template <
typename I>
158 erosion_dispatch(trait::image::kind::logic,
160 const win::disk2d& win)
162 return impl::erosion_by_distance_thresholding_2d(input, win);
165 template <
typename I>
167 erosion_dispatch(trait::image::kind::logic,
169 const win::sphere3d& win)
171 return impl::erosion_by_distance_thresholding_3d(input, win);
176 template <
typename I,
typename W>
178 erosion_dispatch(const I& input, const W& win)
180 return erosion_dispatch(mln_trait_image_kind(I)(),
189 template <
typename I,
typename W>
192 erosion(const Image<I>& input, const Window<W>& win)
194 mln_trace(
"morpho::approx::erosion");
196 mln_precondition(
exact(input).is_valid());
197 mln_precondition(
exact(win).is_valid());
199 mln_concrete(I) output;
200 output = internal::erosion_dispatch(
exact(input),
exact(win));
202 if (
exact(win).is_centered())
203 mln_postcondition(output <= input);
209 # endif // ! MLN_INCLUDE_ONLY
218 #endif // ! MLN_MORPHO_APPROX_EROSION_HH