37 #include <mln/core/image/complex_image.hh>
38 #include <mln/core/image/complex_neighborhoods.hh>
40 #include <mln/core/image/dmorph/image_if.hh>
41 #include <mln/core/image/dmorph/mutable_extension_ima.hh>
42 #include <mln/core/routine/mutable_extend.hh>
43 #include <mln/data/paste.hh>
45 #include <mln/value/label_16.hh>
47 #include <mln/labeling/regional_minima.hh>
48 #include <mln/morpho/closing/area.hh>
50 #include <mln/topo/is_n_face.hh>
51 #include <mln/topo/is_simple_cell.hh>
52 #include <mln/topo/detach_cell.hh>
53 #include <mln/topo/skeleton/breadth_first_thinning.hh>
55 #include <mln/math/pi.hh>
57 #include <mln/util/timer.hh>
59 #include <mln/io/off/load.hh>
62 #include "save_bin_alt.hh"
68 main(
int argc,
char* argv[])
72 std::cerr <<
"usage: " << argv[0] <<
" input.off lambda output.off"
77 std::string input_filename = argv[1];
78 unsigned lambda = atoi(argv[2]);
79 std::string output_filename = argv[3];
88 static const unsigned D = float_ima_t::dim;
90 typedef mln_geom_(float_ima_t) G;
92 mln::bin_2complex_image3df bin_input;
93 mln::io::off::
load(bin_input, input_filename);
95 const mln::topo::complex<D>& cplx = bin_input.domain().cplx();
96 for (
unsigned n = 0; n <= D; ++n)
97 std::cout << cplx.nfaces_of_dim(n) << ' ' << n << "-faces" << std::endl;
99 std::pair<float_ima_t, float_ima_t> curv =
100 mln::geom::mesh_curvature(bin_input.domain());
103 float_ima_t float_ima(bin_input.domain());
104 mln::p_n_faces_fwd_piter<D, G> v(float_ima.domain(), 0);
107 float h = (curv.first(v) + curv.second(v)) / 2;
111 float_ima(v) = h_inv;
119 adj_vertices_nbh_t adj_vertices_nbh;
120 mln_niter_(adj_vertices_nbh_t) adj_v(adj_vertices_nbh, t);
124 adj_v.iter().set_m(0);
133 s += float_ima(adj_v);
136 float_ima(t) = s / n;
138 mln_invariant(n <= 3);
148 ima_t ima(float_ima.domain());
152 ima(t) = 1000 * float_ima(t);
157 ima(v) = mln_max(mln_value_(ima_t));
158 mln::p_n_faces_fwd_piter<D, G> e(float_ima.domain(), 1);
160 ima(e) = mln_max(mln_value_(ima_t));
167 typedef mln::complex_lower_dim_connected_n_face_neighborhood<D, G> nbh_t;
170 ima_t closed_ima = mln::morpho::closing::
area(ima, nbh, lambda);
176 typedef mln::
value::label_16 label_t;
186 typedef mln::complex_higher_neighborhood<D, G> higher_nbh_t;
187 higher_nbh_t higher_nbh;
191 mln_niter_(higher_nbh_t) adj_t(higher_nbh, e);
196 if (minima(adj_t) == mln::literal::zero)
207 ref_adj_minimum = minima(adj_t);
211 mln_assertion(minima(adj_t) == ref_adj_minimum);
213 minima(e) = ref_adj_minimum;
217 mln_niter_(higher_nbh_t) adj_e(higher_nbh, v);
222 if (minima(adj_e) == mln::literal::zero)
233 ref_adj_minimum = minima(adj_e);
237 mln_assertion(minima(adj_e) == ref_adj_minimum);
239 minima(v) = ref_adj_minimum;
254 bin_ima_t surface(minima.domain());
258 mln_piter_(bin_ima_t) f(minima.domain());
260 if (minima(f) != mln::literal::zero)
272 typedef mln::topo::is_n_face<mln_psite_(bin_ima_t), D> is_a_triangle_t;
273 is_a_triangle_t is_a_triangle;
275 typedef mln::image_if<bin_ima_t, is_a_triangle_t> bin_triangle_only_ima_t;
278 typedef mln::mutable_extension_ima<bin_triangle_only_ima_t, bin_ima_t>
287 typedef mln::complex_lower_higher_neighborhood<D, G> adj_nbh_t;
290 typedef mln::complex_lower_neighborhood<D, G> lower_adj_nbh_t;
293 typedef mln::complex_higher_neighborhood<D, G> higher_adj_nbh_t;
295 typedef mln::topo::is_simple_cell< bin_triangle_ima_t,
299 is_simple_triangle_t;
300 is_simple_triangle_t is_simple_triangle;
310 mln::topo::detach_cell<bin_triangle_ima_t, adj_nbh_t> detach(adj_nbh);
313 mln::initialize(skel, surface);
315 mln::util::timer time;
318 (mln::topo::skeleton::breadth_first_thinning
319 (mln::mutable_extend((surface | is_a_triangle).rw(), surface),
325 std::cout << time.read() << " s" << std::endl;