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 __clitkComposeVFGenericFilter_txx
19 #define __clitkComposeVFGenericFilter_txx
20 #include "clitkComposeVFGenericFilter.h"
22 #include "clitkBSplineDeformableTransform.h"
23 #include "clitkBSplineDeformableTransformInitializer.h"
24 #if ITK_VERSION_MAJOR >= 4
25 #include "itkTransformToDisplacementFieldSource.h"
27 #include "itkTransformToDeformationFieldSource.h"
33 template<unsigned int Dimension>
34 void ComposeVFGenericFilter::UpdateWithDim(std::string PixelType)
36 if (PixelType=="double")
38 UpdateWithDimAndPixelType<Dimension, double>();
42 UpdateWithDimAndPixelType<Dimension, float>();
46 template<class DisplacementFieldType>
47 typename DisplacementFieldType::Pointer ComposeVFGenericFilter::CoeffsToDVF(std::string fileName, std::string likeFileName)
49 typedef clitk::BSplineDeformableTransform<double, DisplacementFieldType::ImageDimension, DisplacementFieldType::ImageDimension> TransformType;
50 typedef typename TransformType::CoefficientImageType CoefficientImageType;
52 typedef itk::ImageFileReader<CoefficientImageType> CoeffReaderType;
53 typename CoeffReaderType::Pointer reader = CoeffReaderType::New();
54 reader->SetFileName(fileName);
57 typename TransformType::Pointer transform = TransformType::New();
58 transform->SetCoefficientImage(reader->GetOutput());
60 #if ITK_VERSION_MAJOR >= 4
61 typedef itk::TransformToDisplacementFieldSource<DisplacementFieldType, double> ConvertorType;
63 typedef itk::TransformToDeformationFieldSource<DisplacementFieldType, double> ConvertorType;
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();
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];
85 std::cout << "Interpolating coefficients with grid:" << std::endl;
86 std::cout << output_size << output_spacing << std::endl;
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);
97 return convertor->GetOutput();
100 template<unsigned int Dimension, class PixelType>
101 void ComposeVFGenericFilter::UpdateWithDimAndPixelType()
103 typedef itk::Vector<PixelType, Dimension> DisplacementType;
104 typedef itk::Image<DisplacementType, Dimension> ImageType;
105 typename ImageType::Pointer input1, input2;
107 //Define the image type
109 input1 = this->CoeffsToDVF<ImageType>(m_InputName1, m_LikeImage);
110 input2 = this->CoeffsToDVF<ImageType>(m_InputName2, m_LikeImage);
114 typedef itk::ImageFileReader<ImageType> ImageReaderType;
115 typename ImageReaderType::Pointer reader1= ImageReaderType::New();
116 reader1->SetFileName(m_InputName1);
118 input1 =reader1->GetOutput();
121 typename ImageReaderType::Pointer reader2= ImageReaderType::New();
122 reader2->SetFileName(m_InputName2);
124 input2=reader2->GetOutput();
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);
136 typedef itk::ImageFileWriter<ImageType> WriterType;
137 typename WriterType::Pointer writer = WriterType::New();
138 writer->SetFileName(m_OutputName);
139 writer->SetInput(filter->GetOutput());