17 #ifndef __itkWarpHarmonicEnergyCalculator_txx
18 #define __itkWarpHarmonicEnergyCalculator_txx
25 #include "vnl/vnl_matrix.h"
26 #include "vnl/vnl_math.h"
34 template<
class TInputImage>
38 m_Image = TInputImage::New();
39 m_HarmonicEnergy = 0.0;
40 m_RegionSetByUser =
false;
42 m_UseImageSpacing =
true;
43 for (i = 0; i < ImageDimension; i++)
45 m_NeighborhoodRadius[i] = 1;
46 m_DerivativeWeights[i] = 1.0;
50 template <
class TInputImage>
55 m_UseImageSpacing =
false;
57 for (
unsigned int i = 0; i < ImageDimension; ++i)
59 if (m_DerivativeWeights[i] != data[i])
62 m_DerivativeWeights[i] = data[i];
67 template <
class TInputImage>
72 if (m_UseImageSpacing == f)
79 if (f ==
false && m_UseImageSpacing ==
true)
81 for (
unsigned int i = 0; i < ImageDimension; ++i)
83 m_DerivativeWeights[i] = 1.0;
87 m_UseImageSpacing = f;
94 template<
class TInputImage>
99 if( !m_RegionSetByUser )
101 m_Region = m_Image->GetRequestedRegion();
107 if (m_UseImageSpacing ==
true)
110 for (
unsigned int i = 0; i < ImageDimension; i++)
112 if (m_Image->GetSpacing()[i] <= 0.0)
114 itkExceptionMacro(<<
"Image spacing in dimension " << i <<
" is zero.");
116 m_DerivativeWeights[i] = 1.0 /
static_cast<double>(m_Image->GetSpacing()[i]);
120 m_HarmonicEnergy = 0.0;
127 FaceListType faceList;
129 faceList = bC(m_Image, m_Region, m_NeighborhoodRadius);
132 FaceListType::iterator fit;
133 fit = faceList.begin();
138 for (fit=faceList.begin(); fit != faceList.end(); ++fit)
148 m_HarmonicEnergy += this->EvaluateAtNeighborhood(bit);
153 m_HarmonicEnergy /= m_Region.GetNumberOfPixels();
157 template <
class TInputImage>
165 vnl_matrix_fixed<double,ImageDimension,VectorDimension> J;
171 for (i = 0; i < ImageDimension; ++i)
176 weight = 0.5*m_DerivativeWeights[i];
178 for (j = 0; j < VectorDimension; ++j)
180 J[i][j]=weight*(
static_cast<double>(next[j])-static_cast<double>(prev[j]));
187 const double norm = J.fro_norm();
192 template<
class TInputImage>
198 m_RegionSetByUser =
true;
202 template<
class TInputImage>
207 Superclass::PrintSelf(os,indent);
209 os << indent <<
"HarmonicEnergy: "<<m_HarmonicEnergy<< std::endl;
210 os << indent <<
"Image: " << std::endl;
212 os << indent <<
"Region: " << std::endl;
214 os << indent <<
"Region set by User: " << m_RegionSetByUser << std::endl;
215 os << indent <<
"Use image spacing: " << this->m_UseImageSpacing << std::endl;
216 os << indent <<
"Derivative Weights: " << this->m_DerivativeWeights << std::endl;
217 os << indent <<
"Neighborhood Radius: " << this->m_NeighborhoodRadius << std::endl;