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
00027 #ifndef MLN_LABELING_SUPERPOSE_HH
00028 # define MLN_LABELING_SUPERPOSE_HH
00029
00033
00034
00035 # include <mln/core/concept/image.hh>
00036 # include <mln/util/array.hh>
00037 # include <mln/labeling/relabel.hh>
00038 # include <mln/data/paste.hh>
00039 # include <mln/pw/all.hh>
00040
00041 # include <mln/value/next.hh>
00042 # include <mln/value/equiv.hh>
00043
00044 namespace mln
00045 {
00046
00047 namespace labeling
00048 {
00049
00050
00070 template <typename I, typename J>
00071 mln_concrete(I)
00072 superpose(const Image<I>& lhs, const mln_value(I)& lhs_nlabels,
00073 const Image<J>& rhs, const mln_value(J)& rhs_nlabels,
00074 mln_value(I)& new_nlabels);
00075
00076
00077
00078
00079 # ifndef MLN_INCLUDE_ONLY
00080
00081 template <typename I, typename J>
00082 mln_concrete(I)
00083 superpose(const Image<I>& lhs_, const mln_value(I)& lhs_nlabels,
00084 const Image<J>& rhs_, const mln_value(J)& rhs_nlabels,
00085 mln_value(I)& new_nlabels)
00086 {
00087 trace::entering("mln::labeling::superpose");
00088
00089 const I& lhs = exact(lhs_);
00090 const J& rhs = exact(rhs_);
00091
00092 mlc_converts_to(mln_value(I), mln_value(J))::check();
00093 mln_precondition(lhs.is_valid());
00094 mln_precondition(rhs.is_valid());
00095 mln_precondition(lhs.domain() == rhs.domain());
00097
00098 mln_concrete(I) output = duplicate(lhs);
00099
00100 util::array<mln_value(J)>
00101 rebase_lbl(value::next(rhs_nlabels));
00102
00103 rebase_lbl(0) = 0;
00104 for (unsigned i = 1; i <= rhs_nlabels; ++i)
00105 rebase_lbl(i) = i + value::equiv(lhs_nlabels);
00106
00107 data::paste(labeling::relabel(rhs, rhs_nlabels, rebase_lbl)
00108 | (pw::value(rhs) != pw::cst(literal::zero)),
00109 output);
00110
00111 new_nlabels = value::equiv(lhs_nlabels)
00112 + value::equiv(rhs_nlabels) + 1;
00113
00114 trace::exiting("mln::labeling::superpose");
00115 return output;
00116 }
00117
00118
00119 # endif // ! MLN_INCLUDE_ONLY
00120
00121 }
00122
00123 }
00124
00125
00126 #endif // ! MLN_LABELING_SUPERPOSE_HH