/*========================================================================= Program: GIFT QMF Wavelet Image Filter Test Module: giftQmfWaveletImageFilter.cxx Language: C++ Date: 2005/11/16 Version: 0.1 Author: Dan Mueller [d.mueller@qut.edu.au] Copyright (c) 2005 Queensland University of Technology. All rights reserved. See giftCopyright.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. =========================================================================*/ #if defined(_MSC_VER) //Warning about: identifier was truncated to '255' characters in the debug information (MVC6.0 Debug) #pragma warning( disable : 4786 ) #endif //General includes #include //ITK includes #include #include "vnl_math.h" #include "itkMacro.h" #include "itkImage.h" #include "itkImageFileReader.h" #include "itkImageFileWriter.h" #include "itkCastImageFilter.h" #include "itkAbsImageFilter.h" #include "itkRescaleIntensityImageFilter.h" //GIFT includes #include "giftBiorthogonalWaveletOperator.h" #include "giftQmfWaveletImageFilter.h" ///////////////////////////////////////////////////////////// //Test QmfWaveletImageFilter->GetNumberOfBands/GetNumberOfLevels() template bool TestQmfWaveletLevelsBandsInstance() { bool success = true; //Create image filter typedef itk::Image ImageType; typedef gift::BiorthogonalWaveletOperator BiorWavelet; BiorWavelet bior(BiorWavelet::Bior_2_2); typedef gift::QmfWaveletImageFilter WaveletFilter; //Create filter typename WaveletFilter::Pointer filter = WaveletFilter::New(); unsigned int testNumberOfLevels = 3; filter->SetNumberOfLevels(testNumberOfLevels); filter->SetDeconstruction(); filter->SetWavelet(bior); unsigned int numberOfBands = filter->GetNumberOfOutputBands(); unsigned int numberOfLevels = filter->GetNumberOfOutputLevels(); //Test bands if (numberOfBands != (unsigned int)pow(2.0, (int)VDimension)) { success &= false; } //Test levels if (numberOfLevels != testNumberOfLevels) { success &= false; } //Test number of output images if (filter->GetNumberOfOutputs() != (numberOfBands*numberOfLevels)) { std::cout << "ERROR: gift::QmfWaveletImageFilter->GetNumberOfOutputs() returns incorrect result in deconstruction mode" << std::endl; std::cout << "ERROR: expecting 1 input, but returned " << filter->GetNumberOfOutputs() << std::endl; success &= false; } //------------------------------------------------------------------- //Switch to Reconstruct filter->SetReconstruction(); //Test number of output images if (filter->GetNumberOfOutputs() != 1) { std::cout << "ERROR: gift::QmfWaveletImageFilter->GetNumberOfOutputs() returns incorrect result in reconstruction mode" << std::endl; std::cout << "ERROR: expecting 1 output, but returned " << filter->GetNumberOfOutputs() << std::endl; success &= false; } //Return return success; } ///////////////////////////////////////////////////////////// //Test QmfWaveletImageFilter->GetNumberOfBands/GetNumberOfLevels() int giftTestQmfWaveletLevelsBands( int, char * [] ) { bool success = true; //Call instance test for different dimensions success &= TestQmfWaveletLevelsBandsInstance<2, unsigned char>(); success &= TestQmfWaveletLevelsBandsInstance<3, unsigned char>(); //Return if (success){return EXIT_SUCCESS;} else {return EXIT_FAILURE;} } ///////////////////////////////////////////////////////////// //Test QmfWaveletImageFilter [2D] int giftTestQmfWavelet2D(int argc, char* argv[]) { bool success = true; //Check arguments if (argc < 5) { std::cerr << "Usage: " << argv[0] << " NumberOfLevels InputFilename OutputDeconstructionFilepattern OutputFilename\n"; return EXIT_FAILURE; } //Set inputs //NOTE: OutputDeconstructionFilepattern must have a "{0}" to be replaced... unsigned int NumberOfLevels = atoi(argv[1]); char* InputFilename = argv[2]; char* OutputDeconstructionFilepattern = argv[3]; char* OutputFilename = argv[4]; //Typedefs const unsigned int Dimension = 2; typedef float InternalPixelType; typedef unsigned char WritePixelType; typedef itk::Image InternalImageType; typedef itk::Image WriteImageType; typedef itk::ImageFileReader ReaderType; typedef itk::ImageFileWriter WriterType; typedef itk::RescaleIntensityImageFilter RescaleFilterType; typedef itk::CastImageFilter CastFilterType; typedef gift::BiorthogonalWaveletOperator BiorWavelet; typedef gift::QmfWaveletImageFilter WaveletFilter; //Read input ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(InputFilename); reader->Update(); //Create wavelet operator BiorWavelet bior(gift::BiorthogonalWaveletOperator::Bior_1_1); //Create and setup deconstruction wavelet filter WaveletFilter::Pointer filterWaveletDeconstruct = WaveletFilter::New(); filterWaveletDeconstruct->SetNumberOfLevels(NumberOfLevels); filterWaveletDeconstruct->SetDeconstruction(); filterWaveletDeconstruct->SetWavelet(bior); filterWaveletDeconstruct->SetInput(reader->GetOutput()); filterWaveletDeconstruct->Update(); //Create and setup reconstruction wavelet filter WaveletFilter::Pointer filterWaveletReconstruct = WaveletFilter::New(); filterWaveletReconstruct->SetNumberOfLevels(NumberOfLevels); filterWaveletReconstruct->SetReconstruction(); filterWaveletReconstruct->SetWavelet(bior); //Set inputs for reconstruction, write outputs for (unsigned int index=0; index < filterWaveletDeconstruct->GetNumberOfOutputs(); index++) { //Set input for reconstruction filterWaveletReconstruct->SetInput(index, filterWaveletDeconstruct->GetOutput(index)); //Construct output filename char strIndex[5]; sprintf(strIndex, "%02d", index); std::string outputFilename = OutputDeconstructionFilepattern; itksys::SystemTools::ReplaceString(outputFilename, "{0}", strIndex); //Rescale RescaleFilterType::Pointer filterRescale = RescaleFilterType::New(); filterRescale->SetOutputMinimum(0); filterRescale->SetOutputMaximum(255); filterRescale->SetInput(filterWaveletDeconstruct->GetOutput(index)); //Write WriterType::Pointer writer = WriterType::New(); writer->SetFileName(outputFilename.c_str()); writer->SetInput(filterRescale->GetOutput()); writer->Update(); } //Finish filterWaveletReconstruct->Update(); //Cast CastFilterType::Pointer filterCast = CastFilterType::New(); filterCast->SetInput(filterWaveletReconstruct->GetOutput()); //Write WriterType::Pointer writer = WriterType::New(); writer->SetFileName(OutputFilename); writer->SetInput(filterCast->GetOutput()); writer->Update(); //Return if (success){return EXIT_SUCCESS;} else {return EXIT_FAILURE;} } ///////////////////////////////////////////////////////////// //Test QmfWaveletImageFilter [3D] int giftTestQmfWavelet3D(int argc, char* argv[]) { bool success = true; //Check arguments if (argc < 5) { std::cerr << "Usage: " << argv[0] << " NumberOfLevels InputFilename OutputDeconstructionFilepattern OutputFilename\n"; return EXIT_FAILURE; } //Set inputs //NOTE: OutputDeconstructionFilepattern must have a "{0}" to be replaced... unsigned int NumberOfLevels = atoi(argv[1]); char* InputFilename = argv[2]; char* OutputDeconstructionFilepattern = argv[3]; char* OutputFilename = argv[4]; //Typedefs const unsigned int Dimension = 3; typedef float InternalPixelType; typedef unsigned char WritePixelType; typedef itk::Image InternalImageType; typedef itk::Image WriteImageType; typedef itk::ImageFileReader ReaderType; typedef itk::ImageFileWriter WriterType; typedef itk::RescaleIntensityImageFilter RescaleFilterType; typedef itk::CastImageFilter CastFilterType; typedef gift::BiorthogonalWaveletOperator BiorWavelet; typedef gift::QmfWaveletImageFilter WaveletFilter; //Read input ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(InputFilename); reader->Update(); //Create wavelet operator BiorWavelet bior(gift::BiorthogonalWaveletOperator::Bior_2_2); //Create and setup deconstruction wavelet filter WaveletFilter::Pointer filterWaveletDeconstruct = WaveletFilter::New(); filterWaveletDeconstruct->SetNumberOfLevels(NumberOfLevels); filterWaveletDeconstruct->SetDeconstruction(); filterWaveletDeconstruct->SetWavelet(bior); filterWaveletDeconstruct->SetInput(reader->GetOutput()); filterWaveletDeconstruct->Update(); //Create and setup reconstruction wavelet filter WaveletFilter::Pointer filterWaveletReconstruct = WaveletFilter::New(); filterWaveletReconstruct->SetNumberOfLevels(NumberOfLevels); filterWaveletReconstruct->SetReconstruction(); filterWaveletReconstruct->SetWavelet(bior); //Set inputs for reconstruction, write outputs for (unsigned int index=0; index < filterWaveletDeconstruct->GetNumberOfOutputs(); index++) { //Set input for reconstruction filterWaveletReconstruct->SetInput(index, filterWaveletDeconstruct->GetOutput(index)); //Construct output filename char strIndex[5]; sprintf(strIndex, "%02d", index); std::string outputFilename = OutputDeconstructionFilepattern; itksys::SystemTools::ReplaceString(outputFilename, "{0}", strIndex); //Rescale RescaleFilterType::Pointer filterRescale = RescaleFilterType::New(); filterRescale->SetOutputMinimum(0); filterRescale->SetOutputMaximum(255); filterRescale->SetInput(filterWaveletDeconstruct->GetOutput(index)); //Write WriterType::Pointer writer = WriterType::New(); writer->SetFileName(outputFilename.c_str()); writer->SetInput(filterRescale->GetOutput()); writer->Update(); } //Finish filterWaveletReconstruct->Update(); //Cast CastFilterType::Pointer filterCast = CastFilterType::New(); filterCast->SetInput(filterWaveletReconstruct->GetOutput()); //Write WriterType::Pointer writer = WriterType::New(); writer->SetFileName(OutputFilename); writer->SetInput(filterCast->GetOutput()); writer->Update(); //Return if (success){return EXIT_SUCCESS;} else {return EXIT_FAILURE;} }