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 itkMeanImageFilter_h
  #define itkMeanImageFilter_h
  
  #include "itkBoxImageFilter.h"
  #include "itkImage.h"
  #include "itkNumericTraits.h"
  
  namespace itk
  {
  /** \class MeanImageFilter
   * \brief Applies an averaging filter to an image
   *
   * Computes an image where a given pixel is the mean value of the
   * the pixels in a neighborhood about the corresponding input pixel.
   *
   * A mean filter is one of the family of linear filters.
   *
   * \sa Image
   * \sa Neighborhood
   * \sa NeighborhoodOperator
   * \sa NeighborhoodIterator
   *
   * \ingroup IntensityImageFilters
   * \ingroup ITKSmoothing
   *
   * \sphinx
   * \sphinxexample{Filtering/Smoothing/ApplyMeanFilter,Mean filter an image}
   * \endsphinx
   */
  template <typename TInputImage, typename TOutputImage>
  class ITK_TEMPLATE_EXPORT MeanImageFilter : public BoxImageFilter<TInputImage, TOutputImage>
  {
  public:
    ITK_DISALLOW_COPY_AND_ASSIGN(MeanImageFilter);
  
    /** Extract dimension from input and output image. */
    static constexpr unsigned int InputImageDimension = TInputImage::ImageDimension;
    static constexpr unsigned int OutputImageDimension = TOutputImage::ImageDimension;
  
    /** Convenient type alias for simplifying declarations. */
    using InputImageType = TInputImage;
    using OutputImageType = TOutputImage;
  
    /** Standard class type aliases. */
    using Self = MeanImageFilter;
    using Superclass = BoxImageFilter<InputImageType, OutputImageType>;
    using Pointer = SmartPointer<Self>;
    using ConstPointer = SmartPointer<const Self>;
  
    /** Method for creation through the object factory. */
    itkNewMacro(Self);
  
    /** Run-time type information (and related methods). */
    itkTypeMacro(MeanImageFilter, BoxImageFilter);
  
    /** Image type alias support */
    using InputPixelType = typename InputImageType::PixelType;
    using OutputPixelType = typename OutputImageType::PixelType;
    using InputRealType = typename NumericTraits<InputPixelType>::RealType;
  
    using InputImageRegionType = typename InputImageType::RegionType;
    using OutputImageRegionType = typename OutputImageType::RegionType;
  
    using InputSizeType = typename InputImageType::SizeType;
  
  #ifdef ITK_USE_CONCEPT_CHECKING
    // Begin concept checking
    itkConceptMacro(InputHasNumericTraitsCheck, (Concept::HasNumericTraits<InputPixelType>));
    // End concept checking
  #endif
  
  protected:
    MeanImageFilter();
    ~MeanImageFilter() override = default;
  
    /** MeanImageFilter can be implemented as a multithreaded filter.
     * Therefore, this implementation provides a ThreadedGenerateData()
     * routine which is called for each processing thread. The output
     * image data is allocated automatically by the superclass prior to
     * calling ThreadedGenerateData().  ThreadedGenerateData can only
     * write to the portion of the output image specified by the
     * parameter "outputRegionForThread"
     *
     * \sa BoxImageFilter::ThreadedGenerateData(),
     *     BoxImageFilter::GenerateData() */
    void
    DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override;
  };
  } // end namespace itk
  
  #ifndef ITK_MANUAL_INSTANTIATION
  #  include "itkMeanImageFilter.hxx"
  #endif
  
  #endif
  