[vtkusers] vtkImageReslice & Extent & WholeExtent

Schaap, J.A. (LKEB) J.A.Schaap at lumc.nl
Fri Nov 8 09:14:12 EST 2002


Hi David,

I'm not sure if this is a bug, or wheter I'm mis-using your excelent class.

here's my code:

imReslice->SetOutputExtent(0, dimensionsOfOutput[0]-1, 0, dimensionsOfOutput[1]-1, 0, dimensionsOfOutput[2]-1);
imReslice->SetOutputSpacing(spacingOfOutput[0], spacingOfOutput[1], spacingOfOutput[2]);
imReslice->SetResliceAxesOrigin(originOfLowerSlice[0], originOfLowerSlice[1], originOfLowerSlice[2]);
imReslice->SetResliceAxesDirectionCosines(ortho1, ortho2, normal);
imReslice->SetOutputOrigin(0, 0, 0);

It reslices my box of dat into another box of data, and the results look perfect.
If i ask however, imReslice->GetOutput()->GetBounds() then sometimes it gives the bounds of only one of the sides of the new box (so 2D) instead of 3D.
When I step into imReslice->GetOutput()->GetBounds() then I get to the method vtkImageData::ComputeBounds() which reads as follows:

void vtkImageData::ComputeBounds()
{
  float *origin = this->GetOrigin();
  float *spacing = this->GetSpacing();
  
  this->Bounds[0] = origin[0] + (this->Extent[0] * spacing[0]);
  this->Bounds[2] = origin[1] + (this->Extent[2] * spacing[1]);
  this->Bounds[4] = origin[2] + (this->Extent[4] * spacing[2]);

  this->Bounds[1] = origin[0] + (this->Extent[1] * spacing[0]);
  this->Bounds[3] = origin[1] + (this->Extent[3] * spacing[1]);
  this->Bounds[5] = origin[2] + (this->Extent[5] * spacing[2]);
}


I checked the origin and the spacing, they are correct. That's quite logical since I call the lines:
imReslice->SetOutputOrigin(0, 0, 0);
imReslice->SetOutputSpacing(spacingOfOutput[0], spacingOfOutput[1], spacingOfOutput[2]);

The this->Extent is not ok however. One of the sides is 0, 0 so the whole box is 2D. If I look at this->WholeExtent then it looks ok to me. It's the same as it set it with the line 
imReslice->SetOutputExtent(0, dimensionsOfOutput[0]-1, 0, dimensionsOfOutput[1]-1, 0, dimensionsOfOutput[2]-1);


So I looked into the code of vtkImageReslice. The last lines of the method void vtkImageReslice::ExecuteInformation(vtkImageData *input, vtkImageData *output) read...

  output->SetWholeExtent(outWholeExt);
  output->SetSpacing(outSpacing);
  output->SetOrigin(outOrigin);
  output->SetScalarType(input->GetScalarType());
  output->SetNumberOfScalarComponents(input->GetNumberOfScalarComponents());


Shouldn't this be

  output->SetWholeExtent(outWholeExt);
  output->SetExtent(outWholeExt);
  output->SetSpacing(outSpacing);
  output->SetOrigin(outOrigin);
  output->SetScalarType(input->GetScalarType());
  output->SetNumberOfScalarComponents(input->GetNumberOfScalarComponents());

so the Extent and the WholeExtent of the output are correct and always the same?

Best regards, Jorrit Schaap




More information about the vtkusers mailing list