#include "vnl/vnl_sample.h"
int
main(int argc, char * argv[])
{
if (argc < 5)
{
std::cerr << "Missing Parameters " << std::endl;
std::cerr << "Usage: " << argv[0];
std::cerr << " nbTrain trainFilePattern";
std::cerr << " nbModes modeFilePattern";
std::cerr << std::endl;
return 1;
}
for (int i = 0; i < argc; i++)
{
std::cout << "id: " << i << " arg: " << argv[i] << std::endl;
}
using my_PixelType = float;
unsigned int nb_train = atoi(argv[1]);
std::vector<ImageType::Pointer> trainingImages(nb_train);
fileNamesCreator->SetStartIndex(0);
fileNamesCreator->SetEndIndex(nb_train - 1);
fileNamesCreator->SetSeriesFormat(argv[2]);
const std::vector<std::string> & shapeModeFileNames = fileNamesCreator->GetFileNames();
for (unsigned int k = 0; k < nb_train; k++)
{
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName(shapeModeFileNames[k].c_str());
reader->Update();
trainingImages[k] = reader->GetOutput();
}
my_Estimatortype::Pointer filter = my_Estimatortype::New();
filter->SetNumberOfTrainingImages(nb_train);
filter->SetNumberOfPrincipalComponentsRequired(2);
for (unsigned int k = 0; k < nb_train; k++)
{
filter->SetInput(k, trainingImages[k]);
}
unsigned int nb_modes = atoi(argv[3]);
fileNamesOutCreator->SetStartIndex(0);
fileNamesOutCreator->SetEndIndex(nb_modes - 1);
fileNamesOutCreator->SetSeriesFormat(argv[4]);
const std::vector<std::string> & outFileNames = fileNamesOutCreator->GetFileNames();
ScaleType::Pointer scaler = ScaleType::New();
filter->Update();
my_Estimatortype::VectorOfDoubleType v = filter->GetEigenValues();
double sv_mean = sqrt(v[0]);
for (unsigned int k = 0; k < nb_modes; k++)
{
double sv = sqrt(v[k]);
double sv_n = sv / sv_mean;
std::cout << "writing: " << outFileNames[k] << std::endl;
std::cout << "svd[" << k << "]: " << sv << " norm: " << sv_n << std::endl;
WriterType::Pointer writer = WriterType::New();
writer->SetFileName(outFileNames[k].c_str());
scaler->SetInput(filter->GetOutput(k));
scaler->SetConstant(sv_n);
writer->SetInput(scaler->GetOutput());
writer->Update();
}
return EXIT_SUCCESS;
}