26 #ifndef MLN_MAKE_REGION_ADJACENCY_GRAPH_HH
27 # define MLN_MAKE_REGION_ADJACENCY_GRAPH_HH
37 # include <mln/core/concept/image.hh>
38 # include <mln/core/concept/neighborhood.hh>
39 # include <mln/core/image/image2d.hh>
40 # include <mln/core/alias/box2d.hh>
41 # include <mln/extension/adjust_fill.hh>
42 # include <mln/util/graph.hh>
43 # include <mln/util/adjacency_matrix.hh>
59 template <
typename I,
typename N>
62 const Neighborhood<N>& nbh,
63 const mln_value(I)& nbasins);
67 # ifndef MLN_INCLUDE_ONLY
73 template <
typename I,
typename N>
75 region_adjacency_graph_tests(
const Image<I>& wshd,
76 const Neighborhood<N>& nbh,
79 mln_precondition(
exact(wshd).is_valid());
80 mln_precondition(
exact(nbh).is_valid());
94 template <
typename I,
typename N>
97 const Neighborhood<N>& nbh_,
98 const mln_value(I)& nbasins)
100 mln_trace(
"make::impl::generic::region_adjacency_graph");
102 internal::region_adjacency_graph_tests(wshd_, nbh_, nbasins);
103 const I& wshd =
exact(wshd_);
104 const N& nbh =
exact(nbh_);
106 util::adjacency_matrix<> adj(nbasins.next());
109 typedef mln_value(I) L;
111 mln_piter(I)
p(wshd.domain());
112 mln_niter(N) n(nbh,
p);
120 if (wshd.has(n) && wshd(n) != 0u)
127 mln_invariant(l2 == 0u);
132 if (l2 == 0u || l1 == 0u)
141 g.add_vertices(nbasins.next());
142 for (
unsigned i = 1; i < nbasins.next(); ++i)
143 for (
unsigned j = 1; j < i; ++j)
144 if (adj.are_adjacent(i, j))
160 template <
typename I,
typename N>
162 region_adjacency_graph_dispatch(
const Image<I>& wshd,
163 const Neighborhood<N>& nbh,
164 const mln_value(I)& nbasins)
175 template <
typename I,
typename N>
179 const Neighborhood<N>& nbh,
180 const mln_value(I)& nbasins)
182 mln_trace(
"make::region_adjacency_graph");
184 internal::region_adjacency_graph_tests(wshd, nbh, nbasins);
186 util::graph g = internal::region_adjacency_graph_dispatch(wshd, nbh, nbasins);
192 # endif // ! MLN_INCLUDE_ONLY
200 #endif // ! MLN_MAKE_REGION_ADJACENCY_GRAPH_HH