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