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_LABELING_PACK_HH
00027 # define MLN_LABELING_PACK_HH
00028
00033
00034 # include <mln/core/concept/image.hh>
00035
00036 # include <mln/make/relabelfun.hh>
00037
00038 # include <mln/data/compute.hh>
00039 # include <mln/data/transform.hh>
00040
00041 # include <mln/accu/label_used.hh>
00042
00043
00044
00045 namespace mln
00046 {
00047
00048 namespace labeling
00049 {
00050
00057
00058 template <typename I>
00059 mln_concrete(I)
00060 pack(const Image<I>& label, mln_value(I)& new_nlabels);
00061
00062
00063
00069
00070 template <typename I>
00071 void
00072 pack_inplace(Image<I>& label, mln_value(I)& new_nlabels);
00073
00074
00075
00076 # ifndef MLN_INCLUDE_ONLY
00077
00078
00079 namespace internal
00080 {
00081
00082 template <typename I>
00083 void
00084 pack_tests(const Image<I>& label, mln_value(I)& new_nlabels)
00085 {
00086
00087 mlc_is_a(mln_value(I), mln::value::Symbolic)::check();
00088 mln_precondition(exact(label).is_valid());
00089 (void) label;
00090 (void) new_nlabels;
00091 }
00092
00093 }
00094
00095
00096
00097 template <typename I>
00098 mln_concrete(I)
00099 pack(const Image<I>& label, mln_value(I)& new_nlabels)
00100 {
00101 trace::entering("labeling::pack");
00102
00103 internal::pack_tests(label, new_nlabels);
00104
00105 fun::i2v::array<bool>
00106 fv2b = data::compute(accu::meta::label_used(), label);
00107
00108 mln_value(I) tmp_nlabels = fv2b.size() - 1;
00109 mln_concrete(I)
00110 output = data::transform(label,
00111 make::relabelfun(fv2b,
00112 tmp_nlabels,
00113 new_nlabels));
00114
00115 trace::exiting("labeling::pack");
00116 return output;
00117 }
00118
00119
00120
00121 template <typename I>
00122 void
00123 pack_inplace(Image<I>& label, mln_value(I)& new_nlabels)
00124 {
00125 trace::entering("labeling::pack_inplace");
00126
00127 internal::pack_tests(label, new_nlabels);
00128
00129 fun::i2v::array<bool>
00130 fv2b = data::compute(accu::meta::label_used(), label);
00131
00132 mln_value(I) tmp_nlabels = fv2b.size() - 1;
00133 exact(label) = data::transform(label,
00134 make::relabelfun(fv2b,
00135 tmp_nlabels,
00136 new_nlabels));
00137
00138 trace::exiting("labeling::pack_inplace");
00139 }
00140
00141
00142 # endif // ! MLN_INCLUDE_ONLY
00143
00144 }
00145
00146 }
00147
00148
00149 #endif // ! MLN_LABELING_PACK_HH