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>