]> Creatis software - clitk.git/commitdiff
Add new ConditionalGrayscaleDilateImageFilter -> like GrayscaleGeodesicErodeImageFilt...
authordsarrut <david.sarrut@gmail.com>
Thu, 5 May 2011 09:49:45 +0000 (11:49 +0200)
committerdsarrut <david.sarrut@gmail.com>
Thu, 5 May 2011 09:49:45 +0000 (11:49 +0200)
itk/clitkConditionalGrayscaleDilateImageFilter.h [new file with mode: 0644]
itk/clitkConditionalGrayscaleDilateImageFilter.txx [new file with mode: 0644]

diff --git a/itk/clitkConditionalGrayscaleDilateImageFilter.h b/itk/clitkConditionalGrayscaleDilateImageFilter.h
new file mode 100644 (file)
index 0000000..c129102
--- /dev/null
@@ -0,0 +1,148 @@
+/*=========================================================================
+
+  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
diff --git a/itk/clitkConditionalGrayscaleDilateImageFilter.txx b/itk/clitkConditionalGrayscaleDilateImageFilter.txx
new file mode 100644 (file)
index 0000000..84ed968
--- /dev/null
@@ -0,0 +1,86 @@
+/*=========================================================================
+
+  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