/*! * \file itkOxT1ImageFilter_test.cpp * \author Konrad Werys * \date 2018/08/13 */ #include "CmakeConfigForTomato.h" #ifdef USE_ITK #include "OxTestItkImagesFactory.h" #include "OxFunctionsT1ThreeParam.h" #include "OxFitterAmoebaVnl.h" #include "OxSignCalculatorNoSign.h" #include "OxSignCalculatorRealImag.h" #include "OxStartPointCalculatorDefault3Dims.h" #include "OxCalculatorT1Molli.h" #include "itkCalculatorT1ImageFilter.h" #include "itkTestingComparisonImageFilter.h" #include "gtest/gtest.h" TEST(itkCalculatorT1ImageFilter, calculate) { typedef double TYPE; typedef itk::Image TImageIn; typedef itk::Image TImageOut; typedef itk::CalculatorT1ImageFilter < TImageIn, TImageOut > CalculatorT1ImageFilterType; typedef itk::Testing::ComparisonImageFilter ComparisonImageFilter3dType; typedef itk::Testing::ComparisonImageFilter ComparisonImageFilter2dType; std::vector< std::string > filePaths; filePaths.push_back("testData/blood.yaml"); filePaths.push_back("testData/myocardium.yaml"); int nRows = 2; int nCols = 3; // test images Ox::TestItkImagesFactory itkImagesFactory(nRows, nCols, filePaths); TImageIn::Pointer imageMag = itkImagesFactory.generateImageMag(); TImageIn::Pointer imagePha = itkImagesFactory.generateImagePha(); TImageOut::Pointer imageMolliA = itkImagesFactory.generateImageResultsMolliA(); TImageOut::Pointer imageMolliB = itkImagesFactory.generateImageResultsMolliB(); TImageOut::Pointer imageMolliT1star = itkImagesFactory.generateImageResultsMolliT1star(); // init the necessary objects Ox::FunctionsT1ThreeParam functionsObject; Ox::FitterAmoebaVnl fitterAmoebaVnl; Ox::SignCalculatorRealImag signCalculator; Ox::StartPointCalculatorDefault3Dims startPointCalculator; Ox::CalculatorT1Molli calculatorT1Molli; // configure calculator calculatorT1Molli.setFunctionsT1(&functionsObject); calculatorT1Molli.setFitter(&fitterAmoebaVnl); calculatorT1Molli.setSignCalculator(&signCalculator); calculatorT1Molli.setStartPointCalculator(&startPointCalculator); calculatorT1Molli.setInvTimes(itkImagesFactory.getInvTimesPtr()); calculatorT1Molli.setNSamples(itkImagesFactory.getNSamples()); // configure calculator itk filter CalculatorT1ImageFilterType::Pointer imageCalculatorItk = CalculatorT1ImageFilterType::New(); imageCalculatorItk->SetInputMagImage(imageMag); imageCalculatorItk->SetInputPhaImage(imagePha); imageCalculatorItk->SetCalculator(&calculatorT1Molli); imageCalculatorItk->SetLowerLimitOutputIntensity(0); imageCalculatorItk->SetUpperLimitOutputIntensity(4000); //imageCalculatorItk->SetNumberOfThreads(1); imageCalculatorItk->Update(); ComparisonImageFilter2dType::Pointer diff = ComparisonImageFilter2dType::New(); diff->SetValidInput(imageMolliA.GetPointer()); diff->SetTestInput(imageCalculatorItk->GetAImage()); diff->UpdateLargestPossibleRegion(); EXPECT_LE(diff->GetMaximumDifference(), 1e-2); diff->SetValidInput(imageMolliB.GetPointer()); diff->SetTestInput(imageCalculatorItk->GetBImage()); diff->UpdateLargestPossibleRegion(); EXPECT_LE(diff->GetMaximumDifference(), 1e-2); diff->SetValidInput(imageMolliT1star.GetPointer()); diff->SetTestInput(imageCalculatorItk->GetT1starImage()); diff->UpdateLargestPossibleRegion(); EXPECT_LE(diff->GetMaximumDifference(), 1e-2); } TEST(itkCalculatorT1ImageFilter, calculate_no_phase_given) { typedef double TYPE; typedef itk::Image TImageIn; typedef itk::Image TImageOut; typedef itk::CalculatorT1ImageFilter < TImageIn, TImageOut > ImageCalculatorItkType; typedef itk::Testing::ComparisonImageFilter ComparisonImageFilter3dType; typedef itk::Testing::ComparisonImageFilter ComparisonImageFilter2dType; std::vector< std::string > filePaths; filePaths.push_back("testData/blood.yaml"); filePaths.push_back("testData/myocardium.yaml"); int nRows = 4; int nCols = 5; // test images Ox::TestItkImagesFactory itkImagesFactory(nRows, nCols, filePaths); TImageIn::Pointer imageMag = itkImagesFactory.generateImageMag(); //TImageIn::Pointer imagePha = itkImagesFactory.generateImagePha(); TImageOut::Pointer imageMolliA = itkImagesFactory.generateImageResultsMolliA(); TImageOut::Pointer imageMolliB = itkImagesFactory.generateImageResultsMolliB(); TImageOut::Pointer imageMolliT1star = itkImagesFactory.generateImageResultsMolliT1star(); // init the necessary objects Ox::FunctionsT1ThreeParam functionsObject; Ox::FitterAmoebaVnl fitterAmoebaVnl; Ox::SignCalculatorNoSign signCalculator; Ox::StartPointCalculatorDefault3Dims startPointCalculator; Ox::CalculatorT1Molli calculatorT1Molli; // configure calculator calculatorT1Molli.setFunctionsT1(&functionsObject); calculatorT1Molli.setFitter(&fitterAmoebaVnl); calculatorT1Molli.setSignCalculator(&signCalculator); calculatorT1Molli.setStartPointCalculator(&startPointCalculator); calculatorT1Molli.setInvTimes(itkImagesFactory.getInvTimesPtr()); calculatorT1Molli.setNSamples(itkImagesFactory.getNSamples()); // configure calculator itk filter ImageCalculatorItkType::Pointer imageCalculatorItk = ImageCalculatorItkType::New(); imageCalculatorItk->SetInputMagImage(imageMag); // imageCalculatorItk->SetInputPhaImage(imagePha); imageCalculatorItk->SetCalculator(&calculatorT1Molli); //imageCalculatorItk->SetNumberOfThreads(1); imageCalculatorItk->Update(); ComparisonImageFilter2dType::Pointer diff = ComparisonImageFilter2dType::New(); diff->SetValidInput(imageMolliA.GetPointer()); diff->SetTestInput(imageCalculatorItk->GetAImage()); diff->UpdateLargestPossibleRegion(); EXPECT_LE(diff->GetMaximumDifference(), 1e-2); diff->SetValidInput(imageMolliB.GetPointer()); diff->SetTestInput(imageCalculatorItk->GetBImage()); diff->UpdateLargestPossibleRegion(); EXPECT_LE(diff->GetMaximumDifference(), 1e-2); diff->SetValidInput(imageMolliT1star.GetPointer()); diff->SetTestInput(imageCalculatorItk->GetT1starImage()); diff->UpdateLargestPossibleRegion(); EXPECT_LE(diff->GetMaximumDifference(), 1e-2); } #endif //USE_ITK