27 #ifndef MLN_DATA_FAST_MEDIAN_HH
28 # define MLN_DATA_FAST_MEDIAN_HH
37 # include <mln/core/concept/image.hh>
38 # include <mln/core/alias/window2d.hh>
39 # include <mln/accu/stat/median_h.hh>
41 # include <mln/win/shift.hh>
42 # include <mln/win/diff.hh>
44 # include <mln/geom/min_col.hh>
45 # include <mln/geom/min_row.hh>
46 # include <mln/geom/max_col.hh>
47 # include <mln/geom/max_row.hh>
67 template <
typename I,
typename W,
typename O>
68 void fast_median(
const Image<I>& input,
const Window<W>& win,
72 # ifndef MLN_INCLUDE_ONLY
78 template <
typename I,
typename W,
typename O>
84 mln_precondition(input.is_valid());
85 mln_precondition(output.is_valid());
92 win_fwd_plus = win - win::shift(win,
left),
93 win_fwd_minus = win::shift(win,
left) - win,
94 win_bkd_plus = win - win::shift(win,
right),
95 win_bkd_minus = win::shift(win,
right) - win,
96 win_bot = win - win::shift(win,
up),
97 win_top = win::shift(win,
up) - win;
99 accu::stat::median_h<mln_value(I)> med;
105 mln_qixter(
const I, window2d)
106 q_fp(input, win_fwd_plus, p), q_fm(input, win_fwd_minus, p),
107 q_bp(input, win_bkd_plus, p), q_bm(input, win_bkd_minus, p),
108 q_top(input, win_top, p), q_bot(input, win_bot, p);
112 mln_qixter(
const I, W) q(input, win, p);
117 def::
coord& row = p.row();
118 def::
coord& col = p.col();
121 mln_assertion(p.col() ==
min_col);
122 mln_assertion(p.row() == min_row - 1);
124 for (row = min_row; row <=
max_row; ++row)
129 med.untake(q_top.val());
132 med.take(q_bot.val());
142 med.untake(q_fm.val());
144 med.take(q_fp.val());
149 while (col > min_col)
153 med.untake(q_bm.val());
155 med.take(q_bp.val());
168 template <typename I, typename W, typename O>
170 void fast_median(const Image<I>& input, const Window<W>& win,
176 # endif // ! MLN_INCLUDE_ONLY
183 #endif // ! MLN_DATA_FAST_MEDIAN_HH