/*========================================================================= Program: vv http://www.creatis.insa-lyon.fr/rio/vv Authors belong to: - University of LYON http://www.universite-lyon.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 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the copyright notices for more information. It is distributed under dual licence - 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 { //------------------------------------------------------------------- // 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(); } } //------------------------------------------------------------------- // Update with the number of dimensions and the pixeltype //------------------------------------------------------------------- template void RegionGrowingGenericFilter::UpdateWithDimAndPixelType() { // ImageTypes typedef itk::Image InputImageType; typedef itk::Image OutputImageType; // 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; 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; typename ImageToImageFilterType::Pointer filter; switch (m_ArgsInfo.type_arg) { case 0: { 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..."< 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..."< 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..."< 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..."< 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..."<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(); } }//end clitk #endif //#define clitkRegionGrowingGenericFilter_txx