27 #ifndef MLN_DATA_MEDIAN_HH
28 # define MLN_DATA_MEDIAN_HH
36 # include <mln/core/concept/image.hh>
37 # include <mln/core/window.hh>
38 # include <mln/core/alias/dpoint2d.hh>
40 # include <mln/win/shift.hh>
41 # include <mln/win/diff.hh>
42 # include <mln/win/line.hh>
44 # include <mln/canvas/browsing/snake_fwd.hh>
45 # include <mln/accu/stat/median_h.hh>
46 # include <mln/accu/transform_line.hh>
65 template <
typename I,
typename W>
67 median(const Image<I>& input, const Window<W>& win);
71 # ifndef MLN_INCLUDE_ONLY
76 template <
typename I,
typename W>
78 median_tests(
const Image<I>& input,
const Window<W>& win)
80 mln_precondition(
exact(input).is_valid());
81 mln_precondition(
exact(win).is_valid());
95 template <
typename I,
typename W,
typename O>
98 typedef mln_psite(I) P;
99 typedef mln_dpsite(P) D;
109 accu::stat::median_h<mln_value(I)> med;
111 window<D> win_fp, win_fm, win_bp, win_bm, win_dp, win_dm;
112 mln_qiter(window<D>) q_fp, q_fm, q_bp, q_bm, q_dp, q_dm;
117 median_t(const I& input_, const W& win_, O& output_)
120 input(
exact(input_)),
122 output(
exact(output_)),
126 win_fp(win - win::shift(win,
left)),
127 win_fm(win::shift(win, left) - win),
128 win_bp(win - win::shift(win,
right)),
129 win_bm(win::shift(win, right) - win),
130 win_dp(win - win::shift(win,
up)),
131 win_dm(win::shift(win, up) - win),
132 q_fp(win_fp, p), q_fm(win_fm, p),
133 q_bp(win_bp, p), q_bm(win_bm, p),
134 q_dp(win_dp, p), q_dm(win_dm, p)
144 p = input.domain().pmin() +
up;
145 mln_qiter(W) q(win,
p);
146 for_all(q) if (input.has(q))
153 for_all(q_dm) if (input.has(q_dm))
154 med.untake(input(q_dm));
155 for_all(q_dp) if (input.has(q_dp))
156 med.take(input(q_dp));
157 output(p) = med.to_result();
163 for_all(q_fm) if (input.has(q_fm))
164 med.untake(input(q_fm));
165 for_all(q_fp) if (input.has(q_fp))
166 med.take(input(q_fp));
167 output(p) = med.to_result();
173 for_all(q_bm) if (input.has(q_bm))
174 med.untake(input(q_bm));
175 for_all(q_bp) if (input.has(q_bp))
176 med.take(input(q_bp));
177 output(p) = med.to_result();
187 template <
typename I,
typename W>
190 median(const Image<I>& input, const Window<W>& win)
192 mln_trace(
"data::impl::generic::median");
194 mlc_equal(mln_trait_image_quant(I),
195 trait::image::quant::low)::check();
196 internal::median_tests(input, win);
200 typedef mln_concrete(I) O;
203 median_t<I,W,O> f(
exact(input),
exact(win), output);
204 canvas::browsing::snake_fwd(f);
212 template <typename I,
213 typename M,
unsigned i, typename C>
216 median_line(const Image<I>& input, const win::
line<M,i,C>& win)
218 mln_trace(
"data::impl::median_line");
220 mlc_equal(mln_trait_image_quant(I),
221 trait::image::quant::low)::check();
222 internal::median_tests(input, win);
224 accu::stat::median_h<mln_value(I)> a;
225 mln_concrete(I) output = accu::transform_line(a, input, win.length(), i);
238 template <
typename I,
typename W>
241 median_dispatch_wrt_win(const Image<I>& input, const Window<W>& win)
246 template <
typename I,
247 typename M,
unsigned i,
typename C>
250 median_dispatch_wrt_win(const Image<I>& input, const win::
line<M,i,C>& win)
252 return impl::median_line(input, win);
256 template <
typename I,
typename W>
259 median_dispatch(const Image<I>& input, const Window<W>& win)
261 return median_dispatch_wrt_win(input,
exact(win));
269 template <
typename I,
typename W>
271 median(const Image<I>& input, const Window<W>& win)
273 mln_trace(
"data::median");
275 mlc_equal(mln_trait_image_quant(I),
276 trait::image::quant::low)::check();
278 internal::median_tests(input, win);
279 mln_concrete(I) output;
280 output = internal::median_dispatch(input, win);
285 # endif // ! MLN_INCLUDE_ONLY
292 #endif // ! MLN_DATA_MEDIAN_HH