00001 #ifndef __itkReconstructionImageFilter_h
00002 #define __itkReconstructionImageFilter_h
00003
00004 #include "itkImageToImageFilter.h"
00005 #include "itkConstShapedNeighborhoodIterator.h"
00006 #include "itkShapedNeighborhoodIterator.h"
00007 #include "itkImageRegionConstIterator.h"
00008 #include "itkImageRegionIterator.h"
00009 #include "itkProgressReporter.h"
00010 #include <queue>
00011
00012
00013
00014 #define COPY
00015
00016 #ifdef FACES
00017 #include "itkNeighborhoodAlgorithm.h"
00018 #endif
00019
00020 #ifdef COPY
00021 #include "itkNeighborhoodAlgorithm.h"
00022 #endif
00023
00024 namespace itk {
00025
00043 template<class TInputImage, class TOutputImage, class TCompare>
00044 class ITK_EXPORT ReconstructionImageFilter :
00045 public ImageToImageFilter<TInputImage, TOutputImage>
00046 {
00047 public:
00049 typedef ReconstructionImageFilter Self;
00050 typedef ImageToImageFilter<TInputImage, TOutputImage>
00051 Superclass;
00052 typedef SmartPointer<Self> Pointer;
00053 typedef SmartPointer<const Self> ConstPointer;
00054
00056 typedef TInputImage InputImageType;
00057 typedef TInputImage MarkerImageType;
00058 typedef TInputImage MaskImageType;
00059 typedef TOutputImage OutputImageType;
00060 typedef typename InputImageType::SizeType ISizeType;
00061 typedef typename MarkerImageType::Pointer MarkerImagePointer;
00062 typedef typename MarkerImageType::ConstPointer MarkerImageConstPointer;
00063 typedef typename MarkerImageType::RegionType MarkerImageRegionType;
00064 typedef typename MarkerImageType::PixelType MarkerImagePixelType;
00065 typedef typename InputImageType::PixelType InputImagePixelType;
00066 typedef typename InputImageType::IndexType InputImageIndexType;
00067 typedef typename MaskImageType::Pointer MaskImagePointer;
00068 typedef typename MaskImageType::ConstPointer MaskImageConstPointer;
00069 typedef typename MaskImageType::RegionType MaskImageRegionType;
00070 typedef typename MaskImageType::PixelType MaskImagePixelType;
00071 typedef typename OutputImageType::Pointer OutputImagePointer;
00072 typedef typename OutputImageType::ConstPointer OutputImageConstPointer;
00073 typedef typename OutputImageType::RegionType OutputImageRegionType;
00074 typedef typename OutputImageType::PixelType OutputImagePixelType;
00075 typedef typename OutputImageType::IndexType OutputImageIndexType;
00076
00080 itkStaticConstMacro(MarkerImageDimension, unsigned int,
00081 TInputImage::ImageDimension);
00082 itkStaticConstMacro(MaskImageDimension, unsigned int,
00083 TInputImage::ImageDimension);
00084 itkStaticConstMacro(OutputImageDimension, unsigned int,
00085 TOutputImage::ImageDimension);
00087
00089 itkNewMacro(Self);
00090
00092 itkTypeMacro(ReconstructionImageFilter,
00093 ImageToImageFilter);
00094
00100 void SetMarkerImage(const MarkerImageType *);
00101 const MarkerImageType* GetMarkerImage();
00103
00107 void SetMaskImage(const MaskImageType *);
00108 const MaskImageType* GetMaskImage();
00110
00111
00118 itkSetMacro(FullyConnected, bool);
00119 itkGetConstReferenceMacro(FullyConnected, bool);
00120 itkBooleanMacro(FullyConnected);
00122
00126 itkSetMacro(MarkerValue, typename TInputImage::PixelType);
00127 itkGetConstReferenceMacro(MarkerValue, typename TInputImage::PixelType);
00129
00130
00131 protected:
00132 ReconstructionImageFilter();
00133 ~ReconstructionImageFilter() {};
00134 void PrintSelf(std::ostream& os, Indent indent) const;
00135
00139 void GenerateInputRequestedRegion() ;
00140
00142 void EnlargeOutputRequestedRegion(DataObject *itkNotUsed(output));
00143
00144 void GenerateData();
00145
00146
00147 private:
00148 ReconstructionImageFilter(const Self&);
00149 void operator=(const Self&);
00150 typename TInputImage::PixelType m_MarkerValue;
00151 bool m_FullyConnected;
00152
00153 #ifdef FACES
00154 TCompare compare;
00155
00156
00157
00158 typedef typename std::queue<OutputImageIndexType> FifoType;
00159
00160 typedef typename itk::NeighborhoodAlgorithm::ImageBoundaryFacesCalculator<OutputImageType> FaceCalculatorType;
00161
00162 typedef typename FaceCalculatorType::FaceListType FaceListType;
00163 typedef typename FaceCalculatorType::FaceListType::iterator FaceListTypeIt;
00164
00165 void processRegion(ProgressReporter &progress,
00166 const OutputImageRegionType thisRegion,
00167 const ISizeType kernelRadius,
00168 MarkerImageConstPointer markerImage,
00169 MaskImageConstPointer maskImage,
00170 OutputImagePointer &output,
00171 FifoType &IndexFifo);
00172
00173 void buildFifo(ProgressReporter &progress,
00174 const OutputImageRegionType thisRegion,
00175 OutputImagePointer &output,
00176 FifoType &IndexFifo);
00177
00178 void processFifo(ProgressReporter &progress,
00179 const OutputImageRegionType thisRegion,
00180 const ISizeType kernelRadius,
00181 MarkerImageConstPointer markerImage,
00182 MaskImageConstPointer maskImage,
00183 OutputImagePointer &output,
00184 FifoType &IndexFifo);
00185
00186 void fillFaces(FaceListType faceList,
00187 OutputImagePointer &output);
00188
00189 void copyFaces(FaceListType faceList,
00190 MarkerImageConstPointer markerImage,
00191 OutputImagePointer &output);
00192
00193 #endif
00194
00195 #ifdef COPY
00196 typedef typename itk::NeighborhoodAlgorithm::ImageBoundaryFacesCalculator<OutputImageType> FaceCalculatorType;
00197
00198 typedef typename FaceCalculatorType::FaceListType FaceListType;
00199 typedef typename FaceCalculatorType::FaceListType::iterator FaceListTypeIt;
00200 #endif
00201 typedef ImageRegionConstIterator<InputImageType> InputIteratorType;
00202 typedef ImageRegionIterator<OutputImageType> OutputIteratorType;
00203
00204 typedef typename OutputImageType::IndexType OutIndexType;
00205 typedef typename InputImageType::IndexType InIndexType;
00206 typedef ConstShapedNeighborhoodIterator<InputImageType> CNInputIterator;
00207 typedef ShapedNeighborhoodIterator<OutputImageType> NOutputIterator;
00208
00209 } ;
00210
00211 }
00212
00213 #ifndef ITK_MANUAL_INSTANTIATION
00214 #include "itkReconstructionImageFilter.txx"
00215 #endif
00216
00217
00218 #endif
00219