17 #ifndef __itkFiniteDifferenceImageFilter_txx
18 #define __itkFiniteDifferenceImageFilter_txx
28 template <
class TInputImage,
class TOutputImage>
32 m_UseImageSpacing =
false;
33 m_ElapsedIterations = 0;
34 m_DifferenceFunction = 0;
36 m_MaximumRMSError = 0.0;
38 m_State = UNINITIALIZED;
39 m_ManualReinitialization =
false;
43 template <
class TInputImage,
class TOutputImage>
49 template <
class TInputImage,
class TOutputImage>
58 itkWarningMacro(
"Output pixel type MUST be float or double to prevent computational errors");
61 if (this->GetState() == UNINITIALIZED)
64 this->AllocateOutputs();
68 this->CopyInputToOutput();
71 this->InitializeFunctionCoefficients();
78 this->AllocateUpdateBuffer();
80 this->SetStateToInitialized();
81 m_ElapsedIterations = 0;
87 while ( ! this->Halt() )
89 this->InitializeIteration();
92 dt = this->CalculateChange();
93 this->ApplyUpdate(dt);
94 ++m_ElapsedIterations;
98 if( this->GetAbortGenerateData() )
101 this->ResetPipeline();
106 if (m_ManualReinitialization ==
false)
108 this->SetStateToUninitialized();
112 this->PostProcessOutput();
118 template <
class TInputImage,
class TOutputImage>
125 Superclass::GenerateInputRequestedRegion();
129 const_cast< TInputImage *
>( this->GetInput());
138 RadiusType radius = this->GetDifferenceFunction()->GetRadius();
148 typename TInputImage::RegionType inputRequestedRegion;
149 inputRequestedRegion = inputPtr->GetRequestedRegion();
152 inputRequestedRegion.PadByRadius( radius );
158 if ( inputRequestedRegion.Crop(inputPtr->GetLargestPossibleRegion()) )
160 inputPtr->SetRequestedRegion( inputRequestedRegion );
169 inputPtr->SetRequestedRegion( inputRequestedRegion );
174 e.
SetDescription(
"Requested region is (at least partially) outside the largest possible region.");
181 template <
class TInputImage,
class TOutputImage>
192 for (
int i = 0; i < size; ++i)
196 min = timeStepList[i];
208 for (
int i = 0; i < size; ++i)
209 {
if ( valid[i] && (timeStepList[i] < min) ) min = timeStepList[i]; }
214 template <
class TInputImage,
class TOutputImage>
219 if (m_NumberOfIterations != 0)
221 this->UpdateProgress( static_cast<float>( this->GetElapsedIterations() ) /
222 static_cast<float>( m_NumberOfIterations ) );
225 if (this->GetElapsedIterations() >= m_NumberOfIterations)
229 else if ( this->GetElapsedIterations() == 0)
233 else if ( this->GetMaximumRMSError() > m_RMSChange )
244 template <
class TInputImage,
class TOutputImage>
250 double coeffs[TOutputImage::ImageDimension];
252 if ( this->m_UseImageSpacing )
254 const TOutputImage * outputImage = this->GetOutput();
255 if( outputImage ==
NULL )
257 itkExceptionMacro(
"Output image is NULL");
260 typedef typename TOutputImage::SpacingType SpacingType;
261 const SpacingType spacing = outputImage->GetSpacing();
263 for (
unsigned int i = 0; i < TOutputImage::ImageDimension; i++)
265 coeffs[i] = 1.0 / spacing[i];
270 for (
unsigned int i = 0; i < TOutputImage::ImageDimension; i++)
275 m_DifferenceFunction->SetScaleCoefficients(coeffs);
278 template <
class TInputImage,
class TOutputImage>
283 Superclass::PrintSelf(os, indent);
285 os << indent <<
"ElapsedIterations: " << m_ElapsedIterations << std::endl;
286 os << indent <<
"UseImageSpacing: " << (m_UseImageSpacing ?
"On" :
"Off") << std::endl;
287 os << indent <<
"State: " << m_State << std::endl;
288 os << indent <<
"MaximumRMSError: " << m_MaximumRMSError << std::endl;
289 os << indent <<
"NumberOfIterations: " << m_NumberOfIterations << std::endl;
290 os << indent <<
"ManualReinitialization: " << m_ManualReinitialization << std::endl;
291 os << indent <<
"RMSChange: " << m_RMSChange << std::endl;
293 if (m_DifferenceFunction)
295 os << indent <<
"DifferenceFunction: " << std::endl;
300 os << indent <<
"DifferenceFunction: " <<
"(None)" << std::endl;