18 #ifndef __itkMultiphaseFiniteDifferenceImageFilter_txx
19 #define __itkMultiphaseFiniteDifferenceImageFilter_txx
29 template <
class TInputImage,
32 class TFiniteDifferenceFunction,
35 MultiphaseFiniteDifferenceImageFilter< TInputImage,
38 TFiniteDifferenceFunction,
42 if( ! this->m_FunctionCount )
44 itkExceptionMacro(
"Number of level set functions not specified. "
45 <<
"Please set using SetFunctionCount()" );
48 if( ! this->m_InitializedState )
51 double coeffs[ImageDimension];
53 if (m_UseImageSpacing)
55 for (i = 0; i < ImageDimension; i++)
57 coeffs[i] = 1.0 / m_LevelSet[0]->GetSpacing()[i];
62 for (i = 0; i < ImageDimension; i++)
68 for(
IdCellType id = 0;
id < this->m_FunctionCount;
id++ )
70 this->m_DifferenceFunctions[id]->SetScaleCoefficients(coeffs);
74 this->AllocateOutputs();
78 this->CopyInputToOutput();
85 this->AllocateUpdateBuffer();
87 this->SetInitializedState(
true );
95 this->InitializeIteration();
96 this->m_RMSChange = NumericTraits<double>::max();
98 while ( ! this->Halt() )
100 dt = this->CalculateChange();
102 this->ApplyUpdate( dt );
104 this->m_ElapsedIterations++;
109 if( this->GetAbortGenerateData() )
112 this->ResetPipeline();
116 this->InitializeIteration();
120 if( !this->m_ManualReinitialization )
122 this->SetInitializedState(
true);
126 this->PostProcessOutput();
132 template <
class TInputImage,
135 class TFiniteDifferenceFunction,
141 TFiniteDifferenceFunction,
143 ::GenerateInputRequestedRegion()
147 Superclass::GenerateInputRequestedRegion();
153 if ( inputPtr.IsNull() )
158 if( this->m_DifferenceFunctions[0].IsNull() )
165 RadiusType radius = this->m_DifferenceFunctions[0]->GetRadius();
176 inputRequestedRegion = inputPtr->GetRequestedRegion();
179 inputRequestedRegion.PadByRadius( radius );
182 if ( inputRequestedRegion.Crop( inputPtr->GetLargestPossibleRegion() ) )
184 inputPtr->SetRequestedRegion( inputRequestedRegion );
193 inputPtr->SetRequestedRegion( inputRequestedRegion );
198 e.
SetDescription(
"Requested region is (at least partially) outside the "
199 "largest possible region.");
205 template <
class TInputImage,
208 class TFiniteDifferenceFunction,
211 TOutputImage, TFiniteDifferenceFunction, TIdCell >::TimeStepType
215 TFiniteDifferenceFunction,
218 const std::vector< bool >& valid )
221 size_t size = timeStepList.size();
223 if( size == valid.size() )
229 for( i = 0; i < size; ++i)
233 oMin = timeStepList[i];
242 itkExceptionMacro(
"No Values");
246 for ( i = k; i < size; ++i)
248 if ( valid[i] && (timeStepList[i] < oMin) )
250 oMin = timeStepList[i];
258 template <
class TInputImage,
261 class TFiniteDifferenceFunction,
267 TFiniteDifferenceFunction,
273 if( this->m_NumberOfIterations != 0 )
275 progress =
static_cast<float>( this->GetElapsedIterations() )
276 / static_cast<float>( this->m_NumberOfIterations );
278 this->UpdateProgress( progress );
280 return ( (this->GetElapsedIterations() >= this->m_NumberOfIterations) ||
281 ( this->GetMaximumRMSError() >= this->m_RMSChange ) );
285 template <
class TInputImage,
288 class TFiniteDifferenceFunction,
294 TFiniteDifferenceFunction,
296 ::PrintSelf(std::ostream& os,
Indent indent)
const
298 Superclass::PrintSelf(os, indent);
300 os << indent <<
"ElapsedIterations: " << this->m_ElapsedIterations << std::endl;
301 os << indent <<
"UseImageSpacing: " << (m_UseImageSpacing ?
"On" :
"Off") << std::endl;
302 os << indent <<
"State: " << this->m_InitializedState << std::endl;
303 os << indent <<
"MaximumRMSError: " << m_MaximumRMSError << std::endl;
304 os << indent <<
"NumberOfIterations: " << this->m_NumberOfIterations << std::endl;
305 os << indent <<
"ManualReinitialization: " << this->m_ManualReinitialization << std::endl;
306 os << indent <<
"RMSChange: " << m_RMSChange << std::endl;
309 if ( this->m_FunctionCount )
311 if( this->m_DifferenceFunctions[0] )
313 os << indent <<
"DifferenceFunction: " << std::endl;
314 for(
IdCellType i = 0; i < this->m_FunctionCount; ++i )
316 this->m_DifferenceFunctions[i]->Print(os,indent.
GetNextIndent());
322 os << indent <<
"DifferenceFunction: " <<
"(None)" << std::endl;