Main Page   Groups   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Concepts

itkWatershedImageFilter.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Insight Segmentation & Registration Toolkit
00004   Module:    $RCSfile: itkWatershedImageFilter.h,v $
00005   Language:  C++
00006   Date:      $Date: 2009-01-27 19:30:18 $
00007   Version:   $Revision: 1.44 $
00008 
00009   Copyright (c) Insight Software Consortium. All rights reserved.
00010   See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
00011 
00012      This software is distributed WITHOUT ANY WARRANTY; without even 
00013      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00014      PURPOSE.  See the above copyright notices for more information.
00015 
00016 =========================================================================*/
00017 #ifndef __itkWatershedImageFilter_h
00018 #define __itkWatershedImageFilter_h
00019 
00020 #if defined(_MSC_VER)
00021 #pragma warning ( disable : 4786 )
00022 #endif
00023 
00024 #include "itkImageToImageFilter.h"
00025 #include "itkImage.h"
00026 #include "itkWatershedSegmenter.h"
00027 #include "itkWatershedSegmentTreeGenerator.h"
00028 #include "itkWatershedRelabeler.h"
00029 #include "itkWatershedMiniPipelineProgressCommand.h"
00030 
00031 namespace itk
00032 {
00151 template <class TInputImage>
00152 class ITK_EXPORT WatershedImageFilter :
00153     public ImageToImageFilter< TInputImage, Image<unsigned long,
00154                                                   ::itk::GetImageDimension<TInputImage>::ImageDimension> >
00155 {
00156 public:
00158   typedef WatershedImageFilter Self;
00159 
00161   typedef TInputImage InputImageType;
00162 
00164   itkStaticConstMacro (ImageDimension, unsigned int,
00165                        TInputImage::ImageDimension);
00166 
00168   typedef Image<unsigned long, itkGetStaticConstMacro(ImageDimension)> OutputImageType;
00169 
00171   typedef typename InputImageType::RegionType RegionType;
00172   typedef typename InputImageType::SizeType   SizeType;
00173   typedef typename InputImageType::IndexType  IndexType;
00174 
00176   typedef ImageToImageFilter< InputImageType, OutputImageType > Superclass;
00177 
00179   typedef typename InputImageType::PixelType ScalarType;
00180 
00182   typedef SmartPointer<Self> Pointer;
00183 
00185   itkTypeMacro(WatershedImageFilter, ImageToImageFilter);
00186 
00188   itkNewMacro(Self);
00189 
00191   void GenerateData();
00192 
00195   void SetInput(const InputImageType *input)
00196     {
00197     // if the input is changed, we'll need to clear the cached tree
00198     // when we execute
00199     if (input != this->GetInput(0))
00200       {
00201       m_InputChanged = true;
00202       }
00203 
00204     // processObject is not const-correct so a const_cast is needed here
00205     this->ProcessObject::SetNthInput(0, const_cast<InputImageType *>(input));
00206     m_Segmenter->SetInputImage( const_cast<InputImageType *>( input ) );
00207     }
00208 
00209   virtual void SetInput( unsigned int i, const TInputImage * image)
00210     {
00211     if (i != 0)
00212       { itkExceptionMacro(<< "Filter has only one input."); }
00213     else
00214       { this->SetInput(image); }
00215     }
00218   void SetThreshold(double);
00219   itkGetMacro(Threshold, double);
00221 
00224   void SetLevel(double);
00225   itkGetMacro(Level, double);
00227 
00229   typename watershed::Segmenter<InputImageType>::OutputImageType *
00230   GetBasicSegmentation()
00231     {
00232     m_Segmenter->Update();
00233     return m_Segmenter->GetOutputImage();
00234     }
00236 
00238   typename watershed::SegmentTreeGenerator<ScalarType>::SegmentTreeType *
00239   GetSegmentTree()
00240     {
00241     return m_TreeGenerator->GetOutputSegmentTree();
00242     }
00243 
00244   // Override since the filter produces all of its output
00245   void EnlargeOutputRequestedRegion(DataObject *data);
00246 
00247 #ifdef ITK_USE_CONCEPT_CHECKING
00248 
00249   itkConceptMacro(InputEqualityComparableCheck,
00250     (Concept::EqualityComparable<ScalarType>));
00251   itkConceptMacro(InputAdditiveOperatorsCheck,
00252     (Concept::AdditiveOperators<ScalarType>));
00253   itkConceptMacro(DoubleInputMultiplyOperatorCheck,
00254     (Concept::MultiplyOperator<double, ScalarType, ScalarType>));
00255   itkConceptMacro(InputLessThanComparableCheck,
00256     (Concept::LessThanComparable<ScalarType>));
00257 
00259 #endif
00260 
00261 protected:
00262   WatershedImageFilter();
00263   virtual ~WatershedImageFilter() {}
00264   WatershedImageFilter(const Self&) {}
00265   void operator=(const Self&) {}
00266   void PrintSelf(std::ostream& os, Indent indent) const;
00267 
00270   virtual void PrepareOutputs();
00271 
00272 private:
00276   double m_Threshold;
00277 
00282   double m_Level;
00283 
00288   typename watershed::Segmenter<InputImageType>::Pointer        m_Segmenter;
00289   typename watershed::SegmentTreeGenerator<ScalarType>::Pointer m_TreeGenerator;
00290   typename watershed::Relabeler<ScalarType, itkGetStaticConstMacro(ImageDimension)>::Pointer
00291                                                                 m_Relabeler;
00293 
00294   unsigned long m_ObserverTag;
00295 
00296   bool m_LevelChanged;
00297   bool m_ThresholdChanged;
00298   bool m_InputChanged;
00299 
00300   TimeStamp m_GenerateDataMTime;
00301 };
00302 
00303 } // end namespace itk
00304 
00305 #ifndef ITK_MANUAL_INSTANTIATION
00306 #include "itkWatershedImageFilter.txx"
00307 #endif
00308 
00309 #endif
00310 

Generated at Sat Feb 28 13:53:25 2009 for ITK by doxygen 1.5.6 written by Dimitri van Heesch, © 1997-2000