]> Creatis software - clitk.git/blob - tools/clitkExtrudeGenericFilter.txx
Add like option in clitkExtrude tool
[clitk.git] / tools / clitkExtrudeGenericFilter.txx
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 clitkExtrudeGenericFilter_txx
19 #define clitkExtrudeGenericFilter_txx
20
21 // itk include
22 #include <itkImageFileReader.h>
23 #include <clitkCommon.h>
24
25 namespace clitk
26 {
27
28 //--------------------------------------------------------------------
29 template<class args_info_type>
30 ExtrudeGenericFilter<args_info_type>::ExtrudeGenericFilter():
31   ImageToImageGenericFilter<Self>("Extrude")
32 {
33   InitializeImageType<2>();
34   InitializeImageType<3>();
35 }
36 //--------------------------------------------------------------------
37
38
39 //--------------------------------------------------------------------
40 template<class args_info_type>
41 template<unsigned int Dim>
42 void ExtrudeGenericFilter<args_info_type>::InitializeImageType()
43 {
44   ADD_DEFAULT_IMAGE_TYPES(Dim);
45 }
46 //--------------------------------------------------------------------
47
48
49 //--------------------------------------------------------------------
50 template<class args_info_type>
51 void ExtrudeGenericFilter<args_info_type>::SetArgsInfo(const args_info_type & a)
52 {
53   mArgsInfo=a;
54   this->SetIOVerbose(mArgsInfo.verbose_flag);
55
56   if (mArgsInfo.input_given) {
57     this->SetInputFilename(mArgsInfo.input_arg);
58   }
59   if (mArgsInfo.output_given) {
60     this->SetOutputFilename(mArgsInfo.output_arg);
61   }
62 }
63 //--------------------------------------------------------------------
64
65 //--------------------------------------------------------------------
66 // Update with the number of dimensions and the pixeltype
67 //--------------------------------------------------------------------
68 template<class args_info_type>
69 template<class InputImageType>
70 void
71 ExtrudeGenericFilter<args_info_type>::UpdateWithInputImageType()
72 {
73
74   // Reading input
75   typename InputImageType::Pointer input = this->template GetInput<InputImageType>(0);
76
77   // Main filter
78   typedef typename InputImageType::PixelType PixelType;
79   const int Dim = InputImageType::ImageDimension;
80   typedef itk::Image<PixelType,Dim> ImageType;
81   typedef itk::Image<PixelType,Dim+1> OutputImageType;
82
83   //Create the output
84   typename OutputImageType::IndexType start;
85   typename OutputImageType::SizeType size;
86   typename OutputImageType::PointType origin;
87   typename OutputImageType::SpacingType spacing;
88   typename OutputImageType::DirectionType direction;
89   typename OutputImageType::Pointer output = OutputImageType::New();
90
91   start.Fill(0);
92
93   //Check if like is given and not size, origin and spacing
94   int extrusionSize(1);
95   double extrusionOrigin(0.0), extrusionSpacing(1.0);
96
97   if (mArgsInfo.like_given) {
98     if (mArgsInfo.size_given || mArgsInfo.spacing_given || mArgsInfo.origin_given) {
99       std::cerr << "You cannot set --like and --size, --origin or --spacing at the same time" << std::endl;
100       return;
101     }
102
103     // Read the input like image
104     typedef itk::ImageFileReader<OutputImageType> LikeReaderType;
105     typename LikeReaderType::Pointer reader = LikeReaderType::New();
106     reader->SetFileName(mArgsInfo.like_arg);
107     reader->Update();
108     typename OutputImageType::Pointer likeImage = reader->GetOutput();
109
110     extrusionSize = likeImage->GetLargestPossibleRegion().GetSize()[Dim];
111     extrusionSpacing = likeImage->GetSpacing()[Dim];
112     extrusionOrigin = likeImage->GetOrigin()[Dim];
113   } else {
114     if (mArgsInfo.size_given) {
115       if (mArgsInfo.size_arg > 0)
116         extrusionSize = mArgsInfo.size_arg;
117       else {
118         std::cerr << "The size has to be > 0" << std::endl;
119         return;
120       }
121     }
122     if (mArgsInfo.origin_given) {
123       extrusionOrigin = mArgsInfo.origin_arg;
124     }
125     if (mArgsInfo.spacing_given) {
126       if (mArgsInfo.spacing_arg > 0)
127         extrusionSpacing = mArgsInfo.spacing_arg;
128       else {
129         std::cerr << "The spacing has to be > 0" << std::endl;
130         return;
131       }
132     }
133   }
134
135   for (unsigned int i=0; i<Dim; ++i)
136     size[i] = input->GetLargestPossibleRegion().GetSize()[i];
137   size[Dim] = extrusionSize;
138
139   for (unsigned int i=0; i<Dim; ++i)
140     origin[i] = input->GetOrigin()[i];
141   if (mArgsInfo.origin_given)
142     origin[Dim] = mArgsInfo.origin_arg;
143   else
144     origin[Dim] = 0;
145
146   for (unsigned int i=0; i<Dim; ++i)
147     spacing[i] = input->GetSpacing()[i];
148   if (mArgsInfo.spacing_given)
149     spacing[Dim] = mArgsInfo.spacing_arg;
150   else
151     spacing[Dim] = 1;
152
153   for (unsigned int i=0; i<Dim; ++i) {
154     for (unsigned int j=0; j<Dim; ++j)
155       direction[i][j] = input->GetDirection()[i][j];
156     direction[i][Dim] = 0;
157   }
158   for (unsigned int i=0; i<Dim; ++i)
159     direction[Dim][i] = 0;
160   direction[Dim][Dim] = 1;
161
162   typename OutputImageType::RegionType region(start, size);
163   output->SetRegions(region);
164   output->Allocate();
165   output->FillBuffer(0);
166   output->SetOrigin(origin);
167   output->SetSpacing(spacing);
168   output->SetDirection(direction);
169
170   itk::ImageRegionIteratorWithIndex<InputImageType> inputIterator(input, input->GetLargestPossibleRegion());
171   while(!inputIterator.IsAtEnd()) {
172     typename OutputImageType::IndexType pixelIndex;
173     for (unsigned int i=0; i<Dim; ++i)
174       pixelIndex[i] = inputIterator.GetIndex()[i];
175     for (unsigned int i=0; i<extrusionSize; ++i) {
176       pixelIndex[Dim] = i;
177       output->SetPixel(pixelIndex, inputIterator.Get());
178     }
179     ++inputIterator;
180   }
181
182   this->template SetNextOutput<OutputImageType>(output);
183
184 }
185 //--------------------------------------------------------------------
186
187
188 }//end clitk
189
190 #endif //#define clitkExtrudeGenericFilter_txx