/*========================================================================= Program: GIFT Image Fusion Filter Example 2 Module: giftExampleFusionQmfWavelet2.cxx Language: C++ Date: 2006/06/07 Version: 0.1 Author: Dan Mueller [d.mueller@qut.edu.au] Description: This example performs multi-scale fusion using a quadrature mirror filter (QMF) architecture of the discrete wavelet transform (DWT). The 'select max' area or window rule is used for detail band images, and the 'select' rule for the highest approximation image. This example is currently setup for 2-D images, but can be easily set up for 3-D images by changing the 'Dimension' constant. Copyright (c) 2006 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" int main(int argc, char * argv[]) { try { //ARGUMENTS: //argv[0] = Executable name //argv[1] = Number of levels to deconstruct/reconstruct //argv[2] = The index of the input image to favour //argv[3] = Input1 file name and path (eg. "C:\temp\input1.png") //argv[4] = Input2 file name and path (eg. "C:\temp\input2.png") //argv[5] = Final output file and path (eg. "C:\temp\output.png") //Check arguments if (argc < 6) { std::cerr << "Usage: " << argv[0] << " NumberOfLevels" << " InputImageToFavour" << " Input1Filename" << " Input2Filename" << " OutputFilename\n"; return EXIT_FAILURE; } //Set input variables unsigned int NumberOfLevels = atoi(argv[1]); unsigned int InputImageToFavour = atoi(argv[2]); char* Input1Filename = argv[3]; char* Input2Filename = argv[4]; char* OutputFilename = argv[5]; if (InputImageToFavour > 2 || InputImageToFavour < 0) InputImageToFavour = 0; //Typedefs const unsigned int Dimension = 2; 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; //Read input1 ReaderType::Pointer reader1 = ReaderType::New(); reader1->SetFileName(Input1Filename); //Read input2 ReaderType::Pointer reader2 = ReaderType::New(); reader2->SetFileName(Input2Filename); //Create wavelet operator typedef gift::BiorthogonalWaveletOperator BiorWavelet; BiorWavelet bior(BiorWavelet::Bior_2_2); //Create and setup multiscale method typedef gift::QmfWaveletImageFilter WaveletFilterType; WaveletFilterType::Pointer filterMultiscale = WaveletFilterType::New(); filterMultiscale->SetNumberOfLevels(NumberOfLevels); filterMultiscale->SetWavelet(bior); //Create feature generators typedef gift::SampleActivity SampleActivityType; typedef gift::MedianWindowSampleActivity MedianWindowActivityType; SampleActivityType::Pointer featureSampleActivity = SampleActivityType::New(); MedianWindowActivityType::Pointer featureMedianWindowActivity = MedianWindowActivityType::New(); featureMedianWindowActivity->SetWindowRadius(1); //0=0x0, 1=3x3, 2=5x5, 3=7x7 //Create weight generators typedef gift::SelectMaximumFeature SelectMaximumWeightGeneratorType; typedef gift::SelectFeature SelectWeightGeneratorType; SelectWeightGeneratorType::Pointer selectWeightGenerator = SelectWeightGeneratorType::New(); selectWeightGenerator->SetIndexToSelect(InputImageToFavour); SelectMaximumWeightGeneratorType::Pointer selectMaximumWeightGenerator = SelectMaximumWeightGeneratorType::New(); //Link weight generators to appropriate features selectWeightGenerator->AddFeatureToUse( (SelectWeightGeneratorType::FeatureGeneratorPointer)featureSampleActivity); selectMaximumWeightGenerator->AddFeatureToUse( (SelectMaximumWeightGeneratorType::FeatureGeneratorPointer)featureMedianWindowActivity); //Create weight combiner typedef gift::LinearWeightCombiner WeightCombinerType; WeightCombinerType::Pointer weightCombiner = WeightCombinerType::New(); //Create fusion filter typedef gift::ImageFusionFilter ImageFusionFilterType; ImageFusionFilterType::Pointer filterFusion = ImageFusionFilterType::New(); filterFusion->SetMultiscaleMethod( (ImageFusionFilterType::MultiscaleMethodPointer)filterMultiscale); filterFusion->AddFeatureGenerator( (ImageFusionFilterType::FeatureGeneratorPointer)featureSampleActivity); filterFusion->AddFeatureGenerator( (ImageFusionFilterType::FeatureGeneratorPointer)featureMedianWindowActivity); filterFusion->SetDefaultWeightGenerator( (ImageFusionFilterType::WeightGeneratorPointer)selectMaximumWeightGenerator); filterFusion->OverrideWeightGenerator( (ImageFusionFilterType::WeightGeneratorPointer)selectWeightGenerator, 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(); } catch (itk::ExceptionObject & err) { std::cout << "Caught exception during GIFT fusion filter example!" << std::endl; std::cout << err << std::endl; return EXIT_FAILURE; } //Return return EXIT_SUCCESS; }