]> Creatis software - clitk.git/blob - registration/clitkBSplinePyramidGenericFilter.txx
motion masks with and without bands
[clitk.git] / registration / clitkBSplinePyramidGenericFilter.txx
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 clitkBSplinePyramidGenericFilter_txx
19 #define clitkBSplinePyramidGenericFilter_txx
20
21 /* =================================================
22  * @file   clitkBSplinePyramidGenericFilter.txx
23  * @author 
24  * @date   
25  * 
26  * @brief 
27  * 
28  ===================================================*/
29
30
31 namespace clitk
32 {
33
34   //-------------------------------------------------------------------
35   // Update with the number of dimensions
36   //-------------------------------------------------------------------
37   template<unsigned int Dimension>
38   void 
39   BSplinePyramidGenericFilter::UpdateWithDim(std::string PixelType, unsigned int Components)
40   {
41     if (m_Verbose) std::cout << "Image was detected to be "<<Dimension<<"D and "<<Components<<" component(s) of "<<  PixelType<<"..."<<std::endl;
42     
43     if (Components==1)
44       {
45         if(PixelType == "short"){  
46           if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed short..." << std::endl;
47           UpdateWithDimAndPixelType<Dimension, signed short>(); 
48         }
49         //    else if(PixelType == "unsigned_short"){  
50         //       if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and unsigned_short..." << std::endl;
51         //       UpdateWithDimAndPixelType<Dimension, unsigned short>(); 
52         //     }
53         
54         else if (PixelType == "unsigned_char"){ 
55           if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and unsigned_char..." << std::endl;
56           UpdateWithDimAndPixelType<Dimension, unsigned char>();
57         }
58         
59         //     else if (PixelType == "char"){ 
60         //       if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and signed_char..." << std::endl;
61         //       UpdateWithDimAndPixelType<Dimension, signed char>();
62         //     }
63         else {
64           if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and float..." << std::endl;
65           UpdateWithDimAndPixelType<Dimension, float>();
66         }
67       }
68     else if (Components==3)
69       {
70         if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and 3D float (DVF)" << std::endl;
71         UpdateWithDimAndVectorType<Dimension, itk::Vector<float, 3> >();
72       }
73     else std::cerr<<"Number of components is "<<Components<<", not supported!"<<std::endl;
74     
75   }
76
77
78
79   //-------------------------------------------------------------------
80   // Update with the number of dimensions and the pixeltype
81   //-------------------------------------------------------------------
82   template <unsigned int Dimension, class  PixelType> 
83   void 
84   BSplinePyramidGenericFilter::UpdateWithDimAndPixelType()
85   {
86
87     // ImageTypes
88     typedef itk::Image<PixelType, Dimension> InputImageType;
89     typedef itk::Image<PixelType, Dimension> OutputImageType;
90     
91     // Read the input
92     typedef itk::ImageFileReader<InputImageType> InputReaderType;
93     typename InputReaderType::Pointer reader = InputReaderType::New();
94     reader->SetFileName( m_InputFileName);
95     reader->Update();
96     typename InputImageType::Pointer input= reader->GetOutput();
97
98     // Resampler Types
99     typedef itk::BSplineResampleImageFilterBase<InputImageType, InputImageType> ResamplerType;
100     typedef itk::BSplineCenteredResampleImageFilterBase<InputImageType, InputImageType> CenteredResamplerType;
101     typedef itk::BSplineL2ResampleImageFilterBase<InputImageType, InputImageType> L2ResamplerType;
102     typedef itk::BSplineCenteredL2ResampleImageFilterBase<InputImageType, InputImageType> CenteredL2ResamplerType;
103     
104     // Filter
105     typedef itk::ImageToImageFilter< InputImageType, InputImageType > ImageToImageFilterType;
106     typename  ImageToImageFilterType::Pointer filter;
107
108     if (!m_ArgsInfo.up_flag)
109       {
110         switch (m_ArgsInfo.resamplerType_arg)
111           {
112             
113             // Resampler
114           case 0: {
115             typename itk::BSplineDownsampleImageFilter< InputImageType,InputImageType, ResamplerType >::Pointer df 
116               = itk::BSplineDownsampleImageFilter< InputImageType,InputImageType, ResamplerType >::New();
117             df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);
118             filter=df;
119             if (m_Verbose) std::cout<<"Using the BSpline downsample image filter with standard Resampler"<<std::endl;
120             break;
121           }
122             
123             //CenteredResamplerType
124           case 1: {
125             typename itk::BSplineDownsampleImageFilter< InputImageType,InputImageType, CenteredResamplerType >::Pointer df 
126               = itk::BSplineDownsampleImageFilter< InputImageType,InputImageType, CenteredResamplerType >::New();
127             df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);
128             filter=df;
129             if (m_Verbose) std::cout<<"Using the BSpline downsample image filter with centered Resampler"<<std::endl;
130             break;
131           }
132           
133             //L2ResamplerType
134           case 2:
135             {
136               typename itk::BSplineDownsampleImageFilter< InputImageType,InputImageType, L2ResamplerType >::Pointer df 
137                 = itk::BSplineDownsampleImageFilter< InputImageType,InputImageType,L2ResamplerType >::New();
138               df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);   
139               filter=df;
140               if (m_Verbose) std::cout<<"Using the BSpline downsample image filter with L2 Resampler"<<std::endl;
141               break;
142             }
143           
144             //Centered L2ResamplerType
145           case 3:
146             {
147               typename itk::BSplineDownsampleImageFilter< InputImageType,InputImageType, CenteredL2ResamplerType >::Pointer df 
148                 = itk::BSplineDownsampleImageFilter< InputImageType,InputImageType,CenteredL2ResamplerType >::New();
149               df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);
150               filter=df;
151               if (m_Verbose) std::cout<<"Using the BSpline downsample image filter with L2 centered Resampler"<<std::endl;
152               break;
153             }
154
155           }
156       }
157     else
158       {
159         switch (m_ArgsInfo.resamplerType_arg)
160           {
161             
162             // Resampler
163           case 0: {
164             typename itk::BSplineUpsampleImageFilter< InputImageType,InputImageType, ResamplerType >::Pointer df 
165               = itk::BSplineUpsampleImageFilter< InputImageType,InputImageType, ResamplerType >::New();
166             df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);
167             filter=df;
168             if (m_Verbose) std::cout<<"Using the BSpline upsample image filter with standard Resampler"<<std::endl;
169             break;
170           }
171             
172             //CenteredResamplerType
173           case 1: {
174             typename itk::BSplineUpsampleImageFilter< InputImageType,InputImageType, CenteredResamplerType >::Pointer df 
175               = itk::BSplineUpsampleImageFilter< InputImageType,InputImageType, CenteredResamplerType >::New();
176             df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);
177             filter=df;
178             if (m_Verbose) std::cout<<"Using the BSpline upsample image filter with centered Resampler"<<std::endl;
179             break;
180           }
181           
182             //L2ResamplerType
183           case 2:
184             {
185               typename itk::BSplineUpsampleImageFilter< InputImageType,InputImageType, L2ResamplerType >::Pointer df 
186                 = itk::BSplineUpsampleImageFilter< InputImageType,InputImageType,L2ResamplerType >::New();
187               df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);   
188               filter=df;
189               if (m_Verbose) std::cout<<"Using the BSpline upsample image filter with L2 Resampler"<<std::endl;
190               break;
191             }
192           
193             //Centered L2ResamplerType
194           case 3:
195             {
196               typename itk::BSplineUpsampleImageFilter< InputImageType,InputImageType, CenteredL2ResamplerType >::Pointer df 
197                 = itk::BSplineUpsampleImageFilter< InputImageType,InputImageType,CenteredL2ResamplerType >::New();
198               df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);
199               filter=df;
200               if (m_Verbose) std::cout<<"Using the BSpline upsample image filter with L2 centered Resampler"<<std::endl;
201               break;
202             }
203
204           }
205       }
206
207
208     // Update
209     filter->SetInput(input);
210     filter->Update();
211     typename OutputImageType::Pointer output=filter->GetOutput();
212           
213     // Output
214     typedef itk::ImageFileWriter<OutputImageType> WriterType;
215     typename WriterType::Pointer writer = WriterType::New();
216     writer->SetFileName(m_ArgsInfo.output_arg);
217     writer->SetInput(output);
218     writer->Update();
219
220   }
221   
222
223   //-------------------------------------------------------------------
224   // Update with the number of dimensions and the pixeltype
225   //-------------------------------------------------------------------
226   template <unsigned int Dimension, class  VectorType> 
227   void 
228   BSplinePyramidGenericFilter::UpdateWithDimAndVectorType()
229   {
230
231     // ImageTypes
232     typedef typename VectorType::ValueType PixelType;
233     typedef itk::Image<VectorType, Dimension> VectorInputImageType;
234     typedef itk::Image<PixelType, Dimension> InputImageType;
235     typedef itk::Image<PixelType, Dimension> OutputImageType;
236     typedef itk::Image<VectorType, Dimension> VectorOutputImageType;
237     
238     // Read the input
239     typedef itk::ImageFileReader<VectorInputImageType> InputReaderType;
240     typename InputReaderType::Pointer reader = InputReaderType::New();
241     reader->SetFileName( m_InputFileName);
242     reader->Update();
243     typename VectorInputImageType::Pointer vectorInput= reader->GetOutput();
244
245     // Process components separetely and gather afterwards
246     std::vector<typename OutputImageType::Pointer> components;
247
248     for (unsigned int i=0; i<3;i++)
249       {
250         // Extract component
251         typedef clitk::VectorImageToImageFilter<VectorInputImageType, OutputImageType> FilterType;
252         typename FilterType::Pointer dfilter=FilterType::New();
253         dfilter->SetInput(vectorInput);
254         dfilter->SetComponentIndex(i);
255         dfilter->Update();
256         typename InputImageType::Pointer input=dfilter->GetOutput();
257
258         //============================================================================================
259         // Resampler Types
260         typedef itk::BSplineResampleImageFilterBase<InputImageType, InputImageType> ResamplerType;
261         typedef itk::BSplineCenteredResampleImageFilterBase<InputImageType, InputImageType> CenteredResamplerType;
262         typedef itk::BSplineL2ResampleImageFilterBase<InputImageType, InputImageType> L2ResamplerType;
263         typedef itk::BSplineCenteredL2ResampleImageFilterBase<InputImageType, InputImageType> CenteredL2ResamplerType;
264         
265         // Filter
266         typedef itk::ImageToImageFilter< InputImageType, InputImageType > ImageToImageFilterType;
267         typename  ImageToImageFilterType::Pointer filter;
268         
269         if (!m_ArgsInfo.up_flag)
270           {
271             switch (m_ArgsInfo.resamplerType_arg)
272               {
273                 
274                 // Resampler
275               case 0: {
276                 typename itk::BSplineDownsampleImageFilter< InputImageType,InputImageType, ResamplerType >::Pointer df 
277                   = itk::BSplineDownsampleImageFilter< InputImageType,InputImageType, ResamplerType >::New();
278                 df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);
279                 filter=df;
280                 if (m_Verbose) std::cout<<"Using the BSpline downsample image filter with standard Resampler"<<std::endl;
281                 break;
282               }
283             
284                 //CenteredResamplerType
285               case 1: {
286                 typename itk::BSplineDownsampleImageFilter< InputImageType,InputImageType, CenteredResamplerType >::Pointer df 
287                   = itk::BSplineDownsampleImageFilter< InputImageType,InputImageType, CenteredResamplerType >::New();
288                 df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);
289                 filter=df;
290                 if (m_Verbose) std::cout<<"Using the BSpline downsample image filter with centered Resampler"<<std::endl;
291                 break;
292               }
293           
294                 //L2ResamplerType
295               case 2:
296                 {
297                   typename itk::BSplineDownsampleImageFilter< InputImageType,InputImageType, L2ResamplerType >::Pointer df 
298                     = itk::BSplineDownsampleImageFilter< InputImageType,InputImageType,L2ResamplerType >::New();
299                   df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);       
300                   filter=df;
301                   if (m_Verbose) std::cout<<"Using the BSpline downsample image filter with L2 Resampler"<<std::endl;
302                   break;
303                 }
304           
305                 //Centered L2ResamplerType
306               case 3:
307                 {
308                   typename itk::BSplineDownsampleImageFilter< InputImageType,InputImageType, CenteredL2ResamplerType >::Pointer df 
309                     = itk::BSplineDownsampleImageFilter< InputImageType,InputImageType,CenteredL2ResamplerType >::New();
310                   df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);
311                   filter=df;
312                   if (m_Verbose) std::cout<<"Using the BSpline downsample image filter with L2 centered Resampler"<<std::endl;
313                   break;
314                 }
315
316               }
317           }
318         else
319           {
320             switch (m_ArgsInfo.resamplerType_arg)
321               {
322             
323                 // Resampler
324               case 0: {
325                 typename itk::BSplineUpsampleImageFilter< InputImageType,InputImageType, ResamplerType >::Pointer df 
326                   = itk::BSplineUpsampleImageFilter< InputImageType,InputImageType, ResamplerType >::New();
327                 df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);
328                 filter=df;
329                 if (m_Verbose) std::cout<<"Using the BSpline upsample image filter with standard Resampler"<<std::endl;
330                 break;
331               }
332             
333                 //CenteredResamplerType
334               case 1: {
335                 typename itk::BSplineUpsampleImageFilter< InputImageType,InputImageType, CenteredResamplerType >::Pointer df 
336                   = itk::BSplineUpsampleImageFilter< InputImageType,InputImageType, CenteredResamplerType >::New();
337                 df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);
338                 filter=df;
339                 if (m_Verbose) std::cout<<"Using the BSpline upsample image filter with centered Resampler"<<std::endl;
340                 break;
341               }
342           
343                 //L2ResamplerType
344               case 2:
345                 {
346                   typename itk::BSplineUpsampleImageFilter< InputImageType,InputImageType, L2ResamplerType >::Pointer df 
347                     = itk::BSplineUpsampleImageFilter< InputImageType,InputImageType,L2ResamplerType >::New();
348                   df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);       
349                   filter=df;
350                   if (m_Verbose) std::cout<<"Using the BSpline upsample image filter with L2 Resampler"<<std::endl;
351                   break;
352                 }
353           
354                 //Centered L2ResamplerType
355               case 3:
356                 {
357                   typename itk::BSplineUpsampleImageFilter< InputImageType,InputImageType, CenteredL2ResamplerType >::Pointer df 
358                     = itk::BSplineUpsampleImageFilter< InputImageType,InputImageType,CenteredL2ResamplerType >::New();
359                   df->SetSplineOrder(m_ArgsInfo.splineOrder_arg);
360                   filter=df;
361                   if (m_Verbose) std::cout<<"Using the BSpline upsample image filter with L2 centered Resampler"<<std::endl;
362                   break;
363                 }
364
365               }
366           }
367
368         // Update
369         filter->SetInput(input);
370         filter->Update();
371         typename OutputImageType::Pointer output=filter->GetOutput();
372
373         //===============================================================================
374         // keep component
375         components.push_back(output);
376       }
377     
378     // Join
379     typedef itk::Compose3DVectorImageFilter<InputImageType,VectorOutputImageType> ComposeFilterType;
380     typename ComposeFilterType::Pointer composeFilter=ComposeFilterType::New();
381     for (unsigned int i=0; i<3;i++)
382       composeFilter->SetInput(i,components[i]);
383     composeFilter->Update();
384     typename VectorOutputImageType::Pointer vectorOutput = composeFilter->GetOutput();
385
386           
387     // Output
388     typedef itk::ImageFileWriter<VectorOutputImageType> WriterType;
389     typename WriterType::Pointer writer = WriterType::New();
390     writer->SetFileName(m_ArgsInfo.output_arg);
391     writer->SetInput(vectorOutput);
392     writer->Update();
393
394   }
395   
396 }//end clitk
397  
398 #endif //#define clitkBSplinePyramidGenericFilter_txx