X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkSUVPeakGenericFilter.txx;h=893750dd3961b0d888ad4327346d7abfc66cccbe;hb=bffde3a7ae834139793d8c00f73986879146b0e0;hp=02ca48d5cd66b3d8b35e75ef332b6a07759fd62f;hpb=a9d632132fa5c0da47d7b3079ccca9d673381a1e;p=clitk.git diff --git a/tools/clitkSUVPeakGenericFilter.txx b/tools/clitkSUVPeakGenericFilter.txx index 02ca48d..893750d 100644 --- a/tools/clitkSUVPeakGenericFilter.txx +++ b/tools/clitkSUVPeakGenericFilter.txx @@ -19,6 +19,9 @@ #define CLITKSUVPEAKGENERICFILTER_TXX #include "clitkImageCommon.h" +#include "clitkCropLikeImageFilter.h" +#include "clitkResampleImageWithOptionsFilter.h" + #include namespace clitk @@ -54,9 +57,9 @@ void SUVPeakGenericFilter::SetArgsInfo(const args_info_type & a) // Set value this->SetIOVerbose(mArgsInfo.verbose_flag); - + if (mArgsInfo.input_given) this->AddInputFilename(mArgsInfo.input_arg); - + if (mArgsInfo.mask_given) this->AddInputFilename(mArgsInfo.mask_arg); } //-------------------------------------------------------------------- @@ -72,9 +75,37 @@ void SUVPeakGenericFilter::UpdateWithInputImageType() //Read mask typedef itk::Image MaskImageType; - typename MaskImageType::Pointer mask = NULL; + typename MaskImageType::Pointer mask; if(mArgsInfo.mask_given) { mask = this->template GetInput(1); + // Check mask sampling/size + if (!HaveSameSizeAndSpacing(mask, input)) { + if (mArgsInfo.allow_resize_flag) { + if (mArgsInfo.verbose_flag) { + std::cout << "Resize mask image like input" << std::endl; + } + typedef clitk::ResampleImageWithOptionsFilter ResamplerType; + typename ResamplerType::Pointer resampler = ResamplerType::New(); + resampler->SetInput(mask); //By default the interpolation in NN, Ok for mask + resampler->SetOutputSpacing(input->GetSpacing()); + resampler->SetOutputOrigin(mask->GetOrigin()); + resampler->SetGaussianFilteringEnabled(false); + resampler->Update(); + mask = resampler->GetOutput(); + + typedef clitk::CropLikeImageFilter FilterType; + typename FilterType::Pointer crop = FilterType::New(); + crop->SetInput(mask); + crop->SetCropLikeImage(input); + crop->Update(); + mask = crop->GetOutput(); + + } + else { + std::cerr << "Mask image has a different size/spacing than input. Abort. (Use option --allow_resize)" << std::endl; + exit(-1); + } + } } else { mask = MaskImageType::New(); @@ -86,9 +117,11 @@ void SUVPeakGenericFilter::UpdateWithInputImageType() } double volume = 1000; //1 cc into mc + if (mArgsInfo.volume_given) + volume *= mArgsInfo.volume_arg; const double PI = 3.141592653589793238463; double radius = std::pow(3*volume/(4*PI),1./3); - + typename ImageType::Pointer kernel = ComputeMeanFilterKernel(input->GetSpacing(), radius); // Perform the convolution @@ -98,8 +131,8 @@ void SUVPeakGenericFilter::UpdateWithInputImageType() filter->SetKernelImage(kernel); filter->Update(); typename ImageType::Pointer output = filter->GetOutput(); - - + + typedef itk::ImageRegionConstIteratorWithIndex IteratorType; typedef itk::ImageRegionConstIteratorWithIndex MIteratorType; IteratorType iters(output, output->GetLargestPossibleRegion()); @@ -120,7 +153,7 @@ void SUVPeakGenericFilter::UpdateWithInputImageType() } typename ImageType::PointType p; output->TransformIndexToPhysicalPoint(index, p); - std::cout<<"SUV Peak found in "<< p << " with the value " << max << std::endl; + std::cout<<"SUV Peak found in "<< p << " mm with the value " << max << std::endl; } //-------------------------------------------------------------------- @@ -128,7 +161,7 @@ void SUVPeakGenericFilter::UpdateWithInputImageType() //-------------------------------------------------------------------- template template -typename ImageType::Pointer +typename ImageType::Pointer SUVPeakGenericFilter::ComputeMeanFilterKernel(const typename ImageType::SpacingType & spacing, double radius) { // Some kind of cache to speed up a bit