25 #ifndef __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGFUNCTIONS_H
26 #define __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGFUNCTIONS_H
68 bool normto8bits,
const std::string& fileName );
75 template<
typename FeatureDataTypeT >
78 unsigned int returnValue = 0;
108 template<
typename FeatureDataTypeT >
111 const unsigned int maxSegSizeThreshold,
114 const bool enablelocalMutualBestFitting,
115 const bool enableSameIterationMerges,
121 unsigned int& totalMergesNumber,
122 IterationCounterType& globalMergeIterationsCounter,
125 TERP_TRUE_OR_THROW( actSegsListHeadPtrPtr != 0,
"Invalid active segments list header pointer" );
126 TERP_TRUE_OR_THROW( (*actSegsListHeadPtrPtr) != 0,
"Invalid active segments list header pointer" );
128 minFoundDissimilarity = std::numeric_limits< DissimilarityTypeT >::max();
130 totalMergesNumber = 0;
134 unsigned int internalMaxSegSizeThreshold = maxSegSizeThreshold;
136 if( maxSegSizeThreshold ) {
137 internalDisimilarityThreshold = std::numeric_limits< DissimilarityTypeT >::max();
140 internalMaxSegSizeThreshold = std::numeric_limits< unsigned int >::max();
144 unsigned int iterationMergedSegmentsNumber = 0;
145 unsigned int segmentsLine = 0;
146 unsigned int segmentsLineBound = 0;
147 unsigned int segmentCol = 0;
148 unsigned int segmentColStart = 0;
149 unsigned int segmentColBound = 0;
158 std::list< SegmenterSegmentsBlock::SegmentIdDataType > freeSegmentIds;
159 unsigned int neighborSegIdx = 0;
164 iterationMergedSegmentsNumber = 0;
165 currActSegPtr = (*actSegsListHeadPtrPtr);
168 merger.
update( *actSegsListHeadPtrPtr );
172 if( ( enableSameIterationMerges || ( currActSegPtr->
m_mergetIteration < globalMergeIterationsCounter ) )
174 ( currActSegPtr->
m_size <= internalMaxSegSizeThreshold ) ) {
179 minForwardDissimilaritySegmentPtr = 0;
180 minForwardDissimilarityValue = std::numeric_limits< DissimilarityTypeT >::max();
190 if( ( forwardDissimilarityValue <= internalDisimilarityThreshold )
192 ( forwardDissimilarityValue < minForwardDissimilarityValue ) ) {
193 minForwardDissimilarityValue = forwardDissimilarityValue;
194 minForwardDissimilaritySegmentPtr = currActSegPtr->
m_neighborSegments[ neighborSegIdx ];
195 auxSeg3Ptr->operator=( *auxSeg1Ptr );
202 if( enablelocalMutualBestFitting && ( minForwardDissimilaritySegmentPtr != 0 ) ) {
205 minBackwardDissimilaritySegmentPtr = 0;
206 backwardDissimilarityValue = 0;
207 minBackwardDissimilarityValue = std::numeric_limits< DissimilarityTypeT >::max();
209 for( neighborSegIdx = 0 ;
215 backwardDissimilarityValue =
220 if( backwardDissimilarityValue < minBackwardDissimilarityValue ) {
221 minBackwardDissimilarityValue = backwardDissimilarityValue;
222 minBackwardDissimilaritySegmentPtr =
228 if( minBackwardDissimilaritySegmentPtr != currActSegPtr ) {
229 minForwardDissimilaritySegmentPtr = 0;
234 if( ( minForwardDissimilaritySegmentPtr != 0 )
236 ( enableSameIterationMerges ||
237 ( minForwardDissimilaritySegmentPtr->
m_mergetIteration < globalMergeIterationsCounter )
240 if( minFoundDissimilarity > minForwardDissimilarityValue ) {
241 minFoundDissimilarity = minForwardDissimilarityValue;
244 if( maxFoundDissimilarity < minForwardDissimilarityValue ) {
245 maxFoundDissimilarity = minForwardDissimilarityValue;
253 minForwardDissimilaritySegmentPtr,
263 for( neighborSegIdx = 0 ;
270 ( minForwardDissimilaritySegmentPtr->
m_neighborSegments[ neighborSegIdx ] != currActSegPtr ) ) {
281 minForwardDissimilaritySegmentPtr->
m_neighborSegments[ neighborSegIdx ]->addNeighborSegmentPtr(
286 minForwardDissimilaritySegmentPtr->
m_neighborSegments[ neighborSegIdx ]->removeNeighborSegmentPtr(
287 minForwardDissimilaritySegmentPtr );
293 segmentsLineBound = minForwardDissimilaritySegmentPtr->
m_yBound;
294 segmentColStart = minForwardDissimilaritySegmentPtr->
m_xStart;
295 segmentColBound = minForwardDissimilaritySegmentPtr->
m_xBound;
296 currentSegmentId = currActSegPtr->
m_id;
298 for( segmentsLine = minForwardDissimilaritySegmentPtr->
m_yStart ;
299 segmentsLine < segmentsLineBound ; ++segmentsLine ) {
300 segmentsIdsLinePtr = segmentsIds[ segmentsLine ];
302 for( segmentCol = segmentColStart ; segmentCol < segmentColBound ; ++segmentCol ) {
303 if( segmentsIdsLinePtr[ segmentCol ] ==
304 minForwardDissimilaritySegmentPtr->
m_id ) {
305 segmentsIdsLinePtr[ segmentCol ] = currentSegmentId;
313 if( minForwardDissimilaritySegmentPtr == (*actSegsListHeadPtrPtr) ) {
314 (*actSegsListHeadPtrPtr) = (*actSegsListHeadPtrPtr)->m_nextActiveSegment;
327 minForwardDissimilaritySegmentPtr->
disable();
331 freeSegmentIds.push_back( minForwardDissimilaritySegmentPtr->
m_id );
333 ++iterationMergedSegmentsNumber;
340 }
while( currActSegPtr );
344 if( ! freeSegmentIds.empty() ) {
345 segmenterIdsManager.
addFreeIDs( freeSegmentIds );
346 freeSegmentIds.clear();
349 totalMergesNumber += iterationMergedSegmentsNumber;
354 ++globalMergeIterationsCounter;
356 }
while( iterationMergedSegmentsNumber &&
357 ( globalMergeIterationsCounter <
358 std::numeric_limits< IterationCounterType >::max() ) );
364 #endif // __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGFUNCTIONS_H
unsigned int getActiveSegmentsNumber(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const actSegsListHeadPtr)
Returns the number of active segments.
Segmenter segments IDs manager.
unsigned int m_xStart
Segment left X coordinate box over the label image.
double DissimilarityTypeT
Type for dissimilarity.
unsigned short int IterationCounterType
Iteration counter type.
void disable()
Disable this segment ( same as m_mergetIteration = std::numeric_limits< SegmenterRegionGrowingSegment...
void mergeSegments(SegmentsIdsMatrixT &segmentsIds, const DissimilarityTypeT disimilarityThreshold, const unsigned int maxSegSizeThreshold, SegmenterIdsManager &segmenterIdsManager, SegmenterRegionGrowingMerger< FeatureDataTypeT > &merger, const bool enablelocalMutualBestFitting, const bool enableSameIterationMerges, SegmenterRegionGrowingSegment< FeatureDataTypeT > *auxSeg1Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > *auxSeg2Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > *auxSeg3Ptr, DissimilarityTypeT &minFoundDissimilarity, DissimilarityTypeT &maxFoundDissimilarity, unsigned int &totalMergesNumber, IterationCounterType &globalMergeIterationsCounter, SegmenterRegionGrowingSegment< FeatureDataTypeT > **const actSegsListHeadPtrPtr)
Merge closest segments.
float BaatzFeatureType
Baatz Strategy feature type.
unsigned int m_neighborSegmentsSize
The current size of m_neighborSegments.
Segmenter merger used in region growing process.
virtual DissimilarityTypeT getDissimilarity(SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const segment1Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const segment2Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > *const mergePreviewSegPtr) const =0
Returns a dimilarity index between this and the other segment.
unsigned int SegmentIdDataType
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.
Abstract class for the segments merger.
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.
Matrix< SegmenterSegmentsBlock::SegmentIdDataType > SegmentsIdsMatrixT
Definition for segments ids matrix type.
SegmenterRegionGrowingSegment< FeatureDataTypeT > ** m_neighborSegments
Neighborhood segments pointers (some pointers can be null) or a null pointer if there is no neighborh...
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.
float MeanFeatureType
Mean Strategy feature type.
virtual void update(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const actSegsListHeadPtr)=0
Update the internal state.
unsigned int m_yBound
Segment lower bound Y coordinate box over the label image.
unsigned int m_size
Segment area (pixels number).
void addFreeIDs(const std::vector< SegmenterSegmentsBlock::SegmentIdDataType > &ids)
Stores free unique IDs for later use.
virtual void mergeFeatures(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const segment1Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const segment2Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const mergePreviewSegPtr) const =0
Merge specific segment features from both segments into the first segment.
void exportSegs2Tif(const SegmentsIdsMatrixT &segmentsIds, bool normto8bits, const std::string &fileName)
Export the segments IDs to a tif file.
#define TERP_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not.