25 #ifndef __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGFUNCTIONS_H 26 #define __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGFUNCTIONS_H 33 #include "../common/progress/TaskProgress.h" 71 bool normto8bits,
const std::string& fileName );
78 template<
typename FeatureDataTypeT >
81 unsigned long int returnValue = 0;
103 template<
typename FeatureDataTypeT >
114 assert( minDissimilarityNeighborPtr );
115 assert( minDissimilarityMergeDataPtr );
117 (*minDissimilarityNeighborPtr) = 0;
118 *minDissimilarityMergeDataPtr = 0;
119 minDissimilarityValue = std::numeric_limits< DissimilarityTypeT >::max();
126 for(
unsigned int neighborSegIdx = 0 ; neighborSegIdx < neighborSegmentsSize ;
132 if( auxNeighborSegPtr != 0 )
135 auxNeighborSegPtr, currentTempMergeDataPtr );
137 if( currentDissimilarityValue < minDissimilarityValue )
139 minDissimilarityValue = currentDissimilarityValue;
140 (*minDissimilarityNeighborPtr) = auxNeighborSegPtr;
141 (*minDissimilarityMergeDataPtr) = currentTempMergeDataPtr;
143 if( currentTempMergeDataPtr == auxMergeDataPtr1 )
145 currentTempMergeDataPtr = auxMergeDataPtr2;
149 currentTempMergeDataPtr = auxMergeDataPtr1;
165 template<
typename FeatureDataTypeT >
176 assert( actSegsListHeadPtrPtr );
184 const unsigned int& segmentsLineBound = segPtr2->
m_yBound;
185 const unsigned int& segmentColStart = segPtr2->
m_xStart;
186 const unsigned int& segmentColBound = segPtr2->
m_xBound;
190 unsigned int segmentCol = 0;
192 for(
unsigned int segmentsLine = segPtr2->
m_yStart ;
193 segmentsLine < segmentsLineBound ; ++segmentsLine )
195 segmentsIdsLinePtr = segmentsIds[ segmentsLine ];
197 for( segmentCol = segmentColStart ; segmentCol < segmentColBound ;
201 segmentsIdsLinePtr[ segmentCol ]
206 segmentsIdsLinePtr[ segmentCol ] = segment1Id;
237 for(
unsigned int neighborSegIdx = 0 ; neighborSegIdx < neighborSegmentsSize;
248 neighborSegPtr != segPtr1 )
270 if( segPtr2 == (*actSegsListHeadPtrPtr) )
272 (*actSegsListHeadPtrPtr) = (*actSegsListHeadPtrPtr)->m_nextActiveSegment;
274 if( (*actSegsListHeadPtrPtr) ) (*actSegsListHeadPtrPtr)->m_prevActiveSegment = 0;
305 template<
typename FeatureDataTypeT >
314 "Invalid active segments list header pointer" );
316 if( (*actSegsListHeadPtrPtr) == 0 )
return;
320 unsigned long int iterationMergedSegmentsNumber = 0;
324 (*actSegsListHeadPtrPtr);
332 std::unique_ptr< SegmenterRegionGrowingMergeData >
333 backwardDissimilarityAuxMergeDataPtr1(
334 backwardDissimilarityMergeDataPtr );
337 std::unique_ptr< SegmenterRegionGrowingMergeData >
338 backwardDissimilarityAuxMergeDataPtr2(
339 backwardDissimilarityMergeDataPtr );
345 currActSegPtr = (*actSegsListHeadPtrPtr);
348 merger.
update( *actSegsListHeadPtrPtr );
350 iterationMergedSegmentsNumber = 0;
355 if( currActSegPtr->
m_size < maximumSegmentSize )
362 backwardDissimilarityAuxMergeDataPtr1.get(),
363 backwardDissimilarityAuxMergeDataPtr2.get(),
364 &minBackwardDissimilaritySegmentPtr,
365 minBackwardDissimilarityValue,
366 &backwardDissimilarityMergeDataPtr );
368 if( minBackwardDissimilaritySegmentPtr )
372 merge2Segments( minBackwardDissimilaritySegmentPtr, currActSegPtr,
373 backwardDissimilarityMergeDataPtr, segmentsIds,
374 merger, actSegsListHeadPtrPtr
377 minBackwardDissimilaritySegmentPtr->
m_mergetIteration = globalMergeIterationsCounter;
379 currActSegPtr = nextActSegPtr;
381 ++iterationMergedSegmentsNumber;
392 }
while( currActSegPtr );
399 ++globalMergeIterationsCounter;
400 }
while( iterationMergedSegmentsNumber );
417 template<
typename FeatureDataTypeT >
419 const bool enablelocalMutualBestFitting,
424 const double sameItMergesThreshold,
425 const unsigned int segmentsSimIncreaseSteps,
430 "Invalid active segments list header pointer" );
432 if( (*actSegsListHeadPtrPtr) == 0 )
return true;
437 segmentsSimIncreaseSteps ? maxDisimilarityThreshold / segmentsSimIncreaseSteps
440 unsigned long int maxAchievedMergesPerIteration = 0;
441 unsigned long int currentIterationMergedSegmentsNumber = 0;
443 (*actSegsListHeadPtrPtr);
445 bool enableSameIterationMerges =
false;
447 segmentsSimIncreaseSteps ? 0 : maxDisimilarityThreshold;
458 merger.
createMergeData( &forwardDissimilarityAuxMergeDataHandler1NPtr );
459 std::unique_ptr< SegmenterRegionGrowingMergeData >
460 forwardDissimilarityAuxMergeDataHandler1(
461 forwardDissimilarityAuxMergeDataHandler1NPtr );
464 merger.
createMergeData( &forwardDissimilarityAuxMergeDataHandler2NPtr );
465 std::unique_ptr< SegmenterRegionGrowingMergeData >
466 forwardDissimilarityAuxMergeDataHandler2(
467 forwardDissimilarityAuxMergeDataHandler2NPtr );
477 std::unique_ptr< SegmenterRegionGrowingMergeData >
478 backwardDissimilarityAuxMergeDataPtr1(
479 backwardDissimilarityMergeDataPtr );
482 std::unique_ptr< SegmenterRegionGrowingMergeData >
483 backwardDissimilarityAuxMergeDataPtr2(
484 backwardDissimilarityMergeDataPtr );
490 currActSegPtr = (*actSegsListHeadPtrPtr);
493 merger.
update( *actSegsListHeadPtrPtr );
495 currentIterationMergedSegmentsNumber = 0;
505 enableSameIterationMerges
515 forwardDissimilarityAuxMergeDataHandler1NPtr,
516 forwardDissimilarityAuxMergeDataHandler2NPtr,
517 &minForwardDissimilaritySegmentPtr,
518 minForwardDissimilarityValue,
519 &minForwardDissimilarityMergeDataPtr );
523 ( minForwardDissimilaritySegmentPtr )
525 ( minForwardDissimilarityValue <= currentDisimilarityThreshold )
531 globalMergeIterationsCounter
534 enableSameIterationMerges
538 if( enablelocalMutualBestFitting )
542 backwardDissimilarityAuxMergeDataPtr1.get(),
543 backwardDissimilarityAuxMergeDataPtr2.get(),
544 &minBackwardDissimilaritySegmentPtr,
545 minBackwardDissimilarityValue,
546 &backwardDissimilarityMergeDataPtr );
548 if( minBackwardDissimilaritySegmentPtr != currActSegPtr )
550 minForwardDissimilaritySegmentPtr = 0;
554 if( minForwardDissimilaritySegmentPtr )
557 globalMergeIterationsCounter;
559 if( currActSegPtr->
m_size > minForwardDissimilaritySegmentPtr->
m_size )
561 if( nextActSegPtr == minForwardDissimilaritySegmentPtr )
567 minForwardDissimilarityMergeDataPtr, segmentsIds,
568 merger, actSegsListHeadPtrPtr
574 minForwardDissimilarityMergeDataPtr, segmentsIds,
575 merger, actSegsListHeadPtrPtr
579 ++currentIterationMergedSegmentsNumber;
585 currActSegPtr = nextActSegPtr;
587 }
while( currActSegPtr );
589 maxAchievedMergesPerIteration = std::max( currentIterationMergedSegmentsNumber,
590 maxAchievedMergesPerIteration );
602 ((
double)currentIterationMergedSegmentsNumber)
605 ((
double)maxAchievedMergesPerIteration)
607 ( sameItMergesThreshold / 100.0 )
611 ++seqLowMergesItsNumber;
615 seqLowMergesItsNumber = 0;
618 enableSameIterationMerges =
false;
620 if( currentIterationMergedSegmentsNumber == 0 )
622 if( currentDisimilarityThreshold == maxDisimilarityThreshold )
628 currentDisimilarityThreshold = std::min( maxDisimilarityThreshold,
629 currentDisimilarityThreshold + disimilarityThresholdStepValue );
631 maxAchievedMergesPerIteration = 0;
634 else if( seqLowMergesItsNumber > 3 )
636 seqLowMergesItsNumber = 0;
637 maxAchievedMergesPerIteration = 0;
639 if( currentDisimilarityThreshold == maxDisimilarityThreshold )
641 enableSameIterationMerges =
true;
645 currentDisimilarityThreshold = std::min( maxDisimilarityThreshold,
646 currentDisimilarityThreshold + disimilarityThresholdStepValue );
650 ++globalMergeIterationsCounter;
670 #endif // __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGFUNCTIONS_H Segmenter data used by the merger in region growing process.
Segmenter segments IDs manager.
virtual void mergeFeatures(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const segment1Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const segment2Ptr, SegmenterRegionGrowingMergeData const *const mergeDataPtr) const =0
Merge specific segment features from both segments into the first segment.
unsigned int m_xStart
Segment left X coordinate box over the label image.
double DissimilarityTypeT
Type for dissimilarity.
virtual DissimilarityTypeT getDissimilarity(SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const segment1Ptr, SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const segment2Ptr, SegmenterRegionGrowingMergeData *const mergeDataPtr) const =0
Returns a dimilarity index between this and the other segment.
unsigned long int getActiveSegmentsNumber(SegmenterRegionGrowingSegment< FeatureDataTypeT > *const actSegsListHeadPtr)
Returns the number of active segments.
unsigned short int IterationCounterType
Iteration counter type.
void disable()
Disable this segment ( same as m_mergetIteration = std::numeric_limits< SegmenterRegionGrowingSegment...
This class can be used to inform the progress of a task.
float BaatzFeatureType
Baatz Strategy feature type.
bool mergeSegments(const DissimilarityTypeT maxDisimilarityThreshold, const bool enablelocalMutualBestFitting, SegmentsIdsMatrixT &segmentsIds, SegmenterIdsManager &segmenterIdsManager, SegmenterRegionGrowingMerger< FeatureDataTypeT > &merger, IterationCounterType &globalMergeIterationsCounter, const double sameItMergesThreshold, const unsigned int segmentsSimIncreaseSteps, SegmenterRegionGrowingSegment< FeatureDataTypeT > **actSegsListHeadPtrPtr, te::common::TaskProgress *taskProgressPtr)
Merge segments following a maximum dissimilarity thresold.
unsigned int m_neighborSegmentsSize
The current size of m_neighborSegments.
Segmenter merger used in region growing process.
unsigned int SegmentIdDataType
SegmenterRegionGrowingSegment< FeatureDataTypeT > * m_prevActiveSegment
A pointer to the previous active segment.
IterationCounterType m_mergetIteration
The current merge iteration.
virtual void createMergeData(SegmenterRegionGrowingMergeData **mergeDataPtr) const =0
Create a new merge data instance when applicable.
SegmenterRegionGrowingSegment< FeatureDataTypeT > * m_nextActiveSegment
A pointer to the next active segment.
void removeAllNeighborSegmentsPtrs()
Remove all neighbor segments.
void mergeTooSmallSegments(const unsigned int maximumSegmentSize, SegmentsIdsMatrixT &segmentsIds, SegmenterIdsManager &segmenterIdsManager, SegmenterRegionGrowingMerger< FeatureDataTypeT > &merger, IterationCounterType &globalMergeIterationsCounter, SegmenterRegionGrowingSegment< FeatureDataTypeT > **actSegsListHeadPtrPtr)
Merge too small segments to its closer neighbor.
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.
bool isActive() const
Verify if the task is active.
unsigned int m_size
Segment area (pixels number).
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.
void findMinDissimilaryNeighbor(SegmenterRegionGrowingSegment< FeatureDataTypeT > const *const segPtr, const SegmenterRegionGrowingMerger< FeatureDataTypeT > &merger, SegmenterRegionGrowingMergeData *const auxMergeDataPtr1, SegmenterRegionGrowingMergeData *const auxMergeDataPtr2, SegmenterRegionGrowingSegment< FeatureDataTypeT > **minDissimilarityNeighborPtr, DissimilarityTypeT &minDissimilarityValue, SegmenterRegionGrowingMergeData **minDissimilarityMergeDataPtr)
Locatie the minimim dissimilarity neighbor segment.
void merge2Segments(SegmenterRegionGrowingSegment< FeatureDataTypeT > *segPtr1, SegmenterRegionGrowingSegment< FeatureDataTypeT > *segPtr2, SegmenterRegionGrowingMergeData const *const mergeDataPtr, SegmentsIdsMatrixT &segmentsIds, SegmenterRegionGrowingMerger< FeatureDataTypeT > &merger, SegmenterRegionGrowingSegment< FeatureDataTypeT > **actSegsListHeadPtrPtr)
Merge segment 2 into segment 1.