diff --git a/Data/Baseline/OTB/Files/aptTvHyEndmemberNumberEstimation.txt b/Data/Baseline/OTB/Files/aptTvHyEndmemberNumberEstimation_elm.txt
similarity index 100%
rename from Data/Baseline/OTB/Files/aptTvHyEndmemberNumberEstimation.txt
rename to Data/Baseline/OTB/Files/aptTvHyEndmemberNumberEstimation_elm.txt
diff --git a/Data/Baseline/OTB/Files/aptTvHyEndmemberNumberEstimation_vd.txt b/Data/Baseline/OTB/Files/aptTvHyEndmemberNumberEstimation_vd.txt
new file mode 100644
index 0000000000000000000000000000000000000000..946893ddee6045ae1bd85104e7e9fcc9af654233
--- /dev/null
+++ b/Data/Baseline/OTB/Files/aptTvHyEndmemberNumberEstimation_vd.txt
@@ -0,0 +1 @@
+number: 9
diff --git a/Data/Baseline/OTB/Files/hyTvVirtualDimensionalityTest.txt b/Data/Baseline/OTB/Files/hyTvVirtualDimensionalityTest.txt
index 81dd60b37c723f3e3906f0438c3b83c0e30b6cad..34d64b141601176aab97652579108eb8c3c38604 100644
--- a/Data/Baseline/OTB/Files/hyTvVirtualDimensionalityTest.txt
+++ b/Data/Baseline/OTB/Files/hyTvVirtualDimensionalityTest.txt
@@ -1,8 +1,8 @@
-FAR : 1E-2 -> Nb Endmembers: 1
-FAR : 1E-3 -> Nb Endmembers: 1
-FAR : 1E-4 -> Nb Endmembers: 1
-FAR : 1E-5 -> Nb Endmembers: 1
-FAR : 1E-6 -> Nb Endmembers: 1
-FAR : 1E-7 -> Nb Endmembers: 1
-FAR : 1E-8 -> Nb Endmembers: 1
-FAR : 1E-9 -> Nb Endmembers: 1
+FAR : 1E-2 -> Nb Endmembers: 4
+FAR : 1E-3 -> Nb Endmembers: 4
+FAR : 1E-4 -> Nb Endmembers: 4
+FAR : 1E-5 -> Nb Endmembers: 4
+FAR : 1E-6 -> Nb Endmembers: 4
+FAR : 1E-7 -> Nb Endmembers: 4
+FAR : 1E-8 -> Nb Endmembers: 3
+FAR : 1E-9 -> Nb Endmembers: 3
diff --git a/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx b/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx
index b2ccc61bedd113b5c4281c695126ebe53f2f13d1..3534cd8513a3649c0a7ee5ddc3ef1d9ec8895cf5 100644
--- a/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx
+++ b/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx
@@ -44,9 +44,9 @@ public:
 
   itkTypeMacro(EndmemberNumberEstimation, otb::Application);
 
-  typedef otb::StreamingStatisticsVectorImageFilter<FloatVectorImageType, float> StreamingStatisticsVectorImageFilterType;
-  typedef otb::VirtualDimensionality<float>                                      VirtualDimensionalityType;
-  typedef otb::EigenvalueLikelihoodMaximisation<float>                           EigenvalueLikelihoodMaximisationType;
+  typedef otb::StreamingStatisticsVectorImageFilter<FloatVectorImageType, double> StreamingStatisticsVectorImageFilterType;
+  typedef otb::VirtualDimensionality<double>                                      VirtualDimensionalityType;
+  typedef otb::EigenvalueLikelihoodMaximisation<double>                           EigenvalueLikelihoodMaximisationType;
 
 private:
   void DoInit() override
@@ -61,7 +61,7 @@ private:
     "apply an endmember number estimation algorithm using these statistics. Two "
     "algorithms are available:\n\n"
 
-    "1. Virtual Dimensionality (VD) [1][2]\n"
+    "1. Virtual Dimensionality (HFC-VD) [1][2]\n"
     "2. Eigenvalue Likelihood Maximization (ELM) [3][4]\n\n"
 
     "The application then returns the estimated number of endmembers.\n\n"
@@ -99,9 +99,9 @@ private:
     AddParameter(ParameterType_Choice, "algo", "Unmixing algorithm");
     SetParameterDescription("algo", "The algorithm to use for the estimation");
     AddChoice("algo.elm", "Eigenvalue Likelihood Maximization");
-    SetParameterDescription("algo.elm", "");
+    SetParameterDescription("algo.elm", "Eigenvalue Likelihood Maximization algorithm");
     AddChoice("algo.vd", "Virtual Dimensionality");
-    SetParameterDescription("algo.vd", "");
+    SetParameterDescription("algo.vd", "HFC Virtual Dimensionality algorithm");
 
     AddParameter( ParameterType_Float , "algo.vd.far" , "False alarm rate");
     SetMinimumParameterFloatValue("algo.vd.far", 0);
@@ -155,7 +155,7 @@ private:
       }
     else if (algorithm=="vd")
       {
-      otbAppLogINFO("Estimation algorithm: Virtual Dimensionality.");
+      otbAppLogINFO("Estimation algorithm: HFC Virtual Dimensionality.");
       auto vd = VirtualDimensionalityType::New();
       vd->SetCovariance(covarianceMatrix);
       vd->SetCorrelation(correlationMatrix);
diff --git a/Modules/Applications/AppHyperspectral/test/CMakeLists.txt b/Modules/Applications/AppHyperspectral/test/CMakeLists.txt
index a3b2187ebcc8bb32d3a39d4fd5e364783601cfbc..a430980733388e9732cf69f2270e0396902f904c 100644
--- a/Modules/Applications/AppHyperspectral/test/CMakeLists.txt
+++ b/Modules/Applications/AppHyperspectral/test/CMakeLists.txt
@@ -61,7 +61,7 @@ otb_test_application(NAME  apTvHyEndmemberNumberEstimation_vd
                              -algo.vd.far 0.2
                      TESTENVOPTIONS ${TEMP}/aptTvHyEndmemberNumberEstimation_vd.txt
                      VALID --compare-ascii ${EPSILON_7}
-                             ${BASELINE_FILES}/aptTvHyEndmemberNumberEstimation.txt
+                             ${BASELINE_FILES}/aptTvHyEndmemberNumberEstimation_vd.txt
                        ${TEMP}/aptTvHyEndmemberNumberEstimation_vd.txt
 )
 
@@ -71,7 +71,7 @@ otb_test_application(NAME  apTvHyEndmemberNumberEstimation_elm
                              -algo elm
                      TESTENVOPTIONS ${TEMP}/aptTvHyEndmemberNumberEstimation_elm.txt
                      VALID --compare-ascii ${EPSILON_7}
-                             ${BASELINE_FILES}/aptTvHyEndmemberNumberEstimation.txt
+                             ${BASELINE_FILES}/aptTvHyEndmemberNumberEstimation_elm.txt
                        ${TEMP}/aptTvHyEndmemberNumberEstimation_elm.txt
 )
 
diff --git a/Modules/Hyperspectral/EndmembersExtraction/include/otbVirtualDimensionality.h b/Modules/Hyperspectral/EndmembersExtraction/include/otbVirtualDimensionality.h
index 1c8a5bb7e5cbbaa6762758dd43c4c45b84ddbeda..8ef4d06fa9e9113e09775c6d9afeb0bf78be27cd 100644
--- a/Modules/Hyperspectral/EndmembersExtraction/include/otbVirtualDimensionality.h
+++ b/Modules/Hyperspectral/EndmembersExtraction/include/otbVirtualDimensionality.h
@@ -33,9 +33,9 @@ namespace otb
 
 /** \class VirtualDimensionality
  * \brief Estimates the number of endmembers in a hyperspectral image
- *  with the Virtual Dimensionality method
+ *  with the Virtual Dimensionality (HFC) method
  *
- * This filter applies the VD (Virtual Dimensionality) algorithm to an
+ * This filter applies the HFC-VD (Virtual Dimensionality) algorithm to an
  * hyperspectral image and outputs the number of endmembers.
  * It takes as input the covariance and correlation matrices of the input data,
  * the number of observed pixel for thoses matrices estimations,
diff --git a/Modules/Hyperspectral/EndmembersExtraction/include/otbVirtualDimensionality.hxx b/Modules/Hyperspectral/EndmembersExtraction/include/otbVirtualDimensionality.hxx
index 65cf69715f465095302a7a147fc34269006d498d..28a813eb6d44595273033eff2666ecdd77e32ef1 100644
--- a/Modules/Hyperspectral/EndmembersExtraction/include/otbVirtualDimensionality.hxx
+++ b/Modules/Hyperspectral/EndmembersExtraction/include/otbVirtualDimensionality.hxx
@@ -60,15 +60,17 @@ VirtualDimensionality<TInputImage>
 
   m_NumberOfEndmembers = 0;
   for(unsigned int i = 0; i < nbBands; ++i)
+  {
+    if (eigenCovariance[i] > 0 && eigenCorrelation[i]>0)
     {
-    double sigma = std::sqrt( 2.0 / m_NumberOfPixels
-                              * (eigenCovariance[i] + eigenCorrelation[i]
-                                 + eigenCovariance[i] * eigenCorrelation[i]) );
-    boost::math::normal normalDist(0, sigma);
-    double tau = -boost::math::quantile(normalDist, m_FAR);
-    if (eigenCorrelation[i] - eigenCovariance[i] > tau )
-      m_NumberOfEndmembers++;
+      double sigma = std::sqrt( 2.0 / m_NumberOfPixels * 
+            (eigenCovariance[i]*eigenCovariance[i] + eigenCorrelation[i]*eigenCorrelation[i]));
+      boost::math::normal normalDist(0, sigma);
+      double tau = -boost::math::quantile(normalDist, m_FAR);
+      if (eigenCorrelation[i] - eigenCovariance[i] > tau )
+        m_NumberOfEndmembers++;
     }
+  }
 }
 
 template <class TImage>