26 #ifndef MLN_MORPHO_RANK_FILTER_HH
27 # define MLN_MORPHO_RANK_FILTER_HH
35 # include <mln/morpho/includes.hh>
36 # include <mln/accu/transform_line.hh>
37 # include <mln/convert/to_p_array.hh>
48 template <
typename I,
typename W>
50 rank_filter(const Image<I>& input, const Window<W>& win,
unsigned k);
53 # ifndef MLN_INCLUDE_ONLY
62 template <
typename I,
typename W>
65 rank_filter_tests(
const Image<I>& input_,
const Window<W>& win_,
unsigned k)
67 const I& input = exact(input_);
68 const W& win = exact(win_);
70 mln_precondition(input.is_valid());
71 mln_precondition(! win.is_empty());
90 template <
typename I,
typename W>
93 rank_filter(const Image<I>& input_, const Window<W>& win_,
unsigned k)
95 trace::entering(
"morpho::impl::generic::rank_filter");
97 internal::rank_filter_tests(input_, win_, k);
99 const I& input = exact(input_);
100 const W& win = exact(win_);
102 mln_concrete(I) output;
103 initialize(output, input);
105 accu::stat::rank<mln_value(I)> accu(k);
106 extension::adjust_fill(input, geom::delta(win) + 1, accu);
107 mln_piter(I) p(input.domain());
108 mln_qiter(W) q(win, p);
120 trace::exiting("morpho::impl::generic::rank_filter");
127 template <typename I, typename W>
130 rank_filter_line(const Image<I>& input, const Window<W>& win,
unsigned k,
unsigned dir)
132 trace::entering(
"morpho::impl::rank_filter_line");
134 internal::rank_filter_tests(input, win, k);
136 accu::stat::rank<mln_value(I)> accu(k);
138 mln_concrete(I) output = accu::transform_line(accu, input, exact(win).length(), dir);
140 trace::exiting("morpho::impl::rank_filter_line");
145 template <typename I, typename W>
148 rank_filter_directional(const Image<I>& input, const Window<W>& win,
unsigned k,
unsigned dir)
150 trace::entering(
"morpho::impl::rank_filter_directional");
152 internal::rank_filter_tests(input, win, k);
154 accu::stat::rank<mln_value(I)> accu(k);
156 mln_concrete(I) output = accu::transform_directional(accu, input, win, dir);
158 trace::exiting("morpho::impl::rank_filter_directional");
173 template <
typename I,
typename M,
unsigned i,
typename C>
176 rank_filter_dispatch(const Image<I>& input, const win::line<M, i, C>& win,
unsigned k)
178 return impl::rank_filter_line(input, win, k, i);
181 template <
typename I>
184 rank_filter_dispatch(const Image<I>& input, const win::rectangle2d& win,
unsigned k)
186 if (win.height() <= 3 && win.width() <= 3)
187 return impl::generic::rank_filter(input, win, k);
189 if (win.height() < win.width())
190 return impl::rank_filter_directional(input, win, k, 1);
192 return impl::rank_filter_directional(input, win, k, 0);
195 template <
typename I,
typename W>
198 rank_filter_dispatch(const Image<I>& input, const Window<W>& win,
unsigned k)
200 return impl::generic::rank_filter(input, win, k);
210 template <
typename I,
typename W>
213 rank_filter(const
Image<I>& input, const
Window<W>& win,
unsigned k)
215 trace::entering(
"morpho::rank_filter");
217 mln_precondition(exact(input).is_valid());
218 mln_precondition(! exact(win).is_empty());
220 mln_concrete(I) output = internal::rank_filter_dispatch(exact(input), exact(win), k);
222 trace::exiting(
"morpho::rank_filter");
226 # endif // ! MLN_INCLUDE_ONLY
233 #endif // ! MLN_MORPHO_RANK_FILTER_HH