SegmenterRegionGrowingMeanStrategy.cpp
Go to the documentation of this file.
1 /* Copyright (C) 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/SegmenterRegionGrowingMeanStrategy.cpp
22  \briefRaster region growing segmenter Mean strategy.
23 */
24 
27 
28 #include "Macros.h"
29 
30 #include "../raster/Band.h"
31 #include "../raster/BandProperty.h"
32 #include "../raster/RasterFactory.h"
33 #include "../raster/Grid.h"
34 #include "../datatype/Enums.h"
35 #include "../common/progress/TaskProgress.h"
36 
37 #include <algorithm>
38 #include <cfloat>
39 #include <cmath>
40 #include <cstring>
41 #include <limits>
42 
43 #include <boost/lexical_cast.hpp>
44 
45 namespace
46 {
48  segmenterRegionGrowingMeanStrategyFactoryInstance;
49 }
50 
51 namespace te
52 {
53  namespace rp
54  {
55  //-------------------------------------------------------------------------
56 
58  {
59  reset();
60  }
61 
63 
67  {
68  reset();
69 
75 
76  return *this;
77  }
78 
80  throw( te::rp::Exception )
81  {
82  m_minSegmentSize = 100;
87  }
88 
90  {
92  }
93 
95  {
96  m_isInitialized = false;
97  }
98 
100  {
101  reset();
102  }
103 
105  SegmenterStrategyParameters const* const strategyParams )
106  throw( te::rp::Exception )
107  {
108  m_isInitialized = false;
109  reset();
110 
112  dynamic_cast< SegmenterRegionGrowingMeanStrategy::Parameters const* >( strategyParams );
113 
114  if( paramsPtr )
115  {
116  m_parameters = *( paramsPtr );
117 
119  "Invalid segmenter strategy parameter m_minSegmentSize" )
120 
123  "Invalid segmenter strategy parameter m_segmentsSimilarityThreshold" )
124 
125  m_isInitialized = true;
126 
127  return true;
128  }
129  else
130  {
131  return false;
132  }
133  }
134 
136  {
138 
139  m_isInitialized = false;
143  }
144 
146  SegmenterIdsManager& segmenterIdsManager,
147  const te::rp::SegmenterSegmentsBlock& block2ProcessInfo,
148  const te::rst::Raster& inputRaster,
149  const std::vector< unsigned int >& inputRasterBands,
150  const std::vector< std::complex< double > >& inputRasterNoDataValues,
151  const std::vector< std::complex< double > >& inputRasterBandMinValues,
152  const std::vector< std::complex< double > >& inputRasterBandMaxValues,
153  te::rst::Raster& outputRaster,
154  const unsigned int outputRasterBand,
155  const bool enableProgressInterface )
156  throw( te::rp::Exception )
157  {
159  "Instance not initialized" )
160 
161  // Creating the merger instance
162 
163  std::unique_ptr< SegmenterRegionGrowingMeanMerger >
164  mergerPtr( new SegmenterRegionGrowingMeanMerger( (unsigned int)inputRasterBands.size() ) );
165 
166  // Initiating the segments pool
167 
168  const unsigned int segmentFeaturesSize = mergerPtr->getSegmentFeaturesSize();
169 
170  // The number of segments plus 3 (due 3 auxiliary segments
172  block2ProcessInfo.m_height * block2ProcessInfo.m_width ),
173  segmentFeaturesSize ), "Segments pool initiation error" );
174 
175 // #ifndef NDEBUG
176 // {
177 // // checking alignment
178 // SegmenterRegionGrowingSegment< rg::MeanFeatureType >* auxSegPtr = 0;
179 // unsigned int counter = 0;
180 //
181 // while( auxSegPtr = m_segmentsPool.getNextSegment() )
182 // {
183 // for( unsigned int featureIdx = 0 ; featureIdx < auxSegPtr->m_featuresSize ;
184 // ++featureIdx )
185 // {
186 // auxSegPtr->m_features[ featureIdx ] = (SegmenterRegionGrowingSegment< rg::MeanFeatureType >::FeatureType)
187 // counter;
188 // }
189 // }
190 //
191 // m_segmentsPool.resetUseCounter();
192 //
193 // counter = 0;
194 //
195 // while( auxSegPtr = m_segmentsPool.getNextSegment() )
196 // {
197 // for( unsigned int featureIdx = 0 ; featureIdx < auxSegPtr->m_featuresSize ;
198 // ++featureIdx )
199 // {
200 // if( auxSegPtr->m_features[ featureIdx ] != (rg::MeanFeatureType)
201 // counter ) throw;
202 // }
203 // }
204 // }
205 // #endif
206 
208  auxSeg1Ptr->disable();
210  auxSeg2Ptr->disable();
212  auxSeg3Ptr->disable();
213 
214  // Allocating the ids matrix
215 
216  if( ( m_segmentsIdsMatrix.getLinesNumber() != block2ProcessInfo.m_height ) ||
217  ( m_segmentsIdsMatrix.getColumnsNumber() != block2ProcessInfo.m_width ) )
218  {
219  TERP_INSTANCE_TRUE_OR_RETURN_FALSE( m_segmentsIdsMatrix.reset( block2ProcessInfo.m_height,
220  block2ProcessInfo.m_width,
222  "Error allocating segments Ids matrix" );
223  }
224 
225  // Initializing segments
226 
227  SegmenterRegionGrowingSegment< rg::MeanFeatureType >* actSegsListHeadPtr = nullptr;
228 
230  block2ProcessInfo, inputRaster, inputRasterBands, inputRasterNoDataValues,
231  inputRasterBandMinValues, inputRasterBandMaxValues,
232  &actSegsListHeadPtr ),
233  "Segments initalization error" );
234 
235  if( actSegsListHeadPtr == nullptr )
236  {
237  // no segments were generated (image with no-data values only)
238  return true;
239  }
240 
241  // Progress interface
242 
243  std::unique_ptr< te::common::TaskProgress > progressPtr;
244  if( enableProgressInterface )
245  {
246  progressPtr.reset( new te::common::TaskProgress );
247  progressPtr->setTotalSteps( 2 + m_parameters.m_segmentsSimIncreaseSteps );
248  progressPtr->setMessage( "Segmentation" );
249  }
250 
251  // Globals
252 
253  DissimilarityTypeT minFoundDissimilarity = 0.0;
254  DissimilarityTypeT maxFoundDissimilarity = 0.0;
255  unsigned int totalMergesNumber = 0;
256  rg::IterationCounterType globalMergeIterationsCounter = 1;
257 
258  // Initial merge of equal segments
259 
260  if( enableProgressInterface )
261  {
262  if( ! progressPtr->isActive() )
263  {
264  return false;
265  }
266  progressPtr->pulse();
267  }
268 
269  // Merging the segments that are equal
270 
271 // TERP_LOGMSG( rg::getActiveSegmentsNumber< rg::MeanFeatureType >( actSegsListHeadPtr ) );
272 
273  rg::mergeSegments< rg::MeanFeatureType >(
275  0.0,
276  0,
277  segmenterIdsManager,
278  *mergerPtr,
279  false,
280  true,
281  auxSeg1Ptr,
282  auxSeg2Ptr,
283  auxSeg3Ptr,
284  minFoundDissimilarity,
285  maxFoundDissimilarity,
286  totalMergesNumber,
287  globalMergeIterationsCounter,
288  &actSegsListHeadPtr );
289 
290 // TERP_LOGMSG( rg::getActiveSegmentsNumber< rg::MeanFeatureType >( actSegsListHeadPtr ) );
291 
292  // Main Segmentation loop
293 
294  for( unsigned int segmentsSimIncreaseStep = 1 ; segmentsSimIncreaseStep <=
295  m_parameters.m_segmentsSimIncreaseSteps ; ++segmentsSimIncreaseStep )
296  {
297  const rg::MeanFeatureType disimilarityThreshold =
298  ( ((rg::MeanFeatureType)segmentsSimIncreaseStep) )
299  *
301  /
303 
304  rg::mergeSegments< rg::MeanFeatureType >(
306  disimilarityThreshold,
307  0,
308  segmenterIdsManager,
309  *mergerPtr,
312  auxSeg1Ptr,
313  auxSeg2Ptr,
314  auxSeg3Ptr,
315  minFoundDissimilarity,
316  maxFoundDissimilarity,
317  totalMergesNumber,
318  globalMergeIterationsCounter,
319  &actSegsListHeadPtr );
320 
321 // TERP_LOGMSG( rg::getActiveSegmentsNumber< rg::MeanFeatureType >( actSegsListHeadPtr ) );
322 
323  if( enableProgressInterface )
324  {
325  if( ! progressPtr->isActive() )
326  {
327  return false;
328  }
329  progressPtr->pulse();
330  }
331  }
332 
333  // Forcing the merge of too small segments
334 
336  {
337  rg::mergeSegments< rg::MeanFeatureType >(
339  std::numeric_limits< rg::MeanFeatureType >::max(),
341  segmenterIdsManager,
342  *mergerPtr,
343  false,
344  true,
345  auxSeg1Ptr,
346  auxSeg2Ptr,
347  auxSeg3Ptr,
348  minFoundDissimilarity,
349  maxFoundDissimilarity,
350  totalMergesNumber,
351  globalMergeIterationsCounter,
352  &actSegsListHeadPtr );
353 
354 // TERP_LOGMSG( rg::getActiveSegmentsNumber< rg::MeanFeatureType >( actSegsListHeadPtr ) );
355  }
356 
357  if( enableProgressInterface )
358  {
359  if( ! progressPtr->isActive() )
360  {
361  return false;
362  }
363  progressPtr->pulse();
364  }
365 
366  // Flush result to the output raster
367 
368  {
369  unsigned int blkCol = 0;
370  SegmenterSegmentsBlock::SegmentIdDataType* segmentsIdsLinePtr = nullptr;
371 
372  for( unsigned int blkLine = 0 ; blkLine < block2ProcessInfo.m_height ; ++blkLine )
373  {
374  segmentsIdsLinePtr = m_segmentsIdsMatrix[ blkLine ];
375 
376  for( blkCol = 0 ; blkCol < block2ProcessInfo.m_width ; ++blkCol )
377  {
378  if( segmentsIdsLinePtr[ blkCol ] )
379  {
380  outputRaster.setValue( blkCol + block2ProcessInfo.m_startX, blkLine
381  + block2ProcessInfo.m_startY, segmentsIdsLinePtr[ blkCol ],
382  outputRasterBand );
383  }
384  }
385  }
386  }
387 
388  return true;
389  }
390 
392  const unsigned int bandsToProcess,
393  const unsigned int pixelsNumber ) const
394  {
395  TERP_TRUE_OR_THROW( m_isInitialized, "Instance not initialized" );
396 
397  // The features matrix inside the pool
398  double featuresSizeBytes = (double)
399  (
400  pixelsNumber
401  *
402  bandsToProcess
403  *
404  sizeof( rg::MeanFeatureType )
405  );
406 
407  return (double)
408  (
409  featuresSizeBytes
410  +
411  ( // The segments matrix inside the pool
412  pixelsNumber
413  *
414  (
416  +
417  ( // An initial vector of pointers to 8 neighbors
418  6
419  *
421  )
422  )
423  )
424  +
425  ( // The segments IDs matrix inside the strategy
426  pixelsNumber
427  *
429  )
430  );
431  }
432 
434  {
435  TERP_TRUE_OR_THROW( m_isInitialized, "Instance not initialized" );
436  return (unsigned int)( std::sqrt( (double)m_parameters.m_minSegmentSize) );
437  }
438 
440  {
441  return true;
442  }
443 
446  {
448  }
449 
451  SegmenterIdsManager& segmenterIdsManager,
452  const te::rp::SegmenterSegmentsBlock& block2ProcessInfo,
453  const te::rst::Raster& inputRaster,
454  const std::vector< unsigned int >& inputRasterBands,
455  const std::vector< std::complex< double > >& inputRasterNoDataValues,
456  const std::vector< std::complex< double > >& inputRasterBandMinValues,
457  const std::vector< std::complex< double > >& inputRasterBandMaxValues,
459  {
460  const unsigned int inputRasterBandsSize = (unsigned int)
461  inputRasterBands.size();
462 
463  (*actSegsListHeadPtr) = nullptr;
464 
465  // calculating offset and gain
466 
467  std::vector< rg::MeanFeatureType > inputRasterBandGains(
468  inputRasterBandMinValues.size() );
469 
470  {
471  for( unsigned int inputRasterBandMinValuesIdx = 0 ; inputRasterBandMinValuesIdx
472  < inputRasterBandMinValues.size() ; ++inputRasterBandMinValuesIdx )
473  {
474  inputRasterBandGains[ inputRasterBandMinValuesIdx ] = (rg::MeanFeatureType)
475  ( inputRasterBandMaxValues[ inputRasterBandMinValuesIdx ].real() -
476  inputRasterBandMinValues[ inputRasterBandMinValuesIdx ].real() );
477 
478  if( inputRasterBandGains[ inputRasterBandMinValuesIdx ] != 0.0 )
479  {
480  inputRasterBandGains[ inputRasterBandMinValuesIdx ] = (rg::MeanFeatureType)( 1.0 /
481  inputRasterBandGains[ inputRasterBandMinValuesIdx ] );
482  }
483  }
484  }
485 
486  // Initializing each segment
487 
488  unsigned int blkLine = 0;
489  unsigned int blkCol = 0;
491  SegmenterRegionGrowingSegment< rg::MeanFeatureType >* neighborSegmentPtr = nullptr;
492  bool rasterValuesAreValid = true;
493  unsigned int inputRasterBandsIdx = 0;
494  double value = 0;
495  const std::vector< double > dummyZeroesVector( inputRasterBandsSize, 0 );
496 
497  std::list< SegmenterSegmentsBlock::SegmentIdDataType >
498  unusedLineSegmentIds;
499 
500  std::vector< SegmenterSegmentsBlock::SegmentIdDataType >
501  lineSegmentIds;
502  lineSegmentIds.reserve( block2ProcessInfo.m_width );
503 
504  std::vector< rg::MeanFeatureType > rasterValues;
505  std::vector< rg::MeanFeatureType > rasterSquareValues;
506  rasterValues.resize( inputRasterBandsSize, 0 );
507  rasterSquareValues.resize( inputRasterBandsSize, 0 );
508  std::vector< SegmenterRegionGrowingSegment< rg::MeanFeatureType >* > usedSegPointers1( block2ProcessInfo.m_width, nullptr );
509  std::vector< SegmenterRegionGrowingSegment< rg::MeanFeatureType >* > usedSegPointers2( block2ProcessInfo.m_width, nullptr );
510  std::vector< SegmenterRegionGrowingSegment< rg::MeanFeatureType >* >* lastLineSegsPtrs = &usedSegPointers1;
511  std::vector< SegmenterRegionGrowingSegment< rg::MeanFeatureType >* >* currLineSegsPtrs = &usedSegPointers2;
512 
514 
515  unsigned int rasterValuesIdx = 0;
516 
517  for( blkLine = 0 ; blkLine < block2ProcessInfo.m_height ; ++blkLine )
518  {
519  segmenterIdsManager.getNewIDs( block2ProcessInfo.m_width, lineSegmentIds );
520 
521  for( blkCol = 0 ; blkCol < block2ProcessInfo.m_width ; ++blkCol )
522  {
523  if(
524  ( blkLine >= block2ProcessInfo.m_topCutOffProfile[ blkCol ] )
525  &&
526  ( blkLine <= block2ProcessInfo.m_bottomCutOffProfile[ blkCol ] )
527  &&
528  ( blkCol >= block2ProcessInfo.m_leftCutOffProfile[ blkLine ] )
529  &&
530  ( blkCol <= block2ProcessInfo.m_rightCutOffProfile[ blkLine ] )
531  )
532  {
533  rasterValuesAreValid = true;
534 
535  for( inputRasterBandsIdx = 0 ; inputRasterBandsIdx <
536  inputRasterBandsSize ; ++inputRasterBandsIdx )
537  {
538  inputRaster.getValue( blkCol + block2ProcessInfo.m_startX, blkLine +
539  block2ProcessInfo.m_startY, value,
540  inputRasterBands[ inputRasterBandsIdx ] );
541 
542  if( value == inputRasterNoDataValues[ inputRasterBandsIdx ] )
543  {
544  rasterValuesAreValid = false;
545  break;
546  }
547  else
548  {
549  value -= inputRasterBandMinValues[ inputRasterBandsIdx ].real();
550  value *= inputRasterBandGains[ inputRasterBandsIdx ];
551 
552  rasterValues[ inputRasterBandsIdx ] =
553  (rg::MeanFeatureType)value;
554  rasterSquareValues[ inputRasterBandsIdx ] =
555  (rg::MeanFeatureType)( value * value );
556  }
557  }
558  }
559  else
560  {
561  rasterValuesAreValid = false;
562  }
563 
564  // assotiating a segment object
565 
566  if( rasterValuesAreValid )
567  {
568  segmentPtr = m_segmentsPool.getNextSegment();
569  assert( segmentPtr );
570 
571  for( rasterValuesIdx = 0 ; rasterValuesIdx < inputRasterBandsSize ;
572  ++rasterValuesIdx )
573  {
574  segmentPtr->m_features[ rasterValuesIdx ] = rasterValues[
575  rasterValuesIdx ];
576  }
577 
578  currLineSegsPtrs->operator[]( blkCol ) = segmentPtr;
579 
580  segmentPtr->m_id = lineSegmentIds[ blkCol ];
581  segmentPtr->m_size = 1;
582  segmentPtr->m_xStart = blkCol;
583  segmentPtr->m_xBound = blkCol + 1;
584  segmentPtr->m_yStart = blkLine;
585  segmentPtr->m_yBound = blkLine + 1;
586  segmentPtr->m_mergetIteration = 0;
587  segmentPtr->m_prevActiveSegment = prevActSegPtr;
588  segmentPtr->m_nextActiveSegment = nullptr;
589 
590  m_segmentsIdsMatrix( blkLine, blkCol ) = segmentPtr->m_id;
591 
592  // updating the neighboorhood info
593 
594  segmentPtr->removeAllNeighborSegmentsPtrs();
595 
596  if( blkLine )
597  {
598  neighborSegmentPtr = lastLineSegsPtrs->operator[]( blkCol );
599 
600  if( neighborSegmentPtr )
601  {
602  segmentPtr->addNeighborSegmentPtr( neighborSegmentPtr );
603 
604  neighborSegmentPtr->addNeighborSegmentPtr( segmentPtr );
605  }
606  }
607 
608  if( blkCol )
609  {
610  neighborSegmentPtr = currLineSegsPtrs->operator[]( blkCol - 1 );
611 
612  if( neighborSegmentPtr )
613  {
614  segmentPtr->addNeighborSegmentPtr( neighborSegmentPtr );
615 
616  neighborSegmentPtr->addNeighborSegmentPtr( segmentPtr );
617  }
618  }
619 
620  // Updating the active segments list header
621 
622  if( (*actSegsListHeadPtr) == nullptr )
623  {
624  (*actSegsListHeadPtr) = segmentPtr;
625  }
626 
627  // Updating the previous active segment
628 
629  if( prevActSegPtr )
630  {
631  prevActSegPtr->m_nextActiveSegment = segmentPtr;
632  }
633 
634  prevActSegPtr = segmentPtr;
635  }
636  else // !rasterValueIsValid
637  {
638  m_segmentsIdsMatrix( blkLine, blkCol ) = 0;
639  unusedLineSegmentIds.push_back( lineSegmentIds[ blkCol ] );
640  currLineSegsPtrs->operator[]( blkCol ) = nullptr;
641  }
642  }
643 
644  // Free unused IDs
645 
646  if( ! unusedLineSegmentIds.empty() )
647  {
648  segmenterIdsManager.addFreeIDs( unusedLineSegmentIds );
649  unusedLineSegmentIds.clear();
650  }
651 
652  // Swapping the pointers to the vectors of used segment pointers
653 
654  if( lastLineSegsPtrs == ( &usedSegPointers1 ) )
655  {
656  lastLineSegsPtrs = &usedSegPointers2;
657  currLineSegsPtrs = &usedSegPointers1;
658  }
659  else
660  {
661  lastLineSegsPtrs = &usedSegPointers1;
662  currLineSegsPtrs = &usedSegPointers2;
663  }
664  }
665 
666  return true;
667  }
668 
669  //-------------------------------------------------------------------------
670 
672  : te::rp::SegmenterStrategyFactory( "RegionGrowingMean" )
673  {
674  }
675 
678 
680  {
682  }
683 
684  } // end namespace rp
685 } // end namespace te
686 
Segmenter segments IDs manager.
unsigned int getOptimalBlocksOverlapSize() const
Returns a optimal blocks overlap size (number of border pixels overlapped between blocks...
bool initialize(const SegmenterSegmentsBlock::SegmentIdDataType segsNumber, const unsigned int featuresNumber)
Pool initialization.
BlocksMergingMethod getBlocksMergingMethod() const
Return the strategy blocks merging method.
unsigned int m_xStart
Segment left X coordinate box over the label image.
double DissimilarityTypeT
Type for dissimilarity.
bool m_isInitialized
true if this instance is initialized.
Base exception class for plugin module.
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.
Definition: TaskProgress.h:53
bool m_enableSameIterationMerges
If enabled, a merged segment could be merged with another within the same iteration (default:false)...
bool shouldComputeMinMaxValues() const
Returns if the min and max pixel values should be computed.
SegmenterRegionGrowingSegmentsPool< rg::MeanFeatureType > m_segmentsPool
A pool of segments that can be reused on each strategy execution.
SegmentsIdsMatrixT m_segmentsIdsMatrix
A internal segments IDs matrix that can be reused on each strategy execution.
bool m_enableLocalMutualBestFitting
If enabled, a merge only occurs between two segments if the minimum dissimilarity criteria is best fu...
SegmenterRegionGrowingMeanStrategy::Parameters m_parameters
Internal execution parameters.
Raster segmenter strategy factory base class.
SegmenterRegionGrowingSegment< FeatureDataTypeT > * m_prevActiveSegment
A pointer to the previous active segment.
IterationCounterType m_mergetIteration
The current merge iteration.
std::vector< unsigned int > m_rightCutOffProfile
SegmenterRegionGrowingSegment< FeatureDataTypeT > * m_nextActiveSegment
A pointer to the next active segment.
An abstract class for raster data strucutures.
unsigned int getColumnsNumber() const
The number of current matrix columns.
Definition: Matrix.h:798
double getMemUsageEstimation(const unsigned int bandsToProcess, const unsigned int pixelsNumber) const
Returns a memory estimation (bytes).
void removeAllNeighborSegmentsPtrs()
Remove all neighbor segments.
URI C++ Library.
Definition: Attributes.h:37
Raster segmenter strategy base class.
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.
void reset()
Clear all internal allocated resources and reset the parameters instance to its initial state...
bool initialize(SegmenterStrategyParameters const *const strategyParams)
Initialize the segmentation strategy.
double m_segmentsSimilarityThreshold
Segments similarity treshold - Use lower values to merge only those segments that are more similar - ...
unsigned int m_minSegmentSize
A positive minimum segment size (pixels number - default: 100).
Raster region growing segmenter strategy.
Segmenter mean merger used in region growing process.
void reset()
Reset (clear) the active instance data.
Definition: Matrix.h:502
virtual void getValue(unsigned int c, unsigned int r, double &value, std::size_t b=0) const
Returns the attribute value of a band of a cell.
AbstractParameters * clone() const
Create a clone copy of this instance.
Raster region growing segmenter Mean strategy.
FeatureType * m_features
A pionter to a fixed size vector of segment features.
SegmenterRegionGrowingSegment< FeatureDataTypeT > * getNextSegment()
Retrive a stored segment.
Abstract parameters base interface.
A generic template matrix.
Definition: Matrix.h:55
unsigned int m_xBound
Segment lower bound X coordinate box over the label image.
float MeanFeatureType
Mean Strategy feature type.
unsigned int m_yBound
Segment lower bound Y coordinate box over the label image.
unsigned int m_size
Segment area (pixels number).
te::rp::SegmenterStrategy * build()
Concrete factories (derived from this one) must implement this method in order to create objects...
BlocksMergingMethod
Blocks merging method.
Segmenter segments block description class.
bool initializeSegments(SegmenterIdsManager &segmenterIdsManager, const te::rp::SegmenterSegmentsBlock &block2ProcessInfo, const te::rst::Raster &inputRaster, const std::vector< unsigned int > &inputRasterBands, const std::vector< std::complex< double > > &inputRasterNoDataValues, const std::vector< std::complex< double > > &inputRasterBandMinValues, const std::vector< std::complex< double > > &inputRasterBandMaxValues, SegmenterRegionGrowingSegment< rg::MeanFeatureType > **actSegsListHeadPtr)
Initialize the segment objects container and the segment IDs container.
Raster region growing segmenter strategy factory.
void addFreeIDs(const std::vector< SegmenterSegmentsBlock::SegmentIdDataType > &ids)
Stores free unique IDs for later use.
std::vector< unsigned int > m_topCutOffProfile
#define TERP_INSTANCE_TRUE_OR_RETURN_FALSE(value, message)
Checks if value is true. For false values a warning message will be logged, the current instance erro...
Definition: Macros.h:200
void reset()
Clear all internal allocated resources and go back to the initial not-initialized state...
virtual void reset()
Clear all internal allocated resources and go back to the initial not-initialized state...
unsigned int getLinesNumber() const
The number of current matrix lines.
Definition: Matrix.h:791
unsigned int m_segmentsSimIncreaseSteps
The maximum number of steps to increment the similarity threshold value for the cases where no segmen...
#define TERP_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not.
Definition: Macros.h:150
bool execute(SegmenterIdsManager &segmenterIdsManager, const te::rp::SegmenterSegmentsBlock &block2ProcessInfo, const te::rst::Raster &inputRaster, const std::vector< unsigned int > &inputRasterBands, const std::vector< std::complex< double > > &inputRasterNoDataValues, const std::vector< std::complex< double > > &inputRasterBandMinValues, const std::vector< std::complex< double > > &inputRasterBandMaxValues, te::rst::Raster &outputRaster, const unsigned int outputRasterBand, const bool enableProgressInterface)
Executes the segmentation strategy over region delimited by the given block.
bool getNewIDs(const unsigned int &idsNumber, std::vector< SegmenterSegmentsBlock::SegmentIdDataType > &ids)
Returns new segment unique IDs.
std::vector< unsigned int > m_leftCutOffProfile
std::vector< unsigned int > m_bottomCutOffProfile