00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkWatershedImageFilter_h
00018
#define __itkWatershedImageFilter_h
00019
00020
#if defined(_MSC_VER)
00021
#pragma warning ( disable : 4786 )
00022
#endif
00023
00024
#include "itkImageToImageFilter.h"
00025
#include "itkImage.h"
00026
#include "itkWatershedSegmenter.h"
00027
#include "itkWatershedSegmentTreeGenerator.h"
00028
#include "itkWatershedRelabeler.h"
00029
#include "itkWatershedMiniPipelineProgressCommand.h"
00030
00031
namespace itk
00032 {
00151
template <
class TInputImage>
00152 class ITK_EXPORT WatershedImageFilter :
00153
public ImageToImageFilter< TInputImage, Image<unsigned long,
00154 ::itk::GetImageDimension<TInputImage>::ImageDimension> >
00155 {
00156
public:
00158 typedef WatershedImageFilter
Self;
00159
00161 typedef TInputImage
InputImageType;
00162
00164
itkStaticConstMacro (ImageDimension,
unsigned int,
00165 TInputImage::ImageDimension);
00166
00168 typedef Image<unsigned long, itkGetStaticConstMacro(ImageDimension)> OutputImageType;
00169
00171 typedef typename InputImageType::RegionType
RegionType;
00172 typedef typename InputImageType::SizeType
SizeType;
00173 typedef typename InputImageType::IndexType
IndexType;
00174
00176 typedef ImageToImageFilter< InputImageType, OutputImageType > Superclass;
00177
00179 typedef typename InputImageType::PixelType
ScalarType;
00180
00182 typedef SmartPointer<Self> Pointer;
00183
00185
itkTypeMacro(WatershedImageFilter,
ImageToImageFilter);
00186
00188
itkNewMacro(
Self);
00189
00191
void GenerateData();
00192
00195 void SetInput(
const InputImageType *input)
00196 {
00197
00198 this->ProcessObject::SetNthInput(0,
00199 const_cast<InputImageType *>( input ) );
00200 m_Segmenter->SetInputImage(
00201 const_cast<InputImageType *>( input ) );
00202 }
00203
00204
virtual void SetInput(
unsigned int i,
const TInputImage * image)
00205 {
00206
if (i != 0)
00207 {
itkExceptionMacro(<<
"Filter has only one input."); }
00208
else
00209 { this->SetInput(image); }
00210 }
00213
void SetThreshold(
double);
00214
itkGetMacro(Threshold,
double);
00215
00218
void SetLevel(
double);
00219
itkGetMacro(Level,
double);
00220
00222
typename watershed::Segmenter<InputImageType>::OutputImageType *
00223 GetBasicSegmentation()
00224 {
00225
return m_Segmenter->GetOutputImage();
00226 }
00227
00229
typename watershed::SegmentTreeGenerator<ScalarType>::SegmentTreeType *
00230 GetSegmentTree()
00231 {
00232
return m_TreeGenerator->GetOutputSegmentTree();
00233 }
00234
00235
00236
void EnlargeOutputRequestedRegion(
DataObject *data);
00237
00238
protected:
00239 WatershedImageFilter();
00240
virtual ~WatershedImageFilter() {}
00241 WatershedImageFilter(
const Self&) {}
00242
void operator=(
const Self&) {}
00243 void PrintSelf(std::ostream& os,
Indent indent)
const;
00244
00245 private:
00249
double m_Threshold;
00250
00254
double m_Level;
00255
00260
typename watershed::Segmenter<InputImageType>::Pointer m_Segmenter;
00261
typename watershed::SegmentTreeGenerator<ScalarType>::Pointer m_TreeGenerator;
00262
typename watershed::Relabeler<ScalarType, itkGetStaticConstMacro(ImageDimension)>::Pointer m_Relabeler;
00263
00264
unsigned long m_ObserverTag;
00265
bool m_FirstExecution;
00266 };
00267
00268 }
00269
00270
#ifndef ITK_MANUAL_INSTANTIATION
00271
#include "itkWatershedImageFilter.txx"
00272
#endif
00273
00274
#endif