28 #ifndef SCRIBO_PREPROCESSING_SPLIT_BG_FG_HH
29 # define SCRIBO_PREPROCESSING_SPLIT_BG_FG_HH
35 # include <mln/core/macros.hh>
36 # include <mln/core/image/image2d.hh>
37 # include <mln/core/alias/neighb2d.hh>
38 # include <mln/core/routine/duplicate.hh>
40 # include <mln/core/image/dmorph/image_if.hh>
41 # include <mln/pw/all.hh>
43 # include <mln/data/fill.hh>
44 # include <mln/data/transform.hh>
46 # include <mln/value/int_u8.hh>
47 # include <mln/value/rgb8.hh>
49 # include <mln/io/ppm/load.hh>
50 # include <mln/io/ppm/save.hh>
51 # include <mln/io/pgm/save.hh>
52 # include <mln/io/pbm/save.hh>
54 # include <mln/math/diff_abs.hh>
55 # include <mln/math/min.hh>
57 # include <mln/morpho/closing/area.hh>
58 # include <mln/morpho/opening/area.hh>
59 # include <mln/morpho/elementary/dilation.hh>
61 # include <mln/labeling/blobs.hh>
62 # include <mln/labeling/colorize.hh>
63 # include <mln/labeling/compute.hh>
64 # include <mln/accu/stat/mean.hh>
66 # include <mln/util/couple.hh>
74 namespace preprocessing
96 # ifndef MLN_INCLUDE_ONLY
108 template <
unsigned n>
116 mln_trace(
"scribo::preprocessing::internal::split");
134 mln_pixter(
const I) p_i(input);
135 mln_pixter(O) p_r(r);
136 mln_pixter(O) p_g(g);
137 mln_pixter(O) p_b(b);
138 for (p_i.start(), p_r.start(), p_g.start(), p_b.start();
140 p_i.next(), p_r.next(), p_g.next(), p_b.next())
142 const value::rgb<n>& c = p_i.val();
144 p_g.val() = c.green();
145 p_b.val() = c.blue();
151 template <
unsigned n>
153 merge(
const image2d< value::int_u<n> >& r,
154 const image2d< value::int_u<n> >& g,
155 const image2d< value::int_u<n> >& b)
157 mln_trace(
"scribo::preprocessing::internal::merge");
170 mln_pixter(
const I) p_r(r);
171 mln_pixter(const I) p_g(g);
172 mln_pixter(const I) p_b(b);
174 mln_pixter(O) p_o(output);
176 for (p_o.start(), p_r.start(), p_g.start(), p_b.start();
178 p_o.next(), p_r.next(), p_g.next(), p_b.next())
180 value::rgb<n>& c = p_o.val();
182 c.green() = p_g.val();
183 c.blue() = p_b.val();
196 mln_piter_(
box2d) p(input1.domain());
199 value::rgb8& c = output(p);
214 mln_piter_(
box2d) p(input1.domain());
217 value::rgb8& c = output(p);
231 unsigned dist(
const rgb8& c1,
const rgb8&
c2)
235 d +=
std::abs(c1.green() - c2.green());
236 d +=
std::abs(c1.blue() - c2.blue());
244 unsigned lambda,
unsigned delta)
246 mln_trace(
"scribo::preprocessing::internal::background_analyze");
249 split(input, r, g, b);
259 mln_piter_(
box2d) p(input.domain());
261 mask(p) = (dist(closed(p), opened(p)) >= delta);
264 data::
fill((output | pw::
value(mask)).rw(), rgb8(255,255,0));
282 con = morpho::elementary::
dilation(lab,
c8());
293 typedef accu::stat::mean< rgb8, algebra::vec<3,
float>, rgb8 > A;
310 template <typename I>
311 mln::util::couple<mln_concrete(I), mln_concrete(I)>
314 mln_trace(
"scribo::preprocessing::split_bg_fg");
318 const I& input =
exact(input_);
320 mln_precondition(input.is_valid());
321 mln_precondition(lambda >= 1);
322 mln_precondition(delta >= 1);
325 bg = internal::background_analyze(input, lambda, delta);
332 # endif // ! MLN_INCLUDE_ONLY
339 #endif // ! SCRIBO_PREPROCESSING_SPLIT_BG_FG_HH