[vtkusers] vtkImageStencil too slow for large images

Jothy jothybasu at gmail.com
Mon Jul 25 09:04:53 EDT 2011


Is it available from github?

Can I try resampling image to a coarser spacing?

Will it make any improvement?

Thanks

Jothy

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

> You'll have to wait until VTK 5.8.  It provides a faster
> vtkPolyDataToImageStencil that does not require the contours to be extruded.
>
>  - David
>
>
>
> On Mon, Jul 25, 2011 at 6:33 AM, Jothy <jothybasu at gmail.com> wrote:
>
>> 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/c54fd39a/attachment.htm>


More information about the vtkusers mailing list