From cb7e79ab5154f7be47e9667dc5fb255288fbb117 Mon Sep 17 00:00:00 2001 From: Simon Rit Date: Wed, 4 Jan 2012 16:48:10 +0100 Subject: [PATCH] Adapted crop for vector fields with partial specialization to generate exceptions for AutoCrop of VF --- itk/clitkCropLikeImageFilter.txx | 2 +- tools/clitkCropImageGenericFilter.cxx | 286 ++++++++++++++------------ tools/clitkCropImageGenericFilter.h | 12 ++ 3 files changed, 166 insertions(+), 134 deletions(-) diff --git a/itk/clitkCropLikeImageFilter.txx b/itk/clitkCropLikeImageFilter.txx index 93644a5..519c5fd 100644 --- a/itk/clitkCropLikeImageFilter.txx +++ b/itk/clitkCropLikeImageFilter.txx @@ -30,7 +30,7 @@ CropLikeImageFilter():itk::ImageToImageFilter() { this->SetNumberOfRequiredInputs(1); m_LikeImage = NULL; m_LikeFilenameIsGiven = false; - this->SetBackgroundValue(0); + this->SetBackgroundValue(typename PixelTraits::ValueType(0)); m_CropAlongThisDimension.resize(ImageType::ImageDimension); for(uint i=0; i("CropImage") { + cmdline_parser_clitkCropImage_init(&mArgsInfo); + InitializeImageType<2>(); + InitializeImageType<3>(); + InitializeImageType<4>(); +} + +//-------------------------------------------------------------------- +template +void clitk::CropImageGenericFilter::InitializeImageType() +{ + ADD_DEFAULT_IMAGE_TYPES(Dim); + ADD_DEFAULT_VEC_IMAGE_TYPES; +} +//-------------------------------------------------------------------- + +//-------------------------------------------------------------------- +void clitk::CropImageGenericFilter::SetArgsInfo(const args_info_type& a) +{ + mArgsInfo=a; + SetIOVerbose(mArgsInfo.verbose_flag); + if (mArgsInfo.imagetypes_flag) this->PrintAvailableImageTypes(); + if (mArgsInfo.input_given) AddInputFilename(mArgsInfo.input_arg); + if (mArgsInfo.output_given) AddOutputFilename(mArgsInfo.output_arg); +} +//-------------------------------------------------------------------- + +//-------------------------------------------------------------------- +template +typename clitk::CropImageGenericFilter::AutoCrop::ImagePointer +clitk::CropImageGenericFilter::AutoCrop::Do(args_info_type &argsInfo, ImagePointer input) +{ + static const unsigned int PixelDimension = itk::PixelTraits::Dimension; + return this->Do(argsInfo, input, static_cast< PixelDimType *>(NULL) ); +} +//-------------------------------------------------------------------- + +//-------------------------------------------------------------------- +template +template +typename clitk::CropImageGenericFilter::AutoCrop::ImagePointer +clitk::CropImageGenericFilter::AutoCrop::Do(args_info_type &, ImagePointer, PixelDimType *) +{ + clitkExceptionMacro("Autocrop is not implemented for vector fields"); + return NULL; +} +//-------------------------------------------------------------------- + +//-------------------------------------------------------------------- +template +typename clitk::CropImageGenericFilter::AutoCrop::ImagePointer +clitk::CropImageGenericFilter::AutoCrop::Do(args_info_type &argsInfo, ImagePointer input, PixelDimType<1> *) +{ + if (argsInfo.boundingBox_given) + clitkExceptionMacro("Do not use --BG and --boundingBox at the same time"); + if (argsInfo.lower_given) + clitkExceptionMacro("Do not use --BG and --lower at the same time"); + if (argsInfo.upper_given) + clitkExceptionMacro("Do not use --BG and --upper at the same time"); + typedef clitk::AutoCropFilter FilterType; + typename FilterType::Pointer filter = FilterType::New(); + filter->SetInput(input); + filter->SetBackgroundValue(argsInfo.BG_arg); + filter->Update(); + return filter->GetOutput(); +} +//-------------------------------------------------------------------- + +//-------------------------------------------------------------------- +// Update with the number of dimensions and the pixeltype +//-------------------------------------------------------------------- +template +void clitk::CropImageGenericFilter::UpdateWithInputImageType() +{ + // Reading input + typename ImageType::Pointer input = this->template GetInput(0); + typename ImageType::RegionType input_region = input->GetLargestPossibleRegion(); + // Check options + if (mArgsInfo.BG_given && mArgsInfo.like_given) + clitkExceptionMacro("Do not use --BG and --like at the same time"); - //----------------------------------------------------------- - // Constructor - //----------------------------------------------------------- - CropImageGenericFilter::CropImageGenericFilter(): - ImageToImageGenericFilter("CropImage") - { - cmdline_parser_clitkCropImage_init(&mArgsInfo); - InitializeImageType<2>(); - InitializeImageType<3>(); - InitializeImageType<4>(); - } + // Prepare output + typename ImageType::Pointer output; - //-------------------------------------------------------------------- - template - void clitk::CropImageGenericFilter::InitializeImageType() - { - ADD_DEFAULT_IMAGE_TYPES(Dim); - //ADD_IMAGE_TYPE(Dim, uchar); - //ADD_IMAGE_TYPE(Dim, short); - // ADD_IMAGE_TYPE(Dim, uint); - // ADD_IMAGE_TYPE(Dim, ulong); - // ADD_IMAGE_TYPE(Dim, int); - // ADD_IMAGE_TYPE(Dim, float); + // ------------------------------------------------ + if (mArgsInfo.BG_given) { // AutoCrop filter + AutoCrop autoCrop; + output = autoCrop.Do(mArgsInfo, input); } - //-------------------------------------------------------------------- - - //-------------------------------------------------------------------- - void clitk::CropImageGenericFilter::SetArgsInfo(const args_info_type& a) - { - mArgsInfo=a; - SetIOVerbose(mArgsInfo.verbose_flag); - if (mArgsInfo.imagetypes_flag) this->PrintAvailableImageTypes(); - if (mArgsInfo.input_given) AddInputFilename(mArgsInfo.input_arg); - if (mArgsInfo.output_given) AddOutputFilename(mArgsInfo.output_arg); - } - //-------------------------------------------------------------------- - - //-------------------------------------------------------------------- - // Update with the number of dimensions and the pixeltype - //-------------------------------------------------------------------- - template - void clitk::CropImageGenericFilter::UpdateWithInputImageType() - { - // Reading input - typename ImageType::Pointer input = this->template GetInput(0); - typename ImageType::RegionType input_region = input->GetLargestPossibleRegion(); - - // Check options - if (mArgsInfo.BG_given && mArgsInfo.like_given) - clitkExceptionMacro("Do not use --BG and --like at the same time"); - - // Prepare output - typename ImageType::Pointer output; - + else { // ------------------------------------------------ - if (mArgsInfo.BG_given) { // AutoCrop filter - if (mArgsInfo.boundingBox_given) - clitkExceptionMacro("Do not use --BG and --boundingBox at the same time"); - if (mArgsInfo.lower_given) - clitkExceptionMacro("Do not use --BG and --lower at the same time"); - if (mArgsInfo.upper_given) - clitkExceptionMacro("Do not use --BG and --upper at the same time"); - typedef clitk::AutoCropFilter FilterType; + if (mArgsInfo.like_given) { // CropLike filter + if (mArgsInfo.boundingBox_given) + clitkExceptionMacro("Do not use --like and --boundingBox at the same time"); + if (mArgsInfo.lower_given) + clitkExceptionMacro("Do not use --like and --lower at the same time"); + if (mArgsInfo.upper_given) + clitkExceptionMacro("Do not use --like and --upper at the same time"); + typedef clitk::CropLikeImageFilter FilterType; typename FilterType::Pointer filter = FilterType::New(); filter->SetInput(input); - filter->SetBackgroundValue(mArgsInfo.BG_arg); + filter->SetCropLikeFilename(mArgsInfo.like_arg); + filter->SetBackgroundValue(mArgsInfo.BGLike_arg); filter->Update(); output = filter->GetOutput(); } else { // ------------------------------------------------ - if (mArgsInfo.like_given) { // CropLike filter - if (mArgsInfo.boundingBox_given) - clitkExceptionMacro("Do not use --like and --boundingBox at the same time"); - if (mArgsInfo.lower_given) - clitkExceptionMacro("Do not use --like and --lower at the same time"); - if (mArgsInfo.upper_given) - clitkExceptionMacro("Do not use --like and --upper at the same time"); - typedef clitk::CropLikeImageFilter FilterType; - typename FilterType::Pointer filter = FilterType::New(); - filter->SetInput(input); - filter->SetCropLikeFilename(mArgsInfo.like_arg); - filter->SetBackgroundValue(mArgsInfo.BGLike_arg); - filter->Update(); - output = filter->GetOutput(); + typename ImageType::SizeType lSize; + typename ImageType::SizeType uSize; + if (mArgsInfo.verbose_flag) std::cout << "input region " << input_region << std::endl; + if (mArgsInfo.boundingBox_given) { + for(unsigned int i=0; i(mArgsInfo.lower_arg[i]); } - else { - if (mArgsInfo.lower_given) { - for(unsigned int i=0; i(mArgsInfo.lower_arg[i]); - } - else lSize.Fill(0); - if (mArgsInfo.upper_given) { - for(unsigned int i=0; i(mArgsInfo.upper_arg[i]); - } - else uSize.Fill(0); + else lSize.Fill(0); + if (mArgsInfo.upper_given) { + for(unsigned int i=0; i(mArgsInfo.upper_arg[i]); } - - if (mArgsInfo.verbose_flag) { - std::cout << "lower " << lSize << " upper " << uSize << std::endl; - } - - typedef itk::CropImageFilter CropImageFilterType; - typename CropImageFilterType::Pointer filter=CropImageFilterType::New(); - filter->SetInput(input); - filter->SetLowerBoundaryCropSize(lSize); - filter->SetUpperBoundaryCropSize(uSize); - filter->Update(); - output = filter->GetOutput(); + else uSize.Fill(0); } - } - // Force origin if needed - if (mArgsInfo.origin_flag) { - typename ImageType::PointType origin; - origin.Fill(itk::NumericTraits::Zero); - output->SetOrigin(origin); + if (mArgsInfo.verbose_flag) { + std::cout << "lower " << lSize << " upper " << uSize << std::endl; + } + + typedef itk::CropImageFilter CropImageFilterType; + typename CropImageFilterType::Pointer filter=CropImageFilterType::New(); + filter->SetInput(input); + filter->SetLowerBoundaryCropSize(lSize); + filter->SetUpperBoundaryCropSize(uSize); + filter->Update(); + output = filter->GetOutput(); } - - // adjust image origin and force index to zero - typename ImageType::RegionType region = output->GetLargestPossibleRegion(); - typename ImageType::IndexType index = region.GetIndex(); - typename ImageType::PointType origin = output->GetOrigin(); - typename ImageType::SpacingType spacing = output->GetSpacing(); - if (mArgsInfo.verbose_flag) std::cout << "origin before crop " << origin << std::endl; - for (unsigned int i = 0; i < output->GetImageDimension(); i++) - origin[i] += index[i]*spacing[i]; - if (mArgsInfo.verbose_flag) std::cout << "origin after crop " << origin << std::endl; - output->SetOrigin(origin); + } - index.Fill(itk::NumericTraits::Zero); - region.SetIndex(index); - output->SetRegions(region); - - // Write/Save results - this->template SetNextOutput(output); + // Force origin if needed + if (mArgsInfo.origin_flag) { + typename ImageType::PointType origin; + origin.Fill(itk::NumericTraits::Zero); + output->SetOrigin(origin); } - //-------------------------------------------------------------------- -} //end clitk + // adjust image origin and force index to zero + typename ImageType::RegionType region = output->GetLargestPossibleRegion(); + typename ImageType::IndexType index = region.GetIndex(); + typename ImageType::PointType origin = output->GetOrigin(); + typename ImageType::SpacingType spacing = output->GetSpacing(); + if (mArgsInfo.verbose_flag) std::cout << "origin before crop " << origin << std::endl; + for (unsigned int i = 0; i < output->GetImageDimension(); i++) + origin[i] += index[i]*spacing[i]; + if (mArgsInfo.verbose_flag) std::cout << "origin after crop " << origin << std::endl; + output->SetOrigin(origin); + + index.Fill(itk::NumericTraits::Zero); + region.SetIndex(index); + output->SetRegions(region); + + // Write/Save results + this->template SetNextOutput(output); +} +//-------------------------------------------------------------------- #endif //#define clitkCropImageGenericFilter_cxx diff --git a/tools/clitkCropImageGenericFilter.h b/tools/clitkCropImageGenericFilter.h index a1d668e..fef6103 100644 --- a/tools/clitkCropImageGenericFilter.h +++ b/tools/clitkCropImageGenericFilter.h @@ -60,6 +60,18 @@ namespace clitk void UpdateWithInputImageType(); protected: + template + class AutoCrop + { + public: + typedef typename ImageType::Pointer ImagePointer; + ImagePointer Do(args_info_type &, ImagePointer); + private: + template struct PixelDimType {}; + template ImagePointer Do(args_info_type &,ImagePointer, PixelDimType *); + ImagePointer Do(args_info_type &, ImagePointer, PixelDimType<1> *); + }; + template void InitializeImageType(); args_info_type mArgsInfo; -- 2.45.1