27 #ifndef SCRIBO_SUBSAMPLING_BILINEAR_HH
28 # define SCRIBO_SUBSAMPLING_BILINEAR_HH
34 # include <mln/core/concept/image.hh>
35 # include <mln/core/alias/box2d.hh>
36 # include <mln/geom/max_col.hh>
37 # include <mln/geom/max_row.hh>
39 # include <mln/opt/at.hh>
57 bilinear(const
Image<I>& input,
int sub_ratio);
60 # ifndef MLN_INCLUDE_ONLY
65 bilinear(const
Image<I>& input_,
int sub_ratio)
67 mln_trace(
"scribo::subsampling::bilinear");
69 const I& input =
exact(input_);
70 mln_precondition(input.is_valid());
71 mlc_is(mln_domain(I),
box2d)::check();
74 input.domain().
ncols() / sub_ratio);
76 mln_piter(I) p(output.domain());
77 mln_value(I) pixels[4];
80 x_offset = input.domain().pmin().col(),
81 y_offset = input.domain().pmin().row();
85 int x =
int(
round(-0.5 + p.col() * sub_ratio));
86 int y =
int(
round(-0.5 + p.row() * sub_ratio));
91 x = input.ncols() - 1;
96 y = input.nrows() - 1;
98 double dx = (p.col() * sub_ratio) - x;
99 double dy = (p.row() * sub_ratio) - y;
101 pixels[0] = opt::at(input, y + y_offset, x + x_offset);
102 pixels[1] = opt::at(input, y + y_offset, x + x_offset + 1);
103 pixels[2] = opt::at(input, y + y_offset + 1, x + x_offset);
104 pixels[3] = opt::at(input, y + y_offset + 1, x + x_offset + 1);
106 output(p) = pixels[0] * (1 - dx) * (1 - dy) + pixels[1] * dx * (1 - dy) +
107 pixels[2] * (1 - dx) * dy + pixels[3] * dx * dy;
114 # endif // ! MLN_INCLUDE_ONLY
122 #endif // SCRIBO_SUBSAMPLING_BILINEAR_HH