[Insight-users] PCAnalisys
lucas
lucas at mail.cvrti.utah.edu
Thu, 08 Jan 2004 01:03:58 -0700
Hi Luis,
I'm trying to perform a PCA on a set of training signed
distance functions but although they are different from
each other all the eigenvalues are zero.
I think I might be making a mistake when loading the
training datasets but I'm not sure.
The following one is the code I'm using:
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "vnl/vnl_matrix_fixed.h"
#include "vnl/vnl_math.h"
#include "itkTextOutput.h"
#include "itkVector.h"
#include "itkImagePCAShapeModelEstimator.h"
int main( int argc, char * argv[] )
{
if( argc < 4 )
{
std::cerr << "Usage: " << argv[0];
std::cerr << std::endl;
return 1;
}
typedef short InputPixelType;
typedef double OutputPixelType;
typedef itk::Image<InputPixelType,2> InputImageType;
typedef itk::Image<OutputPixelType,2> OutputImageType;
typedef itk::ImageFileReader< InputImageType >
ReaderType;
typedef itk::ImageFileWriter< OutputImageType >
WriterType;
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
//----------------------------------------------------------------------
//----------------------------------------------------------------------
//Set the image model estimator
//----------------------------------------------------------------------
typedef
itk::ImagePCAShapeModelEstimator<InputImageType,
OutputImageType>
ImagePCAShapeModelEstimatorType;
ImagePCAShapeModelEstimatorType::Pointer
applyPCAShapeEstimator =
ImagePCAShapeModelEstimatorType::New();
//----------------------------------------------------------------------
//Set the parameters of the clusterer
//----------------------------------------------------------------------
applyPCAShapeEstimator->SetNumberOfTrainingImages(4);
applyPCAShapeEstimator->SetNumberOfPrincipalComponentsRequired(2);
reader->SetFileName( argv[1] );
reader->Update();
applyPCAShapeEstimator->SetInput(0,reader->GetOutput()
);
reader->SetFileName( argv[2] );
reader->Update();
applyPCAShapeEstimator->SetInput(1,reader->GetOutput());
reader->SetFileName( argv[3] );
reader->Update();
applyPCAShapeEstimator->SetInput(2,
reader->GetOutput());
reader->SetFileName( argv[4] );
reader->Update();
applyPCAShapeEstimator->SetInput(3,
reader->GetOutput());
applyPCAShapeEstimator->Update();
//----------------------------------------------------------------------
// Write the mean image
//----------------------------------------------------------------------
writer->SetFileName("mean.vtk");
writer->SetInput(applyPCAShapeEstimator->GetOutput( 0 )
);
try
{
writer->Update();
}
catch( itk::ExceptionObject exp )
{
std::cerr << "Exception caught ! mean writer" <<
std::endl;
std::cerr << exp << std::endl;
}
//----------------------------------------------------------------------
// Write first mode image
//----------------------------------------------------------------------
writer->SetFileName("1mode.vtk");
writer->SetInput(applyPCAShapeEstimator->GetOutput( 1 )
);
try
{
writer->Update();
}
catch( itk::ExceptionObject exp )
{
std::cerr << "Exception caught ! 1st mode writer" <<
std::endl;
std::cerr << exp << std::endl;
}
//----------------------------------------------------------------------
// Write second mode image
//----------------------------------------------------------------------
writer->SetFileName("2mode.vtk");
writer->SetInput(applyPCAShapeEstimator->GetOutput( 2 )
);
try
{
writer->Update();
}
catch( itk::ExceptionObject exp )
{
std::cerr << "Exception caught ! 2nd mode writer" <<
std::endl;
std::cerr << exp << std::endl;
}
vnl_vector<double> eigenValues =
applyPCAShapeEstimator->GetEigenValues();
for(unsigned int i= 0; i< 4 ; i++ )
{
std::cout << eigenValues[ i ] << std::endl;
}
return 0;
}
If you have any clue of what am I doing wrong please let
me know.
Thanks,
Lucas Lorenzo