text: /*=========================================================================
   *
   *  Copyright Insight Software Consortium
   *
   *  Licensed under the Apache License, Version 2.0 (the "License");
   *  you may not use this file except in compliance with the License.
   *  You may obtain a copy of the License at
   *
   *         http://www.apache.org/licenses/LICENSE-2.0.txt
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   *
   *=========================================================================*/
  #ifndef itkMorphologicalWatershedImageFilter_h
  #define itkMorphologicalWatershedImageFilter_h
  
  #include "itkImageToImageFilter.h"
  
  namespace itk
  {
  /** \class MorphologicalWatershedImageFilter
   * \brief Watershed segmentation implementation with morphogical operators
   *
   * Watershed pixel are labeled 0.
   * TOutputImage should be an integer type.
   * Labels of output image are in no particular order. You can reorder the
   * labels such that object labels are consecutive and sorted based on object
   * size by passing the output of this filter to a RelabelComponentImageFilter.
   *
   * The morphological watershed transform algorithm is described in
   * Chapter 9.2 of Pierre Soille's book "Morphological Image Analysis:
   * Principles and Applications", Second Edition, Springer, 2003.
   *
   *
   * This code was contributed in the Insight Journal paper:
   * "The watershed transform in ITK - discussion and new developments"
   * by Beare R., Lehmann G.
   * https://hdl.handle.net/1926/202
   * http://www.insight-journal.org/browse/publication/92
   *
   * \author Gaetan Lehmann. Biologie du Developpement et de la Reproduction, INRA de Jouy-en-Josas, France.
   *
   * \sa WatershedImageFilter, MorphologicalWatershedFromMarkersImageFilter
   * \ingroup ImageEnhancement  MathematicalMorphologyImageFilters
   * \ingroup ITKWatersheds
   */
  template< typename TInputImage, typename TOutputImage >
  class ITK_TEMPLATE_EXPORT MorphologicalWatershedImageFilter:
    public ImageToImageFilter< TInputImage, TOutputImage >
  {
  public:
    ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalWatershedImageFilter);
  
    /** Standard class type aliases. */
    using Self = MorphologicalWatershedImageFilter;
    using Superclass = ImageToImageFilter< TInputImage, TOutputImage >;
    using Pointer = SmartPointer< Self >;
    using ConstPointer = SmartPointer< const Self >;
  
    /** Some convenient type alias. */
    using InputImageType = TInputImage;
    using OutputImageType = TOutputImage;
    using InputImagePointer = typename InputImageType::Pointer;
    using InputImageConstPointer = typename InputImageType::ConstPointer;
    using InputImageRegionType = typename InputImageType::RegionType;
    using InputImagePixelType = typename InputImageType::PixelType;
    using OutputImagePointer = typename OutputImageType::Pointer;
    using OutputImageConstPointer = typename OutputImageType::ConstPointer;
    using OutputImageRegionType = typename OutputImageType::RegionType;
    using OutputImagePixelType = typename OutputImageType::PixelType;
  
    /** ImageDimension constants */
    static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension;
    static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension;
  
    /** Standard New method. */
    itkNewMacro(Self);
  
    /** Runtime information support. */
    itkTypeMacro(MorphologicalWatershedImageFilter, ImageToImageFilter);
  
    /**
     * Set/Get whether the connected components are defined strictly by
     * face connectivity or by face+edge+vertex connectivity.  Default is
     * FullyConnectedOff.  For objects that are 1 pixel wide, use
     * FullyConnectedOn.
     */
    itkSetMacro(FullyConnected, bool);
    itkGetConstReferenceMacro(FullyConnected, bool);
    itkBooleanMacro(FullyConnected);
  
    /**
     * Set/Get whether the watershed pixel must be marked or not. Default
     * is true. Set it to false do not only avoid writing watershed pixels,
     * it also decrease algorithm complexity.
     */
    itkSetMacro(MarkWatershedLine, bool);
    itkGetConstReferenceMacro(MarkWatershedLine, bool);
    itkBooleanMacro(MarkWatershedLine);
  
    /**
     */
    itkSetMacro(Level, InputImagePixelType);
    itkGetConstMacro(Level, InputImagePixelType);
  
  protected:
    MorphologicalWatershedImageFilter();
    ~MorphologicalWatershedImageFilter() override = default;
    void PrintSelf(std::ostream & os, Indent indent) const override;
  
    /** MorphologicalWatershedImageFilter needs the entire input be
     * available. Thus, it needs to provide an implementation of
     * GenerateInputRequestedRegion(). */
    void GenerateInputRequestedRegion() override;
  
    /** MorphologicalWatershedImageFilter will produce the entire output. */
    void EnlargeOutputRequestedRegion( DataObject *itkNotUsed(output) ) override;
  
    /** Single-threaded version of GenerateData.  This filter delegates
     * to GrayscaleGeodesicErodeImageFilter. */
    void GenerateData() override;
  
  private:
    bool m_FullyConnected;
  
    bool m_MarkWatershedLine;
  
    InputImagePixelType m_Level;
  }; // end of class
  } // end namespace itk
  
  #ifndef ITK_MANUAL_INSTANTIATION
  #include "itkMorphologicalWatershedImageFilter.hxx"
  #endif
  
  #endif
  