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 /* =================================================
22 * @file clitkCropImageGenericFilter.cxx
28 ===================================================*/
30 #include "clitkCropImageGenericFilter.h"
33 //-----------------------------------------------------------
35 //-----------------------------------------------------------
36 clitk::CropImageGenericFilter::CropImageGenericFilter():
37 ImageToImageGenericFilter<Self>("CropImage")
39 cmdline_parser_clitkCropImage_init(&mArgsInfo);
40 InitializeImageType<2>();
41 InitializeImageType<3>();
42 InitializeImageType<4>();
45 //--------------------------------------------------------------------
46 template<unsigned int Dim>
47 void clitk::CropImageGenericFilter::InitializeImageType()
49 ADD_DEFAULT_IMAGE_TYPES(Dim);
50 ADD_DEFAULT_VEC_IMAGE_TYPES;
52 //--------------------------------------------------------------------
54 //--------------------------------------------------------------------
55 void clitk::CropImageGenericFilter::SetArgsInfo(const args_info_type& 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);
63 //--------------------------------------------------------------------
65 //--------------------------------------------------------------------
66 template <class ImageType>
67 typename clitk::CropImageGenericFilter::AutoCrop<ImageType>::ImagePointer
68 clitk::CropImageGenericFilter::AutoCrop<ImageType>::Do(args_info_type &argsInfo, ImagePointer input)
70 static const unsigned int PixelDimension = itk::PixelTraits<typename ImageType::PixelType>::Dimension;
71 return this->Do(argsInfo, input, static_cast< PixelDimType<PixelDimension> *>(NULL) );
73 //--------------------------------------------------------------------
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> *)
81 clitkExceptionMacro("Autocrop is not implemented for vector fields");
84 //--------------------------------------------------------------------
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> *)
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);
102 return filter->GetOutput();
104 //--------------------------------------------------------------------
106 //--------------------------------------------------------------------
107 // Update with the number of dimensions and the pixeltype
108 //--------------------------------------------------------------------
109 template<class ImageType>
110 void clitk::CropImageGenericFilter::UpdateWithInputImageType()
113 typename ImageType::Pointer input = this->template GetInput<ImageType>(0);
114 typename ImageType::RegionType input_region = input->GetLargestPossibleRegion();
117 if (mArgsInfo.BG_given && mArgsInfo.like_given)
118 clitkExceptionMacro("Do not use --BG and --like at the same time");
121 typename ImageType::Pointer output;
123 // ------------------------------------------------
124 if (mArgsInfo.BG_given) { // AutoCrop filter
125 AutoCrop<ImageType> autoCrop;
126 output = autoCrop.Do(mArgsInfo, input);
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);
143 output = filter->GetOutput();
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;
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]);
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]);
169 if (mArgsInfo.verbose_flag) {
170 std::cout << "lower " << lSize << " upper " << uSize << std::endl;
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);
179 output = filter->GetOutput();
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);
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);
201 index.Fill(itk::NumericTraits<double>::Zero);
202 region.SetIndex(index);
203 output->SetRegions(region);
205 // Write/Save results
206 this->template SetNextOutput<ImageType>(output);
208 //--------------------------------------------------------------------
210 #endif //#define clitkCropImageGenericFilter_cxx