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