00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkOptBinaryMorphologyImageFilter_h
00018 #define __itkOptBinaryMorphologyImageFilter_h
00019
00020 #include <vector>
00021 #include <queue>
00022 #include "itkKernelImageFilter.h"
00023 #include "itkImage.h"
00024 #include "itkNumericTraits.h"
00025 #include "itkNeighborhoodIterator.h"
00026 #include "itkConstNeighborhoodIterator.h"
00027 #include "itkNeighborhood.h"
00028 #include "itkImageBoundaryCondition.h"
00029 #include "itkImageRegionIterator.h"
00030 #include "itkConceptChecking.h"
00031
00032 namespace itk
00033 {
00104 template <class TInputImage, class TOutputImage, class TKernel>
00105 class ITK_EXPORT BinaryMorphologyImageFilter :
00106 public KernelImageFilter< TInputImage, TOutputImage, TKernel >
00107 {
00108 public:
00109
00111 itkStaticConstMacro(InputImageDimension, unsigned int,
00112 TInputImage::ImageDimension);
00113 itkStaticConstMacro(OutputImageDimension, unsigned int,
00114 TOutputImage::ImageDimension);
00116
00118 itkStaticConstMacro(KernelDimension, unsigned int,
00119 TKernel::NeighborhoodDimension);
00120
00122 typedef TInputImage InputImageType;
00123 typedef TOutputImage OutputImageType;
00124
00126 typedef BinaryMorphologyImageFilter Self;
00127 typedef KernelImageFilter< InputImageType, OutputImageType, TKernel>
00128 Superclass;
00129 typedef SmartPointer<Self> Pointer;
00130 typedef SmartPointer<const Self> ConstPointer;
00131
00133 itkNewMacro(Self);
00134
00136 itkTypeMacro(BinaryMorphologyImageFilter, ImageToImageFilter);
00137
00139 typedef TKernel KernelType;
00140
00142 typedef typename KernelType::ConstIterator KernelIteratorType;
00143
00145 typedef typename InputImageType::PixelType InputPixelType;
00146 typedef typename OutputImageType::PixelType OutputPixelType;
00147 typedef typename NumericTraits<InputPixelType>::RealType InputRealType;
00148 typedef typename InputImageType::OffsetType OffsetType;
00149 typedef typename InputImageType::IndexType IndexType;
00150
00151 typedef typename InputImageType::RegionType InputImageRegionType;
00152 typedef typename OutputImageType::RegionType OutputImageRegionType;
00153 typedef typename InputImageType::SizeType InputSizeType;
00154
00156 itkConceptMacro(ImageDimensionCheck,
00157 (Concept::SameDimension<itkGetStaticConstMacro(InputImageDimension),
00158 itkGetStaticConstMacro(OutputImageDimension)>));
00159
00160
00161 #if 0
00162
00163 itkConceptMacro(KernelDimensionCheck,
00164 (Concept::SameDimension<itkGetStaticConstMacro(KernelDimension),
00165 itkGetStaticConstMacro(InputImageDimension)>));
00166 #endif
00167
00171 itkSetMacro(ForegroundValue, InputPixelType);
00172
00175 itkGetConstMacro(ForegroundValue, InputPixelType);
00176
00181 itkSetMacro(BackgroundValue, OutputPixelType);
00182
00187 itkGetConstMacro(BackgroundValue, OutputPixelType);
00188
00191 itkSetMacro(BoundaryToForeground, bool);
00192 itkGetConstReferenceMacro(BoundaryToForeground, bool);
00193 itkBooleanMacro(BoundaryToForeground);
00195
00197 void SetKernel( const KernelType& kernel );
00198
00199 protected:
00200 BinaryMorphologyImageFilter();
00201 virtual ~BinaryMorphologyImageFilter(){}
00202 void PrintSelf(std::ostream& os, Indent indent) const;
00203
00206 void AnalyzeKernel();
00207
00209 typedef std::vector< OffsetType > NeighborIndexContainer;
00210
00212 typedef std::vector<NeighborIndexContainer> NeighborIndexContainerContainer;
00213
00215 typedef std::vector< OffsetType > ComponentVectorType;
00216
00218 typedef typename ComponentVectorType::const_iterator
00219 ComponentVectorConstIterator;
00220
00223 NeighborIndexContainer& GetDifferenceSet(unsigned int code)
00224 { return m_KernelDifferenceSets[code]; }
00225
00228 ComponentVectorConstIterator KernelCCVectorBegin()
00229 { return m_KernelCCVector.begin(); }
00230
00233 ComponentVectorConstIterator KernelCCVectorEnd()
00234 { return m_KernelCCVector.end(); }
00235
00236 bool m_BoundaryToForeground;
00237
00238 private:
00239 BinaryMorphologyImageFilter(const Self&);
00240 void operator=(const Self&);
00241
00243 InputPixelType m_ForegroundValue;
00244
00246 OutputPixelType m_BackgroundValue;
00247
00249 NeighborIndexContainerContainer m_KernelDifferenceSets;
00250
00254 std::vector< OffsetType > m_KernelCCVector;
00255 };
00256
00257 }
00258
00259 #ifndef ITK_MANUAL_INSTANTIATION
00260 #include "itkOptBinaryMorphologyImageFilter.txx"
00261 #endif
00262
00263 #endif
00264