From be00abcdf8e47254335fa359ebc329d9a39c2aaf Mon Sep 17 00:00:00 2001 From: Thomas Feuvrier <thomas.feuvrier@c-s.fr> Date: Thu, 29 Jan 2009 14:20:42 +0100 Subject: [PATCH] ENH: Add PCA new testing as example to study PCA capability in OTB --- Testing/Code/BasicFilters/CMakeLists.txt | 13 ++ .../BasicFilters/otbBasicFiltersTests11.cxx | 1 + .../otbImagePCAShapeModelEstimatorTest.cxx | 205 ++++++++++++++++++ 3 files changed, 219 insertions(+) create mode 100755 Testing/Code/BasicFilters/otbImagePCAShapeModelEstimatorTest.cxx diff --git a/Testing/Code/BasicFilters/CMakeLists.txt b/Testing/Code/BasicFilters/CMakeLists.txt index 1a3bc72a13..8b6e9da752 100644 --- a/Testing/Code/BasicFilters/CMakeLists.txt +++ b/Testing/Code/BasicFilters/CMakeLists.txt @@ -1120,6 +1120,18 @@ ADD_TEST(bfTuPointSetFunctionNew ${BASICFILTERS_TESTS11} otbPointSetFunctionNew ) + +# ------- otbPCAShapeModelEstimatorTest ---------------------------- +ADD_TEST(bfTvImagePCAShapeModelEstimatorTest ${BASICFILTERS_TESTS11} + otbImagePCAShapeModelEstimatorTest + ${INPUTDATA}/poupees_sub_c1.png + ${INPUTDATA}/poupees_sub_c2.png + ${INPUTDATA}/poupees_sub_c3.png + ${TEMP}/imagePCAShapeModelEstimatorTest_mean.tif + ${TEMP}/imagePCAShapeModelEstimatorTest_eigen_vectors1.tif + ${TEMP}/imagePCAShapeModelEstimatorTest_eigen_vectors2.tif + ) + # #ADD_TEST(bfTvCountImageFunction ${BASICFILTERS_TESTS11} #--compare-ascii ${TOL} @@ -1309,6 +1321,7 @@ otbPointSetFunctionNew.cxx #otbCountImageFunctionTest.cxx #otbCountImageFilterNew.cxx #otbCountImageFilterTest.cxx +otbImagePCAShapeModelEstimatorTest.cxx ) diff --git a/Testing/Code/BasicFilters/otbBasicFiltersTests11.cxx b/Testing/Code/BasicFilters/otbBasicFiltersTests11.cxx index 2a21aea6f2..7d4000c022 100644 --- a/Testing/Code/BasicFilters/otbBasicFiltersTests11.cxx +++ b/Testing/Code/BasicFilters/otbBasicFiltersTests11.cxx @@ -32,4 +32,5 @@ REGISTER_TEST(otbPointSetFunctionNew); //REGISTER_TEST(otbCountImageFunctionTest); //REGISTER_TEST(otbCountImageFilterNew); //REGISTER_TEST(otbCountImageFilterTest); +REGISTER_TEST(otbImagePCAShapeModelEstimatorTest); } diff --git a/Testing/Code/BasicFilters/otbImagePCAShapeModelEstimatorTest.cxx b/Testing/Code/BasicFilters/otbImagePCAShapeModelEstimatorTest.cxx new file mode 100755 index 0000000000..ac640603ba --- /dev/null +++ b/Testing/Code/BasicFilters/otbImagePCAShapeModelEstimatorTest.cxx @@ -0,0 +1,205 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile: itkImagePCAShapeModelEstimatorTest.cxx,v $ + Language: C++ + Date: $Date: 2008-02-03 04:05:34 $ + Version: $Revision: 1.11 $ + + Copyright (c) Insight Software Consortium. All rights reserved. + See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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. + +=========================================================================*/ +#if defined(_MSC_VER) +#pragma warning ( disable : 4786 ) +#endif +// Insight classes +#include "itkImage.h" +#include "itkVector.h" +#include "vnl/vnl_matrix_fixed.h" +#include "vnl/vnl_math.h" +#include "itkImageRegionIterator.h" +#include "itkLightProcessObject.h" +#include "itkTextOutput.h" + +#include "otbImageFileReader.h" +#include "otbImageFileWriter.h" + +#include "itkImagePCAShapeModelEstimator.h" + +//Data definitions +#define IMGWIDTH 2 +#define IMGHEIGHT 2 +#define NDIMENSION 2 +#define NUMTRAINIMAGES 3 +#define NUMLARGESTPC 2 + +// class to support progress feeback + + +class ShowProgressObject +{ +public: + ShowProgressObject(itk::LightProcessObject * o) + {m_Process = o;} + void ShowProgress() + {std::cout << "Progress " << m_Process->GetProgress() << std::endl;} + itk::LightProcessObject::Pointer m_Process; +}; + + +int otbImagePCAShapeModelEstimatorTest(int argc, char* argv[] ) +{ +/* const unsigned int numberOfPrincipalComponentsRequired(atoi(argv[1])); + const unsigned int numberOfTrainingImages(atoi(argv[2])); + std::vector<std::string> imagesfilenames; + std::vector<std::string> outputimagesfilenames; + int cpt(3); + for(; cpt<(numberOfTrainingImages+3) ; cpt++) + { + imagesfilenames.push_back(argv[cpt]); + } + int cpt2(cpt); + for(; cpt<(numberOfPrincipalComponentsRequired+cpt2) ; cpt++) + { + outputimagesfilenames.push_back(argv[cpt]); + } +*/ + + + itk::OutputWindow::SetInstance(itk::TextOutput::New().GetPointer()); + + + //------------------------------------------------------ + //Create 3 simple test images with + //------------------------------------------------------ + typedef itk::Image<double,NDIMENSION> InputImageType; + typedef itk::Image<double,NDIMENSION> OutputImageType; + typedef + itk::ImageRegionIterator< InputImageType > InputImageIterator; + + typedef + itk::ImageRegionIterator< OutputImageType > OutputImageIterator; + + typedef otb::ImageFileReader<InputImageType> ReaderType; + typedef otb::ImageFileWriter<OutputImageType> WriterType; + + // Instantiating object + ReaderType::Pointer reader1 = ReaderType::New(); + ReaderType::Pointer reader2 = ReaderType::New(); + ReaderType::Pointer reader3 = ReaderType::New(); + + WriterType::Pointer writer1 = WriterType::New(); + WriterType::Pointer writer2 = WriterType::New(); + WriterType::Pointer writer3 = WriterType::New(); + + reader1->SetFileName(argv[1]); + reader2->SetFileName(argv[2]); + reader3->SetFileName(argv[3]); + + writer1->SetFileName(argv[4]); + writer2->SetFileName(argv[5]); + writer3->SetFileName(argv[6]); + + //---------------------------------------------------------------------- + // Test code for the Shape model estimator + //---------------------------------------------------------------------- + + //---------------------------------------------------------------------- + //Set the image model estimator + //---------------------------------------------------------------------- + typedef itk::ImagePCAShapeModelEstimator<InputImageType, OutputImageType> + ImagePCAShapeModelEstimatorType; + + ImagePCAShapeModelEstimatorType::Pointer + applyPCAShapeEstimator = ImagePCAShapeModelEstimatorType::New(); + + //---------------------------------------------------------------------- + //Set the parameters of the clusterer + //---------------------------------------------------------------------- + applyPCAShapeEstimator->SetNumberOfTrainingImages( NUMTRAINIMAGES ); + applyPCAShapeEstimator->SetNumberOfPrincipalComponentsRequired( NUMLARGESTPC + 1 ); + applyPCAShapeEstimator->SetNumberOfPrincipalComponentsRequired( NUMLARGESTPC ); + applyPCAShapeEstimator->SetInput(0, reader1->GetOutput() ); + applyPCAShapeEstimator->SetInput(1, reader2->GetOutput() ); + applyPCAShapeEstimator->SetInput(2, reader3->GetOutput() ); + + applyPCAShapeEstimator->Update(); + + writer1->SetInput(applyPCAShapeEstimator->GetOutput( 0 )); + writer1->Update(); + writer2->SetInput(applyPCAShapeEstimator->GetOutput( 1 )); + writer2->Update(); + writer3->SetInput(applyPCAShapeEstimator->GetOutput( 2 )); + writer3->Update(); + + //Test the printself function to increase coverage + applyPCAShapeEstimator->Print(std::cout); + + //Exercise TypeMacro in superclass + typedef ImagePCAShapeModelEstimatorType::Superclass GenericEstimatorType; + std::cout << applyPCAShapeEstimator->GenericEstimatorType::GetNameOfClass() << std::endl; + + //Print out the number of training images and the number of principal + //components + std::cout << "The number of training images are: " << + applyPCAShapeEstimator->GetNumberOfTrainingImages() << std::endl; + + std::cout << "The number of principal components desired are: " << + applyPCAShapeEstimator->GetNumberOfPrincipalComponentsRequired() << std::endl; + + //Print the eigen vectors + vnl_vector<double> eigenValues = + applyPCAShapeEstimator->GetEigenValues(); + unsigned int numEigVal = eigenValues.size(); + std::cout << "Number of returned eign-values: " << numEigVal << std::endl; + + std::cout << "The " << + applyPCAShapeEstimator->GetNumberOfPrincipalComponentsRequired() << + " largest eigen values are:" << std::endl; + + for(unsigned int i= 0; i< vnl_math_min( numEigVal, (unsigned int)NUMLARGESTPC ); i++ ) + { + std::cout << eigenValues[ i ] << std::endl; + } + std::cout << "" << std::endl; + std::cout << "" << std::endl; + + + //Print the MeanImage + OutputImageType::Pointer outImage = applyPCAShapeEstimator->GetOutput( 0 ); + OutputImageIterator outImageIt( outImage, outImage->GetBufferedRegion() ); + outImageIt.GoToBegin(); + + std::cout << "The mean image is:" << std::endl; + while(!outImageIt.IsAtEnd() ) + { + std::cout << (double)(outImageIt.Get()) << ";" << std::endl; + ++outImageIt; + } + std::cout << " " << std::endl; + + //Print the largest two eigen vectors + for (unsigned int j=1; j< NUMLARGESTPC + 1; j++ ) + { + OutputImageType::Pointer outImage2 = applyPCAShapeEstimator->GetOutput( j ); + OutputImageIterator outImage2It( outImage2, outImage2->GetBufferedRegion() ); + outImage2It.GoToBegin(); + + std::cout << "" << std::endl; + std::cout << "The eigen vector number: " << j << " is:" << std::endl; + while(!outImage2It.IsAtEnd() ) + { + std::cout << (double) (outImage2It.Get()) << ";" << std::endl; + ++outImage2It; + } + std::cout << " " << std::endl; + + } + + return EXIT_SUCCESS; +} -- GitLab