]> Creatis software - clitk.git/blob - tools/clitkVFResample.cxx
0e25054301f9cf7d7294ef808d259b53964ce5a4
[clitk.git] / tools / clitkVFResample.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://oncora1.lyon.fnclcc.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 CLITKVFRESAMPLE_CXX
19 #define CLITKVFRESAMPLE_CXX
20 /**
21    ------------------------------------------------=
22    * @file   clitkImageResample.cxx
23    * @author David Sarrut <David.Sarrut@creatis.insa-lyon.fr>
24    * @date   23 Feb 2008 08:37:53
25    ------------------------------------------------=*/
26
27 // clitk
28 #include "clitkImageResample_ggo.h"
29 #include "clitkIO.h"
30 #include "clitkVFResampleGenericFilter.h"
31
32 //--------------------------------------------------------------------
33 int main(int argc, char * argv[]) {
34
35   // Init command line
36   GGO(clitkImageResample, args_info);
37   CLITK_INIT;
38
39   // Read input image header to check image dimension
40   itk::ImageIOBase::Pointer header = clitk::readImageHeader(args_info.input_arg);
41   unsigned int dim = header->GetNumberOfDimensions();
42   std::string pixelTypeName = header->GetComponentTypeAsString(header->GetComponentType());
43
44   // Print image info if verbose
45   if (args_info.verbose_flag) {
46     std::cout << "Input image <" << args_info.input_arg << "> is ";
47     clitk::printImageHeader(header, std::cout);
48     std::cout << std::endl;
49   }
50
51   // Get input size/spacing
52   std::vector<int>    inputSize;
53   std::vector<double> inputSpacing;
54   inputSize.resize(dim);
55   inputSpacing.resize(dim);
56   for(unsigned int i=0; i<dim; i++) {
57     inputSpacing[i] = header->GetSpacing(i);
58     inputSize[i] = header->GetDimensions(i);
59   }
60
61   // Get options
62   std::vector<int>    outputSize;
63   std::vector<double> outputSpacing;
64   outputSize.resize(dim);
65   outputSpacing.resize(dim);
66
67   // Check options
68   if (!args_info.size_given && !args_info.spacing_given) {
69     std::cerr << "Please indicate output size or spacing." << std::endl;
70     exit(0);
71   }
72
73   // Check options
74   if (args_info.size_given && args_info.spacing_given) {
75     std::cerr << "Please indicate only output size or spacing, not both." << std::endl;
76     exit(0);
77   }
78
79   // Size is given and not spacing
80   if (args_info.size_given && !args_info.spacing_given) {
81     if (args_info.size_given != dim) {
82       std::cerr << "Input image is " << dim << "D, please give " << dim << " size numbers." << std::endl;
83       exit(0);
84     }
85     for(unsigned int i=0; i<dim; i++) {
86       if ((args_info.size_arg[i] == -1) || (args_info.size_arg[i]==0)) 
87         outputSize[i] = inputSize[i];
88       else 
89         outputSize[i] = args_info.size_arg[i];
90       outputSpacing[i] = inputSize[i]*inputSpacing[i]/outputSize[i];
91     }
92   }
93
94   // Spacing is given and not size
95   if (!args_info.size_given && args_info.spacing_given) {
96     if (args_info.spacing_given != dim) {
97       if (args_info.spacing_given == 1) {
98         for(unsigned int i=0; i<dim; i++) outputSpacing[i] = args_info.spacing_arg[0];
99       }
100       else {
101         std::cerr << "Input image is " << dim << "D, please give " << dim << " spacing numbers." << std::endl;
102         exit(0);
103       }
104     }
105     else {
106       for(unsigned int i=0; i<dim; i++) {
107         if ((args_info.spacing_arg[i] == -1) || (args_info.spacing_arg[i]==0)) 
108           outputSpacing[i] = inputSpacing[i];
109         else 
110           outputSpacing[i] = args_info.spacing_arg[i];
111         
112       }
113     }
114     for(unsigned int i=0; i<dim; i++)
115       outputSize[i] = (int)lrint(inputSize[i]*inputSpacing[i]/outputSpacing[i]);
116   }
117
118   if (args_info.verbose_flag) {
119     std::cout << "Output image will be : " << std::endl;
120     DDV(outputSize,dim);
121     DDV(outputSpacing,dim);
122   }
123   
124   // Get sigma option for Gaussian filter
125   std::vector<double> sigma;
126   sigma.resize(args_info.gauss_given);
127   std::copy(args_info.gauss_arg, args_info.gauss_arg+args_info.gauss_given, sigma.begin());
128   if (args_info.gauss_given) {
129     if (args_info.gauss_given != dim) {
130       if (args_info.gauss_given == 1) {
131         sigma.resize(dim);
132         for(unsigned int i=0; i<dim; i++) sigma[i] = args_info.gauss_arg[0];
133       }
134       else {
135         std::cerr << "Input image is " << dim << "D, please give " << dim << " sigma numbers for gaussian filter." << std::endl;
136         exit(0);
137       }
138     }
139   }
140
141   // Create a filter
142   clitk::VFResampleGenericFilter::Pointer filter = clitk::VFResampleGenericFilter::New();
143   filter->SetInputFilename(args_info.input_arg);
144   filter->SetOutputSize(outputSize);
145   filter->SetOutputSpacing(outputSpacing);
146   filter->SetInterpolationName(args_info.interp_arg);
147   filter->SetBSplineOrder(args_info.order_arg);
148   filter->SetBLUTSampling(args_info.sampling_arg);
149   if (args_info.gauss_given)
150     filter->SetGaussianSigma(sigma);
151   filter->SetOutputFilename(args_info.output_arg);
152   
153   // Go ! 
154   filter->Update();
155
156   // this is the end my friend  
157   return 0;
158 }// end main
159 //--------------------------------------------------------------------
160
161 #endif  /* end #define CLITKVFRESAMPLE_CXX */