X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkCropImageGenericFilter.cxx;h=0e2818ac67e4d3584e20891545aa37d641ce0fba;hb=f49bf3a44e6deb7f840f4f63d5609206c0042b09;hp=7e37c1cfaf984660eeba18d666c1c63bbba40d10;hpb=a26cd8a19e1b9ad8344ab501436045f171a73713;p=clitk.git diff --git a/tools/clitkCropImageGenericFilter.cxx b/tools/clitkCropImageGenericFilter.cxx old mode 100755 new mode 100644 index 7e37c1c..0e2818a --- a/tools/clitkCropImageGenericFilter.cxx +++ b/tools/clitkCropImageGenericFilter.cxx @@ -3,7 +3,7 @@ Authors belong to: - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr + - Léon Bérard cancer center http://www.centreleonberard.fr - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr This software is distributed WITHOUT ANY WARRANTY; without even @@ -14,59 +14,186 @@ - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html -======================================================================-====*/ +===========================================================================**/ #ifndef clitkCropImageGenericFilter_cxx #define clitkCropImageGenericFilter_cxx -/* ================================================= - * @file clitkCropImageGenericFilter.cxx - * @author - * @date - * - * @brief - * - ===================================================*/ - #include "clitkCropImageGenericFilter.h" +//----------------------------------------------------------- +// Constructor +//----------------------------------------------------------- +clitk::CropImageGenericFilter::CropImageGenericFilter(): + ImageToImageGenericFilter("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; +} +//-------------------------------------------------------------------- -namespace clitk +//-------------------------------------------------------------------- +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() - { - m_Verbose=false; - m_InputFileName=""; - } + // Prepare output + typename ImageType::Pointer output; + // ------------------------------------------------ + if (mArgsInfo.BG_given) { // AutoCrop filter + AutoCrop autoCrop; + output = autoCrop.Do(mArgsInfo, input); + } + 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(); + } + else { + // ------------------------------------------------ + 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 lSize.Fill(0); + if (mArgsInfo.upper_given) { + for(unsigned int i=0; i(mArgsInfo.upper_arg[i]); + } + else uSize.Fill(0); + } - //----------------------------------------------------------- - // Update - //----------------------------------------------------------- - void CropImageGenericFilter::Update() - { - // Read the Dimension and PixelType - int Dimension, Components; - std::string PixelType; - ReadImageDimensionAndPixelType(m_InputFileName, Dimension, PixelType, Components); - - - // Call UpdateWithDim - if(Dimension==2) UpdateWithDim<2>(PixelType, Components); - else if(Dimension==3) UpdateWithDim<3>(PixelType, Components); - else if (Dimension==4)UpdateWithDim<4>(PixelType, Components); - else - { - std::cout<<"Error, Only for 2, 3 or 4 Dimensions!!!"< CropImageFilterType; + typename CropImageFilterType::Pointer filter=CropImageFilterType::New(); + filter->SetInput(input); + filter->SetLowerBoundaryCropSize(lSize); + filter->SetUpperBoundaryCropSize(uSize); + filter->Update(); + output = filter->GetOutput(); + } } + // 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; + input->TransformIndexToPhysicalPoint(index,origin); + 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