X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkConeBeamProjectImageGenericFilter.cxx;h=d659b969f8e2f48a75eb30ed8724eb1dc72d1ec2;hb=046c745470683943ba4f0e6abd72ed27446d0cc2;hp=2128c8121c832f235c71016e49718098740b7cbb;hpb=a26cd8a19e1b9ad8344ab501436045f171a73713;p=clitk.git diff --git a/tools/clitkConeBeamProjectImageGenericFilter.cxx b/tools/clitkConeBeamProjectImageGenericFilter.cxx old mode 100755 new mode 100644 index 2128c81..d659b96 --- a/tools/clitkConeBeamProjectImageGenericFilter.cxx +++ b/tools/clitkConeBeamProjectImageGenericFilter.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 CLITKCONEBEAMPROJECTIMAGEGENERICFILTER_CXX #define CLITKCONEBEAMPROJECTIMAGEGENERICFILTER_CXX @@ -37,24 +37,8 @@ namespace clitk // Constructor ConeBeamProjectImageGenericFilter::ConeBeamProjectImageGenericFilter() { - m_Verbose=false; m_InputFileName=""; - -// mIsoCenter.resize(3); -// for (unsigned int j=0; j < 3; j++) mIsoCenter[j]=128.; -// mSourceToScreen=1536.; -// mSourceToAxis=1000.; -// mProjectionAngle=0.; - -// // set the rigid transform matrix to the identity -// for (unsigned int i=0; i <4; i++) -// for (unsigned int j=0; j <4; j++) -// if (i==j)mRigidTransformMatrix[i][j]=1.; -// else mRigidTransformMatrix[i][j]=0.; - -// //Padding value -// mEdgePaddingValue=0.0; } //==================================================================== @@ -98,6 +82,117 @@ namespace clitk << " but I can only work on 3D images."); } } + + //================================================================================ + template void ConeBeamProjectImageGenericFilter::UpdateWithPixelType() + { + + //=================================================================== + // Read the input image + const unsigned int InputImageDimension=3; + typedef itk::Image InputImageType; + typedef itk::ImageFileReader ImageReaderType; + typename ImageReaderType::Pointer reader = ImageReaderType::New(); + reader->SetFileName(m_InputFileName); + reader->Update(); + typename InputImageType::Pointer input = reader->GetOutput(); + + // Define the output type + //JV always float? + typedef float OutputPixelType; + const unsigned int OutputImageDimension=2; + typedef itk::Image OutputImageType; + + // Create the ConeBeamProjectImageFilter + typedef clitk::ConeBeamProjectImageFilter ConeBeamProjectImageFilterType; + typename ConeBeamProjectImageFilterType::Pointer filter=ConeBeamProjectImageFilterType::New(); + + // Pass all the necessary parameters + filter->SetInput(input); + filter->SetVerbose(m_Verbose); + if (m_ArgsInfo.threads_given) filter->SetNumberOfThreads(m_ArgsInfo.threads_arg); + + // Projection parameters + typename InputImageType::PointType iso; + unsigned int i; + if (m_ArgsInfo.iso_given) + for(i=0;iSetIsoCenter(iso); + } + filter->SetSourceToScreen(m_ArgsInfo.screen_arg); + filter->SetSourceToAxis(m_ArgsInfo.axis_arg); + filter->SetProjectionAngle(m_ArgsInfo.angle_arg); + if (m_ArgsInfo.matrix_given) + { + itk::Matrix rt =ReadMatrix3D(m_ArgsInfo.matrix_arg); + filter->SetRigidTransformMatrix(rt); + } + filter->SetEdgePaddingValue(static_cast(m_ArgsInfo.pad_arg)); + + DD(m_ArgsInfo.panel_position_arg); + if (m_ArgsInfo.panel_shift_given) // one should read the specific values for each angle in Frame.dbf + filter->SetPanelShift(m_ArgsInfo.panel_shift_arg); + else { // approximate panel positions hard coded values for the elekta synergy + if (strcmp(m_ArgsInfo.panel_position_arg,"small") ==0) + filter->SetPanelShift(0.); + else if (strcmp(m_ArgsInfo.panel_position_arg,"medium") ==0) + filter->SetPanelShift(114.84); + else if (strcmp(m_ArgsInfo.panel_position_arg,"large") ==0) + filter->SetPanelShift(190.); + else assert(false); //Unsupported panel position + } + // Output image info + if (m_ArgsInfo.like_given) + { + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader2=ReaderType::New(); + reader2->SetFileName(m_ArgsInfo.like_arg); + reader2->Update(); + + OutputImageType::Pointer image=reader2->GetOutput(); + filter->SetOutputParametersFromImage(image); + } + else + { + if (m_ArgsInfo.origin_given) + { + OutputImageType::PointType origin; + for(i=0;iSetOutputOrigin(origin); + } + if (m_ArgsInfo.spacing_given) + { + OutputImageType::SpacingType spacing; + for(i=0;iSetOutputSpacing(spacing); + } + if (m_ArgsInfo.size_given) + { + OutputImageType::SizeType size; + for(i=0;iSetOutputSize(size); + } + } + + //Go + filter->Update(); + + //Get the output + OutputImageType::Pointer output=filter->GetOutput(); + + //Write the output + typedef itk::ImageFileWriter OutputWriterType; + OutputWriterType::Pointer outputWriter = OutputWriterType::New(); + outputWriter->SetInput(output); + outputWriter->SetFileName(m_ArgsInfo.output_arg); + if (m_Verbose)std::cout<<"Writing projected image..."<Update(); + } //====================================================================