17 #ifndef __itkFEMImageMetricLoad_txx
18 #define __itkFEMImageMetricLoad_txx
27 template<
class TMoving,
class TFixed>
32 if (!m_Transform) m_Transform = DefaultTransformType::New();
33 if (!m_Metric) m_Metric = DefaultMetricType::New();
43 m_Metric->SetMovingImage( m_RefImage );
44 m_Metric->SetFixedImage( m_TarImage );
46 typename FixedType::RegionType requestedRegion;
47 typename FixedType::SizeType size;
48 typename FixedType::IndexType tindex;
51 for(
unsigned int k = 0; k < ImageDimension; k++ )
60 m_NumberOfIntegrationPoints=0;
63 requestedRegion.SetSize(size);
64 requestedRegion.SetIndex(tindex);
65 m_TarImage->SetRequestedRegion(requestedRegion);
66 m_Metric->SetFixedImageRegion( m_TarImage->GetRequestedRegion() );
68 m_Metric->SetTransform( m_Transform.GetPointer() );
69 m_Interpolator = InterpolatorType::New();
70 m_Interpolator->SetInputImage( m_RefImage );
71 m_Metric->SetInterpolator( m_Interpolator.GetPointer() );
81 m_Metric->Initialize();
85 std::cout <<
"Metric initialization failed" << std::endl;
91 template<
class TMoving,
class TFixed>
100 for (
unsigned int i=0; i<ImageDimension; i++)
102 m_MetricRadius[i] = 1;
104 m_MetricGradientImage =
NULL;
109 template<
class TMoving,
class TFixed>
113 Float energy=0.0,defe=0.0;
115 vnl_vector_fixed<Float,2*ImageDimension> InVec(0.0);
121 Element::ArrayType::iterator elt=element->begin();
122 const unsigned int Nnodes=(*elt)->GetNumberOfNodes();
124 solmat.set_size(Nnodes*ImageDimension,1);
126 for(; elt!=element->end(); elt++)
128 for(
unsigned int i=0; i<m_NumberOfIntegrationPoints; i++)
130 dynamic_cast<Element*
>(&*(*elt))->GetIntegrationPointAndWeight(i,ip,w,m_NumberOfIntegrationPoints);
134 Float detJ=(*elt)->JacobianDeterminant(ip);
136 for(
unsigned int f=0; f<ImageDimension; f++)
140 for(
unsigned int n=0; n<Nnodes; n++)
142 posval += shapef[n]*(((*elt)->GetNodeCoordinates(n))[f]);
143 float nodeval=( (m_Solution)->GetSolutionValue( (*elt)->GetNode(n)->GetDegreeOfFreedom(f) , m_SolutionIndex)
144 +(m_Solution)->GetSolutionValue( (*elt)->GetNode(n)->GetDegreeOfFreedom(f) , m_SolutionIndex2)*step);
146 solval += shapef[n] * nodeval;
147 solmat[(n*ImageDimension)+f][0]=nodeval;
150 InVec[f+ImageDimension]=solval;
156 tempe=vcl_fabs(GetMetric(InVec));
163 for(
unsigned int n=0; n<Nnodes; n++)
174 return vcl_fabs((
double)energy*(
double)m_Gamma-(
double)defe);
178 template<
class TMoving,
class TFixed>
197 for(
unsigned int k = 0; k < ImageDimension; k++ )
199 if ( vnl_math_isnan(Gpos[k]) || vnl_math_isinf(Gpos[k]) ||
200 vnl_math_isnan(Gsol[k]) || vnl_math_isinf(Gsol[k]) ||
201 vcl_fabs(Gpos[k]) > 1.e33 || vcl_fabs(Gsol[k]) > 1.e33 )
203 OutVec.set_size(ImageDimension); OutVec.fill(0.0);
return OutVec;
207 ParametersType parameters( m_Transform->GetNumberOfParameters() );
208 typename FixedType::RegionType requestedRegion;
210 typename FixedType::IndexType tindex;
211 typename MovingType::IndexType rindex;
212 OutVec.set_size(ImageDimension);
214 int lobordercheck=0,hibordercheck=0;
215 for(
unsigned int k = 0; k < ImageDimension; k++ )
218 parameters[k]= Gsol[k];
219 rindex[k] =(long)(Gpos[k]+Gsol[k]+0.5);
220 tindex[k]= (long)(Gpos[k]+0.5)-(long)m_MetricRadius[k]/2;
221 hibordercheck=(int)tindex[k]+(
int)m_MetricRadius[k]-(int)m_TarSize[k];
222 lobordercheck=(int)tindex[k]-(
int)m_MetricRadius[k];
223 if (hibordercheck >= 0) regionRadius[k]=m_MetricRadius[k]-(long)hibordercheck-1;
224 else if (lobordercheck < 0) regionRadius[k]=m_MetricRadius[k]+(long)lobordercheck;
225 else regionRadius[k]=m_MetricRadius[k];
226 tindex[k]= (long)(Gpos[k]+0.5)-(long)regionRadius[k]/2;
231 requestedRegion.
SetSize(regionRadius);
232 requestedRegion.SetIndex(tindex);
234 m_TarImage->SetRequestedRegion(requestedRegion);
235 m_Metric->SetFixedImageRegion( m_TarImage->GetRequestedRegion() );
245 m_Metric->GetValueAndDerivative( parameters, measure, derivative );
254 m_Energy += (double)measure;
256 for(
unsigned int k = 0; k < ImageDimension; k++ )
258 if (lobordercheck < 0 || hibordercheck >=0 ||
259 vnl_math_isnan(derivative[k]) || vnl_math_isinf(derivative[k]) )
263 else OutVec[k]= m_Sign*m_Gamma*derivative[k];
264 gmag += OutVec[k]*OutVec[k];
266 if (gmag==0.0) gmag=1.0;
273 return OutVec/vcl_sqrt(gmag);
277 template<
class TMoving,
class TFixed>
294 typename FixedType::RegionType requestedRegion;
295 typename FixedType::IndexType tindex;
296 typename MovingType::IndexType rindex;
301 for(
unsigned int k = 0; k < ImageDimension; k++ )
304 parameters[k]= InVec[k+ImageDimension];
305 rindex[k] =(long)(InVec[k]+InVec[k+ImageDimension]+0.5);
306 tindex[k]= (long)(InVec[k]+0.5)-(long)m_MetricRadius[k]/2;
307 int hibordercheck=(int)tindex[k]+(
int)m_MetricRadius[k]-(int)m_TarSize[k];
308 int lobordercheck=(int)tindex[k]-(
int)m_MetricRadius[k];
309 if (hibordercheck > 0) regionRadius[k]=m_MetricRadius[k]-(long)hibordercheck-1;
310 else if (lobordercheck < 0) regionRadius[k]=m_MetricRadius[k]+(long)lobordercheck;
311 else regionRadius[k]=m_MetricRadius[k];
312 tindex[k]= (long)(InVec[k]+0.5)-(long)regionRadius[k]/2;
317 requestedRegion.
SetSize(regionRadius);
318 requestedRegion.SetIndex(tindex);
320 m_TarImage->SetRequestedRegion(requestedRegion);
321 m_Metric->SetFixedImageRegion( m_TarImage->GetRequestedRegion() );
329 measure=m_Metric->GetValue( parameters);
338 return (
Float) measure;
342 template<
class TMoving,
class TFixed>
351 typename FixedType::RegionType requestedRegion;
352 typename FixedType::IndexType tindex;
356 OutVec.set_size(ImageDimension);
358 for(
unsigned int k = 0; k < ImageDimension; k++ )
360 parameters[k]= Gsol[k];
361 tindex[k]= (long)(Gpos[k]+0.5)-(long)m_MetricRadius[k]/2;
362 if (tindex[k] > m_TarSize[k]-1 || tindex[k] < 0) tindex[k]=(long)(Gpos[k]+0.5);
363 int hibordercheck=(int)tindex[k]+(
int)m_MetricRadius[k]-(int)m_TarSize[k];
364 int lobordercheck=(int)tindex[k]-(
int)m_MetricRadius[k];
365 if (hibordercheck >= 0) regionRadius[k]=m_MetricRadius[k]-(long)hibordercheck-1;
366 else if (lobordercheck < 0) regionRadius[k]=m_MetricRadius[k]+(long)lobordercheck;
367 else regionRadius[k]=m_MetricRadius[k];
368 tindex[k]= (long)(Gpos[k]+0.5)-(long)regionRadius[k]/2;
375 for(row=0; row< ImageDimension;row++)
377 difIndex[row][0]=tindex;
378 difIndex[row][1]=tindex;
379 if (tindex[row] < m_TarSize[row]-1)
381 difIndex[row][0][row]=tindex[row]+1;
383 if (tindex[row] > 0 )
385 difIndex[row][1][row]=tindex[row]-1;
389 requestedRegion.
SetIndex(difIndex[row][1]);
390 requestedRegion.SetSize(regionRadius);
391 m_TarImage->SetRequestedRegion(requestedRegion);
392 m_Metric->SetFixedImageRegion( m_TarImage->GetRequestedRegion() );
393 dPixL=m_Metric->GetValue( parameters);
401 requestedRegion.SetIndex(difIndex[row][0]);
402 requestedRegion.SetSize(regionRadius);
403 m_TarImage->SetRequestedRegion(requestedRegion);
404 m_Metric->SetFixedImageRegion( m_TarImage->GetRequestedRegion() );
405 dPixR=m_Metric->GetValue( parameters);
412 OutVec[row]=dPixL-dPixR;
418 template<
class TMoving,
class TFixed>
433 typename FixedType::RegionType requestedRegion;
434 typename FixedType::IndexType tindex;
440 chebycoefs.set_size(ImageDimension);
441 double chebycoefs0=0.0;
442 double datatotal=0.0;
444 double a1norm=1.0/2.0;
446 double met, ind1,ind2;
447 double inds[3]; inds[0]=-1.0; inds[1]=0.0; inds[2]=1.0;
449 for(
unsigned int k = 0; k < ImageDimension; k++ )
452 if (k < ImageDimension-1)
457 parameters[k]= Gsol[k];
458 tindex[k]= (long)(Gpos[k]+0.5)-(long)m_MetricRadius[k]/2;
459 if (tindex[k] > m_TarSize[k]-1 || tindex[k] < 0) tindex[k]=(long)(Gpos[k]+0.5);
460 int hibordercheck=(int)tindex[k]+(
int)m_MetricRadius[k]-(int)m_TarSize[k];
461 int lobordercheck=(int)tindex[k]-(
int)m_MetricRadius[k];
462 if (hibordercheck >= 0) regionRadius[k]=m_MetricRadius[k]-(long)hibordercheck-1;
463 else if (lobordercheck < 0) regionRadius[k]=m_MetricRadius[k]+(long)lobordercheck;
464 else regionRadius[k]=m_MetricRadius[k];
465 tindex[k]= (long)(Gpos[k]+0.5)-(long)regionRadius[k]/2;
469 if (ImageDimension==2)
472 double measure[3][3];
473 for(
int row=-1; row< 2; row++)
475 for(
int col=-1; col< 2; col++)
478 temp[0]=tindex[0]+(long)row;
479 temp[1]=tindex[1]+(long)col;
481 for (
unsigned int i=0; i<ImageDimension; i++)
483 if (temp[i] > m_TarSize[i]-1)
485 temp[i]=m_TarSize[i]-1;
487 else if (temp[i] < 0 )
494 requestedRegion.SetSize(regionRadius);
495 m_TarImage->SetRequestedRegion(requestedRegion);
496 m_Metric->SetFixedImageRegion( m_TarImage->GetRequestedRegion() );
497 measure[row+1][col+1]=0.0;
501 measure[row+1][col+1]=m_Metric->GetValue( parameters);
508 datatotal += measure[row+1][col+1];
511 for(
unsigned int cb1 = 0; cb1 < 3; cb1++ )
513 for(
unsigned int cb2 = 0; cb2 < 3; cb2++ )
515 met=measure[cb1][cb2];
516 ind1=inds[cb1]*a1norm;
517 ind2=inds[cb2]*a1norm;
518 chebycoefs[0] += met*ind1;
519 chebycoefs[1] += met*ind2;
523 else if (ImageDimension == 3)
526 double measure3D[3][3][3];
527 for(
int row=-1; row< 2; row++)
529 for(
int col=-1; col< 2; col++)
531 for(
int z=-1; z< 2; z++)
534 temp[0]=tindex[0]+(long)row;
535 temp[1]=tindex[1]+(long)col;
536 temp[2]=tindex[2]+(long)z;
538 for (
unsigned int i=0; i<ImageDimension; i++)
540 if (temp[i] > m_TarSize[i]-1)
542 temp[i]=m_TarSize[i]-1;
544 else if (temp[i] < 0 )
551 requestedRegion.SetSize(regionRadius);
552 m_TarImage->SetRequestedRegion(requestedRegion);
553 m_Metric->SetFixedImageRegion( m_TarImage->GetRequestedRegion() );
554 measure3D[row+1][col+1][z+1]=0.0;
558 measure3D[row+1][col+1][z+1]=m_Metric->GetValue( parameters);
565 datatotal += measure3D[row+1][col+1][z+1];
569 for(
unsigned int cb1 = 0; cb1 < 2; cb1++ )
571 for(
unsigned int cb2 = 0; cb2 < 2; cb2++ )
573 for(
unsigned int cb3 = 0; cb3 < 2; cb3++ )
575 chebycoefs[0] += measure3D[cb1][cb2][cb3]*inds[cb1]*a1norm;
576 chebycoefs[1] += measure3D[cb1][cb2][cb3]*inds[cb2]*a1norm;
577 chebycoefs[2] += measure3D[cb1][cb2][cb3]*inds[cb3]*a1norm;
583 chebycoefs0=a0norm*datatotal;
590 template<
class TMoving,
class TFixed>
593 static const int CLID_ =
FEMOF::Register( ImageMetricLoad::NewB,(std::string(
"ImageMetricLoad(")
594 +
typeid(TMoving).name()+
","+
typeid(TFixed).name()+
")").c_str());
599 template<
class TMoving,
class TFixed>