X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=segmentation%2FclitkRegionGrowingGenericFilter.txx;h=681b98ec57eee4e8e6f12e260d06ecd27e00266a;hb=HEAD;hp=43f5b08e167db7fdbda6d85029ca0b4b95175a23;hpb=7d2112cf3e366658023ee70f58226426022e70fe;p=clitk.git diff --git a/segmentation/clitkRegionGrowingGenericFilter.txx b/segmentation/clitkRegionGrowingGenericFilter.txx index 43f5b08..681b98e 100644 --- a/segmentation/clitkRegionGrowingGenericFilter.txx +++ b/segmentation/clitkRegionGrowingGenericFilter.txx @@ -14,91 +14,93 @@ - 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 -{ +#ifndef CLITKREGIONGROWINGGENERICFILTER_TXX +#define CLITKREGIONGROWINGGENERICFILTER_TXX - //------------------------------------------------------------------- - // Update with the number of dimensions - //------------------------------------------------------------------- - template - void - RegionGrowingGenericFilter::UpdateWithDim(std::string PixelType) - { - if (m_Verbose) std::cout << "Image was detected to be "<(); - } - // else if(PixelType == "unsigned_short"){ - // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_short..." << std::endl; - // UpdateWithDimAndPixelType(); - // } - - else if (PixelType == "unsigned_char"){ - if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_char..." << std::endl; - UpdateWithDimAndPixelType(); - } - - // else if (PixelType == "char"){ - // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed_char..." << std::endl; - // UpdateWithDimAndPixelType(); - // } - else { - if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and float..." << std::endl; - UpdateWithDimAndPixelType(); - } - } +#include +#include - //------------------------------------------------------------------- - // Update with the number of dimensions and the pixeltype - //------------------------------------------------------------------- - template - void - RegionGrowingGenericFilter::UpdateWithDimAndPixelType() - { +//-------------------------------------------------------------------- +template +clitk::RegionGrowingGenericFilter::RegionGrowingGenericFilter(): + ImageToImageGenericFilter("RegionGrowing") +{ + InitializeImageType<2>(); + InitializeImageType<3>(); + //InitializeImageType<4>(); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +template +void clitk::RegionGrowingGenericFilter::InitializeImageType() +{ + ADD_IMAGE_TYPE(Dim, uchar); + ADD_IMAGE_TYPE(Dim, short); + // ADD_IMAGE_TYPE(Dim, int); + ADD_IMAGE_TYPE(Dim, float); +} +//-------------------------------------------------------------------- + - // ImageTypes - typedef itk::Image InputImageType; - typedef itk::Image OutputImageType; +//-------------------------------------------------------------------- +template +void clitk::RegionGrowingGenericFilter::SetArgsInfo(const ArgsInfoType & a) +{ + mArgsInfo=a; + this->SetIOVerbose(mArgsInfo.verbose_flag); + if (mArgsInfo.input_given) this->AddInputFilename(mArgsInfo.input_arg); + if (mArgsInfo.output_given) this->SetOutputFilename(mArgsInfo.output_arg); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +// Update with the number of dimensions and the pixeltype +//-------------------------------------------------------------------- +template +template +void clitk::RegionGrowingGenericFilter::UpdateWithInputImageType() +{ + DD("UpdateWithInputImageType"); + const int Dimension = ImageType::ImageDimension; + + // ImageTypes + typedef ImageType InputImageType; + typedef ImageType OutputImageType; + typedef typename ImageType::PixelType PixelType; - // Read the input - typedef itk::ImageFileReader InputReaderType; - typename InputReaderType::Pointer reader = InputReaderType::New(); - reader->SetFileName( m_InputFileName); - reader->Update(); - typename InputImageType::Pointer input= reader->GetOutput(); - - // Seed - typedef typename std::vector SeedsType; - SeedsType seeds(1); - if(m_ArgsInfo.seed_given==Dimension) - for (unsigned int i=0; itemplate GetInput(0); + + // Seed + typedef typename std::vector SeedsType; + SeedsType seeds(1); + if (mArgsInfo.seed_given==Dimension) + for (unsigned int i=0; i BallType; typename BallType::RadiusType r; - if (m_ArgsInfo.seedRadius_given == Dimension) + if (mArgsInfo.seedRadius_given == Dimension) for (unsigned i = 0; i < Dimension; i++) - r[i] = m_ArgsInfo.seedRadius_arg[i]; + r[i] = mArgsInfo.seedRadius_arg[i]; else - r.Fill(m_ArgsInfo.seed_arg[0]); + r.Fill(mArgsInfo.seedRadius_arg[0]); BallType ball; ball.SetRadius(r); @@ -106,197 +108,177 @@ namespace clitk 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 + input, + input->GetLargestPossibleRegion()); 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); - } + { + 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; - typename ImageToImageFilterType::Pointer filter; + // Filter + typedef itk::ImageToImageFilter ImageToImageFilterType; + typename ImageToImageFilterType::Pointer filter; - switch (m_ArgsInfo.type_arg) - { - case 0: { + switch (mArgsInfo.type_arg) + { + case 0: { - typedef itk::ConnectedThresholdImageFilter ImageFilterType; - typename ImageFilterType::Pointer f= ImageFilterType::New(); + typedef itk::ConnectedThresholdImageFilter ImageFilterType; + typename ImageFilterType::Pointer f= ImageFilterType::New(); - f->SetLower(m_ArgsInfo.lower_arg); - f->SetUpper(m_ArgsInfo.upper_arg); - f->SetReplaceValue(static_cast(m_ArgsInfo.pad_arg)); - 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(mArgsInfo.lower_arg); + f->SetUpper(mArgsInfo.upper_arg); + f->SetReplaceValue(static_cast(mArgsInfo.pad_arg)); + for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it) + f->AddSeed(*it); + filter=f; + if (mArgsInfo.verbose_flag) std::cout<<"Using the connected threshold image filter..."< ImageFilterType; - typename ImageFilterType::Pointer f= ImageFilterType::New(); + typedef itk::NeighborhoodConnectedImageFilter ImageFilterType; + typename ImageFilterType::Pointer f= ImageFilterType::New(); - // Radius - typename InputImageType::SizeType size; - if(m_ArgsInfo.radius_given==Dimension) - for (unsigned int i=0; iSetLower(m_ArgsInfo.lower_arg); - f->SetUpper(m_ArgsInfo.upper_arg); - f->SetReplaceValue(static_cast(m_ArgsInfo.pad_arg)); - 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..."<SetLower(mArgsInfo.lower_arg); + f->SetUpper(mArgsInfo.upper_arg); + f->SetReplaceValue(static_cast(mArgsInfo.pad_arg)); + for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it) + f->AddSeed(*it); + f->SetRadius(size); + filter=f; + if (mArgsInfo.verbose_flag) std::cout<<"Using the neighborhood threshold connected image filter..."< ImageFilterType; - typename ImageFilterType::Pointer f= ImageFilterType::New(); + typedef itk::ConfidenceConnectedImageFilter ImageFilterType; + typename ImageFilterType::Pointer f= ImageFilterType::New(); - // Radius - typename InputImageType::SizeType size; - if(m_ArgsInfo.radius_given==Dimension) - for (unsigned int i=0; iSetMultiplier( m_ArgsInfo.multiplier_arg ); - f->SetNumberOfIterations( m_ArgsInfo.multiplier_arg ); - 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]); - filter=f; - if(m_Verbose)std::cout<<"Using the confidence threshold connected image filter..."<SetMultiplier( mArgsInfo.multiplier_arg ); + f->SetNumberOfIterations( mArgsInfo.multiplier_arg ); + for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it) + f->AddSeed(*it); + f->SetNumberOfIterations( mArgsInfo.iter_arg); + f->SetReplaceValue(static_cast(mArgsInfo.pad_arg)); + f->SetInitialNeighborhoodRadius(size[0]); + filter=f; + if (mArgsInfo.verbose_flag) std::cout<<"Using the confidence threshold connected image filter..."< ImageFilterType; - typename ImageFilterType::Pointer f= ImageFilterType::New(); + typedef clitk::LocallyAdaptiveThresholdConnectedImageFilter ImageFilterType; + typename ImageFilterType::Pointer f= ImageFilterType::New(); - // Radius - typename InputImageType::SizeType size; - if(m_ArgsInfo.radius_given==Dimension) - for (unsigned int i=0; iSetLower(m_ArgsInfo.lower_arg); - f->SetUpper(m_ArgsInfo.upper_arg); - f->SetLowerBorderIsGiven(m_ArgsInfo.adaptLower_flag); - f->SetLowerBorderIsGiven(m_ArgsInfo.adaptUpper_flag); - f->SetReplaceValue(static_cast(m_ArgsInfo.pad_arg)); - f->SetMultiplier(m_ArgsInfo.multiplier_arg); - f->SetMaximumSDIsGiven(m_ArgsInfo.maxSD_given); - if (m_ArgsInfo.maxSD_given) f->SetMaximumSD(m_ArgsInfo.maxSD_arg); - 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..."<SetLower(mArgsInfo.lower_arg); + f->SetUpper(mArgsInfo.upper_arg); + f->SetLowerBorderIsGiven(mArgsInfo.adaptLower_flag); + f->SetLowerBorderIsGiven(mArgsInfo.adaptUpper_flag); + f->SetReplaceValue(static_cast(mArgsInfo.pad_arg)); + f->SetMultiplier(mArgsInfo.multiplier_arg); + f->SetMaximumSDIsGiven(mArgsInfo.maxSD_given); + if (mArgsInfo.maxSD_given) f->SetMaximumSD(mArgsInfo.maxSD_arg); + for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it) + f->AddSeed(*it); + f->SetRadius(size); + filter=f; + if (mArgsInfo.verbose_flag) std::cout<<"Using the locally adaptive threshold connected image filter..."< ImageFilterType; - typename ImageFilterType::Pointer f= ImageFilterType::New(); + typedef clitk::ExplosionControlledThresholdConnectedImageFilter ImageFilterType; + typename ImageFilterType::Pointer f= ImageFilterType::New(); - // // Radius - // typename InputImageType::SizeType size; - // if(m_ArgsInfo.radius_given==Dimension) - // for (unsigned int i=0; iSetVerbose(m_ArgsInfo.verbose_flag); - f->SetLower(m_ArgsInfo.lower_arg); - f->SetUpper(m_ArgsInfo.upper_arg); - f->SetMinimumLowerThreshold(m_ArgsInfo.minLower_arg); - f->SetMaximumUpperThreshold(m_ArgsInfo.maxUpper_arg); - f->SetAdaptLowerBorder(m_ArgsInfo.adaptLower_flag); - f->SetAdaptUpperBorder(m_ArgsInfo.adaptUpper_flag); - f->SetReplaceValue(static_cast(m_ArgsInfo.pad_arg)); - f->SetMultiplier(m_ArgsInfo.multiplier_arg); - f->SetThresholdStepSize(m_ArgsInfo.step_arg); - f->SetMinimumThresholdStepSize(m_ArgsInfo.minStep_arg); - f->SetFullyConnected(m_ArgsInfo.full_flag); - 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..."<SetVerbose(mArgsInfo.verbose_flag); + f->SetLower(mArgsInfo.lower_arg); + f->SetUpper(mArgsInfo.upper_arg); + f->SetMinimumLowerThreshold(mArgsInfo.minLower_arg); + f->SetMaximumUpperThreshold(mArgsInfo.maxUpper_arg); + f->SetAdaptLowerBorder(mArgsInfo.adaptLower_flag); + f->SetAdaptUpperBorder(mArgsInfo.adaptUpper_flag); + f->SetReplaceValue(static_cast(mArgsInfo.pad_arg)); + f->SetMultiplier(mArgsInfo.multiplier_arg); + f->SetThresholdStepSize(mArgsInfo.step_arg); + f->SetMinimumThresholdStepSize(mArgsInfo.minStep_arg); + f->SetFullyConnected(mArgsInfo.full_flag); + for (typename SeedsType::const_iterator it = seeds.begin(); it != seeds.end(); ++it) + f->AddSeed(*it); + filter=f; + if (mArgsInfo.verbose_flag) std::cout<<"Using the explosion controlled threshold connected image filter..."<SetInput(input); - filter->Update(); - typename OutputImageType::Pointer output=filter->GetOutput(); + filter->SetInput(input); + filter->Update(); + typename OutputImageType::Pointer output=filter->GetOutput(); - // Output - typedef itk::ImageFileWriter WriterType; - typename WriterType::Pointer writer = WriterType::New(); - writer->SetFileName(m_ArgsInfo.output_arg); - writer->SetInput(output); - writer->Update(); - } + // Write/Save results + this->template SetNextOutput(output); +} +//-------------------------------------------------------------------- -}//end clitk -#endif //#define clitkRegionGrowingGenericFilter_txx +#endif //#define CLITKREGIONGROWINGGENERICFILTER_TXX