[Insight-developers] LevelsetMotionRegistrationImageFilter

Kishore Mosaliganti kishoreraom at gmail.com
Tue Oct 13 19:13:05 EDT 2009


Hi all,

I was using the LevelsetMotionRegistrationImageFilter to register two
3D image datasets whose voxels have anisotropic spacing:

  RegistrationFilterType::Pointer filter = RegistrationFilterType::New();
  CommandIterationUpdate::Pointer observer = CommandIterationUpdate::New();
  filter->AddObserver( itk::IterationEvent(), observer );
  filter->SetFixedImage( fixedImage );
  filter->SetMovingImage( movingImage );
  filter->SetNumberOfIterations( 50 );
  filter->SetGradientSmoothingStandardDeviations( 0.1 );
  filter->UseImageSpacingOn();
  filter->Update();

The problem is I get a Segmentation fault when I turn on
UseImageSpacingOn(). Otherwise, the filter executes normally.

I used the debugger and went into the code.
LevelsetMotionRegistrationImageFilter is a sub-class of
PDEDeformableRegistrationImageFilter which is a subclass of
FiniteDifferenceImageFilter. The code failed in the
FiniteDifferenceImageFilter::GenerateData() method in the following
lines:

....

if (this->GetState() == UNINITIALIZED)
    {
    // Set the coefficients for the deriviatives
    double coeffs[TInputImage::ImageDimension];
    if (m_UseImageSpacing)
      {
      for (unsigned int i = 0; i < TInputImage::ImageDimension; i++)
        {
        coeffs[i] = 1.0 / this->GetInput()->GetSpacing()[i];
        }
      }
    else
      {
      for (unsigned int i = 0; i < TInputImage::ImageDimension; i++)
        {
        coeffs[i] = 1.0;
        }
      }

.....

When I went to see the state of the input pointer, this->m_Input, it
is a vector of 3 image pointers. Basically, this->m_Input[1] refers to
the fixed image and this->m_Input[2] refers to the moving image.
this->m_Input[0] is NULL. this->m_Input[0] is supposed to contain the
initial deformation field which is not a prerequisite for running the
code.

The code in itkPDEDeformableRegistrationImageFilter::SetFixedImage()
and itkPDEDeformableRegistrationImageFilter::SetMovingImage() call
this->ProcessObject::SetNthInput( 1, const_cast< FixedImageType * >(
ptr ) ) and this->ProcessObject::SetNthInput( 2, const_cast<
FixedImageType * >( ptr ) ) respectively.

This filter derives from
ImageToImageFilter<TDeformationField,TDeformationField> but the vector
of inputs have been set as scalar-valued fixed and moving image
pointers. Also, for the case when the initial deformation field is
unknown, the FiniteDifferenceFilter is checking for the first input
which doesn't exist.

I have filed a bug report:
http://public.kitware.com/Bug/view.php?id=9709



Thanks,
Kishore


More information about the Insight-developers mailing list