X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=registration%2FclitkCalculateTREGenericFilter.cxx;h=adb0d1cc9d89c751f03a4a9c9cb5bd3a7ee69c24;hb=54de2903ffa1d7f444d2a38609de58f8f2ab0d2d;hp=1da773bb2e97ceae7cb572e1e5bdb2f2bc223e78;hpb=657652a78c2e2717a6f77e027049173442ca29f0;p=clitk.git diff --git a/registration/clitkCalculateTREGenericFilter.cxx b/registration/clitkCalculateTREGenericFilter.cxx old mode 100755 new mode 100644 index 1da773b..adb0d1c --- a/registration/clitkCalculateTREGenericFilter.cxx +++ b/registration/clitkCalculateTREGenericFilter.cxx @@ -3,7 +3,7 @@ Authors belong to: - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://oncora1.lyon.fnclcc.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 @@ -14,7 +14,7 @@ - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html -======================================================================-====*/ +===========================================================================**/ #ifndef clitkCalculateTREGenericFilter_cxx #define clitkCalculateTREGenericFilter_cxx @@ -41,6 +41,9 @@ namespace clitk { m_Verbose=false; m_InputFileName=""; + m_NumberOfFields=0; + m_NumberOfLists=0; + m_NumberOfPoints=0; } @@ -50,39 +53,64 @@ namespace clitk void CalculateTREGenericFilter::Update() { // Read the Dimension and PixelType + if (m_ArgsInfo.vf_given && m_ArgsInfo.coeff_given) + { + std::cout << "Error, You have to supply either vector fields or coefficient images. Supplying both is not allowed. See clitkCalculateTRE --help for details."< 4) + { + std::cout<<"Error, Only for 2, 3 or 4 Dimensions!!!"<(); - else if(Dimension==3) ReadVectorFields<3,3>(); - else if (Dimension==4)ReadVectorFields<4,3>(); - else + if (m_ArgsInfo.vf_given) { - std::cout<<"Error, Only for 2, 3 or 4 Dimensions!!!"<(); + else + if(Dimension==3) ReadVectorFields<3,3>(); + else if (Dimension==4)ReadVectorFields<4,3>(); } + else + { + if(Dimension==2) ReadCoefficientImages<2,2>(); + else + if(Dimension==3) ReadCoefficientImages<3,3>(); + else if (Dimension==4)ReadCoefficientImages<4,3>(); + } } - - //----------------------------- // Process DVF //----------------------------- template< > void - CalculateTREGenericFilter::ProcessVectorFields<4,3>(std::vector, 4>::Pointer > dvfs, char** filenames ) + CalculateTREGenericFilter::ProcessVectorFields<4,3>(std::vector, 4>::Pointer > dvfs, char** filenames ) { // Typedefs - typedef itk::Vector PixelType; + typedef itk::Vector PixelType; typedef itk::Image InputImageType; typedef itk::Image OutputImageType; // IO InputImageType::Pointer input=dvfs[0]; - std::vector, 3>::Pointer > new_dvfs; + std::vector, 3>::Pointer > new_dvfs; // Split vector field typedef itk::ExtractImageFilter FilterType; @@ -124,11 +152,69 @@ namespace clitk } // Update - this->UpdateWithDim<3>(new_dvfs, new_filenames); + this->UpdateDVFWithDim<3>(new_dvfs, new_filenames); } + //----------------------------- + // Process Coefficient images + //----------------------------- + template< > + void + CalculateTREGenericFilter::ProcessCoefficientImages<4,3>(std::vector, 4>::Pointer > coeffs, char** filenames ) + { + // Typedefs + typedef itk::Vector PixelType; + typedef itk::Image InputImageType; + typedef itk::Image OutputImageType; + // IO + InputImageType::Pointer input=coeffs[0]; + std::vector, 3>::Pointer > new_coeffs; + + // Split vector field + typedef itk::ExtractImageFilter FilterType; + unsigned int splitDimension=3; + + // Make new file names + std::vector new_filenames; + std::string base = filenames[0]; + + // Set the extract region + InputImageType::SizeType size=input->GetLargestPossibleRegion().GetSize(); + size[splitDimension]=0; + InputImageType::RegionType extracted_region; + extracted_region.SetSize(size); + InputImageType::IndexType index=input->GetLargestPossibleRegion().GetIndex(); + + + // Loop + for (unsigned int i=0;iGetLargestPossibleRegion().GetSize()[splitDimension];i++) + { + + // Skip? + if (m_ArgsInfo.skip_given && i==(unsigned int) m_ArgsInfo.skip_arg) continue; + + // extract dvf + FilterType::Pointer filter= FilterType::New(); + filter->SetInput(input); + index[splitDimension]=i; + extracted_region.SetIndex(index); + filter->SetExtractionRegion(extracted_region); + filter->Update(); + new_coeffs.push_back(filter->GetOutput()); + + // make name + std::ostringstream number_dvf; + number_dvf << i; + std::string number = number_dvf.str(); + new_filenames.push_back(base+"_"+number); + } + + // Update + this->UpdateCoeffsWithDim<3>(new_coeffs, new_filenames); + + }