1 /*========================================================================= 2 * 3 * Copyright Insight Software Consortium 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0.txt 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 *=========================================================================*/ 18 #ifndef itkMorphologicalGradientImageFilter_h 19 #define itkMorphologicalGradientImageFilter_h 20 21 #include "itkKernelImageFilter.h" 22 #include "itkMovingHistogramMorphologicalGradientImageFilter.h" 23 #include "itkBasicDilateImageFilter.h" 24 #include "itkBasicErodeImageFilter.h" 25 #include "itkAnchorErodeImageFilter.h" 26 #include "itkAnchorDilateImageFilter.h" 27 #include "itkVanHerkGilWermanDilateImageFilter.h" 28 #include "itkVanHerkGilWermanErodeImageFilter.h" 29 #include "itkSubtractImageFilter.h" 30 #include "itkConstantBoundaryCondition.h" 31 #include "itkNeighborhood.h" 32 33 namespace itk 34 { 35 /** 36 * \class MorphologicalGradientImageFilter 37 * \brief gray scale dilation of an image 38 * 39 * Dilate an image using grayscale morphology. Dilation takes the 40 * maximum of all the pixels identified by the structuring element. 41 * 42 * The structuring element is assumed to be composed of binary 43 * values (zero or one). Only elements of the structuring element 44 * having values > 0 are candidates for affecting the center pixel. 45 * 46 * \sa MorphologyImageFilter, GrayscaleFunctionDilateImageFilter, BinaryDilateImageFilter 47 * \ingroup ImageEnhancement MathematicalMorphologyImageFilters 48 * \ingroup ITKMathematicalMorphology 49 */ 50 51 template< typename TInputImage, typename TOutputImage, typename TKernel > 52 class ITK_TEMPLATE_EXPORT MorphologicalGradientImageFilter: 53 public KernelImageFilter< TInputImage, TOutputImage, TKernel > 54 { 55 public: 56 ITK_DISALLOW_COPY_AND_ASSIGN(MorphologicalGradientImageFilter); 57 58 /** Standard class type aliases. */ 59 using Self = MorphologicalGradientImageFilter; 60 using Superclass = KernelImageFilter< TInputImage, TOutputImage, TKernel >; 61 using Pointer = SmartPointer< Self >; 62 using ConstPointer = SmartPointer< const Self >; 63 64 /** Standard New method. */ 65 itkNewMacro(Self); 66 67 /** Runtime information support. */ 68 itkTypeMacro(MorphologicalGradientImageFilter, 69 KernelImageFilter); 70 71 /** Image related type alias. */ 72 static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; 73 74 /** Image related type alias. */ 75 using InputImageType = TInputImage; 76 using OutputImageType = TOutputImage; 77 using RegionType = typename TInputImage::RegionType; 78 using SizeType = typename TInputImage::SizeType; 79 using IndexType = typename TInputImage::IndexType; 80 using PixelType = typename TInputImage::PixelType; 81 using OffsetType = typename TInputImage::OffsetType; 82 using OutputImageRegionType = typename Superclass::OutputImageRegionType; 83 84 using FlatKernelType = 85 FlatStructuringElement< Self::ImageDimension >; 86 using HistogramFilterType = 87 MovingHistogramMorphologicalGradientImageFilter< TInputImage, TOutputImage, TKernel >; 88 using BasicDilateFilterType = 89 BasicDilateImageFilter< TInputImage, TInputImage, TKernel >; 90 using BasicErodeFilterType = 91 BasicErodeImageFilter< TInputImage, TInputImage, TKernel >; 92 using AnchorDilateFilterType = 93 AnchorDilateImageFilter< TInputImage, FlatKernelType >; 94 using AnchorErodeFilterType = AnchorErodeImageFilter< TInputImage, FlatKernelType >; 95 using VHGWDilateFilterType = 96 VanHerkGilWermanDilateImageFilter< TInputImage, FlatKernelType >; 97 using VHGWErodeFilterType = 98 VanHerkGilWermanErodeImageFilter< TInputImage, FlatKernelType >; 99 using SubtractFilterType = 100 SubtractImageFilter< TInputImage, TInputImage, TOutputImage >; 101 102 /** Kernel type alias. */ 103 using KernelType = TKernel; 104 // using KernelSuperclass = typename KernelType::Superclass; 105 // using KernelSuperclass = Neighborhood< typename KernelType::PixelType, ImageDimension >; 106 107 /** Set kernel (structuring element). */ 108 void SetKernel(const KernelType & kernel) override; 109 110 /** Set/Get the backend filter class. */ 111 void SetAlgorithm(int algo); 112 113 itkGetConstMacro(Algorithm, int); 114 115 /** MorphologicalGradientImageFilter need to set its internal filters as 116 modified */ 117 void Modified() const override; 118 119 /** define values used to determine which algorithm to use */ 120 enum AlgorithmType { 121 BASIC = 0, 122 HISTO = 1, 123 ANCHOR = 2, 124 VHGW = 3 125 }; 126 127 protected: 128 MorphologicalGradientImageFilter(); 129 ~MorphologicalGradientImageFilter() override = default; 130 void PrintSelf(std::ostream & os, Indent indent) const override; 131 132 void GenerateData() override; 133 134 private: 135 // the filters used internally 136 typename HistogramFilterType::Pointer m_HistogramFilter; 137 138 typename BasicDilateFilterType::Pointer m_BasicDilateFilter; 139 140 typename BasicErodeFilterType::Pointer m_BasicErodeFilter; 141 142 typename AnchorDilateFilterType::Pointer m_AnchorDilateFilter; 143 144 typename AnchorErodeFilterType::Pointer m_AnchorErodeFilter; 145 146 typename VHGWDilateFilterType::Pointer m_VanHerkGilWermanDilateFilter; 147 148 typename VHGWErodeFilterType::Pointer m_VanHerkGilWermanErodeFilter; 149 150 // and the name of the filter 151 int m_Algorithm; 152 }; // end of class 153 } // end namespace itk 154 155 #ifndef ITK_MANUAL_INSTANTIATION 156 #include "itkMorphologicalGradientImageFilter.hxx" 157 #endif 158 159 #endif 160