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_FILL_HOLES_HH
00027 # define MLN_LABELING_FILL_HOLES_HH
00028
00032
00033 # include <mln/labeling/background.hh>
00034 # include <mln/labeling/compute.hh>
00035
00036 # include <mln/core/image/dmorph/image_if.hh>
00037 # include <mln/accu/math/count.hh>
00038
00039
00040 namespace mln
00041 {
00042
00043 namespace labeling
00044 {
00045
00059 template <typename I, typename N, typename L>
00060 I
00061 fill_holes(const Image<I>& input, const Neighborhood<N>& nbh,
00062 L& nlabels);
00063
00064
00065 # ifndef MLN_INCLUDE_ONLY
00066
00067 template <typename I, typename N, typename L>
00068 inline
00069 I
00070 fill_holes(const Image<I>& input, const Neighborhood<N>& nbh,
00071 L& nlabels)
00072 {
00073 trace::entering("labeling::fill_holes");
00074
00075 mlc_equal(mln_trait_image_kind(I),
00076 mln::trait::image::kind::binary)::check();
00077 mln_precondition(exact(input).is_valid());
00078 mln_precondition(exact(nbh).is_valid());
00079
00080 mln_ch_value(I, bool) output;
00081 initialize(output, input);
00082 data::fill(output, false);
00083
00084 mln_ch_value(I, L) lbls = labeling::background(input, nbh, nlabels);
00085
00086 accu::math::count<mln_value(I)> a_;
00087 util::array<unsigned> arr = labeling::compute(a_, input, lbls, nlabels);
00088
00089 unsigned bg_count = 0;
00090 unsigned bg_lbl = 0;
00091
00092
00093 for (unsigned i = 1; i < arr.nelements(); ++i)
00094 {
00095 if (arr[i] > bg_count)
00096 {
00097 bg_count = arr[i];
00098 bg_lbl = i;
00099 }
00100 }
00101
00102 data::fill((output | (pw::value(lbls) != bg_lbl)).rw(), true);
00103
00104 trace::exiting("labeling::fill_holes");
00105 return output;
00106 }
00107
00108 # endif // ! MLN_INCLUDE_ONLY
00109
00110 }
00111
00112 }
00113
00114
00115 #endif // ! MLN_LABELING_FILL_HOLES_HH