2 #include "clitkConvertBLUTCoeffsToVFFilter.h"
3 #include "clitkBSplineDeformableTransform.h"
4 //#include "clitkTransformToDeformationFieldSource.h"
5 //#include "clitkShapedBLUTSpatioTemporalDeformableTransform.h"
6 #include "itkImageMaskSpatialObject.h"
8 //#include "clitkConvertBSplineDeformableTransformToVFGenericFilter.h"
9 #include "clitkVectorImageToImageFilter.h"
10 #if ITK_VERSION_MAJOR >= 4
11 #include "itkTransformToDisplacementFieldSource.h"
13 #include "itkTransformToDeformationFieldSource.h"
15 #include "itkBSplineDeformableTransform.h"
19 template <class TDVFType>
20 ConvertBLUTCoeffsToVFFilter<TDVFType>::ConvertBLUTCoeffsToVFFilter()
24 m_OutputOrigin.Fill(0);
25 m_OutputSpacing.Fill(1);
27 m_BLUTSplineOrders.Fill(3);
29 m_Filter = ConvertorType::New();
30 m_BLUTTransform = BLUTTransformType::New();
31 m_ITKTransform = ITKTransformType::New();
34 template <class TDVFType>
35 void ConvertBLUTCoeffsToVFFilter<TDVFType>::GenerateOutputInformation()
38 std::cout << "ConvertBLUTCoeffsToVFFilter<TDVFType>::GenerateOutputInformation()" << std::endl;
40 Superclass::GenerateOutputInformation();
41 OutputImagePointer output = this->GetOutput();
42 if (!m_LikeFileName.empty())
44 typename LikeImageType::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(m_LikeFileName.c_str(), itk::ImageIOFactory::ReadMode);
45 imageIO->SetFileName(m_LikeFileName.c_str());
46 imageIO->ReadImageInformation();
48 typename ConvertorType::SizeType output_size;
49 typename ConvertorType::SpacingType output_spacing;
50 typename ConvertorType::OriginType output_origin;
51 typename ConvertorType::DirectionType output_direction;
52 for (unsigned int i = 0; i < OutputImageType::ImageDimension; i++) {
53 output_size[i] = imageIO->GetDimensions(i);
54 output_spacing[i] = imageIO->GetSpacing(i);
55 output_origin[i] = imageIO->GetOrigin(i);
56 //for (unsigned int j = 0; j < Dimension; j++)
57 // output_direction[i][j] = imageIO->GetDirection(i)[j];
61 std::cout << output_origin << output_size << output_spacing << std::endl;
63 output->SetOrigin(output_origin);
64 output->SetSpacing(output_spacing);
65 //output->SetDirection(output_direction);
66 OutputImageRegionType output_region;
67 output_region.SetSize(output_size);
68 output->SetRegions(output_region);
73 std::cout << m_OutputOrigin << m_OutputSize << m_OutputSpacing << std::endl;
75 output->SetOrigin(m_OutputOrigin);
76 output->SetSpacing(m_OutputSpacing);
77 OutputImageRegionType output_region;
78 output_region.SetSize(m_OutputSize);
79 output->SetRegions(output_region);
84 template <class TDVFType>
85 void ConvertBLUTCoeffsToVFFilter<TDVFType>::GenerateData()
88 typedef itk::ImageFileReader<BLUTCoefficientImageType> InputReaderType;
89 typename InputReaderType::Pointer reader = InputReaderType::New();
90 reader->SetFileName(m_InputFileName.c_str());
92 typename BLUTCoefficientImageType::Pointer input = reader->GetOutput();
93 OutputImagePointer output = this->GetOutput();
95 if (m_TransformType != 0 ) { // using BLUT
96 // Spline orders: Default is cubic splines
98 std::cout << "Using clitk::BLUT." << std::endl;
99 std::cout << "Setting spline orders and sampling factors." << std::endl;
102 m_BLUTTransform->SetSplineOrders(m_BLUTSplineOrders);
104 typename BLUTCoefficientImageType::SizeType samplingFactors;
105 for (unsigned int i=0; i< OutputImageType::ImageDimension; i++)
107 samplingFactors[i]= (int) ( input->GetSpacing()[i]/ output->GetSpacing()[i]);
108 if (m_Verbose) std::cout<<"Setting sampling factor "<<i<<" to "<<samplingFactors[i]<<"..."<<std::endl;
110 m_BLUTTransform->SetLUTSamplingFactors(samplingFactors);
111 m_BLUTTransform->SetCoefficientImage(input);
114 typedef itk::ImageMaskSpatialObject<BLUTCoefficientImageType::ImageDimension > MaskType;
115 typename MaskType::Pointer spatialObjectMask=NULL;
116 if (!m_MaskFileName.empty())
118 typedef itk::Image< unsigned char, BLUTCoefficientImageType::ImageDimension > ImageMaskType;
119 typedef itk::ImageFileReader< ImageMaskType > MaskReaderType;
120 typename MaskReaderType::Pointer maskReader = MaskReaderType::New();
121 maskReader->SetFileName(m_MaskFileName.c_str());
125 maskReader->Update();
127 catch ( itk::ExceptionObject & err )
129 std::cerr << "ExceptionObject caught while reading mask !" << std::endl;
130 std::cerr << err << std::endl;
133 if (m_Verbose)std::cout <<"Mask was read..." <<std::endl;
135 // Set the image to the spatialObject
136 spatialObjectMask = MaskType::New();
137 spatialObjectMask->SetImage( maskReader->GetOutput() );
138 m_BLUTTransform->SetMask(spatialObjectMask);
141 m_GenericTransform = m_BLUTTransform;
143 else { // using ITK transform
145 std::cout << "Using itk::BSpline" << std::endl;
146 std::cout << "Extracting components from input coefficient image and creating one coefficient image per-component" << std::endl;
149 typedef clitk::VectorImageToImageFilter<BLUTCoefficientImageType, typename ITKTransformType::ImageType> FilterType;
150 typename FilterType::Pointer component_filter[BLUTCoefficientImageType::ImageDimension];
152 #if ITK_VERSION_MAJOR >= 4
153 typename ITKTransformType::CoefficientImageArray coefficient_images;
155 typename ITKTransformType::ImagePointer coefficient_images[BLUTCoefficientImageType::ImageDimension];
158 for (unsigned int i=0; i < BLUTCoefficientImageType::ImageDimension; i++) {
159 component_filter[i] = FilterType::New();
160 component_filter[i]->SetInput(input);
161 component_filter[i]->SetComponentIndex(i);
162 component_filter[i]->Update();
163 coefficient_images[i] = component_filter[i]->GetOutput();
165 #if ITK_VERSION_MAJOR >= 4
166 m_ITKTransform->SetCoefficientImages(coefficient_images);
168 m_ITKTransform->SetCoefficientImage(coefficient_images);
171 m_GenericTransform = m_ITKTransform;
174 m_Filter->SetOutputOrigin(output->GetOrigin());
175 m_Filter->SetOutputSpacing(output->GetSpacing());
176 m_Filter->SetOutputSize(output->GetLargestPossibleRegion().GetSize());
177 m_Filter->SetTransform(m_GenericTransform);
181 this->SetNthOutput(0, m_Filter->GetOutput());