]> Creatis software - clitk.git/blob - tools/clitkCropImageGenericFilter.cxx
Adapted crop for vector fields with partial specialization to generate
[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 /* =================================================
22  * @file   clitkCropImageGenericFilter.cxx
23  * @author 
24  * @date   
25  * 
26  * @brief 
27  * 
28  ===================================================*/
29
30 #include "clitkCropImageGenericFilter.h"
31
32
33 //-----------------------------------------------------------
34 // Constructor
35 //-----------------------------------------------------------
36 clitk::CropImageGenericFilter::CropImageGenericFilter():
37   ImageToImageGenericFilter<Self>("CropImage")
38 {
39   cmdline_parser_clitkCropImage_init(&mArgsInfo);
40   InitializeImageType<2>();
41   InitializeImageType<3>();
42   InitializeImageType<4>();
43 }
44
45 //--------------------------------------------------------------------
46 template<unsigned int Dim>
47 void clitk::CropImageGenericFilter::InitializeImageType()
48 {
49   ADD_DEFAULT_IMAGE_TYPES(Dim);
50   ADD_DEFAULT_VEC_IMAGE_TYPES;
51 }
52 //--------------------------------------------------------------------
53
54 //--------------------------------------------------------------------
55 void clitk::CropImageGenericFilter::SetArgsInfo(const args_info_type& a)
56 {
57   mArgsInfo=a;
58   SetIOVerbose(mArgsInfo.verbose_flag);
59   if (mArgsInfo.imagetypes_flag) this->PrintAvailableImageTypes();
60   if (mArgsInfo.input_given)   AddInputFilename(mArgsInfo.input_arg);
61   if (mArgsInfo.output_given)  AddOutputFilename(mArgsInfo.output_arg);
62 }
63 //--------------------------------------------------------------------
64
65 //--------------------------------------------------------------------
66 template <class ImageType>
67 typename clitk::CropImageGenericFilter::AutoCrop<ImageType>::ImagePointer
68 clitk::CropImageGenericFilter::AutoCrop<ImageType>::Do(args_info_type &argsInfo, ImagePointer input)
69 {
70   static const unsigned int PixelDimension = itk::PixelTraits<typename ImageType::PixelType>::Dimension;
71   return this->Do(argsInfo, input, static_cast< PixelDimType<PixelDimension> *>(NULL) );
72 }
73 //--------------------------------------------------------------------
74
75 //--------------------------------------------------------------------
76 template <class ImageType>
77 template<unsigned int Dim>
78 typename clitk::CropImageGenericFilter::AutoCrop<ImageType>::ImagePointer
79 clitk::CropImageGenericFilter::AutoCrop<ImageType>::Do(args_info_type &, ImagePointer, PixelDimType<Dim> *)
80 {
81   clitkExceptionMacro("Autocrop is not implemented for vector fields");
82   return NULL;
83 }
84 //--------------------------------------------------------------------
85
86 //--------------------------------------------------------------------
87 template <class ImageType>
88 typename clitk::CropImageGenericFilter::AutoCrop<ImageType>::ImagePointer
89 clitk::CropImageGenericFilter::AutoCrop<ImageType>::Do(args_info_type &argsInfo, ImagePointer input, PixelDimType<1> *)
90 {
91   if (argsInfo.boundingBox_given)
92     clitkExceptionMacro("Do not use --BG and --boundingBox at the same time");
93   if (argsInfo.lower_given)
94     clitkExceptionMacro("Do not use --BG and --lower at the same time");
95   if (argsInfo.upper_given)
96     clitkExceptionMacro("Do not use --BG and --upper at the same time");
97   typedef clitk::AutoCropFilter<ImageType> FilterType;
98   typename FilterType::Pointer filter = FilterType::New();
99   filter->SetInput(input);
100   filter->SetBackgroundValue(argsInfo.BG_arg);
101   filter->Update();
102   return filter->GetOutput();
103 }
104 //--------------------------------------------------------------------
105
106 //--------------------------------------------------------------------
107 // Update with the number of dimensions and the pixeltype
108 //--------------------------------------------------------------------
109 template<class ImageType>
110 void clitk::CropImageGenericFilter::UpdateWithInputImageType()
111 {
112   // Reading input
113   typename ImageType::Pointer input = this->template GetInput<ImageType>(0);
114   typename ImageType::RegionType input_region = input->GetLargestPossibleRegion();
115
116   // Check options
117   if (mArgsInfo.BG_given && mArgsInfo.like_given)
118     clitkExceptionMacro("Do not use --BG and --like at the same time");
119
120   // Prepare output
121   typename ImageType::Pointer output;
122
123   // ------------------------------------------------
124   if (mArgsInfo.BG_given) { // AutoCrop filter
125     AutoCrop<ImageType> autoCrop;
126     output = autoCrop.Do(mArgsInfo, input);
127   }
128   else {
129     // ------------------------------------------------
130     if (mArgsInfo.like_given) { // CropLike filter
131     if (mArgsInfo.boundingBox_given)
132       clitkExceptionMacro("Do not use --like and --boundingBox at the same time");
133     if (mArgsInfo.lower_given)
134       clitkExceptionMacro("Do not use --like and --lower at the same time");
135     if (mArgsInfo.upper_given)
136       clitkExceptionMacro("Do not use --like and --upper at the same time");
137       typedef clitk::CropLikeImageFilter<ImageType> FilterType;
138       typename FilterType::Pointer filter = FilterType::New();
139       filter->SetInput(input);
140       filter->SetCropLikeFilename(mArgsInfo.like_arg);
141       filter->SetBackgroundValue(mArgsInfo.BGLike_arg);
142       filter->Update();
143       output = filter->GetOutput();
144     }
145     else {
146       // ------------------------------------------------
147       typename ImageType::SizeType lSize;
148       typename ImageType::SizeType uSize;
149       if (mArgsInfo.verbose_flag) std::cout << "input region " << input_region << std::endl;
150       if (mArgsInfo.boundingBox_given) {
151         for(unsigned int i=0; i<ImageType::ImageDimension; i++) {
152           lSize[i] = mArgsInfo.boundingBox_arg[2*i];
153           uSize[i] = input_region.GetSize()[i]-mArgsInfo.boundingBox_arg[2*i+1]-1;
154         }
155       }
156       else {
157         if (mArgsInfo.lower_given) {
158           for(unsigned int i=0; i<ImageType::ImageDimension; i++)
159             lSize[i]=static_cast<unsigned int >(mArgsInfo.lower_arg[i]);
160         }
161         else lSize.Fill(0);
162         if (mArgsInfo.upper_given) {
163           for(unsigned int i=0; i<ImageType::ImageDimension; i++)
164             uSize[i]=static_cast<unsigned int >(mArgsInfo.upper_arg[i]);
165         }
166         else uSize.Fill(0);
167       }
168
169       if (mArgsInfo.verbose_flag) {
170         std::cout << "lower " << lSize << " upper " << uSize << std::endl;
171       }
172
173       typedef  itk::CropImageFilter<ImageType, ImageType> CropImageFilterType;
174       typename CropImageFilterType::Pointer filter=CropImageFilterType::New();
175       filter->SetInput(input);
176       filter->SetLowerBoundaryCropSize(lSize);
177       filter->SetUpperBoundaryCropSize(uSize);
178       filter->Update();
179       output = filter->GetOutput();
180     }
181   }
182
183   // Force origin if needed
184   if (mArgsInfo.origin_flag) {
185     typename ImageType::PointType origin;
186     origin.Fill(itk::NumericTraits<double>::Zero);
187     output->SetOrigin(origin);
188   }
189
190   // adjust image origin and force index to zero
191   typename ImageType::RegionType region = output->GetLargestPossibleRegion();
192   typename ImageType::IndexType index = region.GetIndex();
193   typename ImageType::PointType origin = output->GetOrigin();
194   typename ImageType::SpacingType spacing = output->GetSpacing();
195   if (mArgsInfo.verbose_flag) std::cout << "origin before crop " << origin << std::endl;
196   for (unsigned int i = 0; i < output->GetImageDimension(); i++)
197     origin[i] += index[i]*spacing[i];
198   if (mArgsInfo.verbose_flag) std::cout << "origin after crop " << origin << std::endl;
199   output->SetOrigin(origin);
200
201   index.Fill(itk::NumericTraits<double>::Zero);
202   region.SetIndex(index);
203   output->SetRegions(region);
204
205   // Write/Save results
206   this->template SetNextOutput<ImageType>(output);
207 }
208 //--------------------------------------------------------------------
209
210 #endif  //#define clitkCropImageGenericFilter_cxx