Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __itkLabelContourImageFilter_h
00019 #define __itkLabelContourImageFilter_h
00020
00021 #include "itkInPlaceImageFilter.h"
00022 #include "itkImage.h"
00023 #include "itkConceptChecking.h"
00024 #include <vector>
00025 #include <map>
00026 #include "itkProgressReporter.h"
00027 #include "itkBarrier.h"
00028
00029 namespace itk
00030 {
00031
00052 template <class TInputImage, class TOutputImage>
00053 class ITK_EXPORT LabelContourImageFilter :
00054 public InPlaceImageFilter< TInputImage, TOutputImage >
00055 {
00056 public:
00060 typedef LabelContourImageFilter Self;
00061 typedef InPlaceImageFilter< TInputImage, TOutputImage > Superclass;
00062
00066 typedef typename Superclass::InputImagePointer InputImagePointer;
00067
00072 typedef typename TOutputImage::PixelType OutputPixelType;
00073 typedef typename TOutputImage::InternalPixelType OutputInternalPixelType;
00074 typedef typename TInputImage::PixelType InputPixelType;
00075 typedef typename TInputImage::InternalPixelType InputInternalPixelType;
00076
00077 itkStaticConstMacro(ImageDimension, unsigned int,
00078 TOutputImage::ImageDimension);
00079 itkStaticConstMacro(OutputImageDimension, unsigned int,
00080 TOutputImage::ImageDimension);
00081 itkStaticConstMacro(InputImageDimension, unsigned int,
00082 TInputImage::ImageDimension);
00083
00087 typedef TInputImage InputImageType;
00088 typedef typename TInputImage::IndexType IndexType;
00089 typedef typename TInputImage::SizeType SizeType;
00090 typedef typename TInputImage::OffsetType OffsetType;
00091 typedef typename TInputImage::PixelType InputImagePixelType;
00092 typedef typename TInputImage::SizeValueType SizeValueType;
00093 typedef typename TInputImage::OffsetValueType OffsetValueType;
00094
00095 typedef TOutputImage OutputImageType;
00096 typedef typename TOutputImage::RegionType RegionType;
00097 typedef typename TOutputImage::IndexType OutputIndexType;
00098 typedef typename TOutputImage::SizeType OutputSizeType;
00099 typedef typename TOutputImage::OffsetType OutputOffsetType;
00100 typedef typename TOutputImage::PixelType OutputImagePixelType;
00101
00102 typedef std::list<IndexType> ListType;
00103
00107 typedef SmartPointer<Self> Pointer;
00108 typedef SmartPointer<const Self> ConstPointer;
00109
00113 itkTypeMacro(LabelContourImageFilter, ImageToImageFilter);
00114
00118 itkNewMacro(Self);
00119
00126 itkSetMacro(FullyConnected, bool);
00127 itkGetConstReferenceMacro(FullyConnected, bool);
00128 itkBooleanMacro(FullyConnected);
00130
00131
00132 itkConceptMacro(SameDimension,
00133 (Concept::SameDimension<itkGetStaticConstMacro(InputImageDimension),
00134 itkGetStaticConstMacro(OutputImageDimension)>));
00135
00140 itkSetMacro(BackgroundValue, OutputImagePixelType);
00141 itkGetConstMacro(BackgroundValue, OutputImagePixelType);
00143
00144 protected:
00145 LabelContourImageFilter()
00146 {
00147 m_FullyConnected = false;
00148 m_BackgroundValue = NumericTraits< OutputImagePixelType >::Zero;
00149 m_NumberOfThreads = 0;
00150 this->SetInPlace( false );
00151 }
00152 virtual ~LabelContourImageFilter() {}
00153 LabelContourImageFilter(const Self&) {}
00154 void PrintSelf(std::ostream& os, Indent indent) const;
00155
00159 void BeforeThreadedGenerateData ();
00160 void AfterThreadedGenerateData ();
00161 void ThreadedGenerateData (const RegionType& outputRegionForThread, int threadId);
00163
00167 void GenerateInputRequestedRegion();
00168
00173 void EnlargeOutputRequestedRegion(DataObject *itkNotUsed(output));
00174
00175 private:
00176 OutputImagePixelType m_BackgroundValue;
00177 bool m_FullyConnected;
00178
00179
00180 typedef typename TOutputImage::RegionType::SizeType OutSizeType;
00181
00182
00183 class runLength
00184 {
00185 public:
00186
00187 long int length;
00188 typename InputImageType::IndexType where;
00189 InputImagePixelType label;
00190 };
00191
00192 typedef std::vector<runLength> lineEncoding;
00193
00194
00195 typedef std::vector<lineEncoding> LineMapType;
00196
00197 typedef std::vector<long> OffsetVec;
00198
00199
00200 typedef std::vector<unsigned long int> UnionFindType;
00201
00202 bool CheckNeighbors(const OutputIndexType &A,
00203 const OutputIndexType &B);
00204
00205 void CompareLines(lineEncoding ¤t, const lineEncoding &Neighbour);
00206
00207
00208 void SetupLineOffsets(OffsetVec &LineOffsets);
00209
00210 void Wait()
00211 {
00212 if( m_NumberOfThreads > 1 )
00213 {
00214 m_Barrier->Wait();
00215 }
00216 }
00217
00218 typename Barrier::Pointer m_Barrier;
00219 LineMapType m_LineMap;
00220 long m_NumberOfThreads;
00221 };
00222
00223 }
00224
00225 #ifndef ITK_MANUAL_INSTANTIATION
00226 #include "itkLabelContourImageFilter.txx"
00227 #endif
00228
00229 #endif
00230