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 ->ITKSpatialObject ->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 <vtkPolyData.h><br>#include <vtkSphereSource.h><br>#include <itkImage.h><br>#include <vtkSmartPointer.h><br>
#include <itkSpatialObjectToImageFilter.h><br>#include <itkImageFileWriter.h><br>#include <itkEllipseSpatialObject.h><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<vtkSphereSource> polyData = vtkSmartPointer<vtkSphereSource>::New();<br>
polyData->SetRadius(10);<br> polyData->SetThetaResolution(10);<br> polyData->SetPhiResolution(10);<br> polyData->SetCenter(50,50,50);<br> polyData->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<Dimension> EllipseType;<br> EllipseType::Pointer myEllipse = EllipseType::New();<br><br> //Set Ellipse radius<br>
EllipseType::ArrayType radius;<br> for(unsigned int i = 0; i<3; i++)<br> {<br> radius[i] = polyData->GetRadius();<br> }<br> myEllipse->SetRadius(radius);<br><br><br> // Convert ITK Mesh to ITK Mesh spatial object<br>
<br> typedef itk::Image< PixelType, Dimension > ImageType;<br> <br> typedef itk::SpatialObjectToImageFilter<<br> EllipseType, ImageType > 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->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->SetSpacing( spacing );<br> imageFilter->SetInput( myEllipse );<br>
<br> ImageType::PointType origin;<br> origin[0]=-50;<br> origin[1]=-50;<br> origin[2]=-50;<br> imageFilter->SetOrigin(origin);<br><br><br> //Set Inside/Outside voxel value<br> const PixelType empty = 0;<br>
const PixelType filled = 1;<br> myEllipse->SetDefaultInsideValue( filled);<br> myEllipse->SetDefaultOutsideValue( empty );<br> imageFilter->SetUseObjectValue( true );<br> imageFilter->SetOutsideValue( empty );<br>
imageFilter->Update();<br><br> // Write the image<br> typedef itk::ImageFileWriter< ImageType > WriterType;<br> WriterType::Pointer writer = WriterType::New();<br><br> writer->SetFileName("Output.nii");<br>
writer->SetInput( imageFilter->GetOutput() );<br> try<br> {<br> imageFilter->Update();<br> writer->Update();<br> }<br> catch( itk::ExceptionObject & excp )<br> {<br> std::cerr << excp << 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 <<a href="mailto:dmwelch@engineering.uiowa.edu">dmwelch@engineering.uiowa.edu</a><div id=":1dr" class="ii gt">><br>
Subject: [vtkusers] VTKPolyData to 3D image<br>
To: <a href="mailto:vtkusers@vtk.org">vtkusers@vtk.org</a><br>
Message-ID:<br>
<<a href="mailto:q2yfdd3cdf91004190915qf4d908fpf6d53521e1872067@mail.gmail.com">q2yfdd3cdf91004190915qf4d908fpf6d53521e1872067@mail.gmail.com</a>><br>
Content-Type: text/plain; charset="iso-8859-1"<br>
<br>
Hi all,<br>
<br>
I'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>