diff --git a/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx b/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx
index 2123ea15afe0f3affcf65af04cf252718049a998..ef27cb2ba4182770fef4ac75ecbdd749c986eb8f 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);
   }
 
 };