SegmenterRegionGrowingSegment.h
Go to the documentation of this file.
1 /* Copyright (C) 2008-2015 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib 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
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/rp/SegmenterRegionGrowingSegment.h
22  \brief Region Growing segment.
23  */
24 
25 #ifndef __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGSEGMENT_H
26 #define __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGSEGMENT_H
27 
28 #include "Config.h"
29 #include "SegmenterSegmentsBlock.h"
30 
31 #include <limits>
32 
33 namespace te
34 {
35  namespace rp
36  {
37  /*!
38  \brief Region Growing segment.
39  */
40  template< typename FeatureDataTypeT >
42  {
43  /*!
44  \brief Feature type definition.
45  */
46  typedef FeatureDataTypeT FeatureType;
47 
48  /*!
49  \brief Feature type definition.
50  */
51  typedef unsigned short int IterationCounterType;
52 
53  /*!
54  \brief Segment ID.
55  */
57 
58  /*!
59  \brief Segment area (pixels number).
60  */
61  unsigned int m_size;
62 
63  /*!
64  \brief Segment left X coordinate box over the label image.
65  */
66  unsigned int m_xStart;
67 
68  /*!
69  \brief Segment lower bound X coordinate box over the label image.
70  */
71  unsigned int m_xBound;
72 
73  /*!
74  \brief Segment upper Y coordinate box over the label image.
75  */
76  unsigned int m_yStart;
77 
78  /*!
79  \brief Segment lower bound Y coordinate box over the label image.
80  */
81  unsigned int m_yBound;
82 
83  /*!
84  \brief Neighborhood segments pointers (some pointers can be null) or a null pointer if there is no neighborhood.
85  \note The segments pool will delete the vector pointed by this pointer at this segment deletion time.
86  */
88 
89  /*!
90  \brief The current size of m_neighborSegments.
91  */
92  unsigned int m_neighborSegmentsSize;
93 
94  /*!
95  \brief A pointer to the previous active segment.
96  */
98 
99  /*!
100  \brief A pointer to the next active segment.
101  */
103 
104  /*!
105  \brief A pionter to a fixed size vector of segment features.
106  \note The segments pool have the ownership of this vector.
107  */
108  FeatureType* m_features;
109 
110  /*!
111  \brief The current size of m_features.
112  */
113  unsigned int m_featuresSize;
114 
115  /*!
116  \brief The current merge iteration.
117  \note Disabled: std::numeric_limits< SegmenterRegionGrowingSegment::IterationCounterType>::max()
118  */
119  IterationCounterType m_mergetIteration;
120 
121  //overload
124 
125  /*!
126  \brief Add a pointer of a neighbor segment (if it is not already there).
127  */
129 
130  /*!
131  \brief Remove all occurrences of a neighbor segment.
132  */
134 
135  /*!
136  \brief Remove all neighbor segments.
137  */
139 
140  /*!
141  \brief Disable this segment ( same as m_mergetIteration = std::numeric_limits< SegmenterRegionGrowingSegment::IterationCounterType>::max() ).
142  */
143  inline void disable() { m_mergetIteration = std::numeric_limits< IterationCounterType>::max(); };
144 
145  /*!
146  \brief Returns true if this segment is enabled.
147  \returns Returns true if this segment is enabled.
148  */
149  inline bool isEnabled() const { return m_mergetIteration != std::numeric_limits< IterationCounterType>::max(); };
150 
151  };
152 
153  template< typename FeatureDataTypeT >
154  SegmenterRegionGrowingSegment< FeatureDataTypeT >&
156  {
157  m_id = other.m_id;
158  m_size = other.m_size;
159  m_xStart = other.m_xStart;
160  m_xBound = other.m_xBound;
161  m_yStart = other.m_yStart;
162  m_yBound = other.m_yBound;
163  m_mergetIteration = other.m_mergetIteration;
164  m_prevActiveSegment = other.m_prevActiveSegment;
165  m_nextActiveSegment = other.m_nextActiveSegment;
166 
167  free( m_neighborSegments );
168  if( other.m_neighborSegmentsSize )
169  {
170  m_neighborSegments = (SegmenterRegionGrowingSegment**)malloc(
171  sizeof( SegmenterRegionGrowingSegment* ) *
172  other.m_neighborSegmentsSize );
173  memcpy( m_neighborSegments, other.m_neighborSegments,
174  sizeof( SegmenterRegionGrowingSegment* ) *
175  other.m_neighborSegmentsSize );
176  m_neighborSegmentsSize = other.m_neighborSegmentsSize;
177  }
178  else
179  {
180  m_neighborSegments = 0;
181  m_neighborSegmentsSize = 0;
182  }
183 
184  if( other.m_featuresSize )
185  {
186  memcpy( m_features, other.m_features,
187  sizeof( FeatureType ) * other.m_featuresSize );
188  }
189  m_featuresSize = other.m_featuresSize;
190 
191  return *this;
192  }
193 
194  template< typename FeatureDataTypeT >
196  SegmenterRegionGrowingSegment * const nSegPtr )
197  {
198  if( nSegPtr )
199  {
200  unsigned int idx = 0;
201 
202  for( idx = 0 ; idx < m_neighborSegmentsSize ; ++idx )
203  {
204  if( m_neighborSegments[ idx ] == nSegPtr )
205  {
206  return;
207  }
208  }
209 
210  for( idx = 0 ; idx < m_neighborSegmentsSize ; ++idx )
211  {
212  if( m_neighborSegments[ idx ] == 0 )
213  {
214  m_neighborSegments[ idx ] = nSegPtr;
215  return;
216  }
217  }
218 
219  m_neighborSegments = (SegmenterRegionGrowingSegment**)realloc(
220  m_neighborSegments, ( m_neighborSegmentsSize + 1 ) * sizeof(
222 
223  m_neighborSegments[ m_neighborSegmentsSize ] = nSegPtr;
224 
225  m_neighborSegmentsSize = m_neighborSegmentsSize + 1;
226  }
227  }
228 
229  template< typename FeatureDataTypeT >
232  {
233  unsigned int numberOfZeroes = 0;
234  unsigned int idx = 0;
235  for( ; idx < m_neighborSegmentsSize ; ++idx )
236  {
237  if( m_neighborSegments[ idx ] == nSegPtr )
238  {
239  m_neighborSegments[ idx ] = 0;
240  ++numberOfZeroes;
241  }
242  else if( m_neighborSegments[ idx ] == 0 )
243  {
244  ++numberOfZeroes;
245  }
246  }
247 
248  unsigned int numberOfNonZeroes = m_neighborSegmentsSize - numberOfZeroes;
249 
250  if( ( m_neighborSegmentsSize > 4 ) && ( numberOfNonZeroes < numberOfZeroes ) )
251  {
253  malloc( numberOfNonZeroes * sizeof( SegmenterRegionGrowingSegment* ) );
254 
255  unsigned int idx2 = 0;
256 
257  for( idx = 0 ; idx < m_neighborSegmentsSize ; ++idx )
258  {
259  if( m_neighborSegments[ idx ] )
260  {
261  auxVecPtr[ idx2++ ] = m_neighborSegments[ idx ];
262  }
263  }
264 
265  free( m_neighborSegments );
266  m_neighborSegments = auxVecPtr;
267  m_neighborSegmentsSize = numberOfNonZeroes;
268  }
269  }
270 
271  template< typename FeatureDataTypeT >
273  {
274  free( m_neighborSegments );
275  m_neighborSegments = 0;
276  m_neighborSegmentsSize = 0;
277  }
278  } // namespace rp
279 } // namespace te
280 
281 #endif // __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGSEGMENT_H
unsigned int m_xStart
Segment left X coordinate box over the label image.
bool isEnabled() const
Returns true if this segment is enabled.
void disable()
Disable this segment ( same as m_mergetIteration = std::numeric_limits< SegmenterRegionGrowingSegment...
SegmenterRegionGrowingSegment< FeatureDataTypeT > & operator=(const SegmenterRegionGrowingSegment< FeatureDataTypeT > &other)
unsigned int m_neighborSegmentsSize
The current size of m_neighborSegments.
unsigned short int IterationCounterType
Feature type definition.
SegmenterRegionGrowingSegment< FeatureDataTypeT > * m_prevActiveSegment
A pointer to the previous active segment.
IterationCounterType m_mergetIteration
The current merge iteration.
SegmenterRegionGrowingSegment< FeatureDataTypeT > * m_nextActiveSegment
A pointer to the next active segment.
void removeAllNeighborSegmentsPtrs()
Remove all neighbor segments.
URI C++ Library.
void addNeighborSegmentPtr(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const nSegPtr)
Add a pointer of a neighbor segment (if it is not already there).
SegmenterSegmentsBlock::SegmentIdDataType m_id
Segment ID.
unsigned int m_yStart
Segment upper Y coordinate box over the label image.
FeatureType * m_features
A pionter to a fixed size vector of segment features.
Configuration flags for the Raster Processing module of TerraLib.
SegmenterRegionGrowingSegment< FeatureDataTypeT > ** m_neighborSegments
Neighborhood segments pointers (some pointers can be null) or a null pointer if there is no neighborh...
Segments block.
unsigned int m_xBound
Segment lower bound X coordinate box over the label image.
void removeNeighborSegmentPtr(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const nSegPtr)
Remove all occurrences of a neighbor segment.
unsigned int m_yBound
Segment lower bound Y coordinate box over the label image.
unsigned int m_size
Segment area (pixels number).
unsigned int m_featuresSize
The current size of m_features.
FeatureDataTypeT FeatureType
Feature type definition.