/*========================================================================= Program: GIFT Image Fusion Filter Test Module: giftImageFusionFilter.cxx Language: C++ Date: 2005/11/21 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 "itkNumericTraits.h" #include "itkImage.h" #include "itkImageFileReader.h" #include "itkImageFileWriter.h" #include "itkCastImageFilter.h" #include "itkRescaleIntensityImageFilter.h" #include "itkAbsImageFilter.h" #include "itkMinimumMaximumImageFilter.h" #include "itkShiftScaleImageFilter.h" #include "itkThresholdImageFilter.h" //GIFT includes #include "giftBiorthogonalWaveletOperator.h" #include "giftQmfWaveletImageFilter.h" #include "giftSampleActivity.h" #include "giftAbsSampleActivity.h" #include "giftMedianWindowSampleActivity.h" #include "giftMaximumWindowSampleActivity.h" #include "giftSelectMaximumFeature.h" #include "giftSelectFeature.h" #include "giftAverageFeature.h" #include "giftLinearWeightCombiner.h" #include "giftImageFusionFilter.h" template int giftTestImageFusionFilterTemplate(int argc, char * argv[]) { bool success = true; //ARGUMENTS: //argv[0] = Executable name //argv[1] = Number of levels to deconstruct/reconstruct //argv[2] = Input1 file name and path (eg. "C:\temp\input1.png") //argv[3] = Input2 file name and path (eg. "C:\temp\input2.png") //argv[4] = Final output file and path (eg. "C:\temp\output.png") //Set input variables unsigned int NumberOfLevels = atoi(argv[1]); char* Input1Filename = argv[2]; char* Input2Filename = argv[3]; char* OutputFilename = argv[4]; //Typedefs typedef double InternalPixelType; typedef unsigned char WritePixelType; //Declare types typedef itk::Image InternalImageType; typedef itk::Image WriteImageType; typedef itk::ImageFileReader ReaderType; typedef itk::ImageFileWriter WriterType; typedef gift::ImageFusionFilter ImageFusionFilterType; typedef gift::BiorthogonalWaveletOperator BiorWavelet; typedef gift::QmfWaveletImageFilter WaveletFilterType; typedef gift::SampleActivity SampleActivityType; typedef gift::AbsSampleActivity AbsSampleActivityType; typedef gift::MedianWindowSampleActivity MedianWindowSampleActivityType; typedef gift::MaximumWindowSampleActivity MaximumWindowSampleActivityType; typedef gift::SelectMaximumFeature SelectMaximumWeightGeneratorType; typedef gift::SelectFeature SelectWeightGeneratorType; typedef gift::AverageFeature AverageWeightGeneratorType; typedef gift::LinearWeightCombiner WeightCombinerType; //Read input1 ReaderType::Pointer reader1 = ReaderType::New(); reader1->SetFileName(Input1Filename); //Read input2 ReaderType::Pointer reader2 = ReaderType::New(); reader2->SetFileName(Input2Filename); //Create wavelet operator BiorWavelet bior(gift::BiorthogonalWaveletOperator::Bior_3_3); //Create and setup multiscale method WaveletFilterType::Pointer filterMultiscale = WaveletFilterType::New(); filterMultiscale->SetNumberOfLevels(NumberOfLevels); filterMultiscale->SetWavelet(bior); //Create feature generators SampleActivityType::Pointer featureSampleActivity = SampleActivityType::New(); AbsSampleActivityType::Pointer featureAbsSampleActivity = AbsSampleActivityType::New(); MedianWindowSampleActivityType::Pointer featureMedianWindowSampleActivity = MedianWindowSampleActivityType::New(); featureMedianWindowSampleActivity->SetWindowRadius(2); MaximumWindowSampleActivityType::Pointer featureMaximumWindowSampleActivity = MaximumWindowSampleActivityType::New(); featureMaximumWindowSampleActivity->SetWindowRadius(2); //Create weight generators AverageWeightGeneratorType::Pointer averageWeightGenerator = AverageWeightGeneratorType::New(); averageWeightGenerator->AddFeatureToUse((AverageWeightGeneratorType::FeatureGeneratorPointer)featureSampleActivity); SelectMaximumWeightGeneratorType::Pointer selectMaximumWeightGenerator = SelectMaximumWeightGeneratorType::New(); //selectMaximumWeightGenerator->AddFeatureToUse((SelectMaximumWeightGeneratorType::FeatureGeneratorPointer)featureAbsSampleActivity); //selectMaximumWeightGenerator->AddFeatureToUse((SelectMaximumWeightGeneratorType::FeatureGeneratorPointer)featureMedianWindowSampleActivity); selectMaximumWeightGenerator->AddFeatureToUse((SelectMaximumWeightGeneratorType::FeatureGeneratorPointer)featureMaximumWindowSampleActivity); //SelectWeightGeneratorType::Pointer selectWeightGenerator = SelectWeightGeneratorType::New(); //selectWeightGenerator->AddFeatureToUse((SelectWeightGeneratorType::FeatureGeneratorPointer)featureSampleActivity); //selectWeightGenerator->SetIndexToSelect(1); //Create weight combiner WeightCombinerType::Pointer weightCombiner = WeightCombinerType::New(); //Create fusion filter ImageFusionFilterType::Pointer filterFusion = ImageFusionFilterType::New(); filterFusion->SetMultiscaleMethod((ImageFusionFilterType::MultiscaleMethodPointer)filterMultiscale); filterFusion->AddFeatureGenerator((ImageFusionFilterType::FeatureGeneratorPointer)featureSampleActivity); //filterFusion->AddFeatureGenerator((ImageFusionFilterType::FeatureGeneratorPointer)featureAbsSampleActivity); //filterFusion->AddFeatureGenerator((ImageFusionFilterType::FeatureGeneratorPointer)featureMedianWindowSampleActivity); filterFusion->AddFeatureGenerator((ImageFusionFilterType::FeatureGeneratorPointer)featureMaximumWindowSampleActivity); filterFusion->SetDefaultWeightGenerator((ImageFusionFilterType::WeightGeneratorPointer)selectMaximumWeightGenerator); filterFusion->OverrideWeightGenerator((ImageFusionFilterType::WeightGeneratorPointer)averageWeightGenerator, 0, 0); filterFusion->SetWeightCombiner((ImageFusionFilterType::WeightCombinerPointer)weightCombiner); filterFusion->SetInput(0, reader1->GetOutput()); filterFusion->SetInput(1, reader2->GetOutput()); filterFusion->Update(); //Write WriterType::Pointer writer = WriterType::New(); writer->SetFileName(OutputFilename); writer->SetInput(filterFusion->GetOutput()); writer->Update(); //Return if (success){return EXIT_SUCCESS;} else {return EXIT_FAILURE;} } ///////////////////////////////////////////////////////////// //Test ImageFusionFilter2D int giftTestImageFusionFilter2D(int argc, char * argv[]) { return giftTestImageFusionFilterTemplate<2>(argc, argv); } ///////////////////////////////////////////////////////////// //Test ImageFusionFilter3D int giftTestImageFusionFilter3D(int argc, char * argv[]) { return giftTestImageFusionFilterTemplate<3>(argc, argv); }