X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=itk%2FclitkAddRelativePositionConstraintToLabelImageFilter.txx;h=54f431109728bd8b31b4bdbd8b5d09cc9679e441;hb=8a1ec8f0cfd3c6b4cd29ea5456cbdf598f7f0b06;hp=8e12c225e59852544637c5db492d6b26afb532df;hpb=a24b0a699298efe54b53c53cb215455fecd633fe;p=clitk.git diff --git a/itk/clitkAddRelativePositionConstraintToLabelImageFilter.txx b/itk/clitkAddRelativePositionConstraintToLabelImageFilter.txx index 8e12c22..54f4311 100644 --- a/itk/clitkAddRelativePositionConstraintToLabelImageFilter.txx +++ b/itk/clitkAddRelativePositionConstraintToLabelImageFilter.txx @@ -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 - ======================================================================-====*/ + ===========================================================================**/ // clitk #include "clitkCommon.h" @@ -32,7 +32,11 @@ #include #include #include -#include +#if ITK_VERSION_MAJOR >= 4 + #include +#else + #include +#endif // itk [Bloch et al] #include "RelativePositionPropImageFilter.h" @@ -49,12 +53,14 @@ AddRelativePositionConstraintToLabelImageFilter(): SetBackgroundValue(0); SetObjectBackgroundValue(0); ClearOrientationType(); - ResampleBeforeRelativePositionFilterOn(); + IntermediateSpacingFlagOn(); SetIntermediateSpacing(10); AutoCropFlagOn(); InverseOrientationFlagOff(); RemoveObjectFlagOn(); CombineWithOrFlagOff(); + VerboseStepFlagOff(); + WriteStepFlagOff(); } //-------------------------------------------------------------------- @@ -116,13 +122,20 @@ AddOrientationTypeString(std::string t) { m_OrientationTypeString.push_back(t); switch (t[0]) { - case 'L' : AddOrientationType(LeftTo); break; - case 'R' : AddOrientationType(RightTo);break; + case 'L' : AddOrientationType(AtLeftTo); break; + case 'R' : AddOrientationType(AtRightTo);break; case 'A' : AddOrientationType(AntTo);break; case 'P' : AddOrientationType(PostTo);break; case 'S' : AddOrientationType(SupTo);break; case 'I' : AddOrientationType(InfTo);break; - default: clitkExceptionMacro("Error, you must provide L,R or A,P or S,I"); + case 'N': + if (t == "NotLeftTo") { AddOrientationType(AtLeftTo); InverseOrientationFlagOn(); break; } + if (t == "NotRightTo") { AddOrientationType(AtRightTo); InverseOrientationFlagOn(); break; } + if (t == "NotAntTo") { AddOrientationType(AntTo); InverseOrientationFlagOn(); break; } + if (t == "NotPostTo") { AddOrientationType(PostTo); InverseOrientationFlagOn(); break; } + if (t == "NotSupTo") { AddOrientationType(SupTo); InverseOrientationFlagOn(); break; } + if (t == "NotInfTo") { AddOrientationType(InfTo); InverseOrientationFlagOn(); break; } + default: clitkExceptionMacro("Error, you must provide L,R or A,P or S,I (or NotLeftTo, NotRightTo etc)"); } } //-------------------------------------------------------------------- @@ -179,11 +192,11 @@ AddOrientationType(OrientationTypeEnumeration orientation) { m_OrientationType.push_back(orientation); switch (orientation) { - case LeftTo: + case AtRightTo: m_Angle1.push_back(clitk::deg2rad(0)); m_Angle2.push_back(clitk::deg2rad(0)); break; - case RightTo: + case AtLeftTo: m_Angle1.push_back(clitk::deg2rad(180)); m_Angle2.push_back(clitk::deg2rad(0)); break; @@ -230,83 +243,86 @@ GenerateData() // Get input pointer input = dynamic_cast(itk::ProcessObject::GetInput(0)); object = dynamic_cast(itk::ProcessObject::GetInput(1)); - - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- static const unsigned int dim = ImageType::ImageDimension; - StartNewStep("Initial resample"); - // Step 1 : resample - if (m_ResampleBeforeRelativePositionFilter) { - typedef clitk::ResampleImageWithOptionsFilter ResampleFilterType; - typename ResampleFilterType::Pointer resampleFilter = ResampleFilterType::New(); - resampleFilter->SetInput(object); - resampleFilter->SetOutputIsoSpacing(m_IntermediateSpacing); - resampleFilter->SetGaussianFilteringEnabled(false); - // resampleFilter->SetVerboseOptions(true); - resampleFilter->Update(); - working_image = resampleFilter->GetOutput(); - } - else { - working_image = object; - } - StopCurrentStep(working_image); // Step 2: object pad to input image -> we want to compute the // relative position for each point belonging to the input image // domain, so we have to extend (pad) the object image to fit the // domain size + working_image = object; if (!clitk::HaveSameSizeAndSpacing(input, working_image)) { - StartNewStep("Pad object to image size"); - typename ImageType::Pointer output = ImageType::New(); - SizeType size; - for(unsigned int i=0; iGetLargestPossibleRegion().GetSize()[i]* - input->GetSpacing()[i])/(double)working_image->GetSpacing()[i]); - } + StartNewStep("Pad (resize) object to input size"); + + if (0) { // OLD VERSION (TO REMOVE) + StartNewStep("Pad object to image size"); + typename ImageType::Pointer output = ImageType::New(); + SizeType size; + for(unsigned int i=0; iGetLargestPossibleRegion().GetSize()[i]* + input->GetSpacing()[i])/(double)working_image->GetSpacing()[i]); + } - // The index of the input is not necessarily zero, so we have to - // take it into account (not done) - RegionType region; - IndexType index = input->GetLargestPossibleRegion().GetIndex(); - region.SetSize(size); - for(unsigned int i=0; iGetLargestPossibleRegion().GetIndex(); + region.SetSize(size); + for(unsigned int i=0; iSetLargestPossibleRegion(region); + output->SetRegions(region); + output->SetSpacing(working_image->GetSpacing()); + PointType origin = input->GetOrigin(); + for(unsigned int i=0; iGetSpacing()[i] + input->GetOrigin()[i]; + } + output->SetOrigin(origin); + // output->SetOrigin(input->GetOrigin()); + + output->Allocate(); + output->FillBuffer(m_BackgroundValue); + typename PasteFilterType::Pointer padFilter = PasteFilterType::New(); + // typename PasteFilterType::InputImageIndexType index; + for(unsigned int i=0; iGetSpacing()[i]/(double)working_image->GetSpacing()[i] + + lrint((working_image->GetOrigin()[i] - input->GetOrigin()[i])/working_image->GetSpacing()[i]); + } + padFilter->SetSourceImage(working_image); + padFilter->SetDestinationImage(output); + padFilter->SetDestinationIndex(index); + padFilter->SetSourceRegion(working_image->GetLargestPossibleRegion()); + padFilter->Update(); + working_image = padFilter->GetOutput(); } - // output->SetLargestPossibleRegion(region); - output->SetRegions(region); - output->SetSpacing(working_image->GetSpacing()); - PointType origin = input->GetOrigin(); - for(unsigned int i=0; iGetSpacing()[i] + input->GetOrigin()[i]; - } - output->SetOrigin(origin); - // output->SetOrigin(input->GetOrigin()); - - output->Allocate(); - output->FillBuffer(m_BackgroundValue); - typename PadFilterType::Pointer padFilter = PadFilterType::New(); - // typename PadFilterType::InputImageIndexType index; - for(unsigned int i=0; iGetSpacing()[i]/(double)working_image->GetSpacing()[i] - + lrint((working_image->GetOrigin()[i] - input->GetOrigin()[i])/working_image->GetSpacing()[i]); - } - padFilter->SetSourceImage(working_image); - padFilter->SetDestinationImage(output); - padFilter->SetDestinationIndex(index); - padFilter->SetSourceRegion(working_image->GetLargestPossibleRegion()); - padFilter->Update(); - working_image = padFilter->GetOutput(); + + // Resize object like input + working_image = clitk::ResizeImageLike(working_image, input, GetBackgroundValue()); StopCurrentStep(working_image); } - else { - // DD("[debug] RelPos : same size and spacing : no padding"); + + //-------------------------------------------------------------------- + //-------------------------------------------------------------------- + // Step 1 : resample + if (m_IntermediateSpacingFlag) { + StartNewStep("Resample object to intermediate spacing"); + typedef clitk::ResampleImageWithOptionsFilter ResampleFilterType; + typename ResampleFilterType::Pointer resampleFilter = ResampleFilterType::New(); + resampleFilter->SetInput(working_image); + resampleFilter->SetDefaultPixelValue(0); + resampleFilter->SetOutputIsoSpacing(m_IntermediateSpacing); + resampleFilter->SetGaussianFilteringEnabled(false); + // resampleFilter->SetVerboseOptions(true); + resampleFilter->Update(); + working_image = resampleFilter->GetOutput(); + StopCurrentStep(working_image); } + // Keep object image (with resampline and pad) object_resampled = working_image; - // StopCurrentStep(working_image); // Step 3: compute rel pos in object StartNewStep("Relative Position Map"); @@ -347,10 +363,16 @@ GenerateData() // Divide by the number of relpos if (GetNumberOfAngles() != 1) { +#if ITK_VERSION_MAJOR >= 4 + typedef itk::DivideImageFilter DivideFilter; + typename DivideFilter::Pointer divideFilter = DivideFilter::New(); + divideFilter->SetConstant2(GetNumberOfAngles()); +#else typedef itk::DivideByConstantImageFilter DivideFilter; typename DivideFilter::Pointer divideFilter = DivideFilter::New(); - divideFilter->SetInput(m_FuzzyMap); divideFilter->SetConstant(GetNumberOfAngles()); +#endif + divideFilter->SetInput(m_FuzzyMap); divideFilter->Update(); m_FuzzyMap = divideFilter->GetOutput(); } @@ -394,8 +416,8 @@ GenerateData() //-------------------------------------------------------------------- //-------------------------------------------------------------------- // Step 5: resample to initial spacing - if (m_ResampleBeforeRelativePositionFilter) { - StartNewStep("Resample to get the same sampling than input"); + if (m_IntermediateSpacingFlag) { + StartNewStep("Resample to come back to the same sampling than input"); typedef clitk::ResampleImageWithOptionsFilter ResampleFilterType; typename ResampleFilterType::Pointer resampleFilter = ResampleFilterType::New(); resampleFilter->SetDefaultPixelValue(m_BackgroundValue); @@ -419,10 +441,9 @@ GenerateData() temp->SetRegions(input->GetLargestPossibleRegion()); // Do not forget !! temp->Allocate(); temp->FillBuffer(m_BackgroundValue); - typename PadFilterType::Pointer padFilter2 = PadFilterType::New(); + typename PasteFilterType::Pointer padFilter2 = PasteFilterType::New(); padFilter2->SetSourceImage(working_image); padFilter2->SetDestinationImage(temp); - // DD(input->GetLargestPossibleRegion().GetIndex()); padFilter2->SetDestinationIndex(input->GetLargestPossibleRegion().GetIndex()); padFilter2->SetSourceRegion(working_image->GetLargestPossibleRegion()); padFilter2->Update();