27 #ifndef MLN_MORPHO_RANK_FILTER_HH
28 # define MLN_MORPHO_RANK_FILTER_HH
36 # include <mln/morpho/includes.hh>
37 # include <mln/accu/transform_line.hh>
38 # include <mln/convert/to_p_array.hh>
52 template <
typename I,
typename W>
54 rank_filter(const Image<I>& input, const Window<W>&
win,
unsigned k);
57 # ifndef MLN_INCLUDE_ONLY
66 template <
typename I,
typename W>
69 rank_filter_tests(
const Image<I>& input_,
const Window<W>& win_,
unsigned k)
71 const I& input =
exact(input_);
72 const W& win =
exact(win_);
74 mln_precondition(input.is_valid());
75 mln_precondition(! win.is_empty());
94 template <
typename I,
typename W>
97 rank_filter(const Image<I>& input_, const Window<W>& win_,
unsigned k)
99 mln_trace(
"morpho::impl::generic::rank_filter");
101 internal::rank_filter_tests(input_, win_, k);
103 const I& input =
exact(input_);
104 const W& win =
exact(win_);
106 mln_concrete(I) output;
109 accu::stat::rank<mln_value(I)> accu(k);
111 mln_piter(I)
p(input.domain());
112 mln_qiter(W) q(win,
p);
130 template <typename I, typename W>
133 rank_filter_line(const Image<I>& input, const Window<W>& win,
unsigned k,
unsigned dir)
135 mln_trace(
"morpho::impl::rank_filter_line");
137 internal::rank_filter_tests(input, win, k);
139 accu::stat::rank<mln_value(I)> accu(k);
141 mln_concrete(I) output = accu::transform_line(accu, input,
exact(win).length(), dir);
147 template <typename I, typename W>
150 rank_filter_directional(const Image<I>& input, const Window<W>& win,
unsigned k,
unsigned dir)
152 mln_trace(
"morpho::impl::rank_filter_directional");
154 internal::rank_filter_tests(input, win, k);
156 accu::stat::rank<mln_value(I)> accu(k);
158 mln_concrete(I) output = accu::transform_directional(accu, input, win, dir);
174 template <
typename I,
typename M,
unsigned i,
typename C>
177 rank_filter_dispatch(const Image<I>& input, const win::
line<M, i, C>& win,
unsigned k)
179 return impl::rank_filter_line(input, win, k, i);
182 template <
typename I>
185 rank_filter_dispatch(const Image<I>& input, const win::rectangle2d& win,
unsigned k)
187 if (win.height() <= 3 && win.width() <= 3)
190 if (win.height() < win.width())
191 return impl::rank_filter_directional(input, win, k, 1);
193 return impl::rank_filter_directional(input, win, k, 0);
196 template <
typename I,
typename W>
199 rank_filter_dispatch(const Image<I>& input, const Window<W>& win,
unsigned k)
211 template <
typename I,
typename W>
214 rank_filter(const Image<I>& input, const Window<W>& win,
unsigned k)
216 mln_trace(
"morpho::rank_filter");
218 mln_precondition(
exact(input).is_valid());
219 mln_precondition(!
exact(win).is_empty());
221 mln_concrete(I) output = internal::rank_filter_dispatch(
exact(input),
exact(win), k);
226 # endif // ! MLN_INCLUDE_ONLY
233 #endif // ! MLN_MORPHO_RANK_FILTER_HH