17 #ifndef __itkCurvatureFlowFunction_txx
18 #define __itkCurvatureFlowFunction_txx
21 #include "vnl/vnl_math.h"
28 template<
class TImage>
35 for( j = 0; j < ImageDimension; j++ )
50 template<
class TImage>
56 return this->GetTimeStep();
61 GlobalDataStruct *globalData = (GlobalDataStruct *)gd;
64 if ( globalData->m_MaxChange > 0.0 )
66 dt = 1.0 / globalData->m_MaxChange;
81 template<
class TImage>
91 unsigned long stride[ImageDimension];
97 center = it.
Size() / 2;
100 for( i = 0; i < ImageDimension; i++ )
102 stride[i] = it.
GetStride( (
unsigned long) i );
106 for( i = 0; i < ImageDimension; i++ )
110 firstderiv[i] = 0.5 * ( it.
GetPixel(center + stride[i]) -
111 it.
GetPixel(center - stride[i]) ) * neighborhoodScales[i];
114 secderiv[i] = ( it.
GetPixel(center + stride[i]) -
115 2 * it.
GetPixel(center) + it.
GetPixel( center - stride[i] ) ) * vnl_math_sqr( neighborhoodScales[i] );
118 for( j = i + 1; j < ImageDimension; j++ )
120 crossderiv[i][j] = 0.25 * (
121 it.
GetPixel( center - stride[i] - stride[j] )
122 - it.
GetPixel( center - stride[i] + stride[j] )
123 - it.
GetPixel( center + stride[i] - stride[j] )
124 + it.
GetPixel( center + stride[i] + stride[j] ) )
125 * neighborhoodScales[i] * neighborhoodScales[j];
129 magnitudeSqr += vnl_math_sqr( (
double)firstderiv[i] );
133 if ( magnitudeSqr < 1e-9 )
143 for( i = 0; i < ImageDimension; i++ )
146 for( j = 0; j < ImageDimension; j++ )
148 if( j == i )
continue;
152 update += temp * vnl_math_sqr( (
double)firstderiv[i] );
156 for( i = 0; i < ImageDimension; i++ )
158 for( j = i + 1; j < ImageDimension; j++ )
160 update -= 2 * firstderiv[i] * firstderiv[j] *
165 update /= magnitudeSqr;
169 GlobalDataStruct *globalData = (GlobalDataStruct *)gd;
170 globalData->m_MaxChange =
171 vnl_math_max( globalData->m_MaxChange, vnl_math_abs(update) );