27 #ifndef SCRIBO_UTIL_INIT_INTEGRAL_IMAGE_HH
28 # define SCRIBO_UTIL_INIT_INTEGRAL_IMAGE_HH
34 # include <mln/core/image/image2d.hh>
45 template <
typename I,
typename F>
47 init_integral_image(const
Image<I>& input,
unsigned scale, F& func);
49 template <typename I, typename F>
50 mln_ch_value(I, mln_result(F))
51 init_integral_image(const
Image<I>& input,
unsigned scale, F& func,
55 # ifndef MLN_INCLUDE_ONLY
63 template <
typename I,
typename F>
65 init_integral_image(const
Image<I>& ,
unsigned ,
66 F& , const mln_box(I)& ,
69 mln_trace(
"scribo::util::impl::generic::init_integral_image");
73 mlc_abort(I)::check();
81 template <typename I, typename F>
82 mln_ch_value(I, mln_result(F))
83 init_integral_image_fastest(const
Image<I>& input_,
unsigned scale, F& f,
84 const mln_box(I)& output_domain,
unsigned border)
86 mln_trace(
"scribo::util::impl::init_integral_image_fastest");
88 const I& input =
exact(input_);
91 mln_precondition(input.is_valid());
92 mln_precondition(input.domain().pmin() == literal::origin);
94 typedef mln_value(I) V;
96 typedef mln_value(J) V2;
97 typedef mln_site(I) P;
99 J integral_sum_sum_2(output_domain, border);
100 V2* p_integ = integral_sum_sum_2.buffer();
102 const
int up = integral_sum_sum_2.delta_offset(
dpoint2d(-1, 0));
104 const
unsigned nrows = scale * integral_sum_sum_2.
nrows();
105 const
unsigned ncols = scale * integral_sum_sum_2.
ncols();
109 unsigned b_offset = integral_sum_sum_2.delta_offset(dpoint2d(border,
115 f.begin_of_first_row();
118 for (
unsigned s = 0; s < scale; ++s)
119 ptr[s] = & input.at_(row + s, 0);
121 for (
unsigned col = 0; col <
ncols; col += scale)
125 for (
unsigned s = 0; s < scale; ++s)
126 for (
unsigned i = 0; i < scale; ++i)
130 *p_integ = f.to_result_first_row();
138 unsigned b_next = 2 * border;
142 for (row += scale; row <
nrows; row += scale)
147 for (
unsigned s = 0; s < scale; ++s)
148 ptr[s] = & input.at_(row + s, 0);
150 for (
unsigned col = 0; col <
ncols; col += scale)
154 for (
unsigned s = 0; s < scale; ++s)
155 for (
unsigned i = 0; i < scale; ++i)
158 *p_integ = f.to_result(*(p_integ + up));
167 return integral_sum_sum_2;
178 template <
typename I,
typename F>
180 init_integral_image_dispatch(mln::trait::image::speed::fastest,
181 const
Image<I>& input,
unsigned scale,
182 F& func, const mln_box(I)& output_domain,
185 return impl::init_integral_image_fastest(input, scale, func,
186 output_domain, border);
190 template <
typename I,
typename F>
192 init_integral_image_dispatch(mln::trait::image::speed::any,
193 const
Image<I>& input,
unsigned scale,
194 F& func, const mln_box(I)& output_domain,
197 return impl::generic::init_integral_image(input, scale, func,
198 output_domain, border);
202 template <
typename I,
typename F>
204 init_integral_image_dispatch(const
Image<I>& input,
unsigned scale, F& func,
205 const mln_box(I)& output_domain,
unsigned border)
207 return init_integral_image_dispatch(mln_trait_image_speed(I)(),
208 input, scale, func, output_domain, border);
216 template <
typename I,
typename F>
218 init_integral_image(const
Image<I>& input_,
unsigned scale, F& func,
219 const mln_box(I)& output_domain,
unsigned border)
221 mln_trace(
"scribo::util::init_integral_image");
223 const I& input =
exact(input_);
224 mln_precondition(input.is_valid());
225 mln_precondition(input.domain().pmin() == literal::origin);
228 output = internal::init_integral_image_dispatch(input, scale, func,
229 output_domain, border);
234 template <typename I, typename F>
235 mln_ch_value(I,mln_result(F))
236 init_integral_image(const
Image<I>& input_,
unsigned scale, F& func)
238 mln_trace(
"scribo::util::init_integral_image");
240 const I& input =
exact(input_);
241 mln_precondition(input.is_valid());
242 mln_precondition(input.domain().pmin() == literal::origin);
246 (input.ncols() + scale - 1) / scale);
249 output = init_integral_image(input, scale, func,
250 output_domain, exact(input).border());
255 #endif // ! MLN_INCLUDE_ONLY
261 #endif // ! SCRIBO_UTIL_INIT_INTEGRAL_IMAGE_HH