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 clitkConvertBSplineDeformableTransformToVFGenericFilter_cxx
19 #define clitkConvertBSplineDeformableTransformToVFGenericFilter_cxx
21 /* =================================================
22 * @file clitkConvertBSplineDeformableTransformToVFGenericFilter.cxx
28 ===================================================*/
30 #include "clitkConvertBSplineDeformableTransformToVFGenericFilter.h"
37 //-----------------------------------------------------------
39 //-----------------------------------------------------------
40 ConvertBSplineDeformableTransformToVFGenericFilter::ConvertBSplineDeformableTransformToVFGenericFilter()
46 //-------------------------------------------------------------------
47 // Update with the number of dimensions
48 //-------------------------------------------------------------------
51 ConvertBSplineDeformableTransformToVFGenericFilter::UpdateWithDim<3>(std::string PixelType, int Components)
56 std::cerr<<"Number of components is "<<Components<<"! Only 3 components is supported."<<std::endl;
59 if (PixelType != "double")
61 std::cerr<<"PixelType is "<<PixelType<<"! Only double coefficient images are supported."<<std::endl;
62 std::cerr<<"Reading image as double..."<<std::endl;
66 const unsigned int Dimension=3;
67 typedef itk::Vector<double, Dimension> InputPixelType;
68 typedef itk::Vector<float, Dimension> OutputPixelType;
69 typedef itk::Image<InputPixelType, Dimension> InputImageType;
70 typedef itk::Image<OutputPixelType, Dimension> OutputImageType;
73 typedef itk::ImageFileReader<InputImageType> InputReaderType;
74 InputReaderType::Pointer reader = InputReaderType::New();
75 reader->SetFileName( m_InputFileName);
77 InputImageType::Pointer input= reader->GetOutput();
80 // -----------------------------------------------
82 // -----------------------------------------------
83 #if ITK_VERSION_MAJOR >= 4
84 typedef itk::TransformToDisplacementFieldSource<OutputImageType, double> ConvertorType;
86 typedef itk::TransformToDeformationFieldSource<OutputImageType, double> ConvertorType;
88 ConvertorType::Pointer filter= ConvertorType::New();
91 if (m_ArgsInfo.like_given)
93 typedef itk::ImageFileReader<OutputImageType> ReaderType;
94 ReaderType::Pointer reader2=ReaderType::New();
95 reader2->SetFileName(m_ArgsInfo.like_arg);
98 OutputImageType::Pointer image=reader2->GetOutput();
99 filter->SetOutputParametersFromImage(image);
104 if(m_ArgsInfo.origin_given)
106 OutputImageType::PointType origin;
107 for(i=0;i<Dimension;i++)
108 origin[i]=m_ArgsInfo.origin_arg[i];
109 filter->SetOutputOrigin(origin);
111 if (m_ArgsInfo.spacing_given)
113 OutputImageType::SpacingType spacing;
114 for(i=0;i<Dimension;i++)
115 spacing[i]=m_ArgsInfo.spacing_arg[i];
116 filter->SetOutputSpacing(spacing);
118 if (m_ArgsInfo.spacing_given)
120 OutputImageType::SizeType size;
121 for(i=0;i<Dimension;i++)
122 size[i]=m_ArgsInfo.size_arg[i];
123 filter->SetOutputSize(size);
129 std::cout<< "Setting output origin to "<<filter->GetOutputOrigin()<<"..."<<std::endl;
130 std::cout<< "Setting output spacing to "<<filter->GetOutputSpacing()<<"..."<<std::endl;
131 std::cout<< "Setting output size to "<<filter->GetOutputSize()<<"..."<<std::endl;
135 // -----------------------------------------------
137 // -----------------------------------------------
138 typedef clitk::BSplineDeformableTransform< double, Dimension, Dimension> TransformType;
139 TransformType::Pointer transform=TransformType::New();
141 // Spline orders: Default is cubic splines
142 InputImageType::RegionType::SizeType splineOrders ;
143 splineOrders.Fill(3);
144 if (m_ArgsInfo.order_given)
145 for(unsigned int i=0; i<Dimension;i++)
146 splineOrders[i]=m_ArgsInfo.order_arg[i];
147 if (m_Verbose) std::cout<<"Setting the spline orders to "<<splineOrders<<"..."<<std::endl;
150 typedef itk::ImageMaskSpatialObject< Dimension > MaskType;
151 MaskType::Pointer spatialObjectMask=NULL;
152 if (m_ArgsInfo.mask_given)
154 typedef itk::Image< unsigned char, Dimension > ImageMaskType;
155 typedef itk::ImageFileReader< ImageMaskType > MaskReaderType;
156 MaskReaderType::Pointer maskReader = MaskReaderType::New();
157 maskReader->SetFileName(m_ArgsInfo.mask_arg);
161 maskReader->Update();
163 catch( itk::ExceptionObject & err )
165 std::cerr << "ExceptionObject caught while reading mask !" << std::endl;
166 std::cerr << err << std::endl;
169 if (m_Verbose)std::cout <<"Mask was read..." <<std::endl;
171 // Set the image to the spatialObject
172 spatialObjectMask = MaskType::New();
173 spatialObjectMask->SetImage( maskReader->GetOutput() );
178 InputImageType::SizeType samplingFactors;
179 for (unsigned int i=0; i< Dimension; i++)
181 samplingFactors[i]= (int) ( input->GetSpacing()[i]/ filter->GetOutputSpacing()[i]);
182 if (m_Verbose) std::cout<<"Setting sampling factor "<<i<<" to "<<samplingFactors[i]<<"..."<<std::endl;
187 transform->SetSplineOrders(splineOrders);
188 transform->SetMask(spatialObjectMask);
189 transform->SetLUTSamplingFactors(samplingFactors);
190 transform->SetCoefficientImage(input);
191 filter->SetTransform(transform);
194 // -----------------------------------------------
196 // -----------------------------------------------
197 if (m_Verbose)std::cout<< "Converting the BSpline transform..."<<std::endl;
202 catch (itk::ExceptionObject)
204 std::cerr<<"Error: Exception thrown during execution convertion filter!"<<std::endl;
207 OutputImageType::Pointer output=filter->GetOutput();
210 // -----------------------------------------------
212 // -----------------------------------------------
213 typedef itk::ImageFileWriter<OutputImageType> WriterType;
214 WriterType::Pointer writer = WriterType::New();
215 writer->SetFileName(m_ArgsInfo.output_arg);
216 writer->SetInput(output);
222 //-------------------------------------------------------------------
223 // Update with the number of dimensions
224 //-------------------------------------------------------------------
227 ConvertBSplineDeformableTransformToVFGenericFilter::UpdateWithDim<4>(std::string PixelType, int Components)
232 std::cerr<<"Number of components is "<<Components<<"! Only 3 components is supported."<<std::endl;
235 if (PixelType != "double")
237 std::cerr<<"PixelType is "<<PixelType<<"! Only double coefficient images are supported."<<std::endl;
238 std::cerr<<"Reading image as double..."<<std::endl;
242 const unsigned int Dimension=4;
243 const unsigned int SpaceDimension=3;
244 typedef itk::Vector<double, SpaceDimension> InputPixelType;
245 typedef itk::Vector<float, SpaceDimension> OutputPixelType;
246 typedef itk::Image<InputPixelType, Dimension> InputImageType;
247 typedef itk::Image<OutputPixelType, Dimension> OutputImageType;
250 typedef itk::ImageFileReader<InputImageType> InputReaderType;
251 InputReaderType::Pointer reader = InputReaderType::New();
252 reader->SetFileName( m_InputFileName);
254 InputImageType::Pointer input= reader->GetOutput();
257 // -----------------------------------------------
259 // -----------------------------------------------
260 typedef clitk::TransformToDeformationFieldSource<OutputImageType, double> ConvertorType;
261 ConvertorType::Pointer filter= ConvertorType::New();
264 if (m_ArgsInfo.like_given)
266 typedef itk::ImageFileReader<OutputImageType> ReaderType;
267 ReaderType::Pointer reader2=ReaderType::New();
268 reader2->SetFileName(m_ArgsInfo.like_arg);
271 OutputImageType::Pointer image=reader2->GetOutput();
272 filter->SetOutputParametersFromImage(image);
277 if(m_ArgsInfo.origin_given)
279 OutputImageType::PointType origin;
280 for(i=0;i<Dimension;i++)
281 origin[i]=m_ArgsInfo.origin_arg[i];
282 filter->SetOutputOrigin(origin);
284 if (m_ArgsInfo.spacing_given)
286 OutputImageType::SpacingType spacing;
287 for(i=0;i<Dimension;i++)
288 spacing[i]=m_ArgsInfo.spacing_arg[i];
289 filter->SetOutputSpacing(spacing);
291 if (m_ArgsInfo.spacing_given)
293 OutputImageType::SizeType size;
294 for(i=0;i<Dimension;i++)
295 size[i]=m_ArgsInfo.size_arg[i];
296 filter->SetOutputSize(size);
302 std::cout<< "Setting output origin to "<<filter->GetOutputOrigin()<<"..."<<std::endl;
303 std::cout<< "Setting output spacing to "<<filter->GetOutputSpacing()<<"..."<<std::endl;
304 std::cout<< "Setting output size to "<<filter->GetOutputSize()<<"..."<<std::endl;
308 // -----------------------------------------------
310 // -----------------------------------------------
311 typedef clitk::ShapedBLUTSpatioTemporalDeformableTransform< double, Dimension, Dimension > TransformType;
312 TransformType::Pointer transform=TransformType::New();
313 transform->SetTransformShape(m_ArgsInfo.shape_arg);
315 // Spline orders: Default is cubic splines
316 InputImageType::RegionType::SizeType splineOrders ;
317 splineOrders.Fill(3);
318 if (m_ArgsInfo.order_given)
319 for(unsigned int i=0; i<Dimension;i++)
320 splineOrders[i]=m_ArgsInfo.order_arg[i];
321 if (m_Verbose) std::cout<<"Setting the spline orders to "<<splineOrders<<"..."<<std::endl;
324 typedef itk::ImageMaskSpatialObject< Dimension > MaskType;
325 MaskType::Pointer spatialObjectMask=NULL;
326 if (m_ArgsInfo.mask_given)
328 typedef itk::Image< unsigned char, Dimension > ImageMaskType;
329 typedef itk::ImageFileReader< ImageMaskType > MaskReaderType;
330 MaskReaderType::Pointer maskReader = MaskReaderType::New();
331 maskReader->SetFileName(m_ArgsInfo.mask_arg);
335 maskReader->Update();
337 catch( itk::ExceptionObject & err )
339 std::cerr << "ExceptionObject caught while reading mask !" << std::endl;
340 std::cerr << err << std::endl;
343 if (m_Verbose)std::cout <<"Mask was read..." <<std::endl;
345 // Set the image to the spatialObject
346 spatialObjectMask = MaskType::New();
347 spatialObjectMask->SetImage( maskReader->GetOutput() );
352 InputImageType::SizeType samplingFactors;
353 for (unsigned int i=0; i< Dimension; i++)
355 samplingFactors[i]= (int) ( input->GetSpacing()[i]/ filter->GetOutputSpacing()[i]);
356 if (m_Verbose) std::cout<<"Setting sampling factor "<<i<<" to "<<samplingFactors[i]<<"..."<<std::endl;
358 if( !(m_ArgsInfo.shape_arg%2) )samplingFactors[Dimension-1]=5;
361 transform->SetSplineOrders(splineOrders);
362 transform->SetMask(spatialObjectMask);
363 transform->SetLUTSamplingFactors(samplingFactors);
364 transform->SetCoefficientImage(input);
365 filter->SetTransform(transform);
368 // -----------------------------------------------
370 // -----------------------------------------------
371 if (m_Verbose)std::cout<< "Converting the BSpline transform..."<<std::endl;
376 catch (itk::ExceptionObject)
378 std::cerr<<"Error: Exception thrown during execution convertion filter!"<<std::endl;
381 OutputImageType::Pointer output=filter->GetOutput();
384 // -----------------------------------------------
386 // -----------------------------------------------
387 typedef itk::ImageFileWriter<OutputImageType> WriterType;
388 WriterType::Pointer writer = WriterType::New();
389 writer->SetFileName(m_ArgsInfo.output_arg);
390 writer->SetInput(output);
397 //-----------------------------------------------------------
399 //-----------------------------------------------------------
400 void ConvertBSplineDeformableTransformToVFGenericFilter::Update()
403 // Read the Dimension and PixelType
404 int Dimension, Components;
405 std::string PixelType;
406 ReadImageDimensionAndPixelType(m_InputFileName, Dimension, PixelType, Components);
408 // Call UpdateWithDim
409 //if(Dimension==2) UpdateWithDim<2>(PixelType, Components);
410 if(Dimension==3) UpdateWithDim<3>(PixelType, Components);
411 else if (Dimension==4) UpdateWithDim<4>(PixelType, Components);
414 std::cout<<"Error, Only for 3 Dimensions!!!"<<std::endl ;
421 #endif //#define clitkConvertBSplineDeformableTransformToVFGenericFilter_cxx