00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_MORPHO_SKELETON_CONSTRAINED_HH
00027 # define MLN_MORPHO_SKELETON_CONSTRAINED_HH
00028
00034
00035 # include <mln/core/concept/image.hh>
00036 # include <mln/core/concept/neighborhood.hh>
00037 # include <mln/core/site_set/p_queue_fast.hh>
00038 # include <mln/core/site_set/p_priority.hh>
00039 # include <mln/extension/adjust_duplicate.hh>
00040 # include <mln/data/fill.hh>
00041
00042
00043 namespace mln
00044 {
00045
00046 namespace morpho
00047 {
00048
00049 template <typename I,
00050 typename N, typename F,
00051 typename K, typename R>
00052 mln_ch_value(I, bool)
00053 skeleton_constrained(const Image<I>& input,
00054 const Neighborhood<N>& nbh, const F& is_simple,
00055 const Image<K>& constraint, const Image<R>& priority);
00056
00057
00058
00059 # ifndef MLN_INCLUDE_ONLY
00060
00061 template <typename I,
00062 typename N, typename F,
00063 typename K, typename R>
00064 inline
00065 mln_ch_value(I, bool)
00066 skeleton_constrained(const Image<I>& input_,
00067 const Neighborhood<N>& nbh_, const F& is_simple,
00068 const Image<K>& constraint_, const Image<R>& priority_)
00069 {
00070 trace::entering("morpho::skeleton_constrained");
00071
00072 const I& input = exact(input_);
00073 const N& nbh = exact(nbh_);
00074 const K& constraint = exact(constraint_);
00075 const R& priority = exact(priority_);
00076
00077 mln_precondition(input.is_valid());
00078 mln_precondition(nbh.is_valid());
00079 mln_precondition(constraint.is_valid());
00080 mln_precondition(priority.is_valid());
00081
00082 extension::adjust_duplicate(input, nbh);
00083
00084
00085
00086 typedef mln_psite(I) P;
00087 typedef p_queue_fast<P> Q;
00088 p_priority<mln_value(R), Q> q;
00089
00090 mln_ch_value(I, bool) output;
00091
00092
00093 {
00094 initialize(output, input);
00095 data::fill(output, input);
00096 extension::adjust_duplicate(output, nbh);
00097
00098 mln_piter(I) p(input.domain());
00099 for_all(p)
00100 if (input(p) == false &&
00101 is_simple(input, nbh, p))
00102 {
00103 q.push(priority(p), p);
00104 }
00105 }
00106
00107
00108 {
00109 P p;
00110 mln_niter(N) n(nbh, p);
00111 while (! q.is_empty())
00112 {
00113 p = q.pop_front();
00114 for_all(n)
00115 if (output.has(n) &&
00116 output(n) == true &&
00117 constraint(n) == false &&
00118 is_simple(output, nbh, n))
00119 {
00120 output(n) = false;
00121 q.push(priority(n), n);
00122 }
00123 }
00124 }
00125
00126 trace::exiting("morpho::skeleton_constrained");
00127 return output;
00128 }
00129
00130 # endif // ! MLN_INCLUDE_ONLY
00131
00132 }
00133
00134 }
00135
00136
00137 #endif // ! MLN_MORPHO_SKELETON_CONSTRAINED_HH