From 96a1ce5f314e9a854371b0d2f33ac86e95261f49 Mon Sep 17 00:00:00 2001 From: Gregoire Mercier <gregoire.mercier@telecom-bretagne.eu> Date: Thu, 3 Mar 2011 19:07:58 +0100 Subject: [PATCH] TEST: FastICAImageFilter --- Testing/CMakeLists.txt | 16 ++++ Testing/otbFastICAImageFilter.cxx | 147 ++++++++++++++++++++++++++++++ Testing/otbHyperTests1.cxx | 3 + 3 files changed, 166 insertions(+) create mode 100644 Testing/otbFastICAImageFilter.cxx diff --git a/Testing/CMakeLists.txt b/Testing/CMakeLists.txt index a63ba85d9c..8d63be9d90 100644 --- a/Testing/CMakeLists.txt +++ b/Testing/CMakeLists.txt @@ -27,6 +27,7 @@ SET( otbHyperTests1_SRC otbPCAImageFilter.cxx otbMNFImageFilter.cxx otbNAPCAImageFilter.cxx + otbFastICAImageFilter.cxx ) ADD_EXECUTABLE(otbHyperTests1 ${otbHyperTests1_SRC} otbHyperTests1.cxx) @@ -433,6 +434,21 @@ ADD_TEST(hyTvNAPCAImageFilter -inv ${TEMP}/cupriteNAPCAinv.hdr -out ${TEMP}/cupriteNAPCA.hdr) +ADD_TEST(bfTuFastICAInternalOptimizerVectorImageFilterNew + ${TESTEXE_DIR}/otbHyperTests1 + otbFastICAInternalOptimizerVectorImageFilterNewTest) + +ADD_TEST(hyTuFastICAImageFilterNew + ${TESTEXE_DIR}/otbHyperTests1 + otbFastICAImageFilterNewTest) + +ADD_TEST(hyTvFastICAImageFilter + ${TESTEXE_DIR}/otbHyperTests1 + otbFastICAImageFilterTest + -in ${DATA}/CupriteSubHsi/cupriteSubHsi.tif + -inv ${TEMP}/cupriteFastICAinv.hdr + -out ${TEMP}/cupriteFastICA.hdr) + ADD_TEST(hyTuEigenvalueLikelihoodMaximizationNew ${TESTEXE_DIR}/otbHyperTests1 otbEigenvalueLikelihoodMaximizationNewTest) diff --git a/Testing/otbFastICAImageFilter.cxx b/Testing/otbFastICAImageFilter.cxx new file mode 100644 index 0000000000..234f11a060 --- /dev/null +++ b/Testing/otbFastICAImageFilter.cxx @@ -0,0 +1,147 @@ +/*========================================================================= + + Program: ORFEO Toolbox + Language: C++ + Date: $Date$ + Version: $Revision$ + + + Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. + See OTBCopyright.txt for details. + + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ + +#include "otbVectorImage.h" +#include "otbImageFileReader.h" +#include "otbImageFileWriter.h" +#include "otbCommandProgressUpdate.h" +#include "otbCommandLineArgumentParser.h" + +#include "otbFastICAImageFilter.h" +#include "otbFastICAInternalOptimizerVectorImageFilter.h" + +int otbFastICAInternalOptimizerVectorImageFilterNewTest ( int argc, char* argv[] ) +{ + const unsigned int Dimension = 2; + typedef double PixelType; + typedef otb::VectorImage< PixelType, Dimension > ImageType; + typedef otb::FastICAInternalOptimizerVectorImageFilter< ImageType, ImageType > FilterType; + FilterType::Pointer filter = FilterType::New(); + return EXIT_SUCCESS; +} + +int otbFastICAImageFilterNewTest ( int argc, char* argv[] ) +{ + const unsigned int Dimension = 2; + typedef double PixelType; + typedef otb::VectorImage< PixelType, Dimension > ImageType; + typedef otb::FastICAImageFilter< ImageType, ImageType, otb::Transform::FORWARD > FilterType; + FilterType::Pointer filter = FilterType::New(); + return EXIT_SUCCESS; +} + +int otbFastICAImageFilterTest ( int argc, char* argv[] ) +{ + typedef otb::CommandLineArgumentParser ParserType; + ParserType::Pointer parser = ParserType::New(); + + parser->AddInputImage(); + parser->AddOption( "--NumComponents", "Number of components to keep for output", "-n", 1, false ); + parser->AddOption( "--Inverse", "Performs also the inverse transformation (give the output name)", "-inv", 1, false ); + parser->AddOption( "--NumIterations", "number of iterations (def.20)", "-iter", 1, false ); + parser->AddOption( "--Mu", "Give the increment weight of W in [0,1] (def. 1)", "-mu", 1, false ); + parser->AddOutputImage(); + + typedef otb::CommandLineArgumentParseResult ParserResultType; + ParserResultType::Pointer parseResult = ParserResultType::New(); + + try + { + parser->ParseCommandLine( argc, argv, parseResult ); + } + catch( itk::ExceptionObject & err ) + { + std::cerr << argv[0] << " applies MNF transformations\n"; + std::string descriptionException = err.GetDescription(); + if ( descriptionException.find("ParseCommandLine(): Help Parser") + != std::string::npos ) + return EXIT_SUCCESS; + if(descriptionException.find("ParseCommandLine(): Version Parser") + != std::string::npos ) + return EXIT_SUCCESS; + return EXIT_FAILURE; + } + + const char * inputImageName = parseResult->GetInputImage().c_str(); + const char * outputImageName = parseResult->GetOutputImage().c_str(); + const unsigned int nbComponents = parseResult->IsOptionPresent("--NumComponents") ? + parseResult->GetParameterUInt("--NumComponents") : 0; + const unsigned int nbIterations = parseResult->IsOptionPresent("--NumIterations") ? + parseResult->GetParameterUInt("--NumIterations") : 20; + const double mu = parseResult->IsOptionPresent("--Mu" ) ? + parseResult->GetParameterDouble("--Mu") : 1. ; + + // Main type definition + const unsigned int Dimension = 2; + typedef double PixelType; + typedef otb::VectorImage< PixelType, Dimension > ImageType; + + // Reading input images + typedef otb::ImageFileReader<ImageType> ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(inputImageName); + + // Image filtering + typedef otb::FastICAImageFilter< ImageType, ImageType, otb::Transform::FORWARD > FilterType; + FilterType::Pointer filter = FilterType::New(); + filter->SetInput( reader->GetOutput() ); + filter->SetNumberOfPrincipalComponentsRequired( nbComponents ); + filter->SetNumberOfIterations( nbIterations ); + filter->SetMu( mu ); + + typedef otb::CommandProgressUpdate< FilterType > CommandType; + CommandType::Pointer observer = CommandType::New(); + filter->AddObserver( itk::ProgressEvent(), observer ); + + std::cerr << "Decomposition\n"; + + // Writing + typedef otb::ImageFileWriter< ImageType > ImageWriterType; + ImageWriterType::Pointer writer = ImageWriterType::New(); + writer->SetFileName( outputImageName ); + writer->SetInput( filter->GetOutput() ); + writer->Update(); + + // std::cerr << filter << "\n"; + + if ( parseResult->IsOptionPresent("--Inverse") ) + { + typedef otb::FastICAImageFilter< ImageType, ImageType, otb::Transform::INVERSE > InvFilterType; + InvFilterType::Pointer invFilter = InvFilterType::New(); + invFilter->SetInput( filter->GetOutput() ); + invFilter->SetMeanValues( filter->GetMeanValues() ); + invFilter->SetStdDevValues( filter->GetStdDevValues() ); + invFilter->SetPCATransformationMatrix( filter->GetPCATransformationMatrix() ); + invFilter->SetTransformationMatrix( filter->GetTransformationMatrix() ); + + typedef otb::CommandProgressUpdate< InvFilterType > CommandType2; + CommandType2::Pointer invObserver = CommandType2::New(); + invFilter->AddObserver( itk::ProgressEvent(), invObserver ); + + std::cerr << "Reconstruction\n"; + + ImageWriterType::Pointer invWriter = ImageWriterType::New(); + invWriter->SetFileName( parseResult->GetParameterString("--Inverse") ); + invWriter->SetInput( invFilter->GetOutput() ); + invWriter->Update(); + } + + return EXIT_SUCCESS; +} + + diff --git a/Testing/otbHyperTests1.cxx b/Testing/otbHyperTests1.cxx index aa1d71282f..ec22a5adc2 100644 --- a/Testing/otbHyperTests1.cxx +++ b/Testing/otbHyperTests1.cxx @@ -65,4 +65,7 @@ void RegisterTests() REGISTER_TEST(otbMNFImageFilterTest); REGISTER_TEST(otbNAPCAImageFilterNewTest); REGISTER_TEST(otbNAPCAImageFilterTest); + REGISTER_TEST(otbFastICAInternalOptimizerVectorImageFilterNewTest); + REGISTER_TEST(otbFastICAImageFilterNewTest); + REGISTER_TEST(otbFastICAImageFilterTest); } -- GitLab