1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
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
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.
13 It is distributed under dual licence
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
21 #include "clitkCropImageGenericFilter.h"
23 //-----------------------------------------------------------
25 //-----------------------------------------------------------
26 clitk::CropImageGenericFilter::CropImageGenericFilter():
27 ImageToImageGenericFilter<Self>("CropImage")
29 cmdline_parser_clitkCropImage_init(&mArgsInfo);
30 InitializeImageType<2>();
31 InitializeImageType<3>();
32 InitializeImageType<4>();
35 //--------------------------------------------------------------------
36 template<unsigned int Dim>
37 void clitk::CropImageGenericFilter::InitializeImageType()
39 ADD_DEFAULT_IMAGE_TYPES(Dim);
40 ADD_DEFAULT_VEC_IMAGE_TYPES;
42 //--------------------------------------------------------------------
44 //--------------------------------------------------------------------
45 void clitk::CropImageGenericFilter::SetArgsInfo(const args_info_type& 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);
53 //--------------------------------------------------------------------
55 //--------------------------------------------------------------------
56 template <class ImageType>
57 typename clitk::CropImageGenericFilter::AutoCrop<ImageType>::ImagePointer
58 clitk::CropImageGenericFilter::AutoCrop<ImageType>::Do(args_info_type &argsInfo, ImagePointer input)
60 static const unsigned int PixelDimension = itk::PixelTraits<typename ImageType::PixelType>::Dimension;
61 return this->Do(argsInfo, input, static_cast< PixelDimType<PixelDimension> *>(NULL) );
63 //--------------------------------------------------------------------
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> *)
71 clitkExceptionMacro("Autocrop is not implemented for vector fields");
74 //--------------------------------------------------------------------
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> *)
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);
92 return filter->GetOutput();
94 //--------------------------------------------------------------------
96 //--------------------------------------------------------------------
97 // Update with the number of dimensions and the pixeltype
98 //--------------------------------------------------------------------
99 template<class ImageType>
100 void clitk::CropImageGenericFilter::UpdateWithInputImageType()
103 typename ImageType::Pointer input = this->template GetInput<ImageType>(0);
104 typename ImageType::RegionType input_region = input->GetLargestPossibleRegion();
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");
113 typename ImageType::Pointer output;
115 // ------------------------------------------------
116 if (mArgsInfo.BG_given) { // AutoCrop filter
117 AutoCrop<ImageType> autoCrop;
118 output = autoCrop.Do(mArgsInfo, input);
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);
135 output = filter->GetOutput();
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;
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]);
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]);
161 if (mArgsInfo.verbose_flag) {
162 std::cout << "lower " << lSize << " upper " << uSize << std::endl;
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);
171 output = filter->GetOutput();
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);
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);
194 index.Fill(itk::NumericTraits<double>::Zero);
195 region.SetIndex(index);
196 output->SetRegions(region);
198 // Write/Save results
199 this->template SetNextOutput<ImageType>(output);
201 //--------------------------------------------------------------------
203 #endif //#define clitkCropImageGenericFilter_cxx