diff --git a/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx b/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx index 6415a174e39e1674b5cd6cd3dbcb9feeac5eb7b6..c287154caba3e9a3ebd3f5fad9260801b3d2f445 100644 --- a/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx +++ b/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx @@ -127,6 +127,10 @@ private: AddChoice("method.pca", "PCA"); SetParameterDescription("method.pca", "Principal Component Analysis."); + AddParameter(ParameterType_OutputFilename, "method.pca.outeigenvalues", "Output file containing eigenvalues (txt format)"); + SetParameterDescription("method.pca.outeigenvalues", "Output file containing eigenvalues (txt format)."); + MandatoryOff("method.pca.outeigenvalues"); + AddChoice("method.napca", "NA-PCA"); SetParameterDescription("method.napca", "Noise Adjusted Principal Component Analysis."); AddParameter(ParameterType_Int, "method.napca.radiusx", "Set the x radius of the sliding window"); @@ -138,6 +142,7 @@ private: AddChoice("method.maf", "MAF"); SetParameterDescription("method.maf", "Maximum Autocorrelation Factor."); + AddChoice("method.ica", "ICA"); SetParameterDescription("method.ica", "Independent Component Analysis using a stabilized fixed point FastICA algorithm."); AddParameter(ParameterType_Int, "method.ica.iter", "number of iterations"); @@ -258,6 +263,19 @@ private: filter->SetUseNormalization(normalize); m_ForwardFilter->GetOutput()->UpdateOutputInformation(); + //Write transformation matrix + std::ofstream outFile; + outFile.open(this->GetParameterString("method.pca.outeigenvalues")); + if (outFile.is_open()) + { + outFile << std::fixed; + outFile.precision(10); + + outFile << filter->GetEigenValues() << std::endl;; + outFile.close(); + } + + if (invTransform) { invFilter->SetInput(m_ForwardFilter->GetOutput()); @@ -276,6 +294,7 @@ private: } m_TransformationMatrix = filter->GetTransformationMatrix(); + otbAppLogINFO("PCA transform has been computed."); break; } @@ -443,11 +462,14 @@ private: //Write transformation matrix std::ofstream outFile; outFile.open(this->GetParameterString("outmatrix")); - outFile << std::fixed; - outFile.precision(10); + if (outFile.is_open()) + { + outFile << std::fixed; + outFile.precision(10); - outFile << m_TransformationMatrix; - outFile.close(); + outFile << m_TransformationMatrix; + outFile.close(); + } } } diff --git a/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.hxx b/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.hxx index 5d381483eaba33fc0ab18a597c2ce0995f3d3652..a0ad9ddb75b79bafd9ddcf2891bed32d23718bae 100644 --- a/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.hxx +++ b/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.hxx @@ -394,6 +394,10 @@ PCAImageFilter< TInputImage, TOutputImage, TDirectionOfTransformation > for ( unsigned int i = 0; i < vectValP.size(); ++i ) valP(i, i) = vectValP[i]; + m_EigenValues.SetSize( m_NumberOfPrincipalComponentsRequired ); + for ( unsigned int i = 0; i < m_NumberOfPrincipalComponentsRequired; ++i ) + m_EigenValues[i] = static_cast< RealType >( valP(i, i) ); + /* We used normalized PCA */ for ( unsigned int i = 0; i < valP.rows(); ++i ) { @@ -421,10 +425,6 @@ PCAImageFilter< TInputImage, TOutputImage, TDirectionOfTransformation > else m_TransformationMatrix = transf; - m_EigenValues.SetSize( m_NumberOfPrincipalComponentsRequired ); - for ( unsigned int i = 0; i < m_NumberOfPrincipalComponentsRequired; ++i ) - m_EigenValues[i] = static_cast< RealType >( valP(i, i) ); - #endif }