1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
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
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.
13 It is distributed under dual licence
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
21 #include "clitkBSplineDeformableTransform.h"
22 #if ITK_VERSION_MAJOR >= 4
23 #include "itkTransformToDisplacementFieldSource.h"
25 #include "itkTransformToDeformationFieldSource.h"
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)
35 typedef clitk::BSplineDeformableTransform<double, DisplacementFieldType::ImageDimension, DisplacementFieldType::ImageDimension> TransformType;
36 typedef typename TransformType::CoefficientImageType CoefficientImageType;
38 typedef itk::ImageFileReader<CoefficientImageType> CoeffReaderType;
39 typename CoeffReaderType::Pointer reader = CoeffReaderType::New();
40 reader->SetFileName(fileName);
43 typename TransformType::Pointer transform = TransformType::New();
44 transform->SetCoefficientImage(reader->GetOutput());
46 #if ITK_VERSION_MAJOR >= 4
47 typedef itk::TransformToDisplacementFieldSource<DisplacementFieldType, double> ConvertorType;
49 typedef itk::TransformToDeformationFieldSource<DisplacementFieldType, double> ConvertorType;
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();
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];
71 std::cout << "Interpolating coefficients with grid:" << std::endl;
72 std::cout << output_size << output_spacing << std::endl;
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);
83 return convertor->GetOutput();