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