27 #ifndef MLN_BORDER_MIRROR_HH
28 # define MLN_BORDER_MIRROR_HH
40 # include <mln/core/image/image1d.hh>
41 # include <mln/core/image/image2d.hh>
42 # include <mln/core/image/image3d.hh>
44 # include <mln/core/concept/image.hh>
45 # include <mln/core/internal/fixme.hh>
46 # include <mln/core/internal/fixme.hh>
47 # include <mln/geom/min_row.hh>
48 # include <mln/geom/max_row.hh>
49 # include <mln/geom/min_col.hh>
50 # include <mln/geom/max_col.hh>
51 # include <mln/geom/ninds.hh>
53 # include <mln/opt/element.hh>
74 void mirror(
const Image<I>& ima);
77 # ifndef MLN_INCLUDE_ONLY
84 void mirror_(
const box1d&,
const I& ima_)
86 mln_trace(
"border::impl::mirror_");
87 I& ima =
const_cast<I&
>(ima_);
105 for (; i < border; ++i)
126 template <
typename I>
128 void mirror_(
const box2d&,
const I& ima_)
130 mln_trace(
"border::impl::mirror_");
131 I& ima =
const_cast<I&
>(ima_);
133 unsigned border = ima.border ();
136 unsigned real_nbcols = (nbcols + 1) + 2 * border;
137 unsigned start = real_nbcols * border + border;
141 for (
unsigned i = 0; i < border; ++i)
142 for (
unsigned j = 0; j < border; ++j)
143 opt::element(ima, i * ((nbcols + 1) + 2 * border) + j) =
148 for (
unsigned i = 0; i < border; ++i)
149 for (
unsigned j = 1; j <= border; ++j)
153 s = start + (nbrows * real_nbcols);
154 for (
unsigned i = 1; i <= border; ++i)
155 for (
unsigned j = 1; j <= border; ++j)
160 s = start + (nbrows * real_nbcols) + nbcols;
161 for (
unsigned i = 1; i <= border; ++i)
162 for (
unsigned j = 1; j <= border; ++j)
168 for (
unsigned i = 0; i <= nbcols; ++i)
169 for (
unsigned j = 1; j <= border; ++j)
175 for (
unsigned i = 0; i <= nbrows; ++i)
176 for (
unsigned j = 1; j <= border; ++j)
182 for (
unsigned i = 0; i <= nbrows; ++i)
183 for (
unsigned j = 1; j <= border; ++j)
185 opt::element(ima, s + (i * real_nbcols + nbcols) - (j - 1));
188 s = start + (nbrows * real_nbcols);
189 for (
unsigned i = 0; i <= nbcols; ++i)
190 for (
unsigned j = 1; j <= border; ++j)
196 template <
typename I>
198 void mirror_(
const box3d&,
const I& ima)
200 mln_trace_warning(
"border::mirror for 3D image is not implemented,"
201 " so image borders have not been mirrored!");
210 template <
typename I>
212 void mirror(
const Image<I>& ima_)
214 mln_trace(
"border::mirror");
216 const I& ima =
exact(ima_);
218 mln_precondition(ima.is_valid());
219 mlc_is(mln_trait_image_speed(I), trait::image::speed::fastest)::check();
221 typedef mln_psite(I) P;
226 impl::mirror_(ima.
bbox(), ima);
230 # endif // ! MLN_INCLUDE_ONLY
237 #endif // ! MLN_BORDER_MIRROR_HH