26 #ifndef MLN_MORPHO_APPROX_EROSION_HH
27 # define MLN_MORPHO_APPROX_EROSION_HH
33 # include <mln/morpho/approx/dilation.hh>
34 # include <mln/logical/not.hh>
48 template <
typename I,
typename W>
50 erosion(const Image<I>& input, const Window<W>& win);
54 # ifndef MLN_INCLUDE_ONLY
67 erosion_by_distance_thresholding_2d(const Image<I>& input_,
68 const Window< win::
disk2d >& win_)
70 trace::entering(
"morpho::approx::impl::erosion_by_distance_thresholding_2d");
72 const I& input = exact(input_);
75 mln_precondition(input.is_valid());
76 mln_precondition(win.is_valid());
78 int ws[] = { 00, 11, 0, 11, 0,
83 const unsigned coef = 5;
86 radius = coef * win.diameter() / 2,
90 mln_concrete(I) background = logical::not_(input);
91 mln_ch_value(I,
unsigned) dmap = transform::distance_front(background,
92 c4(), make::w_window2d_int(ws),
94 mln_concrete(I) output;
95 output =
duplicate((pw::value(dmap) > pw::cst(radius)) | input.domain());
97 trace::exiting("morpho::approx::impl::erosion_by_distance_thresholding_2d");
103 template <typename I>
105 erosion_by_distance_thresholding_3d(const Image<I>& input_,
106 const Window< win::
sphere3d >& win_)
108 trace::entering(
"morpho::approx::impl::erosion_by_distance_thresholding_3d");
110 const I& input = exact(input_);
113 mln_precondition(input.is_valid());
114 mln_precondition(win.is_valid());
116 int ws[] = { 00, 21, 00,
127 const unsigned coef = 12;
130 radius = coef * win.diameter() / 2,
133 mln_concrete(I) background = logical::not_(input);
134 mln_ch_value(I,
unsigned) dmap = transform::distance_front(background,
135 c6(), make::w_window3d_int(ws),
137 mln_concrete(I) output;
138 output =
duplicate((pw::value(dmap) > pw::cst(radius)) | input.domain());
140 trace::exiting("morpho::approx::impl::erosion_by_distance_thresholding_3d");
154 template <
typename I>
156 erosion_dispatch(trait::image::kind::logic,
160 return impl::erosion_by_distance_thresholding_2d(input, win);
163 template <
typename I>
165 erosion_dispatch(trait::image::kind::logic,
169 return impl::erosion_by_distance_thresholding_3d(input, win);
174 template <
typename I,
typename W>
176 erosion_dispatch(const I& input, const W& win)
178 return erosion_dispatch(mln_trait_image_kind(I)(),
187 template <
typename I,
typename W>
190 erosion(const Image<I>& input, const Window<W>& win)
192 trace::entering(
"morpho::approx::erosion");
194 mln_precondition(exact(input).is_valid());
195 mln_precondition(exact(win).is_valid());
197 mln_concrete(I) output;
198 output = internal::erosion_dispatch(exact(input), exact(win));
200 if (exact(win).is_centered())
201 mln_postcondition(output <= input);
203 trace::exiting("morpho::approx::erosion");
208 # endif // ! MLN_INCLUDE_ONLY
217 #endif // ! MLN_MORPHO_APPROX_EROSION_HH