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