39 #include <mln/core/image/complex_image.hh>
40 #include <mln/core/image/complex_neighborhoods.hh>
42 #include <mln/data/fill.hh>
43 #include <mln/literal/zero.hh>
45 #include <mln/labeling/regional_minima.hh>
46 #include <mln/labeling/regional_maxima.hh>
48 #include <mln/math/max.hh>
49 #include <mln/math/sqr.hh>
50 #include <mln/accu/stat/min_max.hh>
51 #include <mln/fun/v2v/linear.hh>
52 #include <mln/data/transform.hh>
54 #include <mln/value/label_16.hh>
56 #include <mln/literal/white.hh>
57 #include <mln/literal/grays.hh>
58 #include <mln/literal/colors.hh>
60 #include <mln/io/off/load.hh>
61 #include <mln/io/off/save.hh>
66 int main(
int argc,
char* argv[])
70 std::cerr <<
"usage: " << argv[0] <<
" input.off output.off"
75 std::string input_filename = argv[1];
76 std::string output_filename = argv[2];
85 static const unsigned D = ima_t::dim;
87 typedef mln_geom_(ima_t) G;
89 mln::bin_2complex_image3df input;
90 mln::io::off::
load(input, input_filename);
92 std::pair<ima_t, ima_t> curv = mln::geom::mesh_curvature(input.domain());
95 ima_t max_curv(input.domain());
96 mln::
data::
fill(max_curv, mln::literal::zero);
97 mln::p_n_faces_fwd_piter<D, G> v(max_curv.domain(), 0);
99 max_curv(v) = mln::math::
max(mln::math::
sqr(curv.first(v)),
100 mln::math::
sqr(curv.second(v)));
103 mln::p_n_faces_fwd_piter<D, G> t(max_curv.domain(), 2);
104 typedef mln::complex_m_face_neighborhood<D, G> adj_vertices_nbh_t;
105 adj_vertices_nbh_t adj_vertices_nbh;
106 mln_niter_(adj_vertices_nbh_t) adj_v(adj_vertices_nbh, t);
109 adj_v.iter().set_m(0);
110 mln::accu::stat::min_max<
float> acc;
119 s += max_curv(adj_v);
126 mln_invariant(n <= 3);
146 std::cout << "nminima = " << nminima << std::endl;
151 std::cout << "nmaxima = " << nmaxima << std::endl;
157 typedef mln::rgb8_2complex_image3df output_t;
158 output_t output(max_curv.domain());
169 <<
"warning: " << t <<
" is both a minimum and a maximum."