$extrastylesheet
Olena  User documentation 2.1
An Image Processing Platform
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
apply.hh
1 // Copyright (C) 2009, 2010, 2011 EPITA Research and Development
2 // Laboratory (LRDE)
3 //
4 // This file is part of Olena.
5 //
6 // Olena is free software: you can redistribute it and/or modify it under
7 // the terms of the GNU General Public License as published by the Free
8 // Software Foundation, version 2 of the License.
9 //
10 // Olena is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Olena. If not, see <http://www.gnu.org/licenses/>.
17 //
18 // As a special exception, you may use this file as part of a free
19 // software project without restriction. Specifically, if other files
20 // instantiate templates or use macros or inline functions from this
21 // file, or you compile this file and link it with other files to produce
22 // an executable, this file does not by itself cause the resulting
23 // executable to be covered by the GNU General Public License. This
24 // exception does not however invalidate any other reasons why the
25 // executable file might be covered by the GNU General Public License.
26 
27 #ifndef SCRIBO_PRIMITIVE_GROUP_APPLY_HH
28 # define SCRIBO_PRIMITIVE_GROUP_APPLY_HH
29 
33 
34 # include <mln/fun/i2v/array.hh>
35 # include <mln/make/relabelfun.hh>
36 # include <mln/labeling/relabel.hh>
37 
38 # include <scribo/core/object_links.hh>
39 # include <scribo/core/object_groups.hh>
40 # include <scribo/core/component_set.hh>
41 
42 # include <scribo/primitive/group/from_single_link.hh>
43 
44 namespace scribo
45 {
46 
47  namespace primitive
48  {
49 
50  namespace group
51  {
52 
53  using namespace mln;
54 
61  template <typename L>
62  component_set<L>
63  apply(const object_groups<L>& groups);
64 
66  template <typename L>
67  component_set<L>
68  apply(const object_links<L>& links);
69 
70 
71 
72 # ifndef MLN_INCLUDE_ONLY
73 
74 
75  template <typename L>
76  component_set<L>
77  apply(const object_groups<L>& groups,
78  mln::fun::i2v::array<mln_value(L)>& relabel_fun)
79 
80  {
81  mln_trace("scribo::primitive::group::apply");
82 
83  mln_precondition(groups.is_valid());
84 
85  const component_set<L>& components = groups.components();
86 
87  L labeled_image = duplicate(components.labeled_image());
88 
89  // Components part of an invalid group should not exist
90  // anymore, so they are relabeled as background.
91  mln::util::array<unsigned> tmp = groups.comp_to_group();
92  for_all_groups(g, groups)
93  if (!groups(g).is_valid())
94  for_all_elements(c, groups(g).component_ids())
95  tmp(groups(g).component_ids()(c)) = 0;
96 
97  mln_value(L) new_nlabels;
98  relabel_fun = mln::make::relabelfun(tmp,
99  components.nelements(),
100  new_nlabels);
101 
102  labeling::relabel_inplace(labeled_image, new_nlabels,
103  relabel_fun);
104 
105  component_set<L> output(labeled_image, new_nlabels);
106 
107  return output;
108  }
109 
110 
111  template <typename L>
112  component_set<L>
113  apply(const object_groups<L>& groups)
114  {
116  return apply(groups, relabel_fun);
117  }
118 
119 
120  template <typename L>
121  component_set<L>
122  apply(const object_links<L>& links)
123 
124  {
125  mln_trace("scribo::primitive::group::apply");
126 
127  mln_precondition(links.is_valid());
128 
129  object_groups<L> group = group::from_single_link(links);
130  component_set<L> output = apply(group);
131 
132  return output;
133  }
134 
135 
136 # endif // ! MLN_INCLUDE_ONLY
137 
138  } // end of namespace scribo::primitive::group
139 
140  } // end of namespace scribo::primitive
141 
142 } // end of namespace scribo
143 
144 #endif // ! SCRIBO_PRIMITIVE_GROUP_APPLY_HH