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