26 #ifndef SCRIBO_SUBSAMPLING_INTEGRAL_HH
27 # define SCRIBO_SUBSAMPLING_INTEGRAL_HH
33 #include <mln/core/concept/image.hh>
34 #include <mln/metal/equal.hh>
35 #include <mln/extension/fill.hh>
36 #include <mln/debug/println.hh>
37 #include <mln/debug/println_with_border.hh>
62 template <
typename I,
typename J>
65 integral(const
Image<I>& input,
unsigned scale,
66 Image<J>& integral_sum,
Image<J>& integral_sum_2,
67 const mln_domain(I)& output_domain,
unsigned border_thickness);
80 template <typename I, typename J>
83 integral(const
Image<I>& input,
unsigned scale,
84 Image<J>& integral_sum,
Image<J>& integral_sum_2);
88 # ifndef MLN_INCLUDE_ONLY
96 template <
typename I,
typename J>
99 integral_3(const
Image<I>& input_,
100 Image<J>& integral_sum_,
Image<J>& integral_sum_2_,
101 const mln_domain(I)& output_domain,
102 unsigned border_thickness)
104 mln_trace(
"subsampling::impl::integral_3");
108 area = scale * scale;
110 const I& input =
exact(input_);
111 J& integral_sum =
exact(integral_sum_);
112 J& integral_sum_2 =
exact(integral_sum_2_);
114 mln_precondition(input.is_valid());
115 mln_precondition(input.domain().pmin() == literal::origin);
116 mln_precondition(scale > 1);
118 typedef mln_value(I) V;
119 typedef mln_value(J) S;
120 typedef mln_site(I) P;
123 mln_concrete(I) sub(output_domain, border_thickness);
124 V* p_sub = sub.buffer();
126 integral_sum.init_(output_domain, border_thickness);
127 S* p_isum = integral_sum.buffer();
129 integral_sum_2.init_(output_domain, border_thickness);
130 S* p_isum_2 = integral_sum_2.buffer();
132 const
unsigned up = sub.delta_offset(
dpoint2d(-1, 0));
134 const
unsigned nrows = 3 * output_domain.
nrows();
135 const
unsigned ncols = 3 * output_domain.
ncols();
139 unsigned b_offset = sub.delta_offset(dpoint2d(border_thickness,
143 p_isum_2 += b_offset;
145 S h_sum = 0, h_sum_2 = 0;
146 const V* ptr1 = & input.at_(row, 0);
147 const V* ptr2 = & input.at_(row + 1, 0);
148 const V* ptr3 = & input.at_(row + 2, 0);
149 for (
unsigned col = 0; col <
ncols; col += scale)
152 sum = *ptr1 + *(ptr1 + 1) + *(ptr1 + 2);
153 sum += *ptr2 + *(ptr2 + 1) + *(ptr2 + 2);
154 sum += *ptr3 + *(ptr3 + 1) + *(ptr3 + 2);
159 *p_sub++ = sum /
area;
162 h_sum_2 += sum *
sum;
173 unsigned b_next = 2 * border_thickness;
179 for (row += scale; row <
nrows; row += scale)
181 S h_sum = 0, h_sum_2 = 0;
182 const V* ptr1 = & input.at_(row, 0);
183 const V* ptr2 = & input.at_(row + 1, 0);
184 const V* ptr3 = & input.at_(row + 2, 0);
185 for (
unsigned col = 0; col <
ncols; col += scale)
188 sum = *ptr1 + *(ptr1 + 1) + *(ptr1 + 2);
189 sum += *ptr2 + *(ptr2 + 1) + *(ptr2 + 2);
190 sum += *ptr3 + *(ptr3 + 1) + *(ptr3 + 2);
195 *p_sub++ = sum /
area;
198 h_sum_2 += sum *
sum;
200 *p_isum = h_sum + *(p_isum +
up);
201 *p_isum_2 = h_sum_2 + *(p_isum_2 +
up);
216 template <
typename I,
typename J>
219 integral_2(const
Image<I>& input_,
220 Image<J>& integral_sum_,
Image<J>& integral_sum_2_,
221 const mln_domain(I)& output_domain,
222 unsigned border_thickness)
224 mln_trace(
"subsampling::impl::integral_2");
228 area = scale * scale;
230 const I& input =
exact(input_);
231 J& integral_sum =
exact(integral_sum_);
232 J& integral_sum_2 =
exact(integral_sum_2_);
234 typedef mln_value(I) V;
235 typedef mln_value(J) S;
236 typedef mln_site(I) P;
238 mlc_bool(P::dim == 2)::check();
239 mln_precondition(input.is_valid());
240 mln_precondition(input.domain().pmin() == literal::origin);
241 mln_precondition(scale > 1);
245 mln_concrete(I) sub(output_domain, border_thickness);
246 V* p_sub = sub.buffer();
248 integral_sum.init_(output_domain, border_thickness);
249 S* p_isum = integral_sum.buffer();
251 integral_sum_2.init_(output_domain, border_thickness);
252 S* p_isum_2 = integral_sum_2.buffer();
254 const
unsigned up = sub.delta_offset(dpoint2d(-1, 0));
256 const
unsigned nrows = 2 * output_domain.nrows();
257 const
unsigned ncols = 2 * output_domain.ncols();
259 extension::
fill(sub, 0);
261 unsigned b_offset = sub.delta_offset(dpoint2d(border_thickness,
265 p_isum_2 += b_offset;
269 S h_sum = 0, h_sum_2 = 0;
270 const V* ptr1 = & input.at_(row, 0);
271 const V* ptr2 = & input.at_(row + 1, 0);
272 for (
unsigned col = 0; col <
ncols; col += scale)
275 sum = *ptr1 + *(ptr1 + 1);
276 sum += *ptr2 + *(ptr2 + 1);
280 *p_sub++ = sum /
area;
283 h_sum_2 += sum *
sum;
294 unsigned b_next = 2 * border_thickness;
300 for (row += scale; row <
nrows; row += scale)
302 S h_sum = 0, h_sum_2 = 0;
303 const V* ptr1 = & input.at_(row, 0);
304 const V* ptr2 = & input.at_(row + 1, 0);
305 for (
unsigned col = 0; col <
ncols; col += scale)
308 sum = *ptr1 + *(ptr1 + 1);
309 sum += *ptr2 + *(ptr2 + 1);
313 *p_sub++ = sum /
area;
316 h_sum_2 += sum *
sum;
318 *p_isum = h_sum + *(p_isum +
up);
319 *p_isum_2 = h_sum_2 + *(p_isum_2 +
up);
334 template <
typename I,
typename J>
337 integral(const
Image<I>& input,
unsigned scale,
339 const mln_domain(I)& output_domain,
unsigned border_thickness)
344 return integral_3(input, simple, squared,
345 output_domain, border_thickness);
347 return integral_2(input, simple, squared,
348 output_domain, border_thickness);
350 std::cerr <<
"NYI!" << std::endl;
364 template <typename I, typename J>
367 integral(const
Image<I>& input_,
unsigned scale,
368 Image<J>& integral_sum,
Image<J>& integral_sum_2,
369 const mln_domain(I)& output_domain,
unsigned border_thickness)
371 mln_trace(
"subsampling::integral");
373 const I& input =
exact(input_);
375 mln_precondition(input.is_valid());
376 mln_precondition(input.domain().pmin() == literal::origin);
377 mln_precondition(scale > 1);
380 output = impl::integral(input, scale, integral_sum, integral_sum_2,
381 output_domain, border_thickness);
386 template <typename I, typename J>
389 integral(const
Image<I>& input_,
unsigned scale,
390 Image<J>& integral_sum,
Image<J>& integral_sum_2)
392 mln_trace(
"subsampling::integral");
394 const I& input =
exact(input_);
396 mln_precondition(input.is_valid());
397 mln_precondition(input.domain().pmin() == literal::origin);
398 mln_precondition(scale > 1);
401 (input.ncols() + scale - 1) / scale);
403 output = integral(input_, scale, integral_sum, integral_sum_2,
409 # endif // ! MLN_INCLUDE_ONLY
416 #endif // ! SCRIBO_SUBSAMPLING_INTEGRAL_HH