@@ -225,21 +225,12 @@ DisplacementFieldTransform<TParametersValueType, NDimensions>::ComputeJacobianWi
225
225
226
226
typename DisplacementFieldType::SizeType size = this ->m_DisplacementField ->GetLargestPossibleRegion ().GetSize ();
227
227
typename DisplacementFieldType::IndexType startingIndex = this ->m_DisplacementField ->GetLargestPossibleRegion ().GetIndex ();
228
+ typename DisplacementFieldType::IndexType upperIndex = this ->m_DisplacementField ->GetLargestPossibleRegion ().GetUpperIndex ();
228
229
typename DisplacementFieldType::SpacingType spacing = this ->m_DisplacementField ->GetSpacing ();
229
230
230
- IndexType ddrindex;
231
- IndexType ddlindex;
232
- IndexType difIndex[NDimensions][2 ];
233
-
234
- // Index offset
235
- unsigned int posoff = NumericTraits<unsigned int >::OneValue ();
236
-
237
- // Apace between indices
231
+ // Space between indices
238
232
TParametersValueType space = NumericTraits<TParametersValueType>::OneValue ();
239
233
240
- // Minimum distance between neighbors
241
- IndexValueType mindist = NumericTraits<IndexValueType>::OneValue ();
242
-
243
234
// Flag indicating a valid location for Jacobian calculation
244
235
bool isValidJacobianCalcLocat = true ;
245
236
@@ -248,15 +239,10 @@ DisplacementFieldTransform<TParametersValueType, NDimensions>::ComputeJacobianWi
248
239
dPixSign = doInverseJacobian ? -dPixSign : dPixSign;
249
240
for (unsigned int row = 0 ; row < NDimensions; ++row)
250
241
{
251
- IndexValueType dist = index[row] - startingIndex[row];
252
- if (dist < mindist)
253
- {
254
- isValidJacobianCalcLocat = false ;
255
- }
256
- dist = static_cast <IndexValueType>(size[row]) - dist;
257
- if (dist < mindist)
242
+ if (index[row] <= startingIndex[row] || index[row] >= upperIndex[row])
258
243
{
259
244
isValidJacobianCalcLocat = false ;
245
+ break ;
260
246
}
261
247
}
262
248
@@ -266,51 +252,36 @@ DisplacementFieldTransform<TParametersValueType, NDimensions>::ComputeJacobianWi
266
252
// do manually here
267
253
for (unsigned int row = 0 ; row < NDimensions; ++row)
268
254
{
269
- difIndex[row][0 ] = index;
270
- difIndex[row][1 ] = index;
271
- ddrindex = index;
272
- ddlindex = index;
273
- if ((int )index[row] < (int )(size[row] - 2 ))
255
+ IndexType difIndex[4 ] = {index, index, index, index};
256
+ difIndex[0 ][row] -= 2 ;
257
+ difIndex[1 ][row] -= 1 ;
258
+ difIndex[2 ][row] += 1 ;
259
+ difIndex[3 ][row] += 2 ;
260
+ if (difIndex[0 ][row] < startingIndex[row])
274
261
{
275
- difIndex[row][0 ][row] = index[row] + posoff;
276
- ddrindex[row] = index[row] + posoff * 2 ;
262
+ difIndex[0 ][row] = startingIndex[row];
277
263
}
278
- if (index[ row] > 1 )
264
+ if (difIndex[ 3 ][ row] > upperIndex[row] )
279
265
{
280
- difIndex[row][1 ][row] = index[row] - 1 ;
281
- ddlindex[row] = index[row] - 2 ;
266
+ difIndex[3 ][row] = upperIndex[row];
282
267
}
283
268
284
- OutputVectorType tempPix;
285
-
286
- tempPix = m_DisplacementField->GetPixel (difIndex[row][1 ]);
287
- const auto rpix = m_DisplacementField->TransformLocalVectorToPhysicalVector (tempPix);
288
-
289
- tempPix = m_DisplacementField->GetPixel (difIndex[row][0 ]);
290
- const auto lpix = m_DisplacementField->TransformLocalVectorToPhysicalVector (tempPix);
291
-
292
- tempPix = m_DisplacementField->GetPixel (ddrindex);
293
- const auto rrpix = m_DisplacementField->TransformLocalVectorToPhysicalVector (tempPix);
294
-
295
- tempPix = m_DisplacementField->GetPixel (ddlindex);
296
- const auto llpix = m_DisplacementField->TransformLocalVectorToPhysicalVector (tempPix);
297
-
269
+ OutputVectorType pixDisp[4 ];
270
+ for (unsigned int i = 0 ; i < 4 ; ++i)
271
+ {
272
+ const OutputVectorType tempPix = m_DisplacementField->GetPixel (difIndex[i]);
273
+ pixDisp[i] = m_DisplacementField->TransformLocalVectorToPhysicalVector (tempPix);
274
+ }
298
275
299
276
// 4th order centered difference
300
- OutputVectorType dPix = (lpix * 8.0 + llpix - rrpix - rpix * 8.0 ) * space / (12.0 ) * dPixSign;
277
+ OutputVectorType dPix = (pixDisp[ 0 ] - pixDisp[ 1 ] * 8.0 + pixDisp[ 2 ] * 8.0 - pixDisp[ 3 ]) / (12.0 * space * spacing[row] ) * dPixSign;
301
278
302
- // typename DisplacementFieldType::PixelType dPix=
303
- // ( lpix - rpix )*space/(2.0*h); //2nd order centered difference
279
+ dPix[row] += 1.0 ;
304
280
for (unsigned int col = 0 ; col < NDimensions; ++col)
305
281
{
306
- TParametersValueType val = dPix[col] / spacing[row];
307
- if (row == col)
308
- {
309
- val += 1.0 ;
310
- }
311
- jacobian (col, row) = val;
282
+ jacobian (col, row) = dPix[col];
312
283
// Verify it's a real number
313
- if (!itk::Math::isfinite (val ))
284
+ if (!itk::Math::isfinite (dPix[col] ))
314
285
{
315
286
isValidJacobianCalcLocat = false ;
316
287
break ;
0 commit comments