17 #ifndef __itkAnisotropicDiffusionImageFilter_txx
18 #define __itkAnisotropicDiffusionImageFilter_txx
28 template <
class TInputImage,
class TOutputImage>
32 this->SetNumberOfIterations(1);
33 m_ConductanceParameter = 1.0;
34 m_ConductanceScalingParameter = 1.0;
35 m_ConductanceScalingUpdateInterval = 1;
36 m_TimeStep = 0.5 / vcl_pow(2.0, static_cast<double>(ImageDimension));
37 m_FixedAverageGradientMagnitude = 1.0;
38 m_GradientMagnitudeIsFixed =
false;
42 template <
class TInputImage,
class TOutputImage>
49 (this->GetDifferenceFunction().GetPointer());
52 throw ExceptionObject(__FILE__, __LINE__,
"Anisotropic diffusion function is not set.", ITK_LOCATION);
60 if (this->GetUseImageSpacing())
62 minSpacing = this->GetInput()->GetSpacing()[0];
63 for (
unsigned int i = 1; i < ImageDimension; i++)
65 if (this->GetInput()->GetSpacing()[i] < minSpacing)
67 minSpacing = this->GetInput()->GetSpacing()[i];
75 if ( m_TimeStep > (minSpacing / vcl_pow(2.0, static_cast<double>(ImageDimension) + 1)) )
78 itkWarningMacro( <<
"Anisotropic diffusion unstable time step: "
79 << m_TimeStep << std::endl
80 <<
"Stable time step for this image must be smaller than "
81 << minSpacing / vcl_pow(2.0, static_cast<double>(ImageDimension+1)));
84 if (m_GradientMagnitudeIsFixed ==
false)
86 if ((this->GetElapsedIterations() % m_ConductanceScalingUpdateInterval) == 0 )
95 m_FixedAverageGradientMagnitude);
99 if (this->GetNumberOfIterations() != 0)
101 this->UpdateProgress(((
float)(this->GetElapsedIterations()))
102 /((
float)(this->GetNumberOfIterations())));
106 this->UpdateProgress(0);
110 template <
class TInputImage,
class TOutputImage>
116 os << indent <<
"TimeStep: " << m_TimeStep << std::endl;
117 os << indent <<
"ConductanceParameter: "
118 << m_ConductanceParameter << std::endl;
119 os << indent <<
"ConductanceScalingParameter: "
120 << m_ConductanceScalingParameter << std::endl;
121 os << indent <<
"ConductanceScalingUpdateInterval: "
122 << m_ConductanceScalingUpdateInterval << std::endl;
123 os << indent <<
"FixedAverageGradientMagnitude: "
124 << m_FixedAverageGradientMagnitude << std::endl;