27 #ifndef MLN_TOPO_SKELETON_PRIORITY_DRIVEN_THINNING_HH
28 # define MLN_TOPO_SKELETON_PRIORITY_DRIVEN_THINNING_HH
42 # include <mln/core/routine/duplicate.hh>
44 # include <mln/core/concept/image.hh>
45 # include <mln/core/concept/neighborhood.hh>
47 # include <mln/core/site_set/p_queue_fast.hh>
48 # include <mln/core/site_set/p_priority.hh>
50 # include <mln/topo/no_constraint.hh>
52 # include <mln/data/fill.hh>
83 template <
typename I,
typename N,
typename F,
typename G,
typename J,
87 const Neighborhood<N>& nbh,
88 Function_v2b<F>& is_simple,
90 const Image<J>& priority,
91 const Function_v2b<H>& constraint);
110 template <typename I, typename N, typename F, typename G, typename J>
113 const Neighborhood<N>& nbh,
114 Function_v2b<F>& is_simple,
116 const Image<J>& priority);
119 # ifndef MLN_INCLUDE_ONLY
121 template <
typename I,
typename N,
typename F,
typename G,
typename J,
126 const Neighborhood<N>& nbh_,
127 Function_v2b<F>& is_simple_,
129 const Image<J>& priority_,
130 const Function_v2b<H>& constraint_)
132 mln_trace(
"topo::skeleton::priority_driven_thinning");
134 const I& input =
exact(input_);
135 const N& nbh =
exact(nbh_);
136 F& is_simple =
exact(is_simple_);
137 const J& priority =
exact(priority_);
138 const H& constraint =
exact(constraint_);
140 mln_concrete(I) output =
duplicate(input);
142 is_simple.set_image(output);
143 detach.set_image(output);
146 typedef mln_psite(I)
psite;
147 typedef p_queue_fast<psite> queue_t;
148 typedef p_priority<mln_value(J), queue_t> priority_queue_t;
149 priority_queue_t queue;
151 mln_ch_value(I,
bool) in_queue;
156 mln_piter(I)
p(output.domain());
159 if (output(p) && constraint(p) && is_simple(p))
161 queue.push(priority(p), p);
166 while (!queue.is_empty())
168 psite p = queue.pop_front();
170 if (output(p) && constraint(p) && is_simple(p))
173 mln_niter(N) n(nbh, p);
176 if (output.domain().has(n)
177 && output(n) && constraint(n) && is_simple(n)
180 queue.push(priority(n), n);
191 template <
typename I,
typename N,
typename F,
typename G,
typename J>
195 const Neighborhood<N>& nbh,
196 Function_v2b<F>& is_simple,
198 const Image<J>& priority)
202 no_constraint constraint;
204 priority, constraint);
207 # endif // MLN_INCLUDE_ONLY
215 #endif // ! MLN_TOPO_SKELETON_PRIORITY_DRIVEN_THINNING_HH