--- /dev/null
+/*=========================================================================
+
+ Program: Insight Segmentation & Registration Toolkit
+ Module: $RCSfile: itkGrayscaleDilateImageFilter.h,v $
+ Language: C++
+ Date: $Date: 2009-04-28 14:36:20 $
+ Version: $Revision: 1.19 $
+
+ Copyright (c) Insight Software Consortium. All rights reserved.
+ See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notices for more information.
+
+=========================================================================*/
+
+#ifndef __clitkGrayscaleDilateImageFilter_h
+#define __clitkGrayscaleDilateImageFilter_h
+
+// First make sure that the configuration is available.
+// This line can be removed once the optimized versions
+// gets integrated into the main directories.
+#include "itkConfigure.h"
+
+#ifdef ITK_USE_CONSOLIDATED_MORPHOLOGY
+#include "itkOptGrayscaleDilateImageFilter.h"
+#else
+
+
+#include "itkMorphologyImageFilter.h"
+
+namespace itk {
+
+/**
+ * \class ConditionalGrayscaleDilateImageFilter
+ * \brief gray scale dilation of an image
+ *
+ * Dilate an image using grayscale morphology. Dilation takes the
+ * maximum of all the pixels identified by the structuring element.
+ *
+ * The structuring element is assumed to be composed of binary
+ * values (zero or one). Only elements of the structuring element
+ * having values > 0 are candidates for affecting the center pixel.
+ *
+ * For the each input image pixel,
+ * - NeighborhoodIterator gives neighbors of the pixel.
+ * - Evaluate() member function returns the maximum value among
+ * the image neighbors where the kernel has elements > 0.
+ * - Replace the original value with the max value
+ *
+ * \sa MorphologyImageFilter, GrayscaleFunctionDilateImageFilter, BinaryDilateImageFilter
+ * \ingroup ImageEnhancement MathematicalMorphologyImageFilters
+ */
+
+template<class TInputImage, class TOutputImage, class TKernel>
+class ITK_EXPORT ConditionalGrayscaleDilateImageFilter :
+ public MorphologyImageFilter<TInputImage, TOutputImage, TKernel>
+{
+public:
+ /** Standard class typedefs. */
+ typedef ConditionalGrayscaleDilateImageFilter Self;
+ typedef MorphologyImageFilter<TInputImage, TOutputImage, TKernel>
+ Superclass;
+ typedef SmartPointer<Self> Pointer;
+ typedef SmartPointer<const Self> ConstPointer;
+
+ /** Standard New method. */
+ itkNewMacro(Self);
+
+ /** Runtime information support. */
+ itkTypeMacro(ConditionalGrayscaleDilateImageFilter,
+ MorphologyImageFilter);
+
+ /** Declaration of pixel type. */
+ typedef typename Superclass::PixelType PixelType;
+
+ /** Kernel (structuring element) iterator. */
+ typedef typename Superclass::KernelIteratorType KernelIteratorType;
+
+ /** Neighborhood iterator type. */
+ typedef typename Superclass::NeighborhoodIteratorType NeighborhoodIteratorType;
+
+ /** Kernel typedef. */
+ typedef typename Superclass::KernelType KernelType;
+
+ /** Default boundary condition type */
+ typedef typename Superclass::DefaultBoundaryConditionType DefaultBoundaryConditionType;
+
+ /** ImageDimension constants */
+ itkStaticConstMacro(InputImageDimension, unsigned int,
+ TInputImage::ImageDimension);
+ itkStaticConstMacro(OutputImageDimension, unsigned int,
+ TOutputImage::ImageDimension);
+ itkStaticConstMacro(KernelDimension, unsigned int,
+ TKernel::NeighborhoodDimension);
+
+ /** Type of the pixels in the Kernel. */
+ typedef typename TKernel::PixelType KernelPixelType;
+
+#ifdef ITK_USE_CONCEPT_CHECKING
+ /** Begin concept checking */
+ itkConceptMacro(InputConvertibleToOutputCheck,
+ (Concept::Convertible<PixelType, typename TOutputImage::PixelType>));
+ itkConceptMacro(SameDimensionCheck1,
+ (Concept::SameDimension<InputImageDimension, OutputImageDimension>));
+ itkConceptMacro(SameDimensionCheck2,
+ (Concept::SameDimension<InputImageDimension, KernelDimension>));
+ itkConceptMacro(InputGreaterThanComparableCheck,
+ (Concept::GreaterThanComparable<PixelType>));
+ itkConceptMacro(KernelGreaterThanComparableCheck,
+ (Concept::GreaterThanComparable<KernelPixelType>));
+ /** End concept checking */
+#endif
+
+protected:
+ ConditionalGrayscaleDilateImageFilter();
+ ~ConditionalGrayscaleDilateImageFilter() {};
+
+ /** Evaluate image neighborhood with kernel to find the new value
+ * for the center pixel value
+ *
+ * It will return the maximum value of the image pixels whose corresponding
+ * element in the structuring element is positive. This version of
+ * Evaluate is used for non-boundary pixels. */
+ PixelType Evaluate(const NeighborhoodIteratorType &nit,
+ const KernelIteratorType kernelBegin,
+ const KernelIteratorType kernelEnd);
+
+private:
+ ConditionalGrayscaleDilateImageFilter(const Self&); //purposely not implemented
+ void operator=(const Self&); //purposely not implemented
+
+ // Default boundary condition for dilation filter, defaults to
+ // NumericTraits<PixelType>::NonpositiveMin()
+ DefaultBoundaryConditionType m_DilateBoundaryCondition;
+
+}; // end of class
+
+} // end namespace itk
+
+#ifndef ITK_MANUAL_INSTANTIATION
+#include "clitkConditionalGrayscaleDilateImageFilter.txx"
+#endif
+
+#endif
+
+#endif
--- /dev/null
+/*=========================================================================
+
+ Program: Insight Segmentation & Registration Toolkit
+ Module: $RCSfile: itkConditionalGrayscaleDilateImageFilter.txx,v $
+ Language: C++
+ Date: $Date: 2009-04-28 14:36:20 $
+ Version: $Revision: 1.17 $
+
+ Copyright (c) Insight Software Consortium. All rights reserved.
+ See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef __clitkConditionalGrayscaleDilateImageFilter_txx
+#define __clitkConditionalGrayscaleDilateImageFilter_txx
+
+// First make sure that the configuration is available.
+// This line can be removed once the optimized versions
+// gets integrated into the main directories.
+#include "itkConfigure.h"
+
+#ifdef ITK_USE_CONSOLIDATED_MORPHOLOGY
+#include "itkOptGrayscaleDilateImageFilter.txx"
+#else
+
+
+#include "clitkConditionalGrayscaleDilateImageFilter.h"
+
+namespace itk {
+
+template<class TInputImage, class TOutputImage, class TKernel>
+ConditionalGrayscaleDilateImageFilter<TInputImage, TOutputImage, TKernel>
+::ConditionalGrayscaleDilateImageFilter()
+{
+ m_DilateBoundaryCondition.SetConstant( NumericTraits<PixelType>::NonpositiveMin() );
+ this->OverrideBoundaryCondition( &m_DilateBoundaryCondition );
+}
+
+template<class TInputImage, class TOutputImage, class TKernel>
+typename ConditionalGrayscaleDilateImageFilter<TInputImage, TOutputImage, TKernel>::PixelType
+ConditionalGrayscaleDilateImageFilter<TInputImage, TOutputImage, TKernel>
+::Evaluate(const NeighborhoodIteratorType &nit,
+ const KernelIteratorType kernelBegin,
+ const KernelIteratorType kernelEnd)
+{
+ unsigned int i;
+ PixelType max = NumericTraits<PixelType>::NonpositiveMin();
+ PixelType temp;
+
+ KernelIteratorType kernel_it;
+
+ PixelType center = nit.GetCenterPixel ();
+ // if (center != NumericTraits<KernelPixelType>::Zero) {
+ // DD((int)center);
+ // }
+
+ if (center > NumericTraits<KernelPixelType>::Zero) return center;
+
+ for( i=0, kernel_it=kernelBegin; kernel_it<kernelEnd; ++kernel_it, ++i )
+ {
+ // if structuring element is positive, use the pixel under that element
+ // in the image
+ if( *kernel_it > NumericTraits<KernelPixelType>::Zero )
+ {
+ // note we use GetPixel() on the SmartNeighborhoodIterator to
+ // respect boundary conditions
+ temp = nit.GetPixel(i);
+
+ if( temp > max )
+ {
+ max = temp;
+ }
+ }
+ }
+
+ return max;
+}
+
+
+}// end namespace itk
+#endif
+
+#endif