34 #include <mln/core/image/complex_image.hh>
35 #include <mln/core/image/complex_neighborhoods.hh>
37 #include <mln/core/image/dmorph/image_if.hh>
38 #include <mln/core/image/dmorph/mutable_extension_ima.hh>
39 #include <mln/core/routine/mutable_extend.hh>
40 #include <mln/data/paste.hh>
42 #include <mln/value/label_16.hh>
44 #include <mln/labeling/regional_minima.hh>
45 #include <mln/morpho/closing/area.hh>
47 #include <mln/topo/is_n_face.hh>
48 #include <mln/topo/is_simple_cell.hh>
49 #include <mln/topo/detach_cell.hh>
50 #include <mln/topo/skeleton/breadth_first_thinning.hh>
52 #include <mln/io/off/load.hh>
55 #include "save_bin_alt.hh"
59 main(
int argc,
char* argv[])
63 std::cerr <<
"usage: " << argv[0] <<
" input.off lambda output.off"
68 std::string input_filename = argv[1];
69 unsigned lambda = atoi(argv[2]);
70 std::string output_filename = argv[3];
79 static const unsigned D = float_input_t::dim;
81 typedef mln_geom_(float_input_t) G;
83 float_input_t float_input;
84 mln::io::off::
load(float_input, input_filename);
92 typedef mln::unsigned_2complex_image3df ima_t;
93 ima_t input(float_input.domain());
96 mln::p_n_faces_fwd_piter<D, G> t(input.domain(), 2);
98 input(t) = 1000 * float_input(t);
102 mln::p_n_faces_fwd_piter<D, G> v(input.domain(), 0);
104 input(v) = mln_max(mln_value_(ima_t));
105 mln::p_n_faces_fwd_piter<D, G> e(input.domain(), 1);
107 input(e) = mln_max(mln_value_(ima_t));
114 typedef mln::complex_lower_dim_connected_n_face_neighborhood<D, G> nbh_t;
117 ima_t closed_input = mln::morpho::closing::
area(input, nbh, lambda);
123 typedef mln::
value::label_16 label_t;
133 typedef mln::complex_higher_neighborhood<D, G> higher_nbh_t;
134 higher_nbh_t higher_nbh;
138 mln_niter_(higher_nbh_t) adj_t(higher_nbh, e);
143 if (minima(adj_t) == mln::literal::zero)
154 ref_adj_minimum = minima(adj_t);
158 mln_assertion(minima(adj_t) == ref_adj_minimum);
160 minima(e) = ref_adj_minimum;
164 mln_niter_(higher_nbh_t) adj_e(higher_nbh, v);
169 if (minima(adj_e) == mln::literal::zero)
180 ref_adj_minimum = minima(adj_e);
184 mln_assertion(minima(adj_e) == ref_adj_minimum);
186 minima(v) = ref_adj_minimum;
201 bin_ima_t surface(minima.domain());
205 mln_piter_(bin_ima_t) f(minima.domain());
207 if (minima(f) != mln::literal::zero)
219 typedef mln::topo::is_n_face<mln_psite_(bin_ima_t), D> is_a_triangle_t;
220 is_a_triangle_t is_a_triangle;
222 typedef mln::image_if<bin_ima_t, is_a_triangle_t> bin_triangle_only_ima_t;
225 typedef mln::mutable_extension_ima<bin_triangle_only_ima_t, bin_ima_t>
234 typedef mln::complex_lower_higher_neighborhood<D, G> adj_nbh_t;
237 typedef mln::complex_lower_neighborhood<D, G> lower_adj_nbh_t;
240 typedef mln::complex_higher_neighborhood<D, G> higher_adj_nbh_t;
242 typedef mln::topo::is_simple_cell< bin_triangle_ima_t,
246 is_simple_triangle_t;
247 is_simple_triangle_t is_simple_triangle;
257 mln::topo::detach_cell<bin_triangle_ima_t, adj_nbh_t> detach(adj_nbh);
260 mln::initialize(skel, surface);
262 (mln::topo::skeleton::breadth_first_thinning
263 (mln::mutable_extend((surface | is_a_triangle).rw(), surface),