Loading...
Searching...
No Matches
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"
30
31#include <limits>
32
33namespace 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 */
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 */
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 */
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(
173 memcpy( m_neighborSegments, other.m_neighborSegments,
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
TerraLib.
bool isEnabled() const
Returns true if this segment is enabled.
void removeAllNeighborSegmentsPtrs()
Remove all neighbor segments.
SegmenterRegionGrowingSegment< FeatureDataTypeT > * m_prevActiveSegment
A pointer to the previous active segment.
void addNeighborSegmentPtr(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const nSegPtr)
Add a pointer of a neighbor segment (if it is not already there).
unsigned int m_neighborSegmentsSize
The current size of m_neighborSegments.
void removeNeighborSegmentPtr(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const nSegPtr)
Remove all occurrences of a neighbor segment.
SegmenterRegionGrowingSegment< FeatureDataTypeT > * m_nextActiveSegment
A pointer to the next active segment.
unsigned int m_xBound
Segment lower bound X coordinate box over the label image.
void disable()
Disable this segment ( same as m_mergetIteration = std::numeric_limits< SegmenterRegionGrowingSegment...
unsigned int m_featuresSize
The current size of m_features.
unsigned int m_yBound
Segment lower bound Y coordinate box over the label image.
SegmenterRegionGrowingSegment< FeatureDataTypeT > & operator=(const SegmenterRegionGrowingSegment< FeatureDataTypeT > &other)
unsigned int m_xStart
Segment left X coordinate box over the label image.
unsigned short int IterationCounterType
Feature type definition.
FeatureType * m_features
A pionter to a fixed size vector of segment features.
FeatureDataTypeT FeatureType
Feature type definition.
unsigned int m_yStart
Segment upper Y coordinate box over the label image.
unsigned int m_size
Segment area (pixels number).
IterationCounterType m_mergetIteration
The current merge iteration.
SegmenterRegionGrowingSegment< FeatureDataTypeT > ** m_neighborSegments
Neighborhood segments pointers (some pointers can be null) or a null pointer if there is no neighborh...
SegmenterSegmentsBlock::SegmentIdDataType m_id
Segment ID.
Proxy configuration file for TerraView (see terraview_config.h).