X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=segmentation%2FclitkRegionGrowingGenericFilter.txx;h=681b98ec57eee4e8e6f12e260d06ecd27e00266a;hb=bffde3a7ae834139793d8c00f73986879146b0e0;hp=b92272788895fbd19e736e01b37a6ddbac1dedc2;hpb=08d1fd56ac1d08bd228d9e557f5472a395e9b708;p=clitk.git diff --git a/segmentation/clitkRegionGrowingGenericFilter.txx b/segmentation/clitkRegionGrowingGenericFilter.txx index b922727..681b98e 100644 --- a/segmentation/clitkRegionGrowingGenericFilter.txx +++ b/segmentation/clitkRegionGrowingGenericFilter.txx @@ -14,235 +14,271 @@ - 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 + ===========================================================================**/ -namespace clitk +#ifndef CLITKREGIONGROWINGGENERICFILTER_TXX +#define CLITKREGIONGROWINGGENERICFILTER_TXX + +#include +#include + + +//-------------------------------------------------------------------- +template +clitk::RegionGrowingGenericFilter::RegionGrowingGenericFilter(): + ImageToImageGenericFilter("RegionGrowing") { + InitializeImageType<2>(); + InitializeImageType<3>(); + //InitializeImageType<4>(); +} +//-------------------------------------------------------------------- - //------------------------------------------------------------------- - // 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(); - } - } +//-------------------------------------------------------------------- +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); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +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 - void - RegionGrowingGenericFilter::UpdateWithDimAndPixelType() - { - // ImageTypes - typedef itk::Image InputImageType; - typedef itk::Image OutputImageType; +//-------------------------------------------------------------------- +// 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 - typename InputImageType::IndexType index; - 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 (mArgsInfo.seedRadius_given == Dimension) + for (unsigned i = 0; i < Dimension; i++) + r[i] = mArgsInfo.seedRadius_arg[i]; + else + r.Fill(mArgsInfo.seedRadius_arg[0]); - // Filter - typedef itk::ImageToImageFilter ImageToImageFilterType; - typename ImageToImageFilterType::Pointer filter; + BallType ball; + ball.SetRadius(r); + ball.CreateStructuringElement(); - switch (m_ArgsInfo.type_arg) - { - case 0: { + typedef itk::ConstShapedNeighborhoodIterator IteratorType; + IteratorType it(ball.GetRadius(), + input, + input->GetLargestPossibleRegion()); + it.CreateActiveListFromNeighborhood(ball); + it.NeedToUseBoundaryConditionOff(); + + 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; + typename ImageToImageFilterType::Pointer filter; + + 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)); - f->SetSeed(index); - 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)); - f->AddSeed(index); - 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 ); - f->AddSeed( index ); - 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); - f->AddSeed(index); - 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); - f->AddSeed(index); - 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