29 #include "../raster/Band.h"
30 #include "../raster/BandProperty.h"
31 #include "../raster/RasterFactory.h"
32 #include "../raster/Grid.h"
33 #include "../datatype/Enums.h"
34 #include "../common/StringUtils.h"
35 #include "../common/progress/TaskProgress.h"
43 #include <boost/lexical_cast.hpp>
46 #define BAATZ_EL( featPtr ) featPtr[ 0 ]
49 #define BAATZ_CO( featPtr ) featPtr[ 1 ]
52 #define BAATZ_SM( featPtr ) featPtr[ 2 ]
55 #define BAATZ_SU( featPtr, band ) featPtr[ 3 + band ]
58 #define BAATZ_SS( featPtr, bandsNmb, band ) featPtr[ 3 + bandsNmb + band ]
61 #define BAATZ_ST( featPtr, bandsNmb, band ) featPtr[ 3 + bandsNmb + bandsNmb + band ]
66 segmenterRegionGrowingStrategyFactoryInstance;
102 throw( te::rp::Exception )
104 m_minSegmentSize = 100;
105 m_segmentsSimilarityThreshold = 0.1;
106 m_segmentFeatures = InvalidFeaturesType;
107 m_bandsWeights.clear();
108 m_colorWeight = 0.75;
109 m_compactnessWeight = 0.5;
110 m_segmentsSimIncreaseSteps = 10;
131 : m_featuresNumber( featuresNumber )
144 assert( segment1Ptr );
146 assert( segment2Ptr );
149 m_getDissimilarity_dissValue = 0.0;
151 for( m_getDissimilarity_meansIdx = 0 ; m_getDissimilarity_meansIdx < m_featuresNumber ;
152 ++m_getDissimilarity_meansIdx )
154 m_getDissimilarity_diffValue = segment1Ptr->
m_features[ m_getDissimilarity_meansIdx ] -
155 segment2Ptr->
m_features[ m_getDissimilarity_meansIdx ];
157 m_getDissimilarity_dissValue += ( m_getDissimilarity_diffValue * m_getDissimilarity_diffValue );
160 m_getDissimilarity_dissValue = std::sqrt( m_getDissimilarity_dissValue );
162 return m_getDissimilarity_dissValue;
170 assert( segment1Ptr );
172 assert( segment2Ptr );
195 for(
unsigned int meansIdx = 0 ; meansIdx < m_featuresNumber ; ++meansIdx )
226 const double& colorWeight,
const double& compactnessWeight,
227 const std::vector< double >& bandsWeights,
231 m_segmentsIds( segmentsIds ),
232 m_segmentsMatrix( segmentsMatrix ),
233 m_allSegsCompactnessOffset( 0 ),
234 m_allSegsCompactnessGain( 1.0 ),
235 m_allSegsSmoothnessOffset( 0 ),
236 m_allSegsSmoothnessGain( 0 ),
247 bandsWeights[ band ];
260 assert( segment1Ptr );
262 assert( segment2Ptr );
264 assert( mergePreviewSegPtr );
295 unsigned int touchingEdgeLength1 = 0;
296 unsigned int touchingEdgeLength2 = 0;
298 m_segmentsIds, mergePreviewSegPtr->
m_xStart,
305 touchingEdgeLength2 );
314 std::sqrt( sizeUnionD ) );
335 m_allSegsCompactnessOffset
338 m_allSegsCompactnessGain
348 m_allSegsCompactnessOffset
351 m_allSegsCompactnessGain
362 m_allSegsCompactnessOffset
365 m_allSegsCompactnessGain
382 m_allSegsSmoothnessOffset
385 m_allSegsSmoothnessGain
395 m_allSegsSmoothnessOffset
398 m_allSegsSmoothnessGain
409 m_allSegsSmoothnessOffset
412 m_allSegsSmoothnessGain
432 ( 1.0f - m_compactnessWeight )
446 for(
unsigned int sumsIdx = 0 ; sumsIdx < m_bandsNumber ; ++sumsIdx )
454 sumUnion = sum1 + sum2;
461 meanUnion = sumUnion / sizeUnionD;
477 sizeUnionD * meanUnion * meanUnion
490 m_bandsWeights[ sumsIdx ]
525 ( 1.0f - m_colorWeight )
539 assert( segment1Ptr );
541 assert( segment2Ptr );
543 assert( mergePreviewSegPtr );
562 std::numeric_limits< SegmenterRegionGrowingSegment::FeatureType >::max();
564 std::numeric_limits< SegmenterRegionGrowingSegment::FeatureType >::max();
567 std::numeric_limits< SegmenterRegionGrowingSegment::FeatureType >::max();
569 std::numeric_limits< SegmenterRegionGrowingSegment::FeatureType >::max();
573 const unsigned int nRows = m_segmentsMatrix.getLinesNumber();
574 const unsigned int nCols = m_segmentsMatrix.getColumnsNumber();
577 unsigned int col = 0;
578 for(
unsigned int row = 0 ; row < nRows ; ++row )
580 segsRowPtr = m_segmentsMatrix[ row ];
582 for( col = 0 ; col < nCols ; ++col )
584 if( segsRowPtr[ col ].m_status )
588 if( compactnessMin >
BAATZ_CO( featuresPtr ) )
590 compactnessMin =
BAATZ_CO( featuresPtr );
592 if( compactnessMax <
BAATZ_CO( featuresPtr ) )
594 compactnessMax =
BAATZ_CO( featuresPtr );
597 if( smoothnessMin >
BAATZ_SM( featuresPtr ) )
599 smoothnessMin =
BAATZ_SM( featuresPtr );
601 if( smoothnessMax <
BAATZ_SM( featuresPtr ) )
603 smoothnessMax =
BAATZ_SM( featuresPtr );
609 if( compactnessMax == compactnessMin )
611 m_allSegsCompactnessOffset = 0.0;
613 if( compactnessMax == 0.0 )
614 m_allSegsCompactnessGain = 1.0;
616 m_allSegsCompactnessGain = 1.0f / compactnessMax;
620 m_allSegsCompactnessOffset = -1.0f * compactnessMin;
621 m_allSegsCompactnessGain = 1.0f / ( compactnessMax - compactnessMin );
624 if( smoothnessMax == smoothnessMin )
626 m_allSegsSmoothnessOffset = 0.0;
628 if( smoothnessMax == 0.0 )
629 m_allSegsSmoothnessGain = 1.0;
631 m_allSegsSmoothnessGain = 1.0f / smoothnessMax;
635 m_allSegsSmoothnessOffset = -1.0f * smoothnessMin;
636 m_allSegsSmoothnessGain = 1.0f / ( smoothnessMax - smoothnessMin );
654 throw( te::rp::Exception )
667 "Invalid segmenter strategy parameter m_minSegmentSize" )
671 "Invalid segmenter strategy parameter m_segmentsSimilarityThreshold" )
675 "Invalid segmenter strategy parameter m_segmentFeatures" )
680 "Invalid segmenter strategy parameter m_bandsWeights" );
682 double bandsWeightsSum = 0;
683 unsigned int bandsWeightsIdx = 0 ;
684 for( bandsWeightsIdx = 0 ; bandsWeightsIdx <
689 "Invalid segmenter strategy parameter m_bandsWeights" );
693 "Invalid segmenter strategy parameter m_bandsWeights" );
694 for( bandsWeightsIdx = 0 ; bandsWeightsIdx <
723 const std::vector< unsigned int >& inputRasterBands,
724 const std::vector< double >& inputRasterGains,
725 const std::vector< double >& inputRasterOffsets,
727 const unsigned int outputRasterBand,
728 const bool enableProgressInterface )
729 throw( te::rp::Exception )
732 "Instance not initialized" )
738 ((double)inputRasterBands.size()) );
742 unsigned int segmentFeaturesSize = 0;
747 segmentFeaturesSize = inputRasterBands.size();
752 segmentFeaturesSize = 3 + ( 3 * inputRasterBands.size() );
763 inputRaster.getNumberOfColumns() ),
764 segmentFeaturesSize ),
"Segments pool initiation error" );
805 inputRaster.getNumberOfColumns(),
807 "Error allocating segments Ids matrix" );
813 inputRaster, inputRasterBands, inputRasterGains,
814 inputRasterOffsets ),
815 "Segments initalization error" );
819 std::auto_ptr< Merger > mergerPtr;
820 bool enablelocalMutualBestFitting =
false;
826 mergerPtr.reset(
new MeanMerger( inputRasterBands.size() ) );
827 enablelocalMutualBestFitting =
true;
835 enablelocalMutualBestFitting =
true;
847 std::auto_ptr< te::common::TaskProgress > progressPtr;
848 if( enableProgressInterface )
851 progressPtr->setTotalSteps( 100 );
852 progressPtr->setMessage(
"Segmentation" );
864 unsigned int mergedSegments = 0;
865 unsigned int maxMergedSegments = 0;
874 mergedSegments =
mergeSegments( disimilarityThreshold, segmenterIdsManager,
875 *mergerPtr, enablelocalMutualBestFitting,
876 auxSeg1Ptr, auxSeg2Ptr, auxSeg3Ptr);
880 if( enableProgressInterface )
882 if( maxMergedSegments )
888 ( (
double)( maxMergedSegments - mergedSegments ) )
890 ((
double)maxMergedSegments )
897 if( currStep > progressPtr->getCurrentStep() )
899 progressPtr->setCurrentStep( currStep );
903 if( ! progressPtr->isActive() )
908 if( maxMergedSegments < mergedSegments )
910 maxMergedSegments = mergedSegments;
914 if( mergedSegments == 0 )
922 disimilarityThreshold += disimilarityThresholdStep;
923 disimilarityThreshold = std::min( disimilarityThreshold,
929 if( enableProgressInterface )
931 progressPtr->setCurrentStep( 50 );
932 if( ! progressPtr->isActive() )
940 maxMergedSegments = 0;
945 segmenterIdsManager, *mergerPtr, auxSeg1Ptr, auxSeg2Ptr );
949 if( enableProgressInterface )
951 if( maxMergedSegments )
953 currStep = 50 + (int)
957 ( (
double)( maxMergedSegments - mergedSegments ) )
959 ((
double)maxMergedSegments )
966 if( currStep > progressPtr->getCurrentStep() )
968 progressPtr->setCurrentStep( currStep );
972 if( ! progressPtr->isActive() )
977 if( maxMergedSegments < mergedSegments )
979 maxMergedSegments = mergedSegments;
983 if( mergedSegments == 0 )
990 if( enableProgressInterface )
992 progressPtr->setCurrentStep( 100 );
993 if( ! progressPtr->isActive() )
1002 const unsigned int nLines = inputRaster.getNumberOfRows();
1003 const unsigned int nCols = inputRaster.getNumberOfColumns();
1004 unsigned int col = 0;
1007 for(
unsigned int line = 0 ; line < nLines ; ++line )
1011 for( col = 0 ; col < nCols ; ++col )
1013 outputRaster.setValue( col, line, segmentsIdsLinePtr[ col ], outputRasterBand );
1022 const unsigned int bandsToProcess,
1023 const unsigned int pixelsNumber )
const
1028 double featuresSizeBytes = 0.0;
1033 featuresSizeBytes = (double)
1045 featuresSizeBytes = (double)
1109 const std::vector< unsigned int >& inputRasterBands,
1110 const std::vector< double >& inputRasterGains,
1111 const std::vector< double >& inputRasterOffsets )
1115 const unsigned int inputRasterBandsSize = (
unsigned int)
1116 inputRasterBands.size();
1120 std::vector< double > bandDummyValues;
1123 for(
unsigned int inputRasterBandsIdx = 0 ; inputRasterBandsIdx <
1124 inputRasterBandsSize ; ++inputRasterBandsIdx )
1126 bandDummyValues.push_back( inputRaster.
getBand(
1133 unsigned int line = 0;
1134 unsigned int col = 0;
1137 bool rasterValuesAreValid =
true;
1138 unsigned int inputRasterBandsIdx = 0;
1140 const std::vector< double > dummyZeroesVector( inputRasterBandsSize, 0 );
1142 std::list< SegmenterSegmentsBlock::SegmentIdDataType >
1143 unusedLineSegmentIds;
1145 std::vector< SegmenterSegmentsBlock::SegmentIdDataType >
1147 lineSegmentIds.reserve( nCols );
1149 std::vector< SegmenterRegionGrowingSegment::FeatureType > rasterValues;
1150 std::vector< SegmenterRegionGrowingSegment::FeatureType > rasterSquareValues;
1151 rasterValues.resize( inputRasterBandsSize, 0 );
1152 rasterSquareValues.resize( inputRasterBandsSize, 0 );
1153 std::vector< SegmenterRegionGrowingSegment* > usedSegPointers1( nCols, 0 );
1154 std::vector< SegmenterRegionGrowingSegment* > usedSegPointers2( nCols, 0 );
1155 std::vector< SegmenterRegionGrowingSegment* >* lastLineSegsPtrs = &usedSegPointers1;
1156 std::vector< SegmenterRegionGrowingSegment* >* currLineSegsPtrs = &usedSegPointers2;
1158 unsigned int rasterValuesIdx = 0;
1160 for( line = 0 ; line < nLines ; ++line )
1162 segmenterIdsManager.
getNewIDs( nCols, lineSegmentIds );
1164 for( col = 0 ; col < nCols ; ++col )
1166 rasterValuesAreValid =
true;
1168 for( inputRasterBandsIdx = 0 ; inputRasterBandsIdx <
1169 inputRasterBandsSize ; ++inputRasterBandsIdx )
1171 inputRaster.
getValue( col, line, value,
1172 inputRasterBands[ inputRasterBandsIdx ] );
1174 if( value == bandDummyValues[ inputRasterBandsIdx ] )
1176 rasterValuesAreValid =
false;
1181 value += inputRasterOffsets[ inputRasterBandsIdx ];
1182 value *= inputRasterGains[ inputRasterBandsIdx ];
1184 rasterValues[ inputRasterBandsIdx ] =
1186 rasterSquareValues[ inputRasterBandsIdx ] =
1193 if( rasterValuesAreValid )
1200 assert( segmentPtr );
1202 for( rasterValuesIdx = 0 ; rasterValuesIdx < inputRasterBandsSize ;
1205 segmentPtr->
m_features[ rasterValuesIdx ] = rasterValues[
1214 assert( segmentPtr );
1216 for( rasterValuesIdx = 0 ; rasterValuesIdx < inputRasterBandsSize ;
1220 rasterValues[ rasterValuesIdx ];
1222 rasterSquareValues[ rasterValuesIdx ];
1239 currLineSegsPtrs->operator[]( col ) = segmentPtr;
1241 segmentPtr->
m_id = lineSegmentIds[ col ];
1257 neighborSegmentPtr = lastLineSegsPtrs->operator[]( col );
1259 if( neighborSegmentPtr )
1269 neighborSegmentPtr = currLineSegsPtrs->operator[]( col - 1 );
1271 if( neighborSegmentPtr )
1282 unusedLineSegmentIds.push_back( lineSegmentIds[ col ] );
1283 currLineSegsPtrs->operator[]( col ) = 0;
1289 if( ! unusedLineSegmentIds.empty() )
1291 segmenterIdsManager.
addFreeIDs( unusedLineSegmentIds );
1292 unusedLineSegmentIds.clear();
1297 if( lastLineSegsPtrs == ( &usedSegPointers1 ) )
1299 lastLineSegsPtrs = &usedSegPointers2;
1300 currLineSegsPtrs = &usedSegPointers1;
1304 lastLineSegsPtrs = &usedSegPointers1;
1305 currLineSegsPtrs = &usedSegPointers2;
1316 const bool enablelocalMutualBestFitting,
1321 unsigned int mergedSegmentsNumber = 0;
1322 unsigned int segmentsLine = 0;
1323 unsigned int segmentsLineBound = 0;
1324 unsigned int segmentCol = 0;
1325 unsigned int segmentColStart = 0;
1326 unsigned int segmentColBound = 0;
1335 std::list< SegmenterSegmentsBlock::SegmentIdDataType > freeSegmentIds;
1336 unsigned int neighborSegIdx = 0;
1338 const unsigned int segmentsMatrixNRows = segmentsMatrix.
getLinesNumber();
1339 const unsigned int segmentsMatrixNCols = segmentsMatrix.
getColumnsNumber();
1341 unsigned int col = 0;
1350 for(
unsigned int row = 0 ; row < segmentsMatrixNRows ; ++row )
1352 segmentsMatrixLinePtr = segmentsMatrix[ row ];
1354 for( col = 0 ; col < segmentsMatrixNCols ; ++col )
1356 currSegPtr = segmentsMatrixLinePtr + col;
1363 minForwardDissimilaritySegmentPtr = 0;
1364 minForwardDissimilarityValue =
1365 std::numeric_limits< SegmenterRegionGrowingSegment::FeatureType >::max();
1375 if( ( forwardDissimilarityValue <= disimilarityThreshold ) &&
1376 ( forwardDissimilarityValue < minForwardDissimilarityValue ) )
1378 minForwardDissimilarityValue = forwardDissimilarityValue;
1379 minForwardDissimilaritySegmentPtr = currSegPtr->
m_neighborSegments[ neighborSegIdx ];
1380 auxSeg3Ptr->operator=( *auxSeg1Ptr );
1387 if( enablelocalMutualBestFitting && ( minForwardDissimilaritySegmentPtr != 0 ) )
1391 minBackwardDissimilaritySegmentPtr = 0;
1392 backwardDissimilarityValue = 0;
1393 minBackwardDissimilarityValue =
1394 std::numeric_limits< SegmenterRegionGrowingSegment::FeatureType >::max();
1401 backwardDissimilarityValue =
1403 minForwardDissimilaritySegmentPtr->
m_neighborSegments[ neighborSegIdx ], auxSeg2Ptr );
1405 if( backwardDissimilarityValue < minBackwardDissimilarityValue )
1407 minBackwardDissimilarityValue = backwardDissimilarityValue;
1408 minBackwardDissimilaritySegmentPtr =
1414 if( minBackwardDissimilaritySegmentPtr != currSegPtr )
1416 minForwardDissimilaritySegmentPtr = 0;
1422 if( minForwardDissimilaritySegmentPtr )
1426 merger.
mergeFeatures( currSegPtr, minForwardDissimilaritySegmentPtr,
1440 ( minForwardDissimilaritySegmentPtr->
m_neighborSegments[ neighborSegIdx ] != currSegPtr )
1459 minForwardDissimilaritySegmentPtr );
1465 segmentsLineBound = minForwardDissimilaritySegmentPtr->
m_yBound;
1466 segmentColStart = minForwardDissimilaritySegmentPtr->
m_xStart;
1467 segmentColBound = minForwardDissimilaritySegmentPtr->
m_xBound;
1468 currentSegmentId = currSegPtr->
m_id;
1470 for( segmentsLine = minForwardDissimilaritySegmentPtr->
m_yStart ;
1471 segmentsLine < segmentsLineBound ; ++segmentsLine )
1475 for( segmentCol = segmentColStart ; segmentCol <
1476 segmentColBound ; ++segmentCol )
1478 if( segmentsIdsLinePtr[ segmentCol ] ==
1479 minForwardDissimilaritySegmentPtr->
m_id )
1481 segmentsIdsLinePtr[ segmentCol ] = currentSegmentId;
1489 minForwardDissimilaritySegmentPtr->
m_status =
false;
1493 freeSegmentIds.push_back( minForwardDissimilaritySegmentPtr->
m_id );
1495 ++mergedSegmentsNumber;
1503 if( ! freeSegmentIds.empty() )
1505 segmenterIdsManager.
addFreeIDs( freeSegmentIds );
1508 return mergedSegmentsNumber;
1512 const unsigned int minSegmentSize,
1518 unsigned int mergedSegmentsNumber = 0;
1523 unsigned int segmentsLine = 0;
1524 unsigned int segmentsLineBound = 0;
1525 unsigned int segmentCol = 0;
1526 unsigned int segmentColStart = 0;
1527 unsigned int segmentColBound = 0;
1530 std::list< SegmenterSegmentsBlock::SegmentIdDataType > freeSegmentIds;
1531 unsigned int neighborSegIdx = 0;
1533 const unsigned int segmentsMatrixNRows = segmentsMatrix.
getLinesNumber();
1534 const unsigned int segmentsMatrixNCols = segmentsMatrix.
getColumnsNumber();
1536 unsigned int col = 0;
1544 for(
unsigned int row = 0 ; row < segmentsMatrixNRows ; ++row )
1546 segmentsMatrixLinePtr = segmentsMatrix[ row ];
1548 for( col = 0 ; col < segmentsMatrixNCols ; ++col )
1550 currSmallSegPtr = segmentsMatrixLinePtr + col;
1556 if( currSmallSegPtr->
m_size < minSegmentSize )
1560 minForwardDissimilaritySegmentPtr = 0;
1561 minForwardDissimilarityValue =
1562 std::numeric_limits< SegmenterRegionGrowingSegment::FeatureType >::max();
1572 if( forwardDissimilarityValue < minForwardDissimilarityValue )
1574 minForwardDissimilarityValue = forwardDissimilarityValue;
1575 minForwardDissimilaritySegmentPtr = currSmallSegPtr->
m_neighborSegments[ neighborSegIdx ];
1576 auxSeg2Ptr->operator=( *auxSeg1Ptr );
1583 if( minForwardDissimilaritySegmentPtr )
1589 currSmallSegPtr, auxSeg2Ptr );
1602 ( currSmallSegPtr->
m_neighborSegments[ neighborSegIdx ] != minForwardDissimilaritySegmentPtr )
1615 minForwardDissimilaritySegmentPtr );
1627 segmentsLineBound = currSmallSegPtr->
m_yBound;
1628 segmentColStart = currSmallSegPtr->
m_xStart;
1629 segmentColBound = currSmallSegPtr->
m_xBound;
1630 currentSegmentId = currSmallSegPtr->
m_id;
1632 for( segmentsLine = currSmallSegPtr->
m_yStart ;
1633 segmentsLine < segmentsLineBound ; ++segmentsLine )
1637 for( segmentCol = segmentColStart ; segmentCol <
1638 segmentColBound ; ++segmentCol )
1640 if( segmentsIdsLinePtr[ segmentCol ] ==
1643 segmentsIdsLinePtr[ segmentCol ] =
1644 minForwardDissimilaritySegmentPtr->
m_id;
1656 freeSegmentIds.push_back( currentSegmentId );
1658 ++mergedSegmentsNumber;
1667 if( ! freeSegmentIds.empty() )
1669 segmenterIdsManager.
addFreeIDs( freeSegmentIds );
1672 return mergedSegmentsNumber;
1677 const std::string& fileName )
1679 std::map<std::string, std::string> rinfo;
1680 rinfo[
"SOURCE"] = fileName;
1687 std::vector< te::rst::BandProperty* > bandsProps;
1692 gridPtr, bandsProps, rinfo );
1695 unsigned int col = 0;
1696 unsigned int line = 0 ;
1698 double offset = 0.0;
1703 double minValue = DBL_MAX;
1704 double maxValue = -1.0 * DBL_MAX;
1707 for( line = 0 ; line < linesNmb ; ++line )
1709 for( col = 0 ; col < colsNmb ; ++col )
1711 value = (double)segmentsIds( line, col );
1713 if( value > maxValue ) maxValue = value;
1714 if( value < minValue ) minValue = value;
1719 scale = 254.0 / ( maxValue - minValue );
1724 for( line = 0 ; line < linesNmb ; ++line )
1726 for( col = 0 ; col < colsNmb ; ++col )
1728 value = ( ((double)segmentsIds( line, col )) - offset ) * scale;
1730 boost::lexical_cast< std::string >( value ) )
1732 rasterPtr->
setValue( col, line, value , 0 );
1741 const unsigned int& xStart,
const unsigned int& yStart,
1742 const unsigned int& xBound,
const unsigned int& yBound,
1745 unsigned int& edgeLength1,
1746 unsigned int& edgeLength2 )
1767 unsigned int xIdx = 0;
1768 const unsigned int lastColIdx = colsNumber - 1;
1769 const unsigned int lastLineIdx = linesNumber - 1;
1771 for(
unsigned int yIdx = yStart ; yIdx < yBound ; ++yIdx )
1773 for( xIdx = xStart; xIdx < xBound ; ++xIdx )
1775 if( segsIds[ yIdx ][ xIdx ] == id1 )
1778 if( segsIds[ yIdx - 1 ][ xIdx ] == id2 )
1784 if( segsIds[ yIdx ][ xIdx - 1 ] == id2 )
1789 if( yIdx < lastLineIdx)
1790 if( segsIds[ yIdx + 1 ][ xIdx ] == id2 )
1795 if( xIdx < lastColIdx )
1796 if( segsIds[ yIdx ][ xIdx + 1 ] == id2 )
1802 else if( segsIds[ yIdx ][ xIdx ] == id2 )
1805 if( segsIds[ yIdx - 1 ][ xIdx ] == id1 )
1811 if( segsIds[ yIdx ][ xIdx - 1 ] == id1 )
1816 if( yIdx < lastLineIdx)
1817 if( segsIds[ yIdx + 1 ][ xIdx ] == id1 )
1822 if( xIdx < lastColIdx )
1823 if( segsIds[ yIdx ][ xIdx + 1 ] == id1 )
Matrix< SegmenterRegionGrowingSegment > & getSegsMatrix()
Return a reference to the internal segments matrix.
SegmenterRegionGrowingSegment::FeatureType getDissimilarity(SegmenterRegionGrowingSegment const *const segment1Ptr, SegmenterRegionGrowingSegment const *const segment2Ptr, SegmenterRegionGrowingSegment *const mergePreviewSegPtr) const
Returns a dimilarity index between this and the other segment.
Segmenter segments IDs manager.
virtual void setValue(unsigned int c, unsigned int r, const double value, std::size_t b=0)
Sets the attribute value in a band of a cell.
unsigned int mergeSmallSegments(const unsigned int minSegmentSize, SegmenterIdsManager &segmenterIdsManager, Merger &merger, SegmenterRegionGrowingSegment *auxSeg1Ptr, SegmenterRegionGrowingSegment *auxSeg2Ptr)
Merge only small segments to their closest segment.
void mergeFeatures(SegmenterRegionGrowingSegment *const segment1Ptr, SegmenterRegionGrowingSegment const *const segment2Ptr, SegmenterRegionGrowingSegment const *const mergePreviewSegPtr) const
Merge specific segment features from both segments into the first segment.
The Baatz based features will be used - Reference: Baatz, M.; Schape, A. Multiresolution segmentation...
#define BAATZ_SM(featPtr)
Baatz based Segments merger.
bool m_isInitialized
true if this instance is initialized.
Raster region growing segmenter strategy.
unsigned int m_neighborSegmentsSize
The current size of m_neighborSegments.
std::vector< SegmenterRegionGrowingSegment::FeatureType > m_bandsWeights
A vector where each bands weight are stored.
A raster band description.
bool initializeSegments(SegmenterIdsManager &segmenterIdsManager, const te::rst::Raster &inputRaster, const std::vector< unsigned int > &inputRasterBands, const std::vector< double > &inputRasterGains, const std::vector< double > &inputRasterOffsets)
Initialize the segment objects container and the segment IDs container.
unsigned int getNumberOfColumns() const
Returns the raster number of columns.
virtual const Band * getBand(std::size_t i) const =0
Returns the raster i-th band.
#define BAATZ_SS(featPtr, bandsNmb, band)
SegmenterRegionGrowingStrategy::Parameters m_parameters
Internal execution parameters.
#define BAATZ_CO(featPtr)
unsigned int m_yBound
Segment lower bound Y coordinate box over the label image.
unsigned int m_xStart
Segment left X coordinate box over the label image.
SegmentsIdsMatrixT m_segmentsIdsMatrix
A internal segments IDs matrix that can be reused on each strategy execution.
SegmenterRegionGrowingSegment::FeatureType getDissimilarity(SegmenterRegionGrowingSegment const *const segment1Ptr, SegmenterRegionGrowingSegment const *const segment2Ptr, SegmenterRegionGrowingSegment *const mergePreviewSegPtr) const
Returns a dimilarity index between this and the other segment.
This class can be used to inform the progress of a task.
void mergeFeatures(SegmenterRegionGrowingSegment *const segment1Ptr, SegmenterRegionGrowingSegment const *const segment2Ptr, SegmenterRegionGrowingSegment const *const mergePreviewSegPtr) const
Merge specific segment features from both segments into the first segment.
BaatzMerger(const double &colorWeight, const double &compactnessWeight, const std::vector< double > &bandsWeights, const SegmentsIdsMatrixT &segmentsIds, Matrix< SegmenterRegionGrowingSegment > &segmentsMatrix)
Default constructor.
virtual SegmenterRegionGrowingSegment::FeatureType getDissimilarity(SegmenterRegionGrowingSegment const *const segment1Ptr, SegmenterRegionGrowingSegment const *const segment2Ptr, SegmenterRegionGrowingSegment *const mergePreviewSegPtr) const =0
Returns a dimilarity index between this and the other segment.
unsigned int m_xBound
Segment lower bound X coordinate box over the label image.
double m_noDataValue
Value to indicate elements where there is no data, default is std::numeric_limits::max().
Raster region growing segmenter strategy factory.
void addNeighborSegment(SegmenterRegionGrowingSegment *const nSegPtr)
Add a pointer of a neighbor segment (if it is not already there).
#define BAATZ_ST(featPtr, bandsNmb, band)
#define TERP_TRUE_OR_RETURN_FALSE(value, message)
Checks if value is true. For false values a warning message will be logged and a return of context wi...
Segmenter Strategy Parameters.
Raster segmenter strategy factory base class.
void clear()
Clear all stored segments.
unsigned int SegmentIdDataType
std::vector< double > m_bandsWeights
The weight given to each band, when applicable (note: the bands weights sum must always be 1) or an e...
void update()
Update the internal state.
SegmenterRegionGrowingSegmentsPool m_segmentsPool
A pool of segments that can be reused on each strategy execution.
MeanMerger(const unsigned int featuresNumber)
The mean of segments pixel values will be used - Reference: S. A. Bins, L. M. G. Fonseca, G. J. Erthal e F. M. Ii, "Satellite Imagery segmentation: a region growing approach", VIII Simposio Brasileiro de Sensoriamento Remoto, Salvador, BA, 14-19 abril 1996.
An abstract class for raster data strucutures.
unsigned int getNumberOfRows() const
Returns the raster number of rows.
#define TERP_LOG_AND_THROW(message)
Logs a error message and throws.
unsigned int getColumnsNumber() const
The number of current matrix columns.
BandProperty * getProperty()
Returns the band property.
Raster segmenter strategy base class.
SegmentFeaturesType m_segmentFeatures
What segment features will be used on the segmentation process (default:InvalidFeaturesType).
double getMemUsageEstimation(const unsigned int bandsToProcess, const unsigned int pixelsNumber) const
Returns a memory estimation (bytes).
unsigned int mergeSegments(const SegmenterRegionGrowingSegment::FeatureType disimilarityThreshold, SegmenterIdsManager &segmenterIdsManager, Merger &merger, const bool enablelocalMutualBestFitting, SegmenterRegionGrowingSegment *auxSeg1Ptr, SegmenterRegionGrowingSegment *auxSeg2Ptr, SegmenterRegionGrowingSegment *auxSeg3Ptr)
Merge closest segments.
void reset()
Clear all internal allocated resources and go back to the initial not-initialized state...
void reset()
Clear all internal allocated resources and reset the parameters instance to its initial state...
SegmenterRegionGrowingSegment * getNextSegment()
Retrive a stored segment.
bool initialize(const SegmenterSegmentsBlock::SegmentIdDataType segsNumber, const unsigned int featuresNumber)
Pool initialization.
te::rp::SegmenterStrategy * build()
Concrete factories (derived from this one) must implement this method in order to create objects...
unsigned int getOptimalBlocksOverlapSize() const
Returns a optimal blocks overlap size (number of border pixels overlapped between blocks...
FeatureType * m_features
A pionter to a fixed size vector of segment features.
SegmenterRegionGrowingSegment ** m_neighborSegments
Neighborhood segments pointers (some pointers can be null) or a null pointer if there is no neighborh...
unsigned int m_size
Segment area (pixels number).
bool initialize(SegmenterStrategyParameters const *const strategyParams)
Initialize the segmentation strategy.
unsigned int m_minSegmentSize
A positive minimum segment size (pixels number - default: 100).
double m_segmentsSimilarityThreshold
Segments similarity treshold - Use lower values to merge only those segments that are more similar - ...
void reset()
Reset (clear) the active instance data.
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.
bool execute(SegmenterIdsManager &segmenterIdsManager, const te::rst::Raster &inputRaster, const std::vector< unsigned int > &inputRasterBands, const std::vector< double > &inputRasterGains, const std::vector< double > &inputRasterOffsets, te::rst::Raster &outputRaster, const unsigned int outputRasterBand, const bool enableProgressInterface)
Executes the segmentation strategy.
Abstract parameters base interface.
#define BAATZ_EL(featPtr)
unsigned int m_yStart
Segment upper Y coordinate box over the label image.
unsigned int m_bandsNumber
The number of features (bands).
A generic template matrix.
static Raster * make()
It creates and returns an empty raster with default raster driver.
SegmenterRegionGrowingStrategyFactory()
Mean based Segments merger.
float FeatureType
Feature type definition.
double m_colorWeight
The weight given to the color component, deafult:0.75, valid range: [0,1].
SegmenterRegionGrowingStrategy()
unsigned int m_segmentsSimIncreaseSteps
The maximum number of steps to increment the similarity threshold value for the cases where no segmen...
const Parameters & operator=(const Parameters ¶ms)
virtual void mergeFeatures(SegmenterRegionGrowingSegment *const segment1Ptr, SegmenterRegionGrowingSegment const *const segment2Ptr, SegmenterRegionGrowingSegment 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.
double m_compactnessWeight
The weight given to the compactness component, deafult:0.5, valid range: [0,1].
AbstractParameters * clone() const
Create a clone copy of this instance.
void removeNeighborSegment(SegmenterRegionGrowingSegment *const nSegPtr)
Remove all occurrences of a neighbor segment.
#define TERP_DEBUG_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not.
static void getTouchingEdgeLength(const SegmentsIdsMatrixT &segsIds, const unsigned int &xStart, const unsigned int &yStart, const unsigned int &xBound, const unsigned int &yBound, const SegmenterSegmentsBlock::SegmentIdDataType &id1, const SegmenterSegmentsBlock::SegmentIdDataType &id2, unsigned int &edgeLength1, unsigned int &edgeLength2)
Returns the count of points from region 1 (with ID1) touching the region 2 (with ID2).
bool m_status
Segment status (active=true).
void addFreeIDs(const std::vector< SegmenterSegmentsBlock::SegmentIdDataType > &ids)
Stores free unique IDs for later use.
A rectified grid is the spatial support for raster data.
virtual void update()=0
Update the internal state.
unsigned int getLinesNumber() const
The number of current matrix lines.
~SegmenterRegionGrowingStrategy()
#define TERP_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not.
Raster region growing segmenter strategy.
void clearNeighborSegments()
Remove all neighbor segments.
bool getNewIDs(const unsigned int &idsNumber, std::vector< SegmenterSegmentsBlock::SegmentIdDataType > &ids)
Returns new segment unique IDs.
SegmenterSegmentsBlock::SegmentIdDataType m_id
Segment ID.
#define BAATZ_SU(featPtr, band)
~SegmenterRegionGrowingStrategyFactory()