]> Creatis software - clitk.git/blob - common/clitkCoeffsToDVF.h
0fe30bb8c2d85127afc837227e0b1987329e7347
[clitk.git] / common / clitkCoeffsToDVF.h
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 clitkCoeffsToDVF_h
19 #define clitkCoeffsToDVF_h
20
21 #include "clitkBSplineDeformableTransform.h"
22 #if ITK_VERSION_MAJOR >= 4
23 #include "itkTransformToDisplacementFieldSource.h"
24 #else
25 #include "itkTransformToDeformationFieldSource.h"
26 #endif
27
28 //-------------------------------------------------------------------
29 // Convert Coefficient image to DVF
30 //-------------------------------------------------------------------
31 template<class DisplacementFieldType>
32 typename DisplacementFieldType::Pointer
33 CoeffsToDVF(std::string fileName, std::string likeFileName, bool verbose = false)
34 {
35   typedef clitk::BSplineDeformableTransform<double, DisplacementFieldType::ImageDimension, DisplacementFieldType::ImageDimension> TransformType;
36   typedef typename TransformType::CoefficientImageType CoefficientImageType;
37
38   typedef itk::ImageFileReader<CoefficientImageType> CoeffReaderType;
39   typename CoeffReaderType::Pointer reader = CoeffReaderType::New();
40   reader->SetFileName(fileName);
41   reader->Update();
42
43   typename TransformType::Pointer transform = TransformType::New();
44   transform->SetCoefficientImage(reader->GetOutput());
45   
46 #if ITK_VERSION_MAJOR >= 4
47       typedef itk::TransformToDisplacementFieldSource<DisplacementFieldType, double> ConvertorType;
48 #else
49       typedef itk::TransformToDeformationFieldSource<DisplacementFieldType, double> ConvertorType;
50 #endif
51
52   typedef itk::ImageIOBase ImageIOType;
53   typename ImageIOType::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(likeFileName.c_str(), itk::ImageIOFactory::ReadMode);
54   imageIO->SetFileName(likeFileName);
55   imageIO->ReadImageInformation();
56
57   typename ConvertorType::Pointer convertor= ConvertorType::New();
58   typename ConvertorType::SizeType output_size;
59   typename ConvertorType::SpacingType output_spacing;
60   typename ConvertorType::OriginType output_origin;
61   typename ConvertorType::DirectionType output_direction;
62   for (unsigned int i = 0; i < DisplacementFieldType::ImageDimension; i++) {
63     output_size[i] = imageIO->GetDimensions(i);
64     output_spacing[i] = imageIO->GetSpacing(i);
65     output_origin[i] = imageIO->GetOrigin(i);
66     for (unsigned int j = 0; j < DisplacementFieldType::ImageDimension; j++)
67       output_direction[i][j] = imageIO->GetDirection(i)[j];
68   }
69   
70   if (verbose) {
71     std::cout << "Interpolating coefficients with grid:" << std::endl;
72     std::cout << output_size << output_spacing << std::endl;
73   }
74   
75   convertor->SetNumberOfThreads(1);
76   convertor->SetTransform(transform);
77   convertor->SetOutputOrigin(output_origin);
78   convertor->SetOutputSpacing(output_spacing);
79   convertor->SetOutputSize(output_size);
80   convertor->SetOutputDirection(output_direction);
81   convertor->Update();
82
83   return convertor->GetOutput();
84 }
85
86 #endif