X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=itk%2FclitkAddRelativePositionConstraintToLabelImageFilter.txx;h=0e3581ee2eeae844b806e15ecd5a3fabbc620897;hb=8d51bd1cb7e9ca416b46677dcd73ba76d107a587;hp=694910c6490434280661bbbba1d51dfbc96a3bbc;hpb=d8115ca2c9f25daea15a64644e56e005adfb720c;p=clitk.git diff --git a/itk/clitkAddRelativePositionConstraintToLabelImageFilter.txx b/itk/clitkAddRelativePositionConstraintToLabelImageFilter.txx index 694910c..0e3581e 100644 --- a/itk/clitkAddRelativePositionConstraintToLabelImageFilter.txx +++ b/itk/clitkAddRelativePositionConstraintToLabelImageFilter.txx @@ -22,6 +22,7 @@ #include "clitkAutoCropFilter.h" #include "clitkResampleImageWithOptionsFilter.h" #include "clitkBooleanOperatorLabelImageFilter.h" +#include "clitkCropLikeImageFilter.h" // itk #include @@ -32,11 +33,7 @@ #include #include #include -#if ITK_VERSION_MAJOR >= 4 - #include -#else - #include -#endif +#include // itk [Bloch et al] #include "RelativePositionPropImageFilter.h" @@ -61,6 +58,10 @@ AddRelativePositionConstraintToLabelImageFilter(): CombineWithOrFlagOff(); VerboseStepFlagOff(); WriteStepFlagOff(); + FuzzyMapOnlyFlagOff(); + FastFlagOff(); + SetRadius(2.0); + SetK1(std::acos(-1.0)/2); } //-------------------------------------------------------------------- @@ -136,6 +137,8 @@ AddOrientationTypeString(std::string t) if (t == "NotSupTo") { AddOrientationType(SupTo); InverseOrientationFlagOn(); return; } if (t == "NotInfTo") { AddOrientationType(InfTo); InverseOrientationFlagOn(); return; } + if (t == "Angle") return; + clitkExceptionMacro("Error, you must provide LeftTo,RightTo or AntTo,PostTo or SupTo,InfTo (or NotLeftTo, NotRightTo etc) but you give " << t); } //-------------------------------------------------------------------- @@ -175,15 +178,27 @@ GenerateInputRequestedRegion() template void clitk::AddRelativePositionConstraintToLabelImageFilter:: -AddAngles(double a, double b) +AddAnglesInRad(double a, double b) { - AddOrientationTypeString("Angle"); + m_OrientationTypeString.push_back("Angle"); + m_OrientationType.push_back(Angle); m_Angle1.push_back(a); m_Angle2.push_back(b); } //-------------------------------------------------------------------- +//-------------------------------------------------------------------- +template +void +clitk::AddRelativePositionConstraintToLabelImageFilter:: +AddAnglesInDeg(double a, double b) +{ + AddAnglesInRad(clitk::deg2rad(a), clitk::deg2rad(b)); +} +//-------------------------------------------------------------------- + + //-------------------------------------------------------------------- template void @@ -340,14 +355,14 @@ GenerateData() //-------------------------------------------------------------------- // Step 1 : resample if (m_IntermediateSpacingFlag) { - StartNewStep("Resample object to intermediate spacing"); + StartNewStep("Resample object to intermediate spacing (" + toString(m_IntermediateSpacing) + ")"); 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->SetVerboseOptions(true); resampleFilter->Update(); working_image = resampleFilter->GetOutput(); StopCurrentStep(working_image); @@ -361,17 +376,17 @@ GenerateData() typedef itk::RelativePositionPropImageFilter RelPosFilterType; typename RelPosFilterType::Pointer relPosFilter; - typename FloatImageType::Pointer m_FuzzyMap; for(int i=0; iSetFast(GetFastFlag()); + relPosFilter->SetRadius(GetRadius()); relPosFilter->SetInput(working_image); relPosFilter->SetAlpha1(m_Angle1[i]); // xy plane relPosFilter->SetAlpha2(m_Angle2[i]); - relPosFilter->SetK1(M_PI/2.0); // Opening parameter, default = pi/2 - relPosFilter->SetFast(true); - relPosFilter->SetRadius(1); // seems sufficient in this case + relPosFilter->SetK1(GetK1());// M_PI/2.0); // Opening parameter, default = pi/2 // relPosFilter->SetVerboseProgress(true); + relPosFilter->Update(); relPos = relPosFilter->GetOutput(); @@ -395,15 +410,9 @@ 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->SetConstant(GetNumberOfAngles()); -#endif divideFilter->SetInput(m_FuzzyMap); divideFilter->Update(); m_FuzzyMap = divideFilter->GetOutput(); @@ -411,6 +420,44 @@ GenerateData() relPos = m_FuzzyMap; StopCurrentStep(relPos); + if (GetFuzzyMapOnlyFlag()) { + // If the spacing is used, recompute fuzzy map with the input size/spacing + if (m_IntermediateSpacingFlag) { + StartNewStep("Resample FuzzyMap to come back to the same sampling than input"); + typedef clitk::ResampleImageWithOptionsFilter ResampleFilterType; + typename ResampleFilterType::Pointer resampleFilter = ResampleFilterType::New(); + resampleFilter->SetDefaultPixelValue(0.0); //Default fuzzymap value FIXME + resampleFilter->SetInput(relPos); + resampleFilter->SetOutputSpacing(input->GetSpacing()); + resampleFilter->SetGaussianFilteringEnabled(false); + resampleFilter->Update(); + relPos = m_FuzzyMap = resampleFilter->GetOutput(); + StopCurrentStep(relPos); + + // Need to put exactly the same size + if (relPos->GetLargestPossibleRegion() != input->GetLargestPossibleRegion()) { + StartNewStep("Pad to get the same size than input"); + typename FloatImageType::Pointer temp = FloatImageType::New(); + temp->CopyInformation(input); + temp->SetRegions(input->GetLargestPossibleRegion()); // Do not forget !! + temp->Allocate(); + temp->FillBuffer(0.0); // Default fuzzymap value FIXME + typename PasteFloatFilterType::Pointer padFilter2 = PasteFloatFilterType::New(); + padFilter2->SetSourceImage(relPos); + padFilter2->SetDestinationImage(temp); + padFilter2->SetDestinationIndex(input->GetLargestPossibleRegion().GetIndex()); + padFilter2->SetSourceRegion(relPos->GetLargestPossibleRegion()); + padFilter2->Update(); + relPos = padFilter2->GetOutput(); + StopCurrentStep(relPos); + m_FuzzyMap = relPos; + } + } + else { + StopCurrentStep(relPos); + } + return; + } //-------------------------------------------------------------------- //--------------------------------------------------------------------