X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=segmentation%2FclitkFillMaskGenericFilter.txx;h=70d2442da9b99a411ad6b0243f9f005e71dee6fe;hb=323952cc3c1cc5d0e4f21dd9ac74736207cc544a;hp=d723e10dafbeb026fd6210d813b256de73c33387;hpb=e008d74b0ecdc4ca2eaae8c429901a78f9ef5c31;p=clitk.git diff --git a/segmentation/clitkFillMaskGenericFilter.txx b/segmentation/clitkFillMaskGenericFilter.txx index d723e10..70d2442 100644 --- a/segmentation/clitkFillMaskGenericFilter.txx +++ b/segmentation/clitkFillMaskGenericFilter.txx @@ -1,201 +1,88 @@ -#ifndef clitkFillMaskGenericFilter_txx -#define clitkFillMaskGenericFilter_txx +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv -/* ================================================= - * @file clitkFillMaskGenericFilter.txx - * @author - * @date - * - * @brief - * - ===================================================*/ + 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. -namespace clitk -{ + It is distributed under dual licence - //------------------------------------------------------------------- - // Update with the pixeltype - //------------------------------------------------------------------- - template - void - FillMaskGenericFilter::UpdateWithPixelType() - { - // Dim & Pix - const unsigned int Dimension=3; - typedef int InternalPixelType; + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html + ===========================================================================**/ - // ImageTypes - typedef itk::Image InputImageType; - typedef itk::Image InternalImageType; - 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(); - - // Read the directions over which to fill holes - std::vector direction; - if (m_ArgsInfo.dir_given) - for ( unsigned int i=0;i InputCastImageFilterType; - typename InputCastImageFilterType::Pointer inputCaster= InputCastImageFilterType::New(); - inputCaster->SetInput(input); - inputCaster->Update(); +#include "clitkImageCommon.h" + +//-------------------------------------------------------------------- +template +clitk::FillMaskGenericFilter::FillMaskGenericFilter(): + ImageToImageGenericFilter("FillMask") +{ + this->SetFilterBase(NULL); + InitializeImageType<3>(); +} +//-------------------------------------------------------------------- - //---------------------------------------- - // Loop over directions - //---------------------------------------- - typename InternalImageType::Pointer output=inputCaster->GetOutput(); - for (unsigned int i=0; i ImageSliceType; - typedef itk::Image MaskSliceType; - typename InternalImageType::RegionType region3D= input->GetLargestPossibleRegion(); - typename InternalImageType::RegionType::SizeType size3D= region3D.GetSize(); - typename InternalImageType::RegionType::SizeType size2D=size3D; - size2D[direction[i]]=0; - typename InternalImageType::IndexType start2D; - start2D.Fill(0); - typename InternalImageType::RegionType desiredRegion; - desiredRegion.SetSize( size2D ); - desiredRegion.SetIndex( start2D ); - - // Extract and Join - typedef itk::ExtractImageFilter ExtractImageFilterType; - typedef itk::JoinSeriesImageFilter JoinSeriesFilterType; - typename JoinSeriesFilterType::Pointer joinFilter=JoinSeriesFilterType::New(); - joinFilter->SetSpacing(input->GetSpacing()[direction[i]]); - - //---------------------------------------- - // Run over the sliceIndexs - // ---------------------------------------- - for(unsigned int sliceIndex=0; sliceIndex SetInput(output); - start2D[direction[i]]=sliceIndex; - desiredRegion.SetIndex( start2D ); - extractFilter->SetExtractionRegion( desiredRegion ); - extractFilter->Update( ); - typename ImageSliceType::Pointer slice= extractFilter->GetOutput(); +//-------------------------------------------------------------------- +template +template +void clitk::FillMaskGenericFilter::InitializeImageType() +{ + ADD_IMAGE_TYPE(Dim, uchar); + ADD_IMAGE_TYPE(Dim, short); + // ADD_IMAGE_TYPE(Dim, int); + // ADD_IMAGE_TYPE(Dim, float); +} +//-------------------------------------------------------------------- + - // Binarize the image (Before: OBJECT!=0, rest=0, After: object=1, rest=0 ) - typedef itk::BinaryThresholdImageFilter BinarizeFilterType; - typename BinarizeFilterType::Pointer binarizeFilter=BinarizeFilterType::New(); - binarizeFilter->SetInput(slice); - binarizeFilter->SetUpperThreshold(0); - binarizeFilter->SetOutsideValue(0); - binarizeFilter->SetInsideValue(1); - // writeImage(binarizeFilter->GetOutput(),"/home/jef/tmp/input.mhd"); +//-------------------------------------------------------------------- +template +void clitk::FillMaskGenericFilter::SetArgsInfo(const ArgsInfoType & a) +{ + mArgsInfo=a; + SetIOVerbose(mArgsInfo.verbose_flag); + // if (mArgsInfo.imagetypes_flag) this->PrintAvailableImageTypes(); + if (mArgsInfo.input_given) AddInputFilename(mArgsInfo.input_arg); + if (mArgsInfo.output_given) AddOutputFilename(mArgsInfo.output_arg); +} +//-------------------------------------------------------------------- - // Perform connected labelling on the slice (body+air=0 ) - typedef itk::ConnectedComponentImageFilter ConnectFilterType; - typename ConnectFilterType::Pointer connectFilter=ConnectFilterType::New(); - connectFilter->SetInput(binarizeFilter->GetOutput()); - connectFilter->SetBackgroundValue(0); - connectFilter->SetFullyConnected(false); - //connectFilter->Update(); - //writeImage(connectFilter->GetOutput(),"/home/jef/tmp/connect.mhd"); - - // Sort the labels - typedef itk::RelabelComponentImageFilter RelabelFilterType; - typename RelabelFilterType::Pointer relabelFilter=RelabelFilterType::New(); - relabelFilter->SetInput(connectFilter->GetOutput()); - //relabelFilter->Update(); - //writeImage(relabelFilter->GetOutput(),"/home/jef/tmp/label.mhd"); - - // Keep the first - typedef itk::ThresholdImageFilter ThresholdFilterType; - typename ThresholdFilterType::Pointer thresholdFilter=ThresholdFilterType::New(); - thresholdFilter->SetInput(relabelFilter->GetOutput()); - thresholdFilter->SetUpper(1); - thresholdFilter->SetOutsideValue(0); - // thresholdFilter->Update(); - // writeImage(thresholdFilter->GetOutput(),"/home/jef/tmp/bin.mhd"); - // Invert the labels (lung 1, rest 0) - typename BinarizeFilterType::Pointer switchFilter=BinarizeFilterType::New(); - switchFilter->SetInput(thresholdFilter->GetOutput()); - switchFilter->SetUpperThreshold(0); - switchFilter->SetOutsideValue(0); - switchFilter->SetInsideValue(1); - switchFilter->Update(); - //writeImage(switchFilter->GetOutput(),"/home/jef/tmp/inv_bin.mhd"); - - //Join - joinFilter->SetInput( sliceIndex, switchFilter->GetOutput()); - } - - // Join to a 3D image - if (m_Verbose) std::cout<<"Joining the slices..."<Update(); - - // Permute the axes to reset to orientation - typedef itk::PermuteAxesImageFilter PermuteFilterType; - typename PermuteFilterType::Pointer permuteFilter=PermuteFilterType::New(); - permuteFilter->SetInput(joinFilter->GetOutput()); - typename PermuteFilterType::PermuteOrderArrayType order; - order[direction[i]]=2; - if( direction[i]==2) - { - order[0]=0; - order[1]=1; - } - else if ( direction[i]==1) - { - order[0]=0; - order[2]=1; - } - else if (direction[i]==0) - { - order[1]=0; - order[2]=1; - } - permuteFilter->SetOrder(order); - permuteFilter->Update(); - output =permuteFilter->GetOutput(); - - // Set the image direction to the input one - output->SetDirection(input->GetDirection()); - output->SetOrigin(input->GetOrigin()); - } +//-------------------------------------------------------------------- +// Update with the number of dimensions and the pixeltype +//-------------------------------------------------------------------- +template +template +void clitk::FillMaskGenericFilter::UpdateWithInputImageType() +{ + // Reading input + typename ImageType::Pointer input = this->template GetInput(0); + // Create filter + typedef clitk::FillMaskFilter FilterType; + typename FilterType::Pointer filter = FilterType::New(); - // Cast - typedef itk::CastImageFilter OutputCastImageFilterType; - typename OutputCastImageFilterType::Pointer outputCaster =OutputCastImageFilterType::New(); - outputCaster->SetInput(output); - - // Output - typedef itk::ImageFileWriter WriterType; - typename WriterType::Pointer writer = WriterType::New(); - writer->SetFileName(m_ArgsInfo.output_arg); - writer->SetInput(outputCaster->GetOutput()); - writer->Update(); - } + // Set Options + filter->SetInput(input); + filter->SetOptionsFromArgsInfo(mArgsInfo); -}//end clitk + // Go ! + filter->Update(); + + // Write/Save results + typename ImageType::Pointer output = filter->GetOutput(); + this->template SetNextOutput(output); +} +//-------------------------------------------------------------------- -#endif //#define clitkFillMaskGenericFilter_txx +#endif //#define CLITKFILLMASKGENERICFILTER_TXX