X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkCropImageGenericFilter.cxx;h=b8d77445eaa2dbd3f89703d18ca50167eb31a5c9;hb=119a42cb1444930c78314e862e590f54c2f7678d;hp=7e37c1cfaf984660eeba18d666c1c63bbba40d10;hpb=8519d8459a3cf5a6941c2a332ca9eba3671091c9;p=clitk.git diff --git a/tools/clitkCropImageGenericFilter.cxx b/tools/clitkCropImageGenericFilter.cxx index 7e37c1c..b8d7744 100755 --- a/tools/clitkCropImageGenericFilter.cxx +++ b/tools/clitkCropImageGenericFilter.cxx @@ -37,35 +37,131 @@ namespace clitk //----------------------------------------------------------- // Constructor //----------------------------------------------------------- - CropImageGenericFilter::CropImageGenericFilter() + CropImageGenericFilter::CropImageGenericFilter(): + ImageToImageGenericFilter("CropImage") { - m_Verbose=false; - m_InputFileName=""; + cmdline_parser_clitkCropImage_init(&mArgsInfo); + InitializeImageType<2>(); + InitializeImageType<3>(); + InitializeImageType<4>(); } - - //----------------------------------------------------------- - // Update - //----------------------------------------------------------- - void CropImageGenericFilter::Update() + //-------------------------------------------------------------------- + template + void clitk::CropImageGenericFilter::InitializeImageType() { - // Read the Dimension and PixelType - int Dimension, Components; - std::string PixelType; - ReadImageDimensionAndPixelType(m_InputFileName, Dimension, PixelType, Components); + 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); + } + //-------------------------------------------------------------------- + //-------------------------------------------------------------------- + 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); + + // 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; - // 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!!!"< FilterType; + typename FilterType::Pointer filter = FilterType::New(); + filter->SetInput(input); + filter->SetBackgroundValue(mArgsInfo.BG_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(); } - } + else { + // ------------------------------------------------ + typename ImageType::SizeType lSize; + typename ImageType::SizeType uSize; + if (mArgsInfo.boundingBox_given) { + for(unsigned int i=0; iGetLargestPossibleRegion().GetSize()[i]-mArgsInfo.boundingBox_arg[2*i+1]-1; + } + } + 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); + } + typedef itk::CropImageFilter 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); + } + + // Write/Save results + this->template SetNextOutput(output); + } + //-------------------------------------------------------------------- } //end clitk