26 #ifndef APPS_BENCH_DILATION_LENA_HH
27 #define APPS_BENCH_DILATION_LENA_HH
32 #include <mln/core/image/image2d.hh>
33 #include <mln/core/alias/window2d.hh>
35 #include <mln/io/pgm/load.hh>
36 #include <mln/io/pgm/save.hh>
38 #include <mln/value/int_u8.hh>
40 #include <mln/accu/stat/max.hh>
42 #include <mln/util/timer.hh>
44 #include "apps/bench/static_window.hh"
45 #include "apps/bench/static_dpoints_pixter.hh"
46 #include "apps/bench/trait.hh"
56 for (
unsigned int r = 0; r < input.
nrows(); ++r)
57 for (
unsigned int c = 0; c < input.
ncols(); ++c)
59 unsigned char sup = input.
at_(r, c);
60 if (r != 0 && input.
at_(r-1, c) > sup) sup = input.
at_(r-1, c);
61 if (r != input.
nrows() - 1 && input.
at_(r+1, c) > sup) sup = input.
at_(r+1, c);
62 if (c != 0 && input.
at_(r, c-1) > sup) sup = input.
at_(r, c-1);
63 if (c != input.
ncols() - 1 && input.
at_(r, c+1) > sup) sup = input.
at_(r, c+1);
64 output.at_(r, c) = sup;
78 ptrdiff_t win_offset[4] = { &input.
at_(-1, 0) - &input.
at_(0, 0),
79 &input.
at_(+1, 0) - &input.
at_(0, 0),
80 &input.
at_( 0, -1) - &input.
at_(0, 0),
81 &input.
at_( 0, +1) - &input.
at_(0, 0) };
84 for (
unsigned int r = 0; r < input.
nrows(); ++r)
86 const val_t*
pi = &input.
at_(r, 0);
87 val_t* po = &output.at_(r, 0);
88 for (; pi < &input.
at_(r, 0) + input.
ncols(); ++
pi, ++po)
90 unsigned char sup = *
pi;
93 && *(pi + win_offset[0]) > sup)
94 sup = *(pi + win_offset[0]);
96 if (r != input.
nrows() - 1
97 && *(pi + win_offset[1]) > sup)
98 sup = *(pi + win_offset[1]);
100 if (pi != &input.
at_(r, 0)
101 && *(pi + win_offset[2]) > sup)
102 sup = *(pi + win_offset[2]);
104 if (pi != &input.
at_(r, 0) + input.
ncols() - 1
105 && *(pi + win_offset[3]) > sup)
106 sup = *(pi + win_offset[3]);
114 namespace nongen_1ptr
122 ptrdiff_t win_offset[4] = { &input.
at_(-1, 0) - &input.
at_(0, 0),
123 &input.
at_(+1, 0) - &input.
at_(0, 0),
124 &input.
at_( 0, -1) - &input.
at_(0, 0),
125 &input.
at_( 0, +1) - &input.
at_(0, 0) };
128 initialize(output, input);
131 ptrdiff_t output_offset = &output.
at_(0, 0) - &input.
at_(0, 0);
133 for (
unsigned int r = 0; r < input.
nrows(); ++r)
135 for (
const val_t*
pi = &input.
at_(r, 0);
139 unsigned char sup = *
pi;
142 && *(
pi + win_offset[0]) > sup)
143 sup = *(
pi + win_offset[0]);
145 if (r != input.
nrows() - 1
146 && *(
pi + win_offset[1]) > sup)
147 sup = *(
pi + win_offset[1]);
149 if (
pi != &input.
at_(r, 0)
150 && *(
pi + win_offset[2]) > sup)
151 sup = *(
pi + win_offset[2]);
153 if (
pi != &input.
at_(r, 0) + input.
ncols() - 1
154 && *(
pi + win_offset[3]) > sup)
155 sup = *(
pi + win_offset[3]);
156 const_cast<val_t&
>(*(
pi + output_offset)) = sup;
167 template <
typename I,
typename W>
168 mln_concrete(I)
dilation(const I& input, const W& win)
170 mln_concrete(I) output;
initialize(output, input);
171 mln_piter(I)
p(input.domain());
172 mln_qiter(W) q(win,
p);
177 for_all(q)
if (input.has(q))
189 template <
typename I,
typename W>
190 mln_concrete(I)
dilation(const I& input, const W& win)
192 typedef mln_concrete(I) O;
195 mln_pixter(
const I)
pi(input);
196 mln_pixter(O) po(output);
198 mln_qixter(
const I, W) q(
pi, win);
211 namespace fast_noaccu
215 template <
typename I,
typename W>
216 mln_concrete(I)
dilation(const I& input, const W& win)
218 typedef mln_concrete(I) O;
221 mln_pixter(
const I)
pi(input);
222 mln_pixter(O) po(output);
224 mln_qixter(
const I, W) q(
pi, win);
228 mln_value(I) sup = mln_min(mln_value(I));
242 template <
typename I,
typename W>
243 mln_concrete(I)
dilation(const I& input, const W& win)
245 typedef mln_concrete(I) O;
248 mln_pixter(
const I)
p(input);
250 mln_qixter(
const I, W) q(
p, win);
257 *(output.buffer() +
p.offset()) = sup.
to_result();
263 namespace faster_noaccu
267 template <
typename I,
typename W>
268 mln_concrete(I)
dilation(const I& input, const W& win)
270 typedef mln_concrete(I) O;
273 mln_pixter(
const I)
p(input);
275 mln_qixter(
const I, W) q(
p, win);
279 mln_value(I) sup = mln_min(mln_value(I));
283 *(output.buffer() +
p.offset()) = sup;
289 namespace fast_static
293 template <
typename I,
typename W>
294 mln_concrete(I)
dilation(const I& input, const W& win)
301 namespace faster_static
305 template <
typename I,
typename W>
306 mln_concrete(I)
dilation(const I& input, const W& win)
313 #endif // ! APPS_BENCH_DILATION_LENA_HH