Skip to content
Snippets Groups Projects
Commit f514aeb5 authored by Cédric Traizet's avatar Cédric Traizet
Browse files

Merge branch '1841_virtual_dimensionality' into 'develop'

Bugs in Virtual Dimensionality

See merge request orfeotoolbox/otb!419
parents 49f3fa6c ef6093c3
No related branches found
No related tags found
No related merge requests found
number: 9
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
......@@ -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);
......
......@@ -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
)
......
......@@ -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,
......
......@@ -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>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment