//-----------------------------------------------------------
// Constructor
//-----------------------------------------------------------
- CropImageGenericFilter::CropImageGenericFilter()
+ CropImageGenericFilter::CropImageGenericFilter():
+ ImageToImageGenericFilter<Self>("CropImage")
{
- m_Verbose=false;
- m_InputFileName="";
+ cmdline_parser_clitkCropImage_init(&mArgsInfo);
+ InitializeImageType<2>();
+ InitializeImageType<3>();
+ InitializeImageType<4>();
}
-
- //-----------------------------------------------------------
- // Update
- //-----------------------------------------------------------
- void CropImageGenericFilter::Update()
+ //--------------------------------------------------------------------
+ template<unsigned int Dim>
+ 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<class ImageType>
+ void clitk::CropImageGenericFilter::UpdateWithInputImageType()
+ {
+ // Reading input
+ typename ImageType::Pointer input = this->template GetInput<ImageType>(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!!!"<<std::endl ;
- return;
+ // ------------------------------------------------
+ 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<ImageType> 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<ImageType> 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; i<ImageType::ImageDimension; i++) {
+ lSize[i] = mArgsInfo.boundingBox_arg[2*i];
+ uSize[i] = input->GetLargestPossibleRegion().GetSize()[i]-mArgsInfo.boundingBox_arg[2*i+1]-1;
+ }
+ }
+ else {
+ if (mArgsInfo.lower_given) {
+ for(unsigned int i=0; i<ImageType::ImageDimension; i++)
+ lSize[i]=static_cast<unsigned int >(mArgsInfo.lower_arg[i]);
+ }
+ else lSize.Fill(0);
+ if (mArgsInfo.upper_given) {
+ for(unsigned int i=0; i<ImageType::ImageDimension; i++)
+ uSize[i]=static_cast<unsigned int >(mArgsInfo.upper_arg[i]);
+ }
+ else uSize.Fill(0);
+ }
+ typedef itk::CropImageFilter<ImageType, ImageType> 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<double>::Zero);
+ output->SetOrigin(origin);
+ }
+
+ // Write/Save results
+ this->template SetNextOutput<ImageType>(output);
+ }
+ //--------------------------------------------------------------------
} //end clitk