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://oncora1.lyon.fnclcc.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 typedef itk::TransformToDeformationFieldSource<OutputImageType, double> ConvertorType;
84 ConvertorType::Pointer filter= ConvertorType::New();
87 if (m_ArgsInfo.like_given)
89 typedef itk::ImageFileReader<OutputImageType> ReaderType;
90 ReaderType::Pointer reader2=ReaderType::New();
91 reader2->SetFileName(m_ArgsInfo.like_arg);
94 OutputImageType::Pointer image=reader2->GetOutput();
95 filter->SetOutputParametersFromImage(image);
100 if(m_ArgsInfo.origin_given)
102 OutputImageType::PointType origin;
103 for(i=0;i<Dimension;i++)
104 origin[i]=m_ArgsInfo.origin_arg[i];
105 filter->SetOutputOrigin(origin);
107 if (m_ArgsInfo.spacing_given)
109 OutputImageType::SpacingType spacing;
110 for(i=0;i<Dimension;i++)
111 spacing[i]=m_ArgsInfo.spacing_arg[i];
112 filter->SetOutputSpacing(spacing);
114 if (m_ArgsInfo.spacing_given)
116 OutputImageType::SizeType size;
117 for(i=0;i<Dimension;i++)
118 size[i]=m_ArgsInfo.size_arg[i];
119 filter->SetOutputSize(size);
125 std::cout<< "Setting output origin to "<<filter->GetOutputOrigin()<<"..."<<std::endl;
126 std::cout<< "Setting output spacing to "<<filter->GetOutputSpacing()<<"..."<<std::endl;
127 std::cout<< "Setting output size to "<<filter->GetOutputSize()<<"..."<<std::endl;
131 // -----------------------------------------------
133 // -----------------------------------------------
134 typedef clitk::BSplineDeformableTransform< double, Dimension, Dimension> TransformType;
135 TransformType::Pointer transform=TransformType::New();
137 // Spline orders: Default is cubic splines
138 InputImageType::RegionType::SizeType splineOrders ;
139 splineOrders.Fill(3);
140 if (m_ArgsInfo.order_given)
141 for(unsigned int i=0; i<Dimension;i++)
142 splineOrders[i]=m_ArgsInfo.order_arg[i];
143 if (m_Verbose) std::cout<<"Setting the spline orders to "<<splineOrders<<"..."<<std::endl;
146 typedef itk::ImageMaskSpatialObject< Dimension > MaskType;
147 MaskType::Pointer spatialObjectMask=NULL;
148 if (m_ArgsInfo.mask_given)
150 typedef itk::Image< unsigned char, Dimension > ImageMaskType;
151 typedef itk::ImageFileReader< ImageMaskType > MaskReaderType;
152 MaskReaderType::Pointer maskReader = MaskReaderType::New();
153 maskReader->SetFileName(m_ArgsInfo.mask_arg);
157 maskReader->Update();
159 catch( itk::ExceptionObject & err )
161 std::cerr << "ExceptionObject caught while reading mask !" << std::endl;
162 std::cerr << err << std::endl;
165 if (m_Verbose)std::cout <<"Mask was read..." <<std::endl;
167 // Set the image to the spatialObject
168 spatialObjectMask = MaskType::New();
169 spatialObjectMask->SetImage( maskReader->GetOutput() );
174 InputImageType::SizeType samplingFactors;
175 for (unsigned int i=0; i< Dimension; i++)
177 samplingFactors[i]= (int) ( input->GetSpacing()[i]/ filter->GetOutputSpacing()[i]);
178 if (m_Verbose) std::cout<<"Setting sampling factor "<<i<<" to "<<samplingFactors[i]<<"..."<<std::endl;
183 transform->SetSplineOrders(splineOrders);
184 transform->SetMask(spatialObjectMask);
185 transform->SetLUTSamplingFactors(samplingFactors);
186 transform->SetCoefficientImage(input);
187 filter->SetTransform(transform);
190 // -----------------------------------------------
192 // -----------------------------------------------
193 if (m_Verbose)std::cout<< "Converting the BSpline transform..."<<std::endl;
198 catch (itk::ExceptionObject)
200 std::cerr<<"Error: Exception thrown during execution convertion filter!"<<std::endl;
203 OutputImageType::Pointer output=filter->GetOutput();
206 // -----------------------------------------------
208 // -----------------------------------------------
209 typedef itk::ImageFileWriter<OutputImageType> WriterType;
210 WriterType::Pointer writer = WriterType::New();
211 writer->SetFileName(m_ArgsInfo.output_arg);
212 writer->SetInput(output);
218 //-------------------------------------------------------------------
219 // Update with the number of dimensions
220 //-------------------------------------------------------------------
223 ConvertBSplineDeformableTransformToVFGenericFilter::UpdateWithDim<4>(std::string PixelType, int Components)
228 std::cerr<<"Number of components is "<<Components<<"! Only 3 components is supported."<<std::endl;
231 if (PixelType != "double")
233 std::cerr<<"PixelType is "<<PixelType<<"! Only double coefficient images are supported."<<std::endl;
234 std::cerr<<"Reading image as double..."<<std::endl;
238 const unsigned int Dimension=4;
239 const unsigned int SpaceDimension=3;
240 typedef itk::Vector<double, SpaceDimension> InputPixelType;
241 typedef itk::Vector<float, SpaceDimension> OutputPixelType;
242 typedef itk::Image<InputPixelType, Dimension> InputImageType;
243 typedef itk::Image<OutputPixelType, Dimension> OutputImageType;
246 typedef itk::ImageFileReader<InputImageType> InputReaderType;
247 InputReaderType::Pointer reader = InputReaderType::New();
248 reader->SetFileName( m_InputFileName);
250 InputImageType::Pointer input= reader->GetOutput();
253 // -----------------------------------------------
255 // -----------------------------------------------
256 typedef clitk::TransformToDeformationFieldSource<OutputImageType, double> ConvertorType;
257 ConvertorType::Pointer filter= ConvertorType::New();
260 if (m_ArgsInfo.like_given)
262 typedef itk::ImageFileReader<OutputImageType> ReaderType;
263 ReaderType::Pointer reader2=ReaderType::New();
264 reader2->SetFileName(m_ArgsInfo.like_arg);
267 OutputImageType::Pointer image=reader2->GetOutput();
268 filter->SetOutputParametersFromImage(image);
273 if(m_ArgsInfo.origin_given)
275 OutputImageType::PointType origin;
276 for(i=0;i<Dimension;i++)
277 origin[i]=m_ArgsInfo.origin_arg[i];
278 filter->SetOutputOrigin(origin);
280 if (m_ArgsInfo.spacing_given)
282 OutputImageType::SpacingType spacing;
283 for(i=0;i<Dimension;i++)
284 spacing[i]=m_ArgsInfo.spacing_arg[i];
285 filter->SetOutputSpacing(spacing);
287 if (m_ArgsInfo.spacing_given)
289 OutputImageType::SizeType size;
290 for(i=0;i<Dimension;i++)
291 size[i]=m_ArgsInfo.size_arg[i];
292 filter->SetOutputSize(size);
298 std::cout<< "Setting output origin to "<<filter->GetOutputOrigin()<<"..."<<std::endl;
299 std::cout<< "Setting output spacing to "<<filter->GetOutputSpacing()<<"..."<<std::endl;
300 std::cout<< "Setting output size to "<<filter->GetOutputSize()<<"..."<<std::endl;
304 // -----------------------------------------------
306 // -----------------------------------------------
307 typedef clitk::ShapedBLUTSpatioTemporalDeformableTransform< double, Dimension, Dimension > TransformType;
308 TransformType::Pointer transform=TransformType::New();
309 transform->SetTransformShape(m_ArgsInfo.shape_arg);
311 // Spline orders: Default is cubic splines
312 InputImageType::RegionType::SizeType splineOrders ;
313 splineOrders.Fill(3);
314 if (m_ArgsInfo.order_given)
315 for(unsigned int i=0; i<Dimension;i++)
316 splineOrders[i]=m_ArgsInfo.order_arg[i];
317 if (m_Verbose) std::cout<<"Setting the spline orders to "<<splineOrders<<"..."<<std::endl;
320 typedef itk::ImageMaskSpatialObject< Dimension > MaskType;
321 MaskType::Pointer spatialObjectMask=NULL;
322 if (m_ArgsInfo.mask_given)
324 typedef itk::Image< unsigned char, Dimension > ImageMaskType;
325 typedef itk::ImageFileReader< ImageMaskType > MaskReaderType;
326 MaskReaderType::Pointer maskReader = MaskReaderType::New();
327 maskReader->SetFileName(m_ArgsInfo.mask_arg);
331 maskReader->Update();
333 catch( itk::ExceptionObject & err )
335 std::cerr << "ExceptionObject caught while reading mask !" << std::endl;
336 std::cerr << err << std::endl;
339 if (m_Verbose)std::cout <<"Mask was read..." <<std::endl;
341 // Set the image to the spatialObject
342 spatialObjectMask = MaskType::New();
343 spatialObjectMask->SetImage( maskReader->GetOutput() );
348 InputImageType::SizeType samplingFactors;
349 for (unsigned int i=0; i< Dimension; i++)
351 samplingFactors[i]= (int) ( input->GetSpacing()[i]/ filter->GetOutputSpacing()[i]);
352 if (m_Verbose) std::cout<<"Setting sampling factor "<<i<<" to "<<samplingFactors[i]<<"..."<<std::endl;
354 if( !(m_ArgsInfo.shape_arg%2) )samplingFactors[Dimension-1]=5;
357 transform->SetSplineOrders(splineOrders);
358 transform->SetMask(spatialObjectMask);
359 transform->SetLUTSamplingFactors(samplingFactors);
360 transform->SetCoefficientImage(input);
361 filter->SetTransform(transform);
364 // -----------------------------------------------
366 // -----------------------------------------------
367 if (m_Verbose)std::cout<< "Converting the BSpline transform..."<<std::endl;
372 catch (itk::ExceptionObject)
374 std::cerr<<"Error: Exception thrown during execution convertion filter!"<<std::endl;
377 OutputImageType::Pointer output=filter->GetOutput();
380 // -----------------------------------------------
382 // -----------------------------------------------
383 typedef itk::ImageFileWriter<OutputImageType> WriterType;
384 WriterType::Pointer writer = WriterType::New();
385 writer->SetFileName(m_ArgsInfo.output_arg);
386 writer->SetInput(output);
393 //-----------------------------------------------------------
395 //-----------------------------------------------------------
396 void ConvertBSplineDeformableTransformToVFGenericFilter::Update()
399 // Read the Dimension and PixelType
400 int Dimension, Components;
401 std::string PixelType;
402 ReadImageDimensionAndPixelType(m_InputFileName, Dimension, PixelType, Components);
404 // Call UpdateWithDim
405 //if(Dimension==2) UpdateWithDim<2>(PixelType, Components);
406 if(Dimension==3) UpdateWithDim<3>(PixelType, Components);
407 else if (Dimension==4) UpdateWithDim<4>(PixelType, Components);
410 std::cout<<"Error, Only for 3 Dimensions!!!"<<std::endl ;
417 #endif //#define clitkConvertBSplineDeformableTransformToVFGenericFilter_cxx