Slicer  4.11
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
itkGrowCutSegmentationImageFilter.h
Go to the documentation of this file.
1 #ifndef itkGrowCutSegmentationImageFilter_h
2 #define itkGrowCutSegmentationImageFilter_h
3 
4 #include "itkImage.h"
5 #include "itkImageToImageFilter.h"
6 #include "itkSimpleDataObjectDecorator.h"
7 #include "itkVectorContainer.h"
8 //#include "itkCommand.h"
9 
10 //#include "itkGrowCutSegmentationUpdateFilter.h"
11 
12 #include <iostream>
13 #include <list>
14 #include <vector>
15 
16 #ifndef PixelState
18  UNLABELED = 0,
19  LABELED = 1,
21  SATURATED = 3 };
22 #endif
23 
24 namespace itk
25 {
26 
52 /* template<class TInputImage, */
53 /* class TOutputImage, class TLabelPixelType = short, */
54 /* class TWeightPixelType = float > */
55 template<class TInputImage,
56  class TOutputImage,
57  class TWeightPixelType = float>
58  class GrowCutSegmentationImageFilter: public ImageToImageFilter<TInputImage,TOutputImage>
59 {
60 
61  public:
64  typedef ImageToImageFilter<TInputImage,TOutputImage> Superclass;
65  typedef SmartPointer<Self> Pointer;
66  typedef SmartPointer<const Self> ConstPointer;
67 
70 
73  ImageToImageFilter);
74 
76  itkStaticConstMacro(ImageDimension, unsigned int,
77  TInputImage::ImageDimension );
78 
79  typedef TInputImage InputImageType;
80  typedef typename InputImageType::Pointer InputImagePointer;
81  typedef typename InputImageType::ConstPointer InputImageConstPointer;
82 
83  typedef typename InputImageType::PixelType InputPixelType;
84  typedef typename InputImageType::IndexType InputIndexType;
85  typedef typename InputImageType::SizeType SizeType;
86 
87  typedef TOutputImage OutputImageType;
88  typedef typename OutputImageType::Pointer OutputImagePointer;
89  typedef typename OutputImageType::RegionType OutputImageRegionType;
90  typedef typename OutputImageType::PixelType OutputPixelType;
91  typedef typename OutputImageType::IndexType OutputIndexType;
92  typedef typename InputImageType::SizeType OutputSizeType;
93 
94 
96  typedef typename DataObject::Pointer DataObjectPointer;
97 
98 
100  itkStaticConstMacro(InputImageDimension, unsigned int,
101  TInputImage::ImageDimension);
102  itkStaticConstMacro(OutputImageDimension, unsigned int,
103  TOutputImage::ImageDimension);
104 
106  typedef Index<itkGetStaticConstMacro(InputImageDimension)> IndexType;
107 
109  typedef typename InputImageType::SizeType InputSizeType;
110 
111  /* NodeContainer typedef support for storing a set of seed points */
112  typedef VectorContainer<unsigned int, IndexType> NodeContainer;
113 
114  /* NodeContainer pointer support */
115  typedef typename NodeContainer::Pointer NodeContainerPointer;
116 
122 
123 
125  /* indicates the strength of a label for a given cell */
126  typedef Image<TWeightPixelType, itkGetStaticConstMacro(InputImageDimension) > WeightImageType;
127 
129  typedef typename WeightImageType::Pointer WeightImagePointer;
130 
131  typedef TWeightPixelType WeightPixelType;
132 
134  void SetInputImage( const InputImageType *in)
135  {
136  this->ProcessObject::SetNthInput(0, const_cast< InputImageType *>(in) );
137  }
138 
140 
143  {
144  this->ProcessObject::SetNthInput(1, const_cast< OutputImageType *>(f) );
145  m_LabelImage = static_cast< OutputImageType *>(this->ProcessObject::GetInput(1));
146  }
147 
149 
152 
155  {
156  this->ProcessObject::SetNthInput(2,const_cast< WeightImageType *>(w));
157  //m_WeightImage = static_cast< WeightImageType *>(this->ProcessObject::GetInput(2));
158  }
159 
161 
163  void SetStateImage( const OutputImageType *l);
165 
166  void SetDistancesImage( const WeightImageType *d);
168 
169  void SetMaxSaturationImage( const WeightImageType *w);
171 
173  itkSetMacro( SeedStrength, double );
174 
176  itkGetConstMacro( SeedStrength, double );
177 
179  itkSetMacro( Labeled, unsigned int);
180  itkGetMacro( Labeled, unsigned int);
181 
183  itkSetMacro( LocallySaturated, unsigned int);
184  itkGetMacro( LocallySaturated, unsigned int);
185 
187  itkSetMacro( Saturated, unsigned int);
188  itkGetMacro( Saturated, unsigned int);
189 
191  itkSetMacro( MaxIterations, unsigned int );
192 
194  itkGetConstMacro( MaxIterations, unsigned int );
195 
197  itkSetMacro( ObjectRadius, unsigned int );
198 
200  itkGetConstMacro( ObjectRadius, unsigned int );
201 
203  void SetROIStart( const OutputIndexType &start)
204  {
205  m_RoiStart = start;
206  }
207 
209  {
210  return m_RoiStart;
211  }
212 
213 
214  void SetROIEnd(const OutputIndexType &end)
215  {
216  m_RoiEnd = end;
217  }
218 
219 
221  {
222  return m_RoiEnd;
223  }
224 
226  itkSetMacro( Radius, InputSizeType );
227 
229  itkGetConstMacro( Radius, InputSizeType );
230 
234  itkSetMacro(RunOneIteration, bool);
235  itkGetConstMacro(RunOneIteration, bool);
236  itkBooleanMacro(RunOneIteration);
237 
238 
246 
251  itkSetMacro(SetStateImage, bool);
254 
262 
263  protected:
264 
266  ~GrowCutSegmentationImageFilter() override = default;
267 
268  // Override since the filter needs all the data for the algorithm
269  void GenerateInputRequestedRegion() override;
270 
271  // Override since the filter produces the entire dataset
272  void EnlargeOutputRequestedRegion(DataObject *output) override;
273 
274  void GenerateData() override;
275 
276  void ThreadedGenerateData( const OutputImageRegionType &outputRegionForThread ,
277  ThreadIdType threadId ) override;
278 
279  void AfterThreadedGenerateData() override;
280 
281  void Initialize(OutputImageType* output);
282 
283  void PrintSelf ( std::ostream& os, Indent indent ) const override;
284 
285  void GrowCutSlowROI( TOutputImage *);
286 
287 
288  private:
289 
290  GrowCutSegmentationImageFilter(const Self&); //purposely not implemented
291  void operator=(const Self&); // purposely not implemented
292 
293  bool InitializeStateImage( OutputImageType *state );
294 
295  void InitializeDistancesImage(TInputImage *input,WeightImageType *distance);
296 
297  void GetRegionOfInterest();
298 
299  void ComputeLabelVolumes(TOutputImage *outputImage, std::vector< unsigned > &volumes, std::vector< unsigned > &phyVolumes);
300 
301  void MaskSegmentedImageByWeight(float upperThresh);
302 
303 
304  WeightPixelType m_ConfThresh;
305  InputSizeType m_Radius;
306  OutputImagePointer m_LabelImage;
307  WeightImagePointer m_WeightImage;
308  unsigned int m_Labeled;
309  unsigned int m_LocallySaturated;
310  unsigned int m_Saturated;
311 
312  double m_SeedStrength;
313  bool m_RunOneIteration;
314  bool m_SetStateImage;
315  bool m_SetDistancesImage;
316  bool m_SetMaxSaturationImage;
317 
318  unsigned int m_MaxIterations;
319  unsigned int m_ObjectRadius;
320 
321  OutputPixelType m_ObjectLabel;
322  OutputPixelType m_BackgroundLabel;
323  OutputPixelType m_UnknownLabel;
324 
325  OutputIndexType m_RoiStart;
326  OutputIndexType m_RoiEnd;
327 
328 };
329 
330 } // namespace itk
331 
332 
333 #ifndef ITK_MANUAL_INSTANTIATION
334 #include "itkGrowCutSegmentationImageFilter.txx"
335 #endif
336 
337 #endif
const WeightImagePointer GetStrengthImage()
void SetStateImage(const OutputImageType *l)
Simplified inverse ITK transforms.
const OutputImagePointer GetLabelImage()
Image< TWeightPixelType, itkGetStaticConstMacro(InputImageDimension) > WeightImageType
const WeightImagePointer GetMaxSaturationImage()
~GrowCutSegmentationImageFilter() override=default
void ThreadedGenerateData(const OutputImageRegionType &outputRegionForThread, ThreadIdType threadId) override
const InputImagePointer GetInputImage()
itkStaticConstMacro(ImageDimension, unsigned int, TInputImage::ImageDimension)
itkGetMacro(Labeled, unsigned int)
void SetMaxSaturationImage(const WeightImageType *w)
void GrowCutSlowROI(TOutputImage *)
itkGetConstMacro(SeedStrength, double)
itkTypeMacro(GrowCutSegmentationImageFilter, ImageToImageFilter)
ImageToImageFilter< TInputImage, TOutputImage > Superclass
void EnlargeOutputRequestedRegion(DataObject *output) override
Index< itkGetStaticConstMacro(InputImageDimension)> IndexType
void GenerateInputRequestedRegion() override
const OutputImagePointer GetStateImage()
const WeightImagePointer GetDistancesImage()
VectorContainer< unsigned int, IndexType > NodeContainer
const WeightImagePointer GetUpdatedStrengthImage()
void SetROIStart(const OutputIndexType &start)
void SetDistancesImage(const WeightImageType *d)
void PrintSelf(std::ostream &os, Indent indent) const override
void Initialize(OutputImageType *output)
itkSetMacro(SeedStrength, double)