]> Creatis software - clitk.git/blob - tools/clitkComposeVFGenericFilter.txx
VF composition with BSpline coefficients
[clitk.git] / tools / clitkComposeVFGenericFilter.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 __clitkComposeVFGenericFilter_txx
19 #define __clitkComposeVFGenericFilter_txx
20 #include "clitkComposeVFGenericFilter.h"
21
22 #include "clitkBSplineDeformableTransform.h"
23 #include "clitkBSplineDeformableTransformInitializer.h"
24 #if ITK_VERSION_MAJOR >= 4
25 #include "itkTransformToDisplacementFieldSource.h"
26 #else
27 #include "itkTransformToDeformationFieldSource.h"
28 #endif
29
30 namespace clitk
31 {
32
33   template<unsigned int Dimension>
34   void ComposeVFGenericFilter::UpdateWithDim(std::string PixelType)
35   {
36     if (PixelType=="double")
37       {
38         UpdateWithDimAndPixelType<Dimension, double>();
39       }     
40     else
41       {
42         UpdateWithDimAndPixelType<Dimension, float>();
43       }
44   }
45
46   template<class DisplacementFieldType>
47   typename DisplacementFieldType::Pointer ComposeVFGenericFilter::CoeffsToDVF(std::string fileName, std::string likeFileName)
48   {
49     typedef clitk::BSplineDeformableTransform<double, DisplacementFieldType::ImageDimension, DisplacementFieldType::ImageDimension> TransformType;
50     typedef typename TransformType::CoefficientImageType CoefficientImageType;
51
52     typedef itk::ImageFileReader<CoefficientImageType> CoeffReaderType;
53     typename CoeffReaderType::Pointer reader = CoeffReaderType::New();
54     reader->SetFileName(fileName);
55     reader->Update();
56
57     typename TransformType::Pointer transform = TransformType::New();
58     transform->SetCoefficientImage(reader->GetOutput());
59     
60 #if ITK_VERSION_MAJOR >= 4
61         typedef itk::TransformToDisplacementFieldSource<DisplacementFieldType, double> ConvertorType;
62 #else
63         typedef itk::TransformToDeformationFieldSource<DisplacementFieldType, double> ConvertorType;
64 #endif
65
66     typedef itk::ImageIOBase ImageIOType;
67     typename ImageIOType::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(likeFileName.c_str(), itk::ImageIOFactory::ReadMode);
68     imageIO->SetFileName(likeFileName);
69     imageIO->ReadImageInformation();
70
71     typename ConvertorType::Pointer convertor= ConvertorType::New();
72     typename ConvertorType::SizeType output_size;
73     typename ConvertorType::SpacingType output_spacing;
74     typename ConvertorType::OriginType output_origin;
75     typename ConvertorType::DirectionType output_direction;
76     for (unsigned int i = 0; i < DisplacementFieldType::ImageDimension; i++) {
77       output_size[i] = imageIO->GetDimensions(i);
78       output_spacing[i] = imageIO->GetSpacing(i);
79       output_origin[i] = imageIO->GetOrigin(i);
80       for (unsigned int j = 0; j < DisplacementFieldType::ImageDimension; j++)
81         output_direction[i][j] = imageIO->GetDirection(i)[j];
82     }
83     
84     if (m_Verbose) {
85       std::cout << "Interpolating coefficients with grid:" << std::endl;
86       std::cout << output_size << output_spacing << std::endl;
87     }
88     
89     convertor->SetNumberOfThreads(1);
90     convertor->SetTransform(transform);
91     convertor->SetOutputOrigin(output_origin);
92     convertor->SetOutputSpacing(output_spacing);
93     convertor->SetOutputSize(output_size);
94     convertor->SetOutputDirection(output_direction);
95     convertor->Update();
96
97     return convertor->GetOutput();
98   }
99   
100   template<unsigned int Dimension, class PixelType>
101   void ComposeVFGenericFilter::UpdateWithDimAndPixelType()
102   {
103     typedef itk::Vector<PixelType, Dimension> DisplacementType;
104     typedef itk::Image<DisplacementType, Dimension> ImageType;
105     typename ImageType::Pointer input1, input2;
106
107     //Define the image type
108     if (m_Type == 1) {
109       input1 = this->CoeffsToDVF<ImageType>(m_InputName1, m_LikeImage);
110       input2 = this->CoeffsToDVF<ImageType>(m_InputName2, m_LikeImage);
111     }
112     else {
113       //Read the input1
114       typedef itk::ImageFileReader<ImageType> ImageReaderType;
115       typename  ImageReaderType::Pointer reader1= ImageReaderType::New();
116       reader1->SetFileName(m_InputName1);
117       reader1->Update();
118       input1 =reader1->GetOutput();
119
120       //Read the input2
121       typename  ImageReaderType::Pointer reader2= ImageReaderType::New();
122       reader2->SetFileName(m_InputName2);
123       reader2->Update();
124       input2=reader2->GetOutput();
125     }
126
127       //Create the ComposeVFFilter
128       typedef clitk::ComposeVFFilter<ImageType,ImageType> FilterType;
129       typename FilterType::Pointer filter =FilterType::New();
130       filter->SetInput1(input1);
131       filter->SetInput2(input2);
132       filter->SetVerbose(m_Verbose);
133       filter->Update();
134
135       //Write the output
136       typedef itk::ImageFileWriter<ImageType> WriterType;
137       typename WriterType::Pointer writer = WriterType::New();
138       writer->SetFileName(m_OutputName);
139       writer->SetInput(filter->GetOutput());
140       writer->Update();
141     
142   }
143 }
144
145 #endif