27 #ifndef MLN_MORPHO_ALGEBRAIC_FILTER_HH
28 # define MLN_MORPHO_ALGEBRAIC_FILTER_HH
35 # include <mln/core/concept/image.hh>
36 # include <mln/core/concept/neighborhood.hh>
37 # include <mln/core/concept/accumulator.hh>
39 # include <mln/trait/accumulators.hh>
41 # include <mln/data/sort_psites.hh>
42 # include <mln/data/sort_offsets.hh>
44 # include <mln/canvas/morpho/attribute_filter.hh>
55 template <
typename I,
typename N,
typename A>
58 const Neighborhood<N>& nbh,
59 const Accumulator<A>& a,
60 const typename A::result& lambda,
64 # ifndef MLN_INCLUDE_ONLY
66 template <
typename I,
typename N,
typename A>
69 const Neighborhood<N>& nbh,
70 const Accumulator<A>& a,
71 const typename A::result& lambda,
74 mln_trace(
"morpho::opening::algebraic_filter");
76 mln_precondition(
exact(input).is_valid());
78 mlc_or(mlc_equal(mln_trait_accumulator_when_pix(A),
79 trait::accumulator::when_pix::use_none),
80 mlc_equal(mln_trait_accumulator_when_pix(A),
81 trait::accumulator::when_pix::use_p))::check();
83 mln_concrete(I) output;
84 output = canvas::morpho::internal::attribute_filter_dispatch(input,
94 # endif // ! MLN_INCLUDE_ONLY
100 #endif // ! MLN_MORPHO_ALGEBRAIC_FILTER_HH