/*========================================================================= Program: vv http://www.creatis.insa-lyon.fr/rio/vv Authors belong to: - University of LYON http://www.universite-lyon.fr/ - Léon Bérard cancer center http://www.centreleonberard.fr - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the copyright notices for more information. It is distributed under dual licence - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html ===========================================================================**/ #ifndef __clitkShapedBLUTSpatioTemporalDeformableTransformInitializer_txx #define __clitkShapedBLUTSpatioTemporalDeformableTransformInitializer_txx #include "clitkShapedBLUTSpatioTemporalDeformableTransformInitializer.h" namespace clitk { template < class TTransform, class TImage > ShapedBLUTSpatioTemporalDeformableTransformInitializer ::ShapedBLUTSpatioTemporalDeformableTransformInitializer() { this->m_NumberOfControlPointsInsideTheImage.Fill( 5 ); this->m_ControlPointSpacing.Fill(64.); m_ControlPointSpacing[InputDimension-1]=2; this->m_ChosenSpacing.Fill(64.); m_ChosenSpacing[InputDimension-1]=2; m_ControlPointSpacing[InputDimension-1]=2; m_NumberOfControlPointsIsGiven=false; m_ControlPointSpacingIsGiven=false; m_TransformRegionIsGiven=false; m_SamplingFactorIsGiven=false; m_SplineOrders.Fill(3); m_BC1=true; m_BC2=true; m_TrajectoryShape=0; } template < class TTransform, class TImage > void ShapedBLUTSpatioTemporalDeformableTransformInitializer ::InitializeTransform() { // Sanity check: // The image is required for the region and spacing if( ! this->m_Image ) { itkExceptionMacro( "Reference Image has not been set" ); return; } // A pointer to the transform is required if( ! this->m_Transform ) { itkExceptionMacro( "Transform has not been set" ); return; } // If the image come from a filter, then update that filter. if( this->m_Image->GetSource() ) { this->m_Image->GetSource()->Update(); } //-------------------------------------- // Spacing & Size on image //-------------------------------------- SpacingType fixedImageSpacing = m_Image->GetSpacing(); SizeType fixedImageSize=m_Image->GetLargestPossibleRegion().GetSize(); typename RegionType::SizeType gridBorderSize; typename RegionType::SizeType totalGridSize; // Only spacing given: adjust if necessary if (m_ControlPointSpacingIsGiven && !m_NumberOfControlPointsIsGiven) { for(unsigned int r=0; r(m_ChosenSpacing[r]/fixedImageSpacing[r]) *fixedImageSpacing[r] ) ; m_NumberOfControlPointsInsideTheImage[r] = ceil( (double)fixedImageSize[r]*fixedImageSpacing[r]/ m_ControlPointSpacing[r] ); if ( ( ( ceil( (double)fixedImageSize[r]*fixedImageSpacing[r]/ m_ControlPointSpacing[r] ) ) == ( (double)fixedImageSize[r]*fixedImageSpacing[r]/ m_ControlPointSpacing[r] ) ) && (r!= InputDimension-1) ) { m_NumberOfControlPointsInsideTheImage[r] +=1; DD("Adding control point"); } } } // Only number of CP given: adjust if necessary // JV -1 ? else if (!m_ControlPointSpacingIsGiven && m_NumberOfControlPointsIsGiven) { for(unsigned int r=0; rTransformIndexToPhysicalPoint(m_Image->GetLargestPossibleRegion().GetIndex(),fixedImageOrigin); gridDirection = m_Image->GetDirection(); itk::FixedArray orderShift; // Spacing is 2.5 : manually modify the props if( !(m_Transform->GetTransformShape()%2) ) { m_ControlPointSpacing[InputDimension-1]=2.5; m_SamplingFactors[InputDimension-1]=5; totalGridSize[InputDimension-1]-=1; gridRegion.SetSize(totalGridSize); } switch(m_Transform->GetTransformShape()){ // The egg shape case 0: case 1: { if (m_Verbose) std::cout<<"Using the egg shape..."<m_Transform->SetSplineOrders(m_SplineOrders); this->m_Transform->SetGridSpacing( m_ControlPointSpacing ); this->m_Transform->SetGridOrigin( gridOrigin ); this->m_Transform->SetGridDirection( gridDirection ); this->m_Transform->SetGridRegion( gridRegion ); this->m_Transform->SetLUTSamplingFactors(m_SamplingFactors); } template < class TTransform, class TImage > void ShapedBLUTSpatioTemporalDeformableTransformInitializer ::SetInitialParameters( const std::string& s, ParametersType& params) { //--------------------------------------- // Read Initial parameters //--------------------------------------- typedef itk::ImageFileReader CoefficientReaderType; typename CoefficientReaderType::Pointer coeffReader=CoefficientReaderType::New(); coeffReader->SetFileName(s); if(m_Verbose) std::cout<<"Reading initial coefficients from file: "<Update(); typename CoefficientImageType::Pointer coefficientImage=coeffReader->GetOutput(); this->SetInitialParameters(coefficientImage, params); } template < class TTransform, class TImage > void ShapedBLUTSpatioTemporalDeformableTransformInitializer ::SetInitialParameters(const typename CoefficientImageType::Pointer coefficientImage, ParametersType& params) { // Keep a reference m_Parameters=¶ms; // Resample typedef ResampleBSplineDeformableTransformImageFilter ResamplerType; typename ResamplerType::Pointer resampler=ResamplerType::New(); resampler->SetVerbose(m_Verbose); resampler->SetInput(coefficientImage); resampler->SetOutputParametersFromImage(m_Transform->GetCoefficientImage()); if(m_Verbose) std::cout<<"Resampling initial coefficients..."<Update(); // Copy parameters into the existing array, I know its crappy typedef itk::ImageRegionConstIterator Iterator; Iterator it (resampler->GetOutput(), resampler->GetOutput()->GetLargestPossibleRegion() ); it.GoToBegin(); unsigned int i=0; while(! it.IsAtEnd()) { for (unsigned int j=0; jm_Transform->SetParameters(params); } // template < class TTransform, class TImage > // void // ShapedBLUTSpatioTemporalDeformableTransformInitializer // ::SetInitialPaddedParameters( const std::string& s, ParametersType& params) // { // //--------------------------------------- // // Read Initial parameters // //--------------------------------------- // typedef itk::ImageFileReader CoefficientReaderType; // typename CoefficientReaderType::Pointer coeffReader=CoefficientReaderType::New(); // coeffReader->SetFileName(s); // if(m_Verbose) std::cout<<"Reading initial padded coefficients from file: "<Update(); // typename CoefficientImageType::Pointer coefficientImage=coeffReader->GetOutput(); // this->SetInitialPaddedParameters(coefficientImage, params); // } // template < class TTransform, class TImage > // void // ShapedBLUTSpatioTemporalDeformableTransformInitializer // ::SetInitialPaddedParameters(const typename CoefficientImageType::Pointer coefficientImage, ParametersType& params) // { // // Resample // typedef ResampleBSplineSpatioTemporalDeformableTransformImageFilter ResamplerType; // typename ResamplerType::Pointer resampler=ResamplerType::New(); // resampler->SetInput(coefficientImage); // resampler->SetOutputParametersFromImage(m_Transform->GetCoefficientImage()); // if(m_Verbose) std::cout<<"Resampling initial padded coefficients..."<Update(); // // Copy parameters into the existing array, I know its crappy // typedef itk::ImageRegionConstIterator Iterator; // Iterator it (resampler->GetOutput(), resampler->GetOutput()->GetLargestPossibleRegion() ); // it.GoToBegin(); // unsigned int i=0; // while(! it.IsAtEnd()) // { // for (unsigned int j=0; j