/*========================================================================= 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 clitkPointTrajectoryGenericFilter_cxx #define clitkPointTrajectoryGenericFilter_cxx /* ================================================= * @file clitkPointTrajectoryGenericFilter.cxx * @author * @date * * @brief * ===================================================*/ #include "clitkPointTrajectoryGenericFilter.h" namespace clitk { //----------------------------------------------------------- // Constructor //----------------------------------------------------------- PointTrajectoryGenericFilter::PointTrajectoryGenericFilter() { m_Verbose=false; // m_InputFileName=""; } //----------------------------------------------------------- // Update //----------------------------------------------------------- void PointTrajectoryGenericFilter::Update() { // ImageTypes const unsigned int ImageDimension=4; const unsigned int SpaceDimension=3; typedef itk::Vector CoefficientPixelType; typedef itk::Vector VectorPixelType; typedef itk::Image CoefficientImageType; typedef itk::Image VectorFieldType; // ----------------------------------------------- // Reference Point List 3D // ----------------------------------------------- typedef itk::Point SpacePointType; typedef clitk::List PointListType; PointListType referencePointList; if (m_Verbose) std::cout<<"Reference point list:"< TransformType; TransformType::Pointer transform; switch (m_ArgsInfo.transform_arg) { // ========================== // List of points // ========================== case 0: { //----------------------------- // Input point lists //----------------------------- typedef itk::Point PointType; typedef clitk::List PointListType; typedef clitk::Lists PointListsType; PointListsType inputPointLists, sortedPointLists; // Read the lists for (unsigned int i=0; i PointListTransformType; PointListTransformType::Pointer pointListTransform=PointListTransformType::New(); pointListTransform->SetPointLists(sortedPointLists); // Vector Interpolator typedef PointListTransformType::PointListImageType PointListImageType; typedef clitk::GenericVectorInterpolator GenericVectorInterpolatorType; GenericVectorInterpolatorType::Pointer genericInterpolator=GenericVectorInterpolatorType::New(); genericInterpolator->SetArgsInfo(m_ArgsInfo); typedef itk::VectorInterpolateImageFunction InterpolatorType; InterpolatorType::Pointer interpolator=genericInterpolator->GetInterpolatorPointer(); pointListTransform->SetInterpolator(interpolator); transform=pointListTransform; break; } // ========================== // 4D vector field // ========================== case 1: { // Deformation field transform typedef clitk::DeformationFieldTransform DeformationFieldTransformType; DeformationFieldTransformType::Pointer deformationFieldTransform=DeformationFieldTransformType::New(); // The deformation field typedef DeformationFieldTransformType::DeformationFieldType DeformationFieldType; typedef itk::ImageFileReader InputReaderType; InputReaderType::Pointer reader = InputReaderType::New(); reader->SetFileName( m_ArgsInfo.input_arg); reader->Update(); DeformationFieldType::Pointer input= reader->GetOutput(); deformationFieldTransform->SetDeformationField(input); // Vector Interpolator typedef clitk::GenericVectorInterpolator GenericVectorInterpolatorType; GenericVectorInterpolatorType::Pointer genericInterpolator=GenericVectorInterpolatorType::New(); genericInterpolator->SetArgsInfo(m_ArgsInfo); typedef itk::VectorInterpolateImageFunction InterpolatorType; InterpolatorType::Pointer interpolator=genericInterpolator->GetInterpolatorPointer(); deformationFieldTransform->SetInterpolator(interpolator); transform=deformationFieldTransform; break; } // ========================== // Spatio-Temporal transform // ========================== case 2: { // S-T transform typedef clitk::ShapedBLUTSpatioTemporalDeformableTransform< double, ImageDimension, ImageDimension > TransformType; TransformType::Pointer spatioTemporalTransform = TransformType::New(); // Spline orders: Default is cubic splines CoefficientImageType::RegionType::SizeType splineOrders ; splineOrders.Fill(3); if (m_ArgsInfo.order_given) for(unsigned int i=0; i InputReaderType; InputReaderType::Pointer reader = InputReaderType::New(); reader->SetFileName( m_ArgsInfo.input_arg); reader->Update(); CoefficientImageType::Pointer input= reader->GetOutput(); // itk::Vector vector; // vector.Fill(0.); // vector[2]=100; // input->FillBuffer(vector); // Mask typedef itk::ImageMaskSpatialObject< ImageDimension > MaskType; MaskType::Pointer spatialObjectMask=NULL; if (m_ArgsInfo.mask_given) { typedef itk::Image< unsigned char, ImageDimension > ImageMaskType; typedef itk::ImageFileReader< ImageMaskType > MaskReaderType; MaskReaderType::Pointer maskReader = MaskReaderType::New(); maskReader->SetFileName(m_ArgsInfo.mask_arg); try { maskReader->Update(); } catch( itk::ExceptionObject & err ) { std::cerr << "ExceptionObject caught while reading mask !" << std::endl; std::cerr << err << std::endl; return; } if (m_Verbose)std::cout <<"Mask was read..." <SetImage( maskReader->GetOutput() ); } // Samplingfactors CoefficientImageType::SizeType samplingFactors; for (unsigned int i=0; i< ImageDimension-1; i++) { samplingFactors[i]= (int) ( input->GetSpacing()[i]/ m_ArgsInfo.spacing_arg); if (m_Verbose) std::cout<<"Setting sampling factor "<GetSpacing()[ImageDimension-1]/ m_ArgsInfo.phaseIncrement_arg); if (m_Verbose) std::cout<<"Setting sampling factor "<SetTransformShape(m_ArgsInfo.shape_arg); spatioTemporalTransform->SetSplineOrders(splineOrders); spatioTemporalTransform->SetMask(spatialObjectMask); spatioTemporalTransform->SetLUTSamplingFactors(samplingFactors); spatioTemporalTransform->SetCoefficientImage(input); transform=spatioTemporalTransform; break; } // // ========================== // // Spatio-Temporal transform // // ========================== // case 3: // { // // S-T transform // typedef clitk::BSplineSpatioTemporalDeformableTransform< double, ImageDimension, ImageDimension > TransformType; // TransformType::Pointer spatioTemporalTransform = TransformType::New(); // // Spline orders: Default is cubic splines // CoefficientImageType::RegionType::SizeType splineOrders ; // splineOrders.Fill(3); // if (m_ArgsInfo.order_given) // for(unsigned int i=0; i InputReaderType; // InputReaderType::Pointer reader = InputReaderType::New(); // reader->SetFileName( m_ArgsInfo.input_arg); // reader->Update(); // CoefficientImageType::Pointer input= reader->GetOutput(); // // itk::Vector vector; // // vector.Fill(0.); // // vector[2]=100; // // input->FillBuffer(vector); // // Mask // typedef itk::ImageMaskSpatialObject< ImageDimension > MaskType; // MaskType::Pointer spatialObjectMask=NULL; // if (m_ArgsInfo.mask_given) // { // typedef itk::Image< unsigned char, ImageDimension > ImageMaskType; // typedef itk::ImageFileReader< ImageMaskType > MaskReaderType; // MaskReaderType::Pointer maskReader = MaskReaderType::New(); // maskReader->SetFileName(m_ArgsInfo.mask_arg); // try // { // maskReader->Update(); // } // catch( itk::ExceptionObject & err ) // { // std::cerr << "ExceptionObject caught while reading mask !" << std::endl; // std::cerr << err << std::endl; // return; // } // if (m_Verbose)std::cout <<"Mask was read..." <SetImage( maskReader->GetOutput() ); // } // // Samplingfactors // CoefficientImageType::SizeType samplingFactors; // for (unsigned int i=0; i< ImageDimension-1; i++) // { // samplingFactors[i]= (int) ( input->GetSpacing()[i]/ m_ArgsInfo.spacing_arg); // if (m_Verbose) std::cout<<"Setting sampling factor "<GetSpacing()[ImageDimension-1]/ m_ArgsInfo.phaseIncrement_arg); // if (m_Verbose) std::cout<<"Setting sampling factor "<SetTransformShape(m_ArgsInfo.shape_arg); // spatioTemporalTransform->SetSplineOrders(splineOrders); // spatioTemporalTransform->SetMask(spatialObjectMask); // spatioTemporalTransform->SetLUTSamplingFactors(samplingFactors); // spatioTemporalTransform->SetCoefficientImage(input); // transform=spatioTemporalTransform; // break; // } } // ----------------------------------------------- // Construct Spatio-Temporal Point lists 4D // ----------------------------------------------- typedef itk::Point SpaceTimePointType; typedef clitk::Lists PointListsType; PointListsType pointLists(referencePointList.size()); SpaceTimePointType spaceTimePoint; double phase; for (unsigned int i=0; i VectorType; typedef clitk::List VectorListType; typedef clitk::Lists VectorListsType; VectorListsType displacementLists(pointLists.size()); VectorType displacement; for (unsigned int i=0; iTransformPoint(pointLists[i][j]); if (m_Verbose) std::cout<<"Transformed point "< filenames; for (unsigned int i=0;i