[vtkusers] Drawing an image mask per slice on top of VtkImageViewer2 for a 3D data set
Dan Liew
delcypher at gmail.com
Sat Mar 3 06:08:14 EST 2012
On 03/03/12 09:11, Dan Liew wrote:
> On 02/03/12 15:45, Delcypher wrote:
>> Hi, I have two 3D data sets
>>
>> VtkStructuredPoints named "original" of dimensions [512x512x120]
>> VtkStructuredPoints named "mask" of dimensions [512x512x120]
>>
>> I'm currently using the VtkImageViewer2 class to view a slice at
>> a time of the image "original" and this seems to be working quite
>> nicely.
>>
>> What I want is to have an image mask that is drawn on top of the
>> "original" image for each slice. I want the mask to come from
>> "mask" i.e. for every slice in "original" there is one
>> corresponding mask for that slice in "mask". When I switch slice
>> using imageViewer I need a way to make sure that the
>> corresponding mask from "mask" is drawn on the newly displayed
>> slice.
>>
>> I started looking at
>> http://www.vtk.org/Wiki/VTK/Examples/Cxx/Images/Transparency
>> which is a good example but it is only for 2D images.
>>
>> I took a look at the source code for VtkImageViewer2 and I think
>> it does the following...
>>
>> 1. Place the entire 3D image in the world co-ordinate system and
>> place the camera outside of this. 2. To select a particular
>> slice VtkImageViewer2 seems to call SetDisplayExtent(x_min ,
>> x_max, y_min, y_max, NEWSLICE_NUMBER, NEWSLICE_NUMBER) on its
>> Actor so that only the relevant slice is visible (assuming slices
>> are arranged along the Z-axis). I presume that these co-ordinates
>> are local to the actor and are not world co-ordinates, is that
>> correct?
>>
>> I'm quite happy to call SetDisplayExtent() myself on the
>> VtkImageActor for my "mask" image so that the right slice is
>> used but what I'm really unsure of is.... Where do I put the
>> VtkImageActor for my "mask" image in the world co-ordinate
>> system so everything works (i.e. the mask's slices line up
>> perfectly for all slices)??
>>
>> I consider placing the "mask" image Actor completely outside the
>> block of data for "original" but I have a strong suspicion this
>> won't work because VtkImageViewer2 adjusts the cliping planes of
>> the Active Camera of the renderer everytime the slice is changed
>> so my "mask" may be outside the clipping planes.
>>
>> Or could I just place "mask" directly on top of "original" in the
>> world co-ordinate system?
>>
>> Or better yet could I use a second VtkImageViewer2 for my "mask"
>> image and have both "VtkImageViewer2"s use the same renderer?
>>
>> What's the best approach?
>>
>> Regards,
>>
>> Dan Liew.
> Well I tried using two "VtkImageViewer2"s the program crashed. So
> I tried the approach in the example and added another actor to the
> renderer. It is sort of working but for some reason the slices are
> not correctly lining up in the XY plane despite the actors both
> sharing the same origin.
>
> Here's a screenshot illustrating what I see
> http://www.doc.ic.ac.uk/~dsl11/simi-qt.png
>
> The green square should be lined on top of the "blackish" image
> underneath it. Instead the bottom corner of the "mask" is aligned
> with the centre of the "original" image in the XY plane.
>
> Here is the code if anyone wishes to see it
> https://github.com/delcypher/simi-qt/blob/restructure/src/viewmanager.cpp
>
> Does anyone know what's wrong?
Well managed to fix it on my own. It turns out that the
VTKStructuredPoints Image I'm loading has a weird origin which is
different from the default. So I just copied the origin from my
original image to the mask image and it worked correctly.
mask = vtkStructuredPoints::New();
mask->SetExtent(original->GetExtent());
mask->SetSpacing(original->GetSpacing());
mask->SetNumberOfScalarComponents(1);
mask->SetOrigin(original->GetOrigin()); //IMPORTANT!
More information about the vtkusers
mailing list