[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