X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=segmentation%2FclitkRegionGrowingGenericFilter.txx;h=eead0d5174341a4acf08a3a05a93cff55b6ae387;hb=5a7da4aedae5c204bc55c187717193e5950f9a44;hp=9ebfe185bb8a0026fe62516a47b4833445857f1f;hpb=bf4928c59a1d39f53fe03deb4b73ecb7e1cf214b;p=clitk.git diff --git a/segmentation/clitkRegionGrowingGenericFilter.txx b/segmentation/clitkRegionGrowingGenericFilter.txx old mode 100755 new mode 100644 index 9ebfe18..eead0d5 --- a/segmentation/clitkRegionGrowingGenericFilter.txx +++ b/segmentation/clitkRegionGrowingGenericFilter.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,9 +14,11 @@ - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html -======================================================================-====*/ +===========================================================================**/ #ifndef clitkRegionGrowingGenericFilter_txx #define clitkRegionGrowingGenericFilter_txx +#include +#include namespace clitk { @@ -75,17 +77,64 @@ namespace clitk typename InputImageType::Pointer input= reader->GetOutput(); // Seed - typename InputImageType::IndexType index; + typedef typename std::vector SeedsType; + SeedsType seeds(1); if(m_ArgsInfo.seed_given==Dimension) for (unsigned int i=0; i BallType; + typename BallType::RadiusType r; + + if (m_ArgsInfo.seedRadius_given == Dimension) + for (unsigned i = 0; i < Dimension; i++) + r[i] = m_ArgsInfo.seedRadius_arg[i]; + else + r.Fill(m_ArgsInfo.seedRadius_arg[0]); + + BallType ball; + ball.SetRadius(r); + ball.CreateStructuringElement(); + + typedef itk::ConstShapedNeighborhoodIterator IteratorType; + IteratorType it(ball.GetRadius(), + input, + input->GetLargestPossibleRegion()); +#if ITK_VERSION_MAJOR < 4 + typename BallType::ConstIterator nit; + unsigned idx = 0; + for (nit = ball.Begin(); nit != ball.End(); ++nit, ++idx) + { + if (*nit) + { + it.ActivateOffset(it.GetOffset(idx)); + } + else + { + it.DeactivateOffset(it.GetOffset(idx)); + } + } +#else + it.CreateActiveListFromNeighborhood(ball); + it.NeedToUseBoundaryConditionOff(); +#endif + + it.SetLocation(seeds[0]); + for (typename IteratorType::ConstIterator i = it.Begin(); !i.IsAtEnd(); ++i) + { + typename InputImageType::IndexType id = seeds[0] + i.GetNeighborhoodOffset(); + if (id != seeds[0] && input->GetLargestPossibleRegion().IsInside(id)) + seeds.push_back(id); + } + } // Filter typedef itk::ImageToImageFilter ImageToImageFilterType; @@ -101,7 +150,8 @@ namespace clitk f->SetLower(m_ArgsInfo.lower_arg); f->SetUpper(m_ArgsInfo.upper_arg); f->SetReplaceValue(static_cast(m_ArgsInfo.pad_arg)); - f->SetSeed(index); + for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it) + f->AddSeed(*it); filter=f; if(m_Verbose)std::cout<<"Using the connected threshold image filter..."<SetLower(m_ArgsInfo.lower_arg); f->SetUpper(m_ArgsInfo.upper_arg); f->SetReplaceValue(static_cast(m_ArgsInfo.pad_arg)); - f->AddSeed(index); + for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it) + f->AddSeed(*it); f->SetRadius(size); filter=f; if(m_Verbose)std::cout<<"Using the neighborhood threshold connected image filter..."<SetMultiplier( m_ArgsInfo.multiplier_arg ); f->SetNumberOfIterations( m_ArgsInfo.multiplier_arg ); - f->AddSeed( index ); + for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it) + f->AddSeed(*it); f->SetNumberOfIterations( m_ArgsInfo.iter_arg); f->SetReplaceValue(static_cast(m_ArgsInfo.pad_arg)); f->SetInitialNeighborhoodRadius(size[0]); @@ -187,7 +239,8 @@ namespace clitk f->SetMultiplier(m_ArgsInfo.multiplier_arg); f->SetMaximumSDIsGiven(m_ArgsInfo.maxSD_given); if (m_ArgsInfo.maxSD_given) f->SetMaximumSD(m_ArgsInfo.maxSD_arg); - f->AddSeed(index); + for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it) + f->AddSeed(*it); f->SetRadius(size); filter=f; if(m_Verbose)std::cout<<"Using the locally adaptive threshold connected image filter..."<SetThresholdStepSize(m_ArgsInfo.step_arg); f->SetMinimumThresholdStepSize(m_ArgsInfo.minStep_arg); f->SetFullyConnected(m_ArgsInfo.full_flag); - f->AddSeed(index); + for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it) + f->AddSeed(*it); filter=f; if(m_Verbose)std::cout<<"Using the explosion controlled threshold connected image filter..."<