27 #ifndef MLN_MORPHO_HIT_OR_MISS_HH
28 # define MLN_MORPHO_HIT_OR_MISS_HH
36 # include <mln/morpho/includes.hh>
37 # include <mln/pw/all.hh>
38 # include <mln/fun/p2v/ternary.hh>
39 # include <mln/fun/cast.hh>
40 # include <mln/literal/zero.hh>
58 template <
typename I,
typename Wh,
typename Wm>
61 const Window<Wh>& win_hit, const Window<Wm>& win_miss);
69 template <typename I, typename Wh, typename Wm>
72 const Window<Wh>& win_hit, const Window<Wm>& win_miss);
80 template <typename I, typename Wh, typename Wm>
83 const Window<Wh>& win_hit, const Window<Wm>& win_miss);
91 template <typename I, typename Wh, typename Wm>
94 const Window<Wh>& win_hit, const Window<Wm>& win_miss);
102 template <typename I, typename Wh, typename Wm>
105 const Window<Wh>& win_hit, const Window<Wm>& win_miss);
109 # ifndef MLN_INCLUDE_ONLY
111 # ifndef MLN_WO_GLOBAL_VARS
115 # endif // ! MLN_WO_GLOBAL_VARS
120 template <
typename I,
typename Wh,
typename Wm>
123 hit_or_miss_tests(
const Image<I>& input_,
124 const Window<Wh>& win_hit_,
125 const Window<Wm>& win_miss_)
127 const I& input =
exact(input_);
128 const Wh& win_hit =
exact(win_hit_);
129 const Wm& win_miss =
exact(win_miss_);
132 mln_precondition(input.is_valid());
133 mln_precondition((win_hit && win_miss).is_empty());
149 template <
typename I,
typename Wh,
typename Wm>
152 hit_or_miss_logic(const Image<I>& input,
153 const Window<Wh>& win_hit,
154 const Window<Wm>& win_miss)
156 mln_trace(
"morpho::impl::hit_or_miss_logic");
157 internal::hit_or_miss_tests(input, win_hit, win_miss);
159 mln_concrete(I) output = logical::
and_(
erosion(input, win_hit),
173 template <
typename I,
typename Wh,
typename Wm>
177 const Window<Wh>& win_hit_,
178 const Window<Wm>& win_miss_)
180 mln_trace(
"morpho::impl::generic::hit_or_miss");
181 internal::hit_or_miss_tests(input_, win_hit_, win_miss_);
183 const I& input =
exact(input_);
184 const Wh& win_hit =
exact(win_hit_);
185 const Wm& win_miss =
exact(win_miss_);
187 typedef mln_value(I) V;
188 mln_value(I) zero_V = literal::zero;
190 mln_concrete(I) output;
195 if (win_hit.is_centered())
198 ero_fg =
erosion(input, win_hit),
201 fun::p2v::ternary(pw::
value(input) == pw::
value(ero_fg)
203 fun::cast<V>(pw::
value(input) - pw::
value(dil_bg)),
206 else if (win_miss.is_centered())
209 ero_bg =
erosion(input, win_miss),
212 fun::p2v::ternary(pw::
value(input) == pw::
value(dil_fg)
214 fun::cast<V>(pw::
value(ero_bg) - pw::
value(input)),
226 fun::p2v::ternary(pw::
value(dil) < pw::
value(ero),
227 fun::cast<V>(pw::
value(ero) - pw::
value(dil)),
242 template <
typename I,
typename Wh,
typename Wm>
245 hit_or_miss_dispatch(trait::image::kind::any,
246 const Image<I>& input,
247 const Window<Wh>& win_hit,
248 const Window<Wm>& win_miss)
253 template <
typename I,
typename Wh,
typename Wm>
256 hit_or_miss_dispatch(trait::image::kind::logic,
257 const Image<I>& input,
258 const Window<Wh>& win_hit,
259 const Window<Wm>& win_miss)
261 return impl::hit_or_miss_logic(input, win_hit, win_miss);
265 template <
typename I,
typename Wh,
typename Wm>
268 hit_or_miss_dispatch(const Image<I>& input,
269 const Window<Wh>& win_hit,
270 const Window<Wm>& win_miss)
272 return hit_or_miss_dispatch(mln_trait_image_kind(I)(),
281 template <
typename I,
typename Wh,
typename Wm>
285 const Window<Wh>& win_hit,
286 const Window<Wm>& win_miss)
288 mln_trace(
"morpho::hit_or_miss");
289 internal::hit_or_miss_tests(input, win_hit, win_miss);
291 mln_concrete(I) output = internal::hit_or_miss_dispatch(input,
298 template <typename I, typename Wh, typename Wm>
302 const Window<Wh>& win_hit,
303 const Window<Wm>& win_miss)
305 mln_trace(
"morpho::hit_or_miss_opening");
306 internal::hit_or_miss_tests(input, win_hit, win_miss);
308 mln_concrete(I) output =
dilation(internal::hit_or_miss_dispatch(input,
317 template <typename I, typename Wh, typename Wm>
321 const Window<Wh>& win_hit,
322 const Window<Wm>& win_miss)
324 mln_trace(
"morpho::hit_or_miss_background_opening");
325 internal::hit_or_miss_tests(input, win_hit, win_miss);
331 mln_postcondition(
dilation(internal::hit_or_miss_dispatch(input,
334 win::sym(win_miss)) == output);
339 template <typename I, typename Wh, typename Wm>
343 const Window<Wh>& win_hit,
344 const Window<Wm>& win_miss)
346 mln_trace(
"morpho::hit_or_miss_closing");
347 internal::hit_or_miss_tests(input, win_hit, win_miss);
349 mln_concrete(I) output =
358 template <typename I, typename Wh, typename Wm>
362 const Window<Wh>& win_hit,
363 const Window<Wm>& win_miss)
365 mln_trace(
"morpho::hit_or_miss_background_closing");
366 internal::hit_or_miss_tests(input, win_hit, win_miss);
372 win_hit, win_miss)) == output);
376 # endif // ! MLN_INCLUDE_ONLY
383 #endif // ! MLN_MORPHO_HIT_OR_MISS_HH