00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkObjectMorphologyImageFilter_h
00018 #define __itkObjectMorphologyImageFilter_h
00019
00020 #include "itkImageToImageFilter.h"
00021 #include "itkNeighborhoodIterator.h"
00022 #include "itkNeighborhood.h"
00023 #include "itkConstSliceIterator.h"
00024 #include "itkConstantBoundaryCondition.h"
00025 #include "itkImageBoundaryCondition.h"
00026 #include "itkImageRegionIterator.h"
00027
00028 namespace itk {
00029
00072 template<class TInputImage, class TOutputImage, class TKernel>
00073 class ITK_EXPORT ObjectMorphologyImageFilter :
00074 public ImageToImageFilter<TInputImage, TOutputImage>
00075 {
00076 public:
00078 typedef ObjectMorphologyImageFilter Self;
00079 typedef ImageToImageFilter<TInputImage,TOutputImage> Superclass;
00080 typedef SmartPointer<Self> Pointer;
00081 typedef SmartPointer<const Self> ConstPointer;
00082
00084 itkTypeMacro(ObjectMorphologyImageFilter, ImageToImageFilter);
00085
00087 typedef TInputImage InputImageType;
00088 typedef TOutputImage OutputImageType;
00089 typedef typename TInputImage::RegionType RegionType ;
00090 typedef typename TInputImage::SizeType SizeType ;
00091 typedef typename TInputImage::IndexType IndexType ;
00092 typedef typename TInputImage::PixelType PixelType ;
00093 typedef typename Superclass::OutputImageRegionType OutputImageRegionType;
00094
00095 typedef ImageBoundaryCondition<InputImageType> *
00096 ImageBoundaryConditionPointerType;
00097 typedef ImageBoundaryCondition<InputImageType> const *
00098 ImageBoundaryConditionConstPointerType;
00099 typedef ConstantBoundaryCondition<InputImageType>
00100 DefaultBoundaryConditionType;
00101
00103 itkStaticConstMacro(ImageDimension, unsigned int,
00104 TInputImage::ImageDimension);
00105 itkStaticConstMacro(OutputImageDimension, unsigned int,
00106 TOutputImage::ImageDimension );
00107 itkStaticConstMacro(KernelDimension, unsigned int,
00108 TKernel::NeighborhoodDimension);
00110
00112 typedef ConstNeighborhoodIterator<TInputImage>
00113 InputNeighborhoodIteratorType ;
00114
00115 typedef NeighborhoodIterator<TOutputImage>
00116 OutputNeighborhoodIteratorType ;
00117
00119 typedef TKernel KernelType;
00120
00122 typedef typename KernelType::ConstIterator KernelIteratorType ;
00123
00125 typedef typename KernelType::SizeType RadiusType ;
00126
00128 itkSetMacro(Kernel, KernelType);
00129
00131 itkGetConstReferenceMacro(Kernel, KernelType);
00132
00134 itkGetMacro(ObjectValue, PixelType);
00135
00137 itkSetMacro(ObjectValue, PixelType);
00138
00144 void GenerateInputRequestedRegion() ;
00145
00152 void OverrideBoundaryCondition(const ImageBoundaryConditionPointerType i)
00153 { m_BoundaryCondition = i; }
00154
00156 void ResetBoundaryCondition()
00157 { m_BoundaryCondition = &m_DefaultBoundaryCondition; }
00158
00160 itkGetMacro(BoundaryCondition, ImageBoundaryConditionPointerType);
00161
00166 itkSetMacro(UseBoundaryCondition, bool);
00167
00172 itkGetMacro(UseBoundaryCondition, bool);
00173
00174 #ifdef ITK_USE_CONCEPT_CHECKING
00175
00176 itkConceptMacro(SameDimensionCheck1,
00177 (Concept::SameDimension<ImageDimension, OutputImageDimension>));
00178 itkConceptMacro(SameDimensionCheck2,
00179 (Concept::SameDimension<ImageDimension, KernelDimension>));
00180 itkConceptMacro(OutputInputEqualityComparableCheck,
00181 (Concept::EqualityComparable<typename TOutputImage::PixelType,
00182 PixelType>));
00183 itkConceptMacro(InputConvertibleToOutputCheck,
00184 (Concept::Convertible<PixelType, typename TOutputImage::PixelType>));
00185 itkConceptMacro(IntConvertibleToOutputCheck,
00186 (Concept::Convertible<int, typename TOutputImage::PixelType>));
00187 itkConceptMacro(InputEqualityComparable,
00188 (Concept::EqualityComparable<PixelType>));
00189 itkConceptMacro(InputOStreamWritableCheck,
00190 (Concept::OStreamWritable<PixelType>));
00191
00193 #endif
00194
00195 protected:
00196 ObjectMorphologyImageFilter();
00197 ~ObjectMorphologyImageFilter() {};
00198 void PrintSelf(std::ostream& os, Indent indent) const;
00199
00201 void ThreadedGenerateData (const OutputImageRegionType&
00202 outputRegionForThread,
00203 int threadId) ;
00204
00207 virtual void Evaluate(OutputNeighborhoodIteratorType &nit,
00208 const KernelType &kernel)=0;
00209
00213 bool IsObjectPixelOnBoundary(const InputNeighborhoodIteratorType &nit);
00214
00217 ImageBoundaryConditionPointerType m_BoundaryCondition;
00218
00220 DefaultBoundaryConditionType m_DefaultBoundaryCondition;
00221
00223 bool m_UseBoundaryCondition;
00224
00226 KernelType m_Kernel ;
00227
00229 PixelType m_ObjectValue;
00230
00231 void BeforeThreadedGenerateData();
00232
00233 private:
00234 ObjectMorphologyImageFilter(const Self&);
00235 void operator=(const Self&);
00236
00237
00238
00239 } ;
00240
00241 }
00242
00243 #ifndef ITK_MANUAL_INSTANTIATION
00244 #include "itkObjectMorphologyImageFilter.txx"
00245 #endif
00246
00247 #endif
00248