From 1f8d29f559adc0ac6676c1dd738f4ecb46c341a4 Mon Sep 17 00:00:00 2001 From: dsarrut Date: Thu, 5 May 2011 11:49:45 +0200 Subject: [PATCH] Add new ConditionalGrayscaleDilateImageFilter -> like GrayscaleGeodesicErodeImageFilter but only dilate inside BG (preserve other label) --- ...itkConditionalGrayscaleDilateImageFilter.h | 148 ++++++++++++++++++ ...kConditionalGrayscaleDilateImageFilter.txx | 86 ++++++++++ 2 files changed, 234 insertions(+) create mode 100644 itk/clitkConditionalGrayscaleDilateImageFilter.h create mode 100644 itk/clitkConditionalGrayscaleDilateImageFilter.txx diff --git a/itk/clitkConditionalGrayscaleDilateImageFilter.h b/itk/clitkConditionalGrayscaleDilateImageFilter.h new file mode 100644 index 0000000..c129102 --- /dev/null +++ b/itk/clitkConditionalGrayscaleDilateImageFilter.h @@ -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 ITK_EXPORT ConditionalGrayscaleDilateImageFilter : + public MorphologyImageFilter +{ +public: + /** Standard class typedefs. */ + typedef ConditionalGrayscaleDilateImageFilter Self; + typedef MorphologyImageFilter + Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer 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)); + itkConceptMacro(SameDimensionCheck1, + (Concept::SameDimension)); + itkConceptMacro(SameDimensionCheck2, + (Concept::SameDimension)); + itkConceptMacro(InputGreaterThanComparableCheck, + (Concept::GreaterThanComparable)); + itkConceptMacro(KernelGreaterThanComparableCheck, + (Concept::GreaterThanComparable)); + /** 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::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 index 0000000..84ed968 --- /dev/null +++ b/itk/clitkConditionalGrayscaleDilateImageFilter.txx @@ -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 +ConditionalGrayscaleDilateImageFilter +::ConditionalGrayscaleDilateImageFilter() +{ + m_DilateBoundaryCondition.SetConstant( NumericTraits::NonpositiveMin() ); + this->OverrideBoundaryCondition( &m_DilateBoundaryCondition ); +} + +template +typename ConditionalGrayscaleDilateImageFilter::PixelType +ConditionalGrayscaleDilateImageFilter +::Evaluate(const NeighborhoodIteratorType &nit, + const KernelIteratorType kernelBegin, + const KernelIteratorType kernelEnd) +{ + unsigned int i; + PixelType max = NumericTraits::NonpositiveMin(); + PixelType temp; + + KernelIteratorType kernel_it; + + PixelType center = nit.GetCenterPixel (); + // if (center != NumericTraits::Zero) { + // DD((int)center); + // } + + if (center > NumericTraits::Zero) return center; + + for( i=0, kernel_it=kernelBegin; kernel_it NumericTraits::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 -- 2.47.1