[vtkusers] vtkImageStencil too slow for large images

Jothy jothybasu at gmail.com
Mon Jul 25 08:33:49 EDT 2011


First I read a seriers of contours and create a vtkPolyData with
vtkAppendPolyData (e.g.: 100 contours as 1 polydata).

Then, create a vtkImageData with the same spacing  and origin as the dicom
image and set the extent to the extent of polydata.

Now apply vtkLinearExtrusionFilter to the polydata and then apply
vtkPolyDataToImageStencil, now finally applying the vtkImageStencil.

I works satisfactorily for vtkPolyData with bounds[2] in the range 0 to 50
or so. But becomes slow when I need to extrude on all the z slices of the
image.

here is the code

double *bounds=appendFilter->GetOutput()->GetBounds();

               vtkSmartPointer<vtkImageData>
binary_image=vtkSmartPointer<vtkImageData>::New();

               binary_image->SetScalarTypeToUnsignedChar();

               ///Use the smallest mask in which the mesh fits

               // Add two voxels on each side to make sure the mesh fits

               double * samp_origin=imgData->GetOrigin();

               double * spacing=imgData->GetSpacing();

               binary_image->SetSpacing(spacing);

               /// Put the origin on a voxel to avoid small skips

               binary_image->SetOrigin(floor((bounds[0]-samp_origin[0])/spacing[0]-2)*spacing[0]+samp_origin[0],


floor((bounds[2]-samp_origin[1])/spacing[1]-2)*spacing[1]+samp_origin[1],


floor((bounds[4]-samp_origin[2])/spacing[2]-2)*spacing[2]+samp_origin[2]);

               double * origin=binary_image->GetOrigin();

               binary_image->SetExtent(0,ceil((bounds[1]-origin[0])/spacing[0]+4),


0,ceil((bounds[3]-origin[1])/spacing[1]+4),


0,ceil((bounds[5]-origin[2])/spacing[2])+4);

               binary_image->AllocateScalars();

               memset(binary_image->GetScalarPointer(),0,binary_image->GetDimensions()[0]*binary_image->GetDimensions()[1]*binary_image->GetDimensions()[2]*sizeof(unsigned
char));

            qDebug()<<binary_image->GetExtent()[0]<<binary_image->GetExtent()[1]<<binary_image->GetExtent()[2]<<


binary_image->GetExtent()[3]<<binary_image->GetExtent()[4]<<binary_image->GetExtent()[5]<<"Binary
image extent";

               vtkSmartPointer<vtkPolyDataToImageStencil>
sts=vtkSmartPointer<vtkPolyDataToImageStencil>::New();

               //The following line is extremely important

               //http://www.nabble.com/Bug-in-vtkPolyDataToImageStencil--td23368312.html#a23370933

               sts->SetTolerance(0);

               sts->SetInformationInput(binary_image);

               vtkSmartPointer<vtkLinearExtrusionFilter>
extrude=vtkSmartPointer<vtkLinearExtrusionFilter>::New();

               extrude->SetInput(appendFilter->GetOutput());

               extrude->CappingOn();

               ///We extrude in the -slice_spacing direction to
respect the FOCAL convention

               extrude->SetVector(0, 0,-zSpacing);//Correct Z spacing
is important

               //qDebug()<<-zSpacing<<"-ve zSpacing";

               sts->SetInput(extrude->GetOutput());

               qDebug()<<t->currentTime()<<"Stencil start";

               vtkSmartPointer<vtkImageStencil>
stencil=vtkSmartPointer<vtkImageStencil>::New();

               stencil->SetStencil(sts->GetOutput());

               stencil->SetInput(binary_image);

               stencil->Update();

               qDebug()<<t->currentTime()<<"Stencil stop";





The bslowest execution occus only when I do this for the body contour, which
is there on every dicom image slice.

Can you have a look at the code and suggest ways to improve the
speed,please. The idea is from vv open source viewer.

Thanks

Jothy

On Mon, Jul 25, 2011 at 1:18 PM, David Gobbi <david.gobbi at gmail.com> wrote:

> Hi Jothy,
>
> How are you creating the stencil?  The reason that I ask is that
> vtkImageStencil is a fast filter, so I doubt that it is what is causing
> the slowdown.  But some of the stencil source filters, especially
> vtkImplicitFunctionToImageStencil, can be slow depending on how
> they are used.
>
>  - David
>
> On Mon, Jul 25, 2011 at 3:09 AM, Jothy <jothybasu at gmail.com> wrote:
> >
> > I am running in release mode in QtCreator. I even tried running from
> outside and also copiling with -o2 and -03 optimization flags, but there is
> no improvement.
> >
> > Jothy
> >
> > On Sun, Jul 24, 2011 at 4:18 AM, John Drescher <drescherjm at gmail.com>
> wrote:
> >>
> >> On Sat, Jul 23, 2011 at 3:48 PM, Jothy <jothybasu at gmail.com> wrote:
> >> > Hi all,
> >> >
> >> > In my program vtkImageStencil take alomost 2-3 mins for vtkImageData
> with
> >> > 160 slices with 0.9x0.9x2.5 spacing. Is there any way to speed up
> this?
> >> >
> >> > Thanks
> >> >
> >>
> >> Are you running release mode? And also not inside the debugger?
> >> Running debug mode or inside the Visual Studio can slow down some
> >> applications considerably ( I am talking about > 10 times slower).
> >>
> >> John
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20110725/7e8e109c/attachment.htm>


More information about the vtkusers mailing list