26 #ifndef MLN_DATA_FAST_MEDIAN_HH
27 # define MLN_DATA_FAST_MEDIAN_HH
36 # include <mln/core/concept/image.hh>
37 # include <mln/core/alias/window2d.hh>
38 # include <mln/accu/stat/median_h.hh>
40 # include <mln/win/shift.hh>
41 # include <mln/win/diff.hh>
43 # include <mln/geom/min_col.hh>
44 # include <mln/geom/min_row.hh>
45 # include <mln/geom/max_col.hh>
46 # include <mln/geom/max_row.hh>
64 template <
typename I,
typename W,
typename O>
65 void fast_median(
const Image<I>& input,
const Window<W>& win,
69 # ifndef MLN_INCLUDE_ONLY
75 template <
typename I,
typename W,
typename O>
81 mln_precondition(input.is_valid());
82 mln_precondition(output.is_valid());
89 win_fwd_plus = win - win::shift(win, left),
90 win_fwd_minus = win::shift(win, left) - win,
91 win_bkd_plus = win - win::shift(win, right),
92 win_bkd_minus = win::shift(win, right) - win,
93 win_bot = win - win::shift(win,
up),
94 win_top = win::shift(win,
up) - win;
96 accu::stat::median_h<mln_value(I)> med;
103 q_fp(input, win_fwd_plus, p), q_fm(input, win_fwd_minus, p),
104 q_bp(input, win_bkd_plus, p), q_bm(input, win_bkd_minus, p),
105 q_top(input, win_top, p), q_bot(input, win_bot, p);
109 mln_qixter(
const I, W) q(input, win, p);
114 def::coord& row = p.row();
115 def::coord& col = p.col();
118 mln_assertion(p.col() == min_col);
119 mln_assertion(p.row() == min_row - 1);
121 for (row = min_row; row <= max_row; ++row)
126 med.untake(q_top.val());
129 med.take(q_bot.val());
135 while (col < max_col)
139 med.untake(q_fm.val());
141 med.take(q_fp.val());
146 while (col > min_col)
150 med.untake(q_bm.val());
152 med.take(q_bp.val());
165 template <typename I, typename W, typename O>
170 impl::fast_median(exact(input), exact(win), exact(output));
173 # endif // ! MLN_INCLUDE_ONLY
180 #endif // ! MLN_DATA_FAST_MEDIAN_HH