From 0ac0655140ff23e28b9489f86de07418d977ef0f Mon Sep 17 00:00:00 2001
From: Julien Michel <julien.michel@orfeo-toolbox.org>
Date: Thu, 25 Oct 2012 14:47:53 +0200
Subject: [PATCH] ENH: Inserting the new composite segmentation filter into the
 segmentation application

---
 Applications/Segmentation/otbSegmentation.cxx | 79 +++----------------
 1 file changed, 12 insertions(+), 67 deletions(-)

diff --git a/Applications/Segmentation/otbSegmentation.cxx b/Applications/Segmentation/otbSegmentation.cxx
index 42775c5e9a..6c9b618a95 100644
--- a/Applications/Segmentation/otbSegmentation.cxx
+++ b/Applications/Segmentation/otbSegmentation.cxx
@@ -29,13 +29,7 @@
 #include "otbVectorImageToAmplitudeImageFilter.h"
 #include "itkGradientMagnitudeImageFilter.h"
 #include "otbWatershedSegmentationFilter.h"
-#include "otbMultiScaleConvexOrConcaveClassificationFilter.h"
-#include "itkBinaryBallStructuringElement.h"
-#include "otbMorphologicalOpeningProfileFilter.h"
-#include "otbMorphologicalClosingProfileFilter.h"
-#include "otbProfileToProfileDerivativeFilter.h"
-#include "otbProfileDerivativeToMultiScaleCharacteristicsFilter.h"
-#include "itkScalarConnectedComponentImageFilter.h"
+#include "otbMorphologicalProfilesSegmentationFilter.h"
 
 // Large scale vectorization framework
 #include "otbStreamingImageToOGRLayerSegmentationFilter.h"
@@ -102,16 +96,7 @@ public:
   <FloatImageType,LabelImageType>         WatershedSegmentationFilterType;
 
   // Geodesic morphology multiscale segmentation
-  typedef itk::BinaryBallStructuringElement<FloatImageType::PixelType, 2> StructuringElementType;
-  typedef otb::MorphologicalOpeningProfileFilter<FloatImageType, FloatImageType, StructuringElementType>
-  OpeningProfileFilterType;
-  typedef otb::MorphologicalClosingProfileFilter<FloatImageType, FloatImageType, StructuringElementType>
-  ClosingProfileFilterType;
-  typedef otb::ProfileToProfileDerivativeFilter<FloatImageType, FloatImageType> DerivativeFilterType;
-  typedef otb::ProfileDerivativeToMultiScaleCharacteristicsFilter<FloatImageType,FloatImageType, LabelImageType>
-  MultiScaleCharacteristicsFilterType;
-  typedef otb::MultiScaleConvexOrConcaveClassificationFilter<FloatImageType,LabelImageType> MultiScaleClassificationFilterType;
-  
+  typedef otb::MorphologicalProfilesSegmentationFilter<FloatImageType,LabelImageType> MorphologicalProfilesSegmentationFilterType;
 
 
   // mask filter
@@ -135,11 +120,10 @@ public:
   <FloatVectorImageType,
    ConnectedComponentSegmentationFilterType>
   ConnectedComponentStreamingVectorizedSegmentationOGRType;
-  typedef otb::StreamingImageToOGRLayerSegmentationFilter
-  <LabelImageType,
-   LabeledConnectedComponentSegmentationFilterType>
-  LabeledConnectedComponentStreamingVectorizedSegmentationOGRType;
 
+  // Morphological profiles
+  typedef otb::StreamingImageToOGRLayerSegmentationFilter
+  <FloatImageType,MorphologicalProfilesSegmentationFilterType> MorphoVectorizedSegmentationOGRType;
 
   typedef otb::OGRLayerStreamStitchingFilter
   <FloatVectorImageType>                  FusionFilterType;
@@ -698,53 +682,14 @@ private:
 
             amplitudeFilter->SetInput(this->GetParameterFloatVectorImage("in"));
 
-            OpeningProfileFilterType::Pointer oprofileFilter = OpeningProfileFilterType::New();
-            oprofileFilter->SetInput(amplitudeFilter->GetOutput());
-            oprofileFilter->SetProfileSize(profileSize);
-            oprofileFilter->SetInitialValue(initialValue);
-            oprofileFilter->SetStep(step);
-            
-            ClosingProfileFilterType::Pointer cprofileFilter = ClosingProfileFilterType::New();
-            cprofileFilter->SetInput(amplitudeFilter->GetOutput());
-            cprofileFilter->SetProfileSize(profileSize);
-            cprofileFilter->SetInitialValue(initialValue);
-            cprofileFilter->SetStep(step);
-            
-            DerivativeFilterType::Pointer oderivativeFilter = DerivativeFilterType::New();
-            oderivativeFilter->SetInput(oprofileFilter->GetOutput());
-            
-            DerivativeFilterType::Pointer cderivativeFilter = DerivativeFilterType::New();
-            cderivativeFilter->SetInput(cprofileFilter->GetOutput());
-            
-            MultiScaleCharacteristicsFilterType::Pointer omsCharFilter = MultiScaleCharacteristicsFilterType::New();
-            omsCharFilter->SetInput(oderivativeFilter->GetOutput());
-            omsCharFilter->SetInitialValue(initialValue);
-            omsCharFilter->SetStep(step);
-            
-            MultiScaleCharacteristicsFilterType::Pointer cmsCharFilter = MultiScaleCharacteristicsFilterType::New();
-            cmsCharFilter->SetInput(cderivativeFilter->GetOutput());
-            cmsCharFilter->SetInitialValue(initialValue);
-            cmsCharFilter->SetStep(step);
-            
-            MultiScaleClassificationFilterType::Pointer classificationFilter = MultiScaleClassificationFilterType::New();
-            classificationFilter->SetOpeningProfileDerivativeMaxima(omsCharFilter->GetOutput());
-            classificationFilter->SetOpeningProfileCharacteristics(omsCharFilter->GetOutputCharacteristics());
-            classificationFilter->SetClosingProfileDerivativeMaxima(cmsCharFilter->GetOutput());
-            classificationFilter->SetClosingProfileCharacteristics(cmsCharFilter->GetOutputCharacteristics());
-            classificationFilter->SetSigma(sigma);
-            classificationFilter->SetLabelSeparator(initialValue + profileSize * step);
-            
-            LabeledConnectedComponentStreamingVectorizedSegmentationOGRType::Pointer
-              ccVectorizationFilter = LabeledConnectedComponentStreamingVectorizedSegmentationOGRType::New();
-            
-            if (HasValue("mode.vector.inmask"))
-              {
-              ccVectorizationFilter->GetSegmentationFilter()->SetMaskImage(
-                this->GetParameterUInt32Image("mode.vector.inmask"));
-        }
+            MorphoVectorizedSegmentationOGRType::Pointer morphoVectorizedSegmentation = MorphoVectorizedSegmentationOGRType::New();
+            morphoVectorizedSegmentation->GetSegmentationFilter()->SetProfileStart(initialValue);
+            morphoVectorizedSegmentation->GetSegmentationFilter()->SetProfileSize(profileSize);
+            morphoVectorizedSegmentation->GetSegmentationFilter()->SetProfileStep(step);
+            morphoVectorizedSegmentation->GetSegmentationFilter()->SetSigma(sigma);
 
-            streamSize = GenericApplySegmentation<LabelImageType, LabeledConnectedComponentSegmentationFilterType> (
-        ccVectorizationFilter,                                                                      classificationFilter->GetOutput(),
+            streamSize = GenericApplySegmentation<FloatImageType, MorphologicalProfilesSegmentationFilterType> (
+        morphoVectorizedSegmentation,                                                                     amplitudeFilter->GetOutput(),
                                                                                                              layer, 0);
             
             }
-- 
GitLab