#define CLITKSUVPEAKGENERICFILTER_TXX
#include "clitkImageCommon.h"
+#include "clitkCropLikeImageFilter.h"
+#include "clitkResampleImageWithOptionsFilter.h"
+
#include <itkConvolutionImageFilter.h>
namespace clitk
// 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);
}
//--------------------------------------------------------------------
//Read mask
typedef itk::Image<unsigned char, ImageType::ImageDimension> MaskImageType;
- typename MaskImageType::Pointer mask = NULL;
+ typename MaskImageType::Pointer mask;
if(mArgsInfo.mask_given) {
mask = this->template GetInput<MaskImageType>(1);
+ // Check mask sampling/size
+ if (!HaveSameSizeAndSpacing<MaskImageType, ImageType>(mask, input)) {
+ if (mArgsInfo.allow_resize_flag) {
+ if (mArgsInfo.verbose_flag) {
+ std::cout << "Resize mask image like input" << std::endl;
+ }
+ typedef clitk::ResampleImageWithOptionsFilter<MaskImageType> 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<MaskImageType> 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();
}
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<ImageType>(input->GetSpacing(), radius);
// Perform the convolution
filter->SetKernelImage(kernel);
filter->Update();
typename ImageType::Pointer output = filter->GetOutput();
-
-
+
+
typedef itk::ImageRegionConstIteratorWithIndex<ImageType> IteratorType;
typedef itk::ImageRegionConstIteratorWithIndex<MaskImageType> MIteratorType;
IteratorType iters(output, output->GetLargestPossibleRegion());
}
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;
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
template<class args_info_type>
template<class ImageType>
-typename ImageType::Pointer
+typename ImageType::Pointer
SUVPeakGenericFilter<args_info_type>::ComputeMeanFilterKernel(const typename ImageType::SpacingType & spacing, double radius)
{
// Some kind of cache to speed up a bit