00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkNarrowBandImageFilterBase_h_
00018
#define __itkNarrowBandImageFilterBase_h_
00019
00020
#include "itkFiniteDifferenceImageFilter.h"
00021
#include "itkMultiThreader.h"
00022
#include "itkNarrowBand.h"
00023
#include "itkBarrier.h"
00024
#include "itkObjectStore.h"
00025
00026
namespace itk {
00027
00065
template <
class TInputImage,
class TOutputImage>
00066 class NarrowBandImageFilterBase
00067 :
public FiniteDifferenceImageFilter<TInputImage, TOutputImage>
00068 {
00069
public:
00071
typedef NarrowBandImageFilterBase Self;
00072 typedef FiniteDifferenceImageFilter<TInputImage, TOutputImage> Superclass;
00073 typedef SmartPointer<Self> Pointer;
00074 typedef SmartPointer<const Self> ConstPointer;
00075
00077
itkTypeMacro(
NarrowBandImageFilterBase,
ImageToImageFilter );
00078
00080
typedef typename Superclass::InputImageType
InputImageType;
00081 typedef typename Superclass::OutputImageType
OutputImageType;
00082 typedef typename Superclass::FiniteDifferenceFunctionType
FiniteDifferenceFunctionType;
00083
00086
itkStaticConstMacro(ImageDimension,
unsigned int,Superclass::ImageDimension);
00087
00090
typedef typename Superclass::PixelType
PixelType;
00091
00093
typedef typename Superclass::TimeStepType
TimeStepType;
00094
00096
typedef typename OutputImageType::IndexType
IndexType;
00097
00100
typedef typename OutputImageType::ValueType
ValueType;
00101
00103
typedef BandNode<IndexType,PixelType> BandNodeType;
00104
00106
typedef NarrowBand<BandNodeType> NarrowBandType;
00107 typedef typename NarrowBandType::Pointer
NarrowBandPointer;
00108 typedef typename NarrowBandType::RegionType
RegionType;
00109
00111
itkSetMacro( IsoSurfaceValue,
ValueType);
00112
itkGetMacro( IsoSurfaceValue,
ValueType);
00113
00115
00116
00121
void InsertNarrowBandNode (
BandNodeType &node)
00122 {
00123 m_NarrowBand->PushBack(node);
00124 this->
Modified();
00125 };
00126
void InsertNarrowBandNode (IndexType &index)
00127 {
00128 BandNodeType tmpnode;
00129 tmpnode.
m_Index = index;
00130
m_NarrowBand->PushBack(tmpnode);
00131 this->
Modified();
00132 };
00133
void InsertNarrowBandNode (IndexType &index, PixelType &value,
signed char &nodestate)
00134 {
00135 BandNodeType tmpnode;
00136 tmpnode.
m_Data = value;
00137 tmpnode.
m_Index = index;
00138 tmpnode.
m_NodeState = nodestate;
00139
00140
m_NarrowBand->PushBack(tmpnode);
00141 this->
Modified();
00142 };
00143
00148
void SetNarrowBandTotalRadius (
float val)
00149 {
00150
if (m_NarrowBand->GetTotalRadius() != val)
00151 {
00152
m_NarrowBand->SetTotalRadius(val);
00153 this->
Modified();
00154 }
00155 }
00156
00158
float GetNarrowBandTotalRadius()
00159 {
00160
return m_NarrowBand->GetTotalRadius();
00161 }
00162
00167
void SetNarrowBandInnerRadius (
float val)
00168 {
00169
if (
m_NarrowBand->GetInnerRadius() != val)
00170 {
00171 m_NarrowBand->SetInnerRadius(val);
00172 this->
Modified();
00173 }
00174 }
00175
00177
float GetNarrowBandInnerRadius()
00178 {
00179
return m_NarrowBand->GetInnerRadius();
00180 }
00181
00187
virtual void CreateNarrowBand (){};
00188
00189
virtual void SetNarrowBand(NarrowBandType * ptr)
00190 {
00191
00192 if (
m_NarrowBand != ptr )
00193 {
00194 m_NarrowBand = ptr;
00195 this->
Modified();
00196 }
00197 };
00198
00199
virtual void CopyInputToOutput ();
00200
00201
protected:
00202
typename NarrowBandType::Pointer m_NarrowBand;
00203
NarrowBandImageFilterBase()
00204 {
00205 m_NarrowBand =
NarrowBandType::New();
00206 m_NarrowBand->SetTotalRadius(4);
00207 m_NarrowBand->SetInnerRadius(2);
00208 m_ReinitializationFrequency = 6;
00209
m_IsoSurfaceValue = 0.0;
00210
m_Step = 0;
00211
m_Touched =
false;
00212
m_Barrier =
Barrier::New();
00213 }
00214
00215
virtual ~NarrowBandImageFilterBase() {}
00216
void PrintSelf(std::ostream& os, Indent indent)
const;
00217
00220 struct ThreadRegionType
00221 {
00222
typename NarrowBandType::Iterator first;
00223
typename NarrowBandType::Iterator last;
00224 };
00225
00228 std::vector<RegionType>
m_RegionList;
00229
00232
void GetSplitRegion (
int i,
ThreadRegionType &splitRegion);
00233
00238
virtual void Initialize();
00239
00244
virtual void InitializeIteration();
00245
00248
virtual void PostProcessOutput();
00249
00250
00251
void ClearNarrowBand ();
00252
00254
void WaitForAll();
00255
00259
virtual void GenerateData();
00260
00261
00262
unsigned int m_ReinitializationFrequency;
00263
unsigned int m_Step;
00264
bool m_Touched;
00265
bool *
m_TouchedForThread;
00266
ValueType m_IsoSurfaceValue;
00267
00268 typename Barrier::Pointer m_Barrier;
00269
00270 private:
00271 NarrowBandImageFilterBase(
const Self&);
00272
void operator=(
const Self&);
00273
00276
struct NarrowBandImageFilterBaseThreadStruct
00277 {
00278
NarrowBandImageFilterBase *Filter;
00279
TimeStepType TimeStep;
00280
TimeStepType *TimeStepList;
00281
bool *ValidTimeStepList;
00282 };
00283
00284
00285
00286
00287
00288
00289
virtual void AllocateUpdateBuffer() {};
00290
00291
00293
static ITK_THREAD_RETURN_TYPE IterateThreaderCallback(
void *arg );
00294
00298
virtual void ThreadedIterate(
void *arg,
int threadId);
00299
00303
virtual void ThreadedApplyUpdate(TimeStepType dt,
00304
const ThreadRegionType ®ionToProcess,
00305
int threadId);
00306
virtual void ApplyUpdate(TimeStepType){}
00307
00311
virtual TimeStepType ThreadedCalculateChange(
const ThreadRegionType ®ionToProcess,
00312
int threadId);
00313
virtual TimeStepType CalculateChange() {
return 0;}
00314
00315 };
00316
00317 }
00318
00319
#ifndef ITK_MANUAL_INSTANTIATION
00320
#include "itkNarrowBandImageFilterBase.txx"
00321
#endif
00322
00323
#endif