127
128
Float detJ=(*elt)->JacobianDeterminant(ip);
129
130
for(unsigned int f=0; f<ImageDimension; f++)
133
134
for(unsigned int n=0; n<Nnodes; n++)
135
136
posval+=shapef[n]*(((*elt)->GetNodeCoordinates(n))[f]);
136
137
float nodeval=( (m_Solution)->GetSolutionValue( (*elt)->GetNode(n)->GetDegreeOfFreedom(f) , m_SolutionIndex)
137
+(m_Solution)->GetSolutionValue( (*elt)->GetNode(n)->GetDegreeOfFreedom(f) , m_SolutionIndex2)*step);
138
+(m_Solution)->GetSolutionValue( (*elt)->GetNode(n)->GetDegreeOfFreedom(f) , m_SolutionIndex2)*step);
139
140
solval+=shapef[n] * nodeval;
140
141
solmat[(n*ImageDimension)+f][0]=nodeval;
143
144
InVec[f+ImageDimension]=solval;
149
tempe=vcl_fabs(GetMetric(InVec));
150
tempe=vcl_fabs(GetMetric(InVec));
151
152
catch( itk::ExceptionObject & )
153
// do nothing we dont care if the metric region is outside the image
154
//std::cerr << e << std::endl;
154
// do nothing we dont care if the metric region is outside the image
155
//std::cerr << e << std::endl;
156
157
for(unsigned int n=0; n<Nnodes; n++)
158
159
itk::fem::Element::Float temp=shapef[n]*tempe*w*detJ;
163
164
defe+=0.0;//(double)(*elt)->GetElementDeformationEnergy( solmat );
166
167
//std::cout << " def e " << defe << " sim e " << energy*m_Gamma << std::endl;
167
168
return vcl_fabs((double)energy*(double)m_Gamma-(double)defe);
243
245
typename MetricBaseType::DerivativeType derivative;
247
249
m_Metric->GetValueAndDerivative( parameters, measure, derivative );
248
// m_Metric->GetDerivative( parameters, derivative );
250
// m_Metric->GetDerivative( parameters, derivative );
252
// do nothing we don't care if the metric lies outside the image sometimes
253
//std::cerr << e << std::endl;
254
// do nothing we don't care if the metric lies outside the image sometimes
255
//std::cerr << e << std::endl;
256
258
m_Energy+=(double)measure;
258
260
for( unsigned int k = 0; k < ImageDimension; k++ )
260
262
if (lobordercheck < 0 || hibordercheck >=0 ||
261
vnl_math_isnan(derivative[k]) || vnl_math_isinf(derivative[k]) )
263
vnl_math_isnan(derivative[k]) || vnl_math_isinf(derivative[k]) )
265
267
else OutVec[k]= m_Sign*m_Gamma*derivative[k];
266
268
gmag+=OutVec[k]*OutVec[k];
268
270
if (gmag==0.0) gmag=1.0;
269
// NOTE : POSSIBLE THAT DERIVATIVE DIRECTION POINTS UP OR DOWN HILL!
270
// IN FACT, IT SEEMS MEANSQRS AND NCC POINT IN DIFFT DIRS
271
// NOTE : POSSIBLE THAT DERIVATIVE DIRECTION POINTS UP OR DOWN HILL!
272
// IN FACT, IT SEEMS MEANSQRS AND NCC POINT IN DIFFT DIRS
271
273
//std::cout << " deriv " << derivative << " val " << measure << endl;
272
274
//if (m_Temp !=0.0)
273
275
//return OutVec * vcl_exp(-1.*OutVec.magnitude()/m_Temp);
368
370
else if (lobordercheck < 0) regionRadius[k]=m_MetricRadius[k]+(long)lobordercheck;
369
371
else regionRadius[k]=m_MetricRadius[k];
370
372
tindex[k]= (long)(Gpos[k]+0.5)-(long)regionRadius[k]/2; // position in reference image
373
375
unsigned int row;
374
376
typename ImageType::IndexType difIndex[ImageDimension][2];
376
378
typename MetricBaseType::MeasureType dPixL,dPixR;
377
for(row=0; row< ImageDimension;row++){
379
for(row=0; row< ImageDimension;row++)
378
381
difIndex[row][0]=tindex;
379
382
difIndex[row][1]=tindex;
380
if (tindex[row] < m_TarSize[row]-1) difIndex[row][0][row]=tindex[row]+1;
381
if (tindex[row] > 0 ) difIndex[row][1][row]=tindex[row]-1;
383
if (tindex[row] < m_TarSize[row]-1)
385
difIndex[row][0][row]=tindex[row]+1;
387
if (tindex[row] > 0 )
389
difIndex[row][1][row]=tindex[row]-1;
385
requestedRegion.SetIndex(difIndex[row][1]);
386
requestedRegion.SetSize(regionRadius);
387
m_TarImage->SetRequestedRegion(requestedRegion);
388
m_Metric->SetFixedImageRegion( m_TarImage->GetRequestedRegion() );
389
dPixL=m_Metric->GetValue( parameters);
393
requestedRegion.SetIndex(difIndex[row][1]);
394
requestedRegion.SetSize(regionRadius);
395
m_TarImage->SetRequestedRegion(requestedRegion);
396
m_Metric->SetFixedImageRegion( m_TarImage->GetRequestedRegion() );
397
dPixL=m_Metric->GetValue( parameters);
397
requestedRegion.SetIndex(difIndex[row][0]);
398
requestedRegion.SetSize(regionRadius);
399
m_TarImage->SetRequestedRegion(requestedRegion);
400
m_Metric->SetFixedImageRegion( m_TarImage->GetRequestedRegion() );
401
dPixR=m_Metric->GetValue( parameters);
405
requestedRegion.SetIndex(difIndex[row][0]);
406
requestedRegion.SetSize(regionRadius);
407
m_TarImage->SetRequestedRegion(requestedRegion);
408
m_Metric->SetFixedImageRegion( m_TarImage->GetRequestedRegion() );
409
dPixR=m_Metric->GetValue( parameters);
408
416
OutVec[row]=dPixL-dPixR;
457
464
else if (lobordercheck < 0) regionRadius[k]=m_MetricRadius[k]+(long)lobordercheck;
458
465
else regionRadius[k]=m_MetricRadius[k];
459
466
tindex[k]= (long)(Gpos[k]+0.5)-(long)regionRadius[k]/2; // position in reference image
463
if (ImageDimension==2){
465
double measure[3][3];
466
for(int row=-1; row< 2; row++){
467
for(int col=-1; col< 2; col++){
469
temp[0]=tindex[0]+(long)row;
470
temp[1]=tindex[1]+(long)col;
472
for (unsigned int i=0; i<ImageDimension; i++){
473
if (temp[i] > m_TarSize[i]-1) temp[i]=m_TarSize[i]-1;
474
else if (temp[i] < 0 ) temp[i]=0;
477
requestedRegion.SetIndex(temp);
478
requestedRegion.SetSize(regionRadius);
479
m_TarImage->SetRequestedRegion(requestedRegion);
480
m_Metric->SetFixedImageRegion( m_TarImage->GetRequestedRegion() );
481
measure[row+1][col+1]=0.0;
485
measure[row+1][col+1]=m_Metric->GetValue( parameters);
492
datatotal+=measure[row+1][col+1];
494
for( unsigned int cb1 = 0; cb1 < 3; cb1++ )
495
for( unsigned int cb2 = 0; cb2 < 3; cb2++ )
497
met=measure[cb1][cb2];
498
ind1=inds[cb1]*a1norm;
499
ind2=inds[cb2]*a1norm;
500
chebycoefs[0]+=met*ind1;
501
chebycoefs[1]+=met*ind2;
504
else if (ImageDimension == 3) {
506
double measure3D[3][3][3];
507
for(int row=-1; row< 2; row++){
508
for(int col=-1; col< 2; col++){
509
for(int z=-1; z< 2; z++){
511
temp[0]=tindex[0]+(long)row;
512
temp[1]=tindex[1]+(long)col;
513
temp[2]=tindex[2]+(long)z;
515
for (unsigned int i=0; i<ImageDimension; i++){
516
if (temp[i] > m_TarSize[i]-1) temp[i]=m_TarSize[i]-1;
517
else if (temp[i] < 0 ) temp[i]=0;
520
requestedRegion.SetIndex(temp);
521
requestedRegion.SetSize(regionRadius);
522
m_TarImage->SetRequestedRegion(requestedRegion);
523
m_Metric->SetFixedImageRegion( m_TarImage->GetRequestedRegion() );
524
measure3D[row+1][col+1][z+1]=0.0;
528
measure3D[row+1][col+1][z+1]=m_Metric->GetValue( parameters);
535
datatotal+=measure3D[row+1][col+1][z+1];
537
for( unsigned int cb1 = 0; cb1 < 2; cb1++ )
538
for( unsigned int cb2 = 0; cb2 < 2; cb2++ )
539
for( unsigned int cb3 = 0; cb3 < 2; cb3++ )
541
chebycoefs[0]+=measure3D[cb1][cb2][cb3]*inds[cb1]*a1norm;
542
chebycoefs[1]+=measure3D[cb1][cb2][cb3]*inds[cb2]*a1norm;
543
chebycoefs[2]+=measure3D[cb1][cb2][cb3]*inds[cb3]*a1norm;
470
if (ImageDimension==2)
473
double measure[3][3];
474
for(int row=-1; row< 2; row++)
476
for(int col=-1; col< 2; col++)
479
temp[0]=tindex[0]+(long)row;
480
temp[1]=tindex[1]+(long)col;
482
for (unsigned int i=0; i<ImageDimension; i++)
484
if (temp[i] > m_TarSize[i]-1)
486
temp[i]=m_TarSize[i]-1;
488
else if (temp[i] < 0 )
494
requestedRegion.SetIndex(temp);
495
requestedRegion.SetSize(regionRadius);
496
m_TarImage->SetRequestedRegion(requestedRegion);
497
m_Metric->SetFixedImageRegion( m_TarImage->GetRequestedRegion() );
498
measure[row+1][col+1]=0.0;
502
measure[row+1][col+1]=m_Metric->GetValue( parameters);
509
datatotal+=measure[row+1][col+1];
512
for( unsigned int cb1 = 0; cb1 < 3; cb1++ )
514
for( unsigned int cb2 = 0; cb2 < 3; cb2++ )
516
met=measure[cb1][cb2];
517
ind1=inds[cb1]*a1norm;
518
ind2=inds[cb2]*a1norm;
519
chebycoefs[0]+=met*ind1;
520
chebycoefs[1]+=met*ind2;
524
else if (ImageDimension == 3)
527
double measure3D[3][3][3];
528
for(int row=-1; row< 2; row++)
530
for(int col=-1; col< 2; col++)
532
for(int z=-1; z< 2; z++)
535
temp[0]=tindex[0]+(long)row;
536
temp[1]=tindex[1]+(long)col;
537
temp[2]=tindex[2]+(long)z;
539
for (unsigned int i=0; i<ImageDimension; i++)
541
if (temp[i] > m_TarSize[i]-1)
543
temp[i]=m_TarSize[i]-1;
545
else if (temp[i] < 0 )
551
requestedRegion.SetIndex(temp);
552
requestedRegion.SetSize(regionRadius);
553
m_TarImage->SetRequestedRegion(requestedRegion);
554
m_Metric->SetFixedImageRegion( m_TarImage->GetRequestedRegion() );
555
measure3D[row+1][col+1][z+1]=0.0;
559
measure3D[row+1][col+1][z+1]=m_Metric->GetValue( parameters);
566
datatotal+=measure3D[row+1][col+1][z+1];
570
for( unsigned int cb1 = 0; cb1 < 2; cb1++ )
572
for( unsigned int cb2 = 0; cb2 < 2; cb2++ )
574
for( unsigned int cb3 = 0; cb3 < 2; cb3++ )
576
chebycoefs[0]+=measure3D[cb1][cb2][cb3]*inds[cb1]*a1norm;
577
chebycoefs[1]+=measure3D[cb1][cb2][cb3]*inds[cb2]*a1norm;
578
chebycoefs[2]+=measure3D[cb1][cb2][cb3]*inds[cb3]*a1norm;
547
584
chebycoefs0=a0norm*datatotal;
548
585
// std::cout << " cb " << chebycoefs << std::endl;