26 #ifndef MLN_MAKE_INFLUENCE_ZONE_ADJACENCY_GRAPH_HH
27 # define MLN_MAKE_INFLUENCE_ZONE_ADJACENCY_GRAPH_HH
38 # include <mln/core/concept/image.hh>
39 # include <mln/core/concept/neighborhood.hh>
40 # include <mln/core/image/image2d.hh>
41 # include <mln/core/alias/box2d.hh>
42 # include <mln/extension/adjust_fill.hh>
43 # include <mln/util/graph.hh>
44 # include <mln/util/adjacency_matrix.hh>
61 template <
typename I,
typename N>
64 const Neighborhood<N>& nbh,
65 const mln_value(I)& nlabels);
69 # ifndef MLN_INCLUDE_ONLY
75 template <
typename I,
typename N>
77 influence_zone_adjacency_graph_tests(
const Image<I>& iz,
78 const Neighborhood<N>& nbh,
81 mln_precondition(
exact(iz).is_valid());
82 mln_precondition(
exact(nbh).is_valid());
104 template <
typename I,
typename N>
107 const Neighborhood<N>& nbh_,
108 const mln_value(I)& nlabels)
110 mln_trace(
"make::impl::generic::influence_zone_adjacency_graph");
112 internal::influence_zone_adjacency_graph_tests(iz_, nbh_, nlabels);
113 const I& iz =
exact(iz_);
114 const N& nbh =
exact(nbh_);
116 util::adjacency_matrix<> adj(nlabels.next());
119 typedef mln_value(I) L;
120 mln_piter(I)
p(iz.domain());
121 mln_niter(N) n(nbh,
p);
127 if (iz.domain().has(n))
130 if (iz(n) != iz((p)))
138 g.add_vertices(nlabels.next());
139 for (
unsigned i = 0; i < nlabels.next(); ++i)
140 for (
unsigned j = 0; j < i; ++j)
141 if (adj.are_adjacent(i, j))
156 template <
typename I,
typename N>
158 influence_zone_adjacency_graph_dispatch(
const Image<I>& iz,
159 const Neighborhood<N>& nbh,
160 const mln_value(I)& nlabels)
171 template <
typename I,
typename N>
175 const Neighborhood<N>& nbh,
176 const mln_value(I)& nlabels)
178 mln_trace(
"make::influence_zone_adjacency_graph");
180 internal::influence_zone_adjacency_graph_tests(iz, nbh, nlabels);
182 util::graph g = internal::influence_zone_adjacency_graph_dispatch(iz, nbh, nlabels);
188 # endif // ! MLN_INCLUDE_ONLY
196 #endif // ! MLN_MAKE_INFLUENCE_ZONE_ADJACENCY_GRAPH_HH