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 clitkExtrudeGenericFilter_txx
19 #define clitkExtrudeGenericFilter_txx
22 #include <itkImageFileReader.h>
23 #include <clitkCommon.h>
28 //--------------------------------------------------------------------
29 template<class args_info_type>
30 ExtrudeGenericFilter<args_info_type>::ExtrudeGenericFilter():
31 ImageToImageGenericFilter<Self>("Extrude")
33 InitializeImageType<2>();
34 InitializeImageType<3>();
36 //--------------------------------------------------------------------
39 //--------------------------------------------------------------------
40 template<class args_info_type>
41 template<unsigned int Dim>
42 void ExtrudeGenericFilter<args_info_type>::InitializeImageType()
44 ADD_DEFAULT_IMAGE_TYPES(Dim);
46 //--------------------------------------------------------------------
49 //--------------------------------------------------------------------
50 template<class args_info_type>
51 void ExtrudeGenericFilter<args_info_type>::SetArgsInfo(const args_info_type & a)
54 this->SetIOVerbose(mArgsInfo.verbose_flag);
56 if (mArgsInfo.input_given) {
57 this->SetInputFilename(mArgsInfo.input_arg);
59 if (mArgsInfo.output_given) {
60 this->SetOutputFilename(mArgsInfo.output_arg);
63 //--------------------------------------------------------------------
65 //--------------------------------------------------------------------
66 // Update with the number of dimensions and the pixeltype
67 //--------------------------------------------------------------------
68 template<class args_info_type>
69 template<class InputImageType>
71 ExtrudeGenericFilter<args_info_type>::UpdateWithInputImageType()
75 typename InputImageType::Pointer input = this->template GetInput<InputImageType>(0);
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;
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();
93 //Check if like is given and not size, origin and spacing
95 double extrusionOrigin(0.0), extrusionSpacing(1.0);
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;
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);
108 typename OutputImageType::Pointer likeImage = reader->GetOutput();
110 extrusionSize = likeImage->GetLargestPossibleRegion().GetSize()[Dim];
111 extrusionSpacing = likeImage->GetSpacing()[Dim];
112 extrusionOrigin = likeImage->GetOrigin()[Dim];
114 if (mArgsInfo.size_given) {
115 if (mArgsInfo.size_arg > 0)
116 extrusionSize = mArgsInfo.size_arg;
118 std::cerr << "The size has to be > 0" << std::endl;
122 if (mArgsInfo.origin_given) {
123 extrusionOrigin = mArgsInfo.origin_arg;
125 if (mArgsInfo.spacing_given) {
126 if (mArgsInfo.spacing_arg > 0)
127 extrusionSpacing = mArgsInfo.spacing_arg;
129 std::cerr << "The spacing has to be > 0" << std::endl;
135 for (unsigned int i=0; i<Dim; ++i)
136 size[i] = input->GetLargestPossibleRegion().GetSize()[i];
137 size[Dim] = extrusionSize;
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;
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;
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;
158 for (unsigned int i=0; i<Dim; ++i)
159 direction[Dim][i] = 0;
160 direction[Dim][Dim] = 1;
162 typename OutputImageType::RegionType region(start, size);
163 output->SetRegions(region);
165 output->FillBuffer(0);
166 output->SetOrigin(origin);
167 output->SetSpacing(spacing);
168 output->SetDirection(direction);
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) {
177 output->SetPixel(pixelIndex, inputIterator.Get());
182 this->template SetNextOutput<OutputImageType>(output);
185 //--------------------------------------------------------------------
190 #endif //#define clitkExtrudeGenericFilter_txx