]> Creatis software - clitk.git/blob - tools/clitkCropImageGenericFilter.cxx
Change behavior of clitkCropImage with like option
[clitk.git] / tools / clitkCropImageGenericFilter.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to: 
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://www.centreleonberard.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
18 #ifndef clitkCropImageGenericFilter_cxx
19 #define clitkCropImageGenericFilter_cxx
20
21 #include "clitkCropImageGenericFilter.h"
22
23 //-----------------------------------------------------------
24 // Constructor
25 //-----------------------------------------------------------
26 clitk::CropImageGenericFilter::CropImageGenericFilter():
27   ImageToImageGenericFilter<Self>("CropImage")
28 {
29   cmdline_parser_clitkCropImage_init(&mArgsInfo);
30   InitializeImageType<2>();
31   InitializeImageType<3>();
32   InitializeImageType<4>();
33 }
34
35 //--------------------------------------------------------------------
36 template<unsigned int Dim>
37 void clitk::CropImageGenericFilter::InitializeImageType()
38 {
39   ADD_DEFAULT_IMAGE_TYPES(Dim);
40   ADD_DEFAULT_VEC_IMAGE_TYPES;
41 }
42 //--------------------------------------------------------------------
43
44 //--------------------------------------------------------------------
45 void clitk::CropImageGenericFilter::SetArgsInfo(const args_info_type& a)
46 {
47   mArgsInfo=a;
48   SetIOVerbose(mArgsInfo.verbose_flag);
49   if (mArgsInfo.imagetypes_flag) this->PrintAvailableImageTypes();
50   if (mArgsInfo.input_given)   AddInputFilename(mArgsInfo.input_arg);
51   if (mArgsInfo.output_given)  AddOutputFilename(mArgsInfo.output_arg);
52 }
53 //--------------------------------------------------------------------
54
55 //--------------------------------------------------------------------
56 template <class ImageType>
57 typename clitk::CropImageGenericFilter::AutoCrop<ImageType>::ImagePointer
58 clitk::CropImageGenericFilter::AutoCrop<ImageType>::Do(args_info_type &argsInfo, ImagePointer input)
59 {
60   static const unsigned int PixelDimension = itk::PixelTraits<typename ImageType::PixelType>::Dimension;
61   return this->Do(argsInfo, input, static_cast< PixelDimType<PixelDimension> *>(NULL) );
62 }
63 //--------------------------------------------------------------------
64
65 //--------------------------------------------------------------------
66 template <class ImageType>
67 template<unsigned int Dim>
68 typename clitk::CropImageGenericFilter::AutoCrop<ImageType>::ImagePointer
69 clitk::CropImageGenericFilter::AutoCrop<ImageType>::Do(args_info_type &, ImagePointer, PixelDimType<Dim> *)
70 {
71   clitkExceptionMacro("Autocrop is not implemented for vector fields");
72   return ITK_NULLPTR;
73 }
74 //--------------------------------------------------------------------
75
76 //--------------------------------------------------------------------
77 template <class ImageType>
78 typename clitk::CropImageGenericFilter::AutoCrop<ImageType>::ImagePointer
79 clitk::CropImageGenericFilter::AutoCrop<ImageType>::Do(args_info_type &argsInfo, ImagePointer input, PixelDimType<1> *)
80 {
81   if (argsInfo.boundingBox_given)
82     clitkExceptionMacro("Do not use --BG and --boundingBox at the same time");
83   if (argsInfo.lower_given)
84     clitkExceptionMacro("Do not use --BG and --lower at the same time");
85   if (argsInfo.upper_given)
86     clitkExceptionMacro("Do not use --BG and --upper at the same time");
87   typedef clitk::AutoCropFilter<ImageType> FilterType;
88   typename FilterType::Pointer filter = FilterType::New();
89   filter->SetInput(input);
90   filter->SetBackgroundValue(argsInfo.BG_arg);
91   filter->Update();
92   return filter->GetOutput();
93 }
94 //--------------------------------------------------------------------
95
96 //--------------------------------------------------------------------
97 // Update with the number of dimensions and the pixeltype
98 //--------------------------------------------------------------------
99 template<class ImageType>
100 void clitk::CropImageGenericFilter::UpdateWithInputImageType()
101 {
102   // Reading input
103   typename ImageType::Pointer input = this->template GetInput<ImageType>(0);
104   typename ImageType::RegionType input_region = input->GetLargestPossibleRegion();
105
106   // Check options
107   if (mArgsInfo.BG_given && mArgsInfo.like_given)
108     clitkExceptionMacro("Do not use --BG and --like at the same time");
109   if (mArgsInfo.updateOrigin_flag && !mArgsInfo.like_given)
110     clitkExceptionMacro("Use --updateOrigin with --like");
111
112   // Prepare output
113   typename ImageType::Pointer output;
114
115   // ------------------------------------------------
116   if (mArgsInfo.BG_given) { // AutoCrop filter
117     AutoCrop<ImageType> autoCrop;
118     output = autoCrop.Do(mArgsInfo, input);
119   }
120   else {
121     // ------------------------------------------------
122     if (mArgsInfo.like_given) { // CropLike filter
123     if (mArgsInfo.boundingBox_given)
124       clitkExceptionMacro("Do not use --like and --boundingBox at the same time");
125     if (mArgsInfo.lower_given)
126       clitkExceptionMacro("Do not use --like and --lower at the same time");
127     if (mArgsInfo.upper_given)
128       clitkExceptionMacro("Do not use --like and --upper at the same time");
129       typedef clitk::CropLikeImageFilter<ImageType> FilterType;
130       typename FilterType::Pointer filter = FilterType::New();
131       filter->SetInput(input);
132       filter->SetCropLikeFilename(mArgsInfo.like_arg);
133       filter->SetBackgroundValue(mArgsInfo.BGLike_arg);
134       filter->Update();
135       output = filter->GetOutput();
136     }
137     else {
138       // ------------------------------------------------
139       typename ImageType::SizeType lSize;
140       typename ImageType::SizeType uSize;
141       if (mArgsInfo.verbose_flag) std::cout << "input region " << input_region << std::endl;
142       if (mArgsInfo.boundingBox_given) {
143         for(unsigned int i=0; i<ImageType::ImageDimension; i++) {
144           lSize[i] = mArgsInfo.boundingBox_arg[2*i];
145           uSize[i] = input_region.GetSize()[i]-mArgsInfo.boundingBox_arg[2*i+1]-1;
146         }
147       }
148       else {
149         if (mArgsInfo.lower_given) {
150           for(unsigned int i=0; i<ImageType::ImageDimension; i++)
151             lSize[i]=static_cast<unsigned int >(mArgsInfo.lower_arg[i]);
152         }
153         else lSize.Fill(0);
154         if (mArgsInfo.upper_given) {
155           for(unsigned int i=0; i<ImageType::ImageDimension; i++)
156             uSize[i]=static_cast<unsigned int >(mArgsInfo.upper_arg[i]);
157         }
158         else uSize.Fill(0);
159       }
160
161       if (mArgsInfo.verbose_flag) {
162         std::cout << "lower " << lSize << " upper " << uSize << std::endl;
163       }
164
165       typedef  itk::CropImageFilter<ImageType, ImageType> CropImageFilterType;
166       typename CropImageFilterType::Pointer filter=CropImageFilterType::New();
167       filter->SetInput(input);
168       filter->SetLowerBoundaryCropSize(lSize);
169       filter->SetUpperBoundaryCropSize(uSize);
170       filter->Update();
171       output = filter->GetOutput();
172     }
173   }
174
175   // Force origin if needed
176   if (mArgsInfo.origin_flag) {
177     typename ImageType::PointType origin;
178     origin.Fill(itk::NumericTraits<double>::Zero);
179     output->SetOrigin(origin);
180   }
181
182   // adjust image origin and force index to zero
183   typename ImageType::RegionType region = output->GetLargestPossibleRegion();
184   typename ImageType::IndexType index = region.GetIndex();
185   typename ImageType::PointType origin = output->GetOrigin();
186   typename ImageType::SpacingType spacing = output->GetSpacing();
187   if (!mArgsInfo.BG_given && (!mArgsInfo.like_given || mArgsInfo.updateOrigin_flag)) {
188     if (mArgsInfo.verbose_flag) std::cout << "origin before crop " << origin << std::endl;
189     input->TransformIndexToPhysicalPoint(index,origin);
190     if (mArgsInfo.verbose_flag) std::cout << "origin after crop " << origin << std::endl;
191     output->SetOrigin(origin);
192   }
193
194   index.Fill(itk::NumericTraits<double>::Zero);
195   region.SetIndex(index);
196   output->SetRegions(region);
197
198   // Write/Save results
199   this->template SetNextOutput<ImageType>(output);
200 }
201 //--------------------------------------------------------------------
202
203 #endif  //#define clitkCropImageGenericFilter_cxx