[vtkusers] orthogonal slices through a volume
David Gobbi
dgobbi at atamai.com
Mon Aug 21 14:05:24 EDT 2006
Hi Anja,
It is possible to use vtkImageReslice to do what you want, but the trick
is this:
You need to set up vtkImageReslice so that it will extract just 1 slice
for you.
If you use vtkImageReslice to reslice the whole volume, and then use
vtkImageViewer2 or vtkImageClip to extract one slice from the resliced
volume, then you will have a very hard time getting the result you want.
So, I'm sure you are wondering how to get vtkImageReslice to select just
one slice for you, and how to make sure that it selects the correct slice.
The easiest way to output just one slice is to use
slicer->SetOutputDimensionality(2).
The easiest way to select which slice to output is to use
slicer->SetResliceAxesOrigin(x,y,z) where (x,y,z) is the point where
your three orthogonal planes will intersect.
There is still one tricky part left! When you use
SetOutputDimensionality(2), the output of vtkImageReslice will always be
in a 2D (x,y) coordinate system with z=0. This is no problem if you are
using vtkImageViewer, since it works in the 2D display coordinate
system, but you will get into trouble with vtkImageViewer2.
The best way to display the result is to use vtkImageActor (or actually
3 separate vtkImageActors). You will have to set the UserMatrix of the
vtkImageActor to match the ResliceAxes matrix that was applied to the
image by the slicer:
imageActor->SetUserMatrix(slicer->GetResliceAxes());
This will place the imageActor in exactly the same position as the slice
that the slicer cut from the volume.
So as you can see, this is all fairly complicated. But when it is all
done, you can slice in all three directions by changing the (x,y,z) that
you send to slicer->ResliceAxesOrigin(x,y,z). Send the same (x,y,z) to
all three slicers.
Let me know how it works for you.
- David
Anja Ende wrote:
> Hi everyone,
>
> I know this question has been asked before but I could not find an
> answer that could have helped me, so I am asking again.
>
> Well... I am trying to get the classic 3 orthogonal slices through a
> volume. I know the vtkImageViewer2 provides this functionality but I
> cannot use that component unfortunately.
>
> I was trying to use the vtkImageReslicer to get the XZ plane through
> the volume.
>
> So, I tried setting up the matrix as follows:
>
> vtkImageReslice * slicer = vtkImageReslice::New();
> slicer->SetInput(imageChangeInformationP->GetOutput());
> slicer->SetResliceAxesDirectionCosines(1, 0, 0, 0, 0, 1, 0, -1, 0);
>
> Is this matrix correct if I want to get the XZ plane out of the
> volume? I ask because some of the slices in the beginning and end seem
> bogus. The vtkImageViewer2 does not show them when I set the
> orientation to XZ in the vtk viewer.
>
> Also, I noticed that the vtkImageViewer2 displays the volume nicely
> with correct aspect ratio and all that... So, I tried using:
>
> slicer->SetOutputSpacing(1.0, 1.0, 1.0);
>
> This was shown in the example. However, this changes my extents and
> the number of Z slices reduces.
>
> I was wondering if someone can help me determine the correct matrix
> for extracting these planes.
>
> Thanks,
>
> Anja
> ------------------------------------------------------------------------
>
> _______________________________________________
> This is the private VTK discussion list.
> Please keep messages on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>
More information about the vtkusers
mailing list