[vtkusers] vtkImageReslice config problem

David Gobbi david.gobbi at gmail.com
Mon Mar 3 18:06:35 EST 2008


Since setting the OutputOrigin has been a problem for almost
as long as ImageReslice has been around, I might add a method
"SetOutputOriginInInputCoords()" so that the
set-the-output-origin-through-the-transform trick can be
pipelined.  I know that ImageReslice already has too many
methods, but this one might be quite useful.

    David


On Mon, Mar 3, 2008 at 5:01 PM, Dean Inglis <dean.inglis at camris.ca> wrote:
> thanks David,
>
>  I also added a vtkImageChangeInformation to the center
>  the image so now my ResliceAxesOrigin is always 0,0,0 .
>  It all works very nicely now!
>
>  Dean
>
>
>  Hi Dean,
>
>  I think that everything is correct except for the OutputOrigin, which
>  requires a bit of math.  See below.
>
>  On Mon, Mar 3, 2008 at 2:22 PM, Dean Inglis <dean.inglis at sympatico.ca>
>  wrote:
>  >
>  > Hi
>  >
>  > I am developing a MPR application and am having some difficulty
>  > getting vtkImageReslice configured properly. I have a set of "layout
>  > lines" interactively defined on a slice through the original image
>  > data set. The user can set the number of slices, spacing (output slice
>  > thickness ) and length of the lines (in-plane FOV of the slices) as
>  > well as the in-plane pixel dimensions (see attached jpeg). When I set
>  > the vtkImageReslice, I use the following settings:
>  > // r, s and t define the the output axes unit vectors
>  > this->Reslice->SetResliceAxesDirectionCosines(
>  > r[0],r[1],r[2],s[0],s[1],s[2],t[0],t[1],t[2]);
>
>  That part is correct.  Note that trilinear and tricubic interpolation give
>  poor results if you use large oblique angles such that there is more than
>  one pixel worth of shear per unit slice spacing.
>  If the axes are orthogonal, you are always safe.
>
>  > // turn off transformation of the input spacing origin and extent //
>  > so we can use our own
>  > this->Reslice->TransformInputSamplingOff();
>
>  That's definitely necessary.
>
>  > // p0 corresponds to the origin of the output axes unit vectors // and
>  > would correspond to one of the corners of the preview // plane shown
>  > in the figure when that plane was on the first // of the layout lines
>  > this->Reslice->SetResliceAxesOrigin(p0[0], p0[1], p0[2]);
>
>  That is probably not the best choice.  I usually try to keep the
>  ResliceAxesOrigin at (or at least close to) the centre of the volume.
>  However, where you set the ResliceAxesOrigin is not critical as you will see
>  in the next step.
>
>  > // neither of the following choices work!
>  > // this->Reslice->SetOutputOrigin( p0[0], p0[1], p0[2] );
>  > this->Reslice->SetOutputOrigin( 0.5*r_sp, 0.5*s_sp, 0.5*t_sp );
>
>  This is where things are going wrong.  The OutputOrigin must be placed at
>  the corner of the output volume, and must be given in the Output's own
>  coordinate system.
>
>  You already know the coordinates of Output volume's corner in the Input
>  coordinate system, so you just have to apply a coordinate transformation to
>  put it into the Output coordinate system.
>
>  If you have already set the ResliceAxesDirectionCosines and the
>  ResliceAxesOrigin, you have already created a 4x4 matrix containing the
>  transformation from the Output coordinate system to Input coordinate system,
>  so you can do as follows:
>
>  vtkMatrix4x4 *temp = vtkMatrix4x4::New();
>  temp->DeepCopy(reslice->GetResliceAxes());
>  temp->Invert();
>  temp->MultiplyPoint(outputCornderInInputCoords,
>  temp->outputCornerInOutputCoords);
>
>
>
>  Don't forget that MultiplyPoint takes homogeneous coords (4 values).
>  Use the result as your OutputOrigin.
>
>  > // r_sp, s_sp and t_sp are user specified spacings
>  > this->Reslice->SetOutputSpacing( r_sp, s_sp, t_sp );
>
>  Correct.
>
>  > // w_ext is calculated from the specified spacings, the length of //
>  > the layout lines, the distance they span, and the necessary height //
>  > of the output slices so that none of the input data is truncated.
>  > // w_ext[0], w_ext[2], w_ext[4] are all 0.
>  > this->Reslice->SetOutputExtent(w_ext);
>
>  Yes.
>
>  > When I update the reslice, the output slices do not appear positioned
>  > with respect to the requested origin. Is there some transform I have
>  > to apply to get the correct origin? Would I have to transform the extent?
>
>  Leave the extent alone, VTK can be a pain to work with if extents don't
>  start at zero.
>
>   -David
>



More information about the vtkusers mailing list