18 #ifndef __itkFastMarchingUpwindGradientImageFilter_txx
19 #define __itkFastMarchingUpwindGradientImageFilter_txx
23 #include "itkNumericTraits.h"
24 #include "vnl/vnl_math.h"
34 template <
class TLevelSet,
class TSpeedImage>
38 m_TargetPoints =
NULL;
39 m_ReachedTargetPoints =
NULL;
40 m_GradientImage = GradientImageType::New();
41 m_GenerateGradientImage =
false;
43 m_TargetReachedMode = NoTargets;
45 m_NumberOfTargets = 0;
52 template <
class TLevelSet,
class TSpeedImage>
57 Superclass::PrintSelf(os,indent);
58 os << indent <<
"Target points: " << m_TargetPoints.GetPointer() << std::endl;
59 os << indent <<
"Reached points: " << m_ReachedTargetPoints.GetPointer() << std::endl;
60 os << indent <<
"Gradient image: " << m_GradientImage.GetPointer() << std::endl;
61 os << indent <<
"Generate gradient image: " << m_GenerateGradientImage << std::endl;
62 os << indent <<
"Number of targets: " << m_NumberOfTargets << std::endl;
63 os << indent <<
"Target offset: " << m_TargetOffset << std::endl;
64 os << indent <<
"Target reach mode: " << m_TargetReachedMode << std::endl;
65 os << indent <<
"Target value: " << m_TargetValue << std::endl;
71 template <
class TLevelSet,
class TSpeedImage>
76 Superclass::Initialize(output);
79 if (m_GenerateGradientImage)
81 m_GradientImage->CopyInformation( this->GetInput() );
82 m_GradientImage->SetBufferedRegion( output->GetBufferedRegion() );
83 m_GradientImage->Allocate();
87 if (m_GenerateGradientImage)
91 GradientIterator gradientIt( m_GradientImage,
92 m_GradientImage->GetBufferedRegion() );
97 for ( gradientIt.GoToBegin(); !gradientIt.IsAtEnd(); ++gradientIt )
99 gradientIt.Set( zeroGradient );
107 if ( m_TargetReachedMode == SomeTargets || m_TargetReachedMode == AllTargets)
109 m_ReachedTargetPoints = NodeContainer::New();
115 template <
class TLevelSet,
class TSpeedImage>
123 double stoppingValue = this->GetStoppingValue();
128 Superclass::GenerateData();
137 this->SetStoppingValue( stoppingValue );
142 this->SetStoppingValue( stoppingValue );
146 template <
class TLevelSet,
class TSpeedImage>
154 Superclass::UpdateNeighbors(index,speedImage,output);
156 if (m_GenerateGradientImage)
158 this->ComputeGradient(index, output, this->GetLabelImage(), m_GradientImage);
165 if( m_TargetReachedMode != NoTargets && m_TargetPoints )
167 bool targetReached =
false;
169 if (m_TargetReachedMode == OneTarget)
173 for (; pointsIter != pointsEnd; ++pointsIter )
175 node = pointsIter.
Value();
176 if (node.GetIndex() == index)
178 targetReached =
true;
183 else if (m_TargetReachedMode == SomeTargets)
187 for (; pointsIter != pointsEnd; ++pointsIter )
189 node = pointsIter.
Value();
191 if (node.GetIndex() == index)
193 m_ReachedTargetPoints->InsertElement(m_ReachedTargetPoints->Size(),node);
198 if (static_cast<long>(m_ReachedTargetPoints->Size()) == m_NumberOfTargets)
200 targetReached =
true;
203 else if (m_TargetReachedMode == AllTargets)
207 for (; pointsIter != pointsEnd; ++pointsIter )
209 node = pointsIter.
Value();
211 if (node.GetIndex() == index)
213 m_ReachedTargetPoints->InsertElement(m_ReachedTargetPoints->Size(),node);
218 if (m_ReachedTargetPoints->Size() == m_TargetPoints->Size())
220 targetReached =
true;
226 m_TargetValue =
static_cast<double>(output->GetPixel(index));
227 double newStoppingValue = m_TargetValue + m_TargetOffset;
228 if (newStoppingValue < this->GetStoppingValue())
234 this->SetStoppingValue(newStoppingValue);
240 m_TargetValue =
static_cast<double>(output->GetPixel(index));
247 template <
class TLevelSet,
class TSpeedImage>
256 typedef typename TLevelSet::PixelType LevelSetPixelType;
257 LevelSetPixelType centerPixel;
258 LevelSetPixelType dx_forward;
259 LevelSetPixelType dx_backward;
265 const LevelSetPixelType
ZERO =
270 unsigned int xStride[itkGetStaticConstMacro(SetDimension)];
272 for (
unsigned int j = 0; j < SetDimension; j++ )
274 centerPixel = output->GetPixel(index);
284 neighIndex[j] = index[j] - xStride[j];
286 if(! (neighIndex[j] > lastIndex[j] ||
287 neighIndex[j] < startIndex[j]) )
289 if ( this->GetLabelImage()->GetPixel( neighIndex ) == Superclass::AlivePoint )
291 dx_backward = centerPixel - output->GetPixel( neighIndex );
296 neighIndex[j] = index[j] + xStride[j];
298 if(! (neighIndex[j] > lastIndex[j] ||
299 neighIndex[j] < startIndex[j]) )
301 if ( this->GetLabelImage()->GetPixel( neighIndex ) == Superclass::AlivePoint )
303 dx_forward = output->GetPixel( neighIndex ) - centerPixel;
308 if (vnl_math_max(dx_backward,-dx_forward) < ZERO)
310 gradientPixel[j] =
ZERO;
312 else if (dx_backward > -dx_forward)
314 gradientPixel[j] = dx_backward;
318 gradientPixel[j] = dx_forward;
321 gradientPixel[j] /= spacing[j];
324 gradientImage->
SetPixel( index, gradientPixel );