From b9524112ecde7c5c157c0d9fb13970e59bd233ad Mon Sep 17 00:00:00 2001 From: Cedric <cedric.traizet@c-s.fr> Date: Wed, 9 Jan 2019 17:43:02 +0100 Subject: [PATCH] ENH: added the endmember number estimation to the application --- .../app/otbEndmemberNumberEstimation.cxx | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx b/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx index 2123ea15af..ef27cb2ba4 100644 --- a/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx +++ b/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx @@ -22,6 +22,8 @@ #include "otbWrapperApplicationFactory.h" #include "otbStreamingStatisticsVectorImageFilter.h" +#include "otbEigenvalueLikelihoodMaximisation.h" +#include "otbVirtualDimensionality.h" namespace otb { @@ -44,6 +46,8 @@ public: typedef otb::StreamingStatisticsVectorImageFilter<FloatVectorImageType, float> StreamingStatisticsVectorImageFilterType; + typedef otb::VirtualDimensionality<float> VirtualDimensionalityType; + typedef otb::EigenvalueLikelihoodMaximisation<float> EigenvalueLikelihoodMaximisationType; private: void DoInit() override @@ -70,7 +74,7 @@ private: AddChoice("algo.vd", "vd"); SetParameterDescription("algo.vd", "virtual dimensionality"); - AddParameter(ParameterType_String,"number","Number of endmembers"); + AddParameter(ParameterType_Int,"number","Number of endmembers"); SetParameterDescription("number", "Estimated number of endmembers"); SetParameterRole("number", Role_Output); @@ -92,6 +96,27 @@ private: statisticsFilter->SetInput(GetParameterImage("in")); statisticsFilter->Update(); + int numberOfEndmembers = 0; + const std::string algorithm = GetParameterString("algo"); + if (algorithm=="elm") + { + auto elm = EigenvalueLikelihoodMaximisationType::New(); + elm->SetCovariance(statisticsFilter->GetCovariance().GetVnlMatrix()); + elm->SetCorrelation(statisticsFilter->GetCorrelation().GetVnlMatrix()); + elm->SetNumberOfPixels(GetParameterImage("in")->GetLargestPossibleRegion().GetNumberOfPixels()); + elm->Compute(); + numberOfEndmembers = elm->GetNumberOfEndmembers(); + } + else if (algorithm=="vd") + { + auto vd = VirtualDimensionalityType::New(); + vd->SetCovariance(statisticsFilter->GetCovariance().GetVnlMatrix()); + vd->SetCorrelation(statisticsFilter->GetCorrelation().GetVnlMatrix()); + vd->SetNumberOfPixels(GetParameterImage("in")->GetLargestPossibleRegion().GetNumberOfPixels()); + vd->Compute(); + numberOfEndmembers = vd->GetNumberOfEndmembers(); + } + SetParameterInt("number", numberOfEndmembers); } }; -- GitLab