[vtkusers] vtkImageStencil too slow for large images
Jothy
jothybasu at gmail.com
Mon Jul 25 09:22:38 EDT 2011
Resampling is improving the speed at the cost of accuracy. But the speed
improves only when it is downsampled in the z direction.
May be I could use this resampling for just body.
Jothy
On Mon, Jul 25, 2011 at 2:04 PM, Jothy <jothybasu at gmail.com> wrote:
> 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/aa77f7bb/attachment.htm>
More information about the vtkusers
mailing list