Hi,<br>While there are some filters in vtk which can be used to voxelize polydata (vtkPolyDataToImageStencil, vtkImplicitModeller, vtkSelectEnclosedPoints + image iterator etc) , I found them to be too slow, esp for large images.<br>
If you are ok with a hybrid solution (ITK + VTK ), then I would suggest the following pipeline:  vtkPolyData  -&gt;ITKSpatialObject -&gt;ItkSpatialObjectToImageFilter. I found this to be much faster. This works for simple shapes like ellipsoid, cylinders, tubes etc. With some modifications you could convert any polydata to image (using meshSpatialObject ).<br>
<br>For example, to convert a sphere polydata you could use the following code:<br><br>#include &lt;vtkPolyData.h&gt;<br>#include &lt;vtkSphereSource.h&gt;<br>#include &lt;itkImage.h&gt;<br>#include &lt;vtkSmartPointer.h&gt;<br>
#include &lt;itkSpatialObjectToImageFilter.h&gt;<br>#include &lt;itkImageFileWriter.h&gt;<br>#include &lt;itkEllipseSpatialObject.h&gt;<br><br>#if defined(_MSC_VER)<br>#pragma warning ( disable : 4786 )<br>#endif<br><br>#ifdef __BORLANDC__<br>
#define ITK_LEAN_AND_MEAN<br>#endif<br><br><br>int main( int argc, char *argv[] )<br>{<br><br>    // Generate a Sphere in VTK<br>    vtkSmartPointer&lt;vtkSphereSource&gt; polyData = vtkSmartPointer&lt;vtkSphereSource&gt;::New();<br>
    polyData-&gt;SetRadius(10);<br>    polyData-&gt;SetThetaResolution(10);<br>    polyData-&gt;SetPhiResolution(10);<br>    polyData-&gt;SetCenter(50,50,50);<br>    polyData-&gt;Update();<br><br><br><br>    typedef unsigned char  PixelType;<br>
    const unsigned int    Dimension = 3;<br><br>   // Initialize Ellise in ITK<br>    typedef itk::EllipseSpatialObject&lt;Dimension&gt;   EllipseType;<br>    EllipseType::Pointer myEllipse = EllipseType::New();<br><br>    //Set Ellipse radius<br>
    EllipseType::ArrayType radius;<br>    for(unsigned int i = 0; i&lt;3; i++)<br>      {<br>      radius[i] = polyData-&gt;GetRadius();<br>      }<br>    myEllipse-&gt;SetRadius(radius);<br><br><br>    // Convert  ITK Mesh to ITK Mesh spatial object<br>
<br>    typedef itk::Image&lt; PixelType, Dimension &gt;       ImageType;<br>    <br>    typedef itk::SpatialObjectToImageFilter&lt;<br>             EllipseType, ImageType &gt;   SpatialObjectToImageFilterType;<br><br>    SpatialObjectToImageFilterType::Pointer imageFilter =<br>
            SpatialObjectToImageFilterType::New();<br><br>    // Set Size, Spacing and origin<br>    ImageType::SizeType size;<br>    size[ 0 ] =  100;<br>    size[ 1 ] =  100;<br>    size[ 2 ] = 100;<br>    imageFilter-&gt;SetSize( size );<br>
    ImageType::SpacingType spacing;<br>    spacing[0] =  100.0 / size[0];<br>    spacing[1] =  100.0 / size[1];<br>    spacing[2] =  100.0 / size[2];<br><br>    imageFilter-&gt;SetSpacing( spacing );<br>    imageFilter-&gt;SetInput( myEllipse );<br>
<br>    ImageType::PointType origin;<br>    origin[0]=-50;<br>    origin[1]=-50;<br>    origin[2]=-50;<br>    imageFilter-&gt;SetOrigin(origin);<br><br><br>    //Set Inside/Outside voxel value<br>    const PixelType empty  = 0;<br>
    const PixelType filled =  1;<br>    myEllipse-&gt;SetDefaultInsideValue(  filled);<br>    myEllipse-&gt;SetDefaultOutsideValue(   empty   );<br>    imageFilter-&gt;SetUseObjectValue( true );<br>    imageFilter-&gt;SetOutsideValue( empty );<br>
    imageFilter-&gt;Update();<br><br>    // Write the image<br>    typedef itk::ImageFileWriter&lt; ImageType &gt;     WriterType;<br>    WriterType::Pointer writer = WriterType::New();<br><br>    writer-&gt;SetFileName(&quot;Output.nii&quot;);<br>
    writer-&gt;SetInput( imageFilter-&gt;GetOutput() );<br>    try<br>    {<br>        imageFilter-&gt;Update();<br>        writer-&gt;Update();<br>    }<br>    catch( itk::ExceptionObject &amp; excp )<br>    {<br>        std::cerr &lt;&lt; excp &lt;&lt; std::endl;<br>
        return EXIT_FAILURE;<br>    }<br><br><br>    return EXIT_SUCCESS;<br>}<br><br><br>Thanks,<br>Somesh<br><br>Date: Mon, 19 Apr 2010 11:15:18 -0500<br>
From: David Welch &lt;<a href="mailto:dmwelch@engineering.uiowa.edu">dmwelch@engineering.uiowa.edu</a><div id=":1dr" class="ii gt">&gt;<br>
Subject: [vtkusers] VTKPolyData to 3D image<br>
To: <a href="mailto:vtkusers@vtk.org">vtkusers@vtk.org</a><br>
Message-ID:<br>
        &lt;<a href="mailto:q2yfdd3cdf91004190915qf4d908fpf6d53521e1872067@mail.gmail.com">q2yfdd3cdf91004190915qf4d908fpf6d53521e1872067@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=&quot;iso-8859-1&quot;<br>
<br>
Hi all,<br>
<br>
I&#39;m want to voxelize a simple sphere surface to a 3D image, inside positive<br>
values, outside negative.  Does anyone have a suggestion how I can go about<br>
doing this?<br>
<br>
Thanks,<br>
<br>
--<br>
David Welch<br>
Graduate Student<br>
Dept. of Biomedical Engineering<br>
University of Iowa<br>
Lab: (319) 335-5279</div><br>