Skip to content

Commit 75bee91

Browse files
committed
STYLE: Clarifying logic in ComputeJacobianWithRespectToPositionInternal
The implementation syntax of the spatial derivative estimation from finite differences have been simplified to make the logic more evident. In addition the robustness for displacement fields with non-zero initial index has been improved.
1 parent 0bb068d commit 75bee91

File tree

1 file changed

+23
-52
lines changed

1 file changed

+23
-52
lines changed

Modules/Filtering/DisplacementField/include/itkDisplacementFieldTransform.hxx

Lines changed: 23 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -225,21 +225,12 @@ DisplacementFieldTransform<TParametersValueType, NDimensions>::ComputeJacobianWi
225225

226226
typename DisplacementFieldType::SizeType size = this->m_DisplacementField->GetLargestPossibleRegion().GetSize();
227227
typename DisplacementFieldType::IndexType startingIndex = this->m_DisplacementField->GetLargestPossibleRegion().GetIndex();
228+
typename DisplacementFieldType::IndexType upperIndex = this->m_DisplacementField->GetLargestPossibleRegion().GetUpperIndex();
228229
typename DisplacementFieldType::SpacingType spacing = this->m_DisplacementField->GetSpacing();
229230

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
238232
TParametersValueType space = NumericTraits<TParametersValueType>::OneValue();
239233

240-
// Minimum distance between neighbors
241-
IndexValueType mindist = NumericTraits<IndexValueType>::OneValue();
242-
243234
// Flag indicating a valid location for Jacobian calculation
244235
bool isValidJacobianCalcLocat = true;
245236

@@ -248,15 +239,10 @@ DisplacementFieldTransform<TParametersValueType, NDimensions>::ComputeJacobianWi
248239
dPixSign = doInverseJacobian ? -dPixSign : dPixSign;
249240
for (unsigned int row = 0; row < NDimensions; ++row)
250241
{
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])
258243
{
259244
isValidJacobianCalcLocat = false;
245+
break;
260246
}
261247
}
262248

@@ -266,51 +252,36 @@ DisplacementFieldTransform<TParametersValueType, NDimensions>::ComputeJacobianWi
266252
// do manually here
267253
for (unsigned int row = 0; row < NDimensions; ++row)
268254
{
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])
274261
{
275-
difIndex[row][0][row] = index[row] + posoff;
276-
ddrindex[row] = index[row] + posoff * 2;
262+
difIndex[0][row] = startingIndex[row];
277263
}
278-
if (index[row] > 1)
264+
if (difIndex[3][row] > upperIndex[row])
279265
{
280-
difIndex[row][1][row] = index[row] - 1;
281-
ddlindex[row] = index[row] - 2;
266+
difIndex[3][row] = upperIndex[row];
282267
}
283268

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+
}
298275

299276
// 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;
301278

302-
// typename DisplacementFieldType::PixelType dPix=
303-
// ( lpix - rpix )*space/(2.0*h); //2nd order centered difference
279+
dPix[row] += 1.0;
304280
for (unsigned int col = 0; col < NDimensions; ++col)
305281
{
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];
312283
// Verify it's a real number
313-
if (!itk::Math::isfinite(val))
284+
if (!itk::Math::isfinite(dPix[col]))
314285
{
315286
isValidJacobianCalcLocat = false;
316287
break;

0 commit comments

Comments
 (0)