PolyDataToImageData
VTKExamples/Cxx/PolyData/PolyDataToImageData
Description¶
- Contributed by: Lars Friedrich
This example generates a sphere (prerequisite: closed surface of type vtkPolyData) and converts it into volume representation (vtkImageData) where the foreground voxels are 255 (inside) and the background voxels are 0 (outside). Internally vtkPolyDataToImageStencil is utilized. The resultant image is saved to disk in metaimage file format (SphereVolume.mhd).
Code¶
PolyDataToImageData.cxx
#include <vtkVersion.h> #include <vtkSmartPointer.h> #include <vtkPolyData.h> #include <vtkImageData.h> #include <vtkSphereSource.h> #include <vtkMetaImageWriter.h> #include <vtkPolyDataToImageStencil.h> #include <vtkImageStencil.h> #include <vtkPointData.h> /** * This program generates a sphere (closed surface, vtkPolyData) and converts it into volume * representation (vtkImageData) where the foreground voxels are 1 and the background voxels are * 0. Internally vtkPolyDataToImageStencil is utilized. The resultant image is saved to disk * in metaimage file format (SphereVolume.mhd). */ int main(int, char *[]) { vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New(); sphereSource->SetRadius(20); sphereSource->SetPhiResolution(30); sphereSource->SetThetaResolution(30); vtkSmartPointer<vtkPolyData> pd = sphereSource->GetOutput(); sphereSource->Update(); vtkSmartPointer<vtkImageData> whiteImage = vtkSmartPointer<vtkImageData>::New(); double bounds[6]; pd->GetBounds(bounds); double spacing[3]; // desired volume spacing spacing[0] = 0.5; spacing[1] = 0.5; spacing[2] = 0.5; whiteImage->SetSpacing(spacing); // compute dimensions int dim[3]; for (int i = 0; i < 3; i++) { dim[i] = static_cast<int>(ceil((bounds[i * 2 + 1] - bounds[i * 2]) / spacing[i])); } whiteImage->SetDimensions(dim); whiteImage->SetExtent(0, dim[0] - 1, 0, dim[1] - 1, 0, dim[2] - 1); double origin[3]; origin[0] = bounds[0] + spacing[0] / 2; origin[1] = bounds[2] + spacing[1] / 2; origin[2] = bounds[4] + spacing[2] / 2; whiteImage->SetOrigin(origin); #if VTK_MAJOR_VERSION <= 5 whiteImage->SetScalarTypeToUnsignedChar(); whiteImage->AllocateScalars(); #else whiteImage->AllocateScalars(VTK_UNSIGNED_CHAR,1); #endif // fill the image with foreground voxels: unsigned char inval = 255; unsigned char outval = 0; vtkIdType count = whiteImage->GetNumberOfPoints(); for (vtkIdType i = 0; i < count; ++i) { whiteImage->GetPointData()->GetScalars()->SetTuple1(i, inval); } // polygonal data --> image stencil: vtkSmartPointer<vtkPolyDataToImageStencil> pol2stenc = vtkSmartPointer<vtkPolyDataToImageStencil>::New(); #if VTK_MAJOR_VERSION <= 5 pol2stenc->SetInput(pd); #else pol2stenc->SetInputData(pd); #endif pol2stenc->SetOutputOrigin(origin); pol2stenc->SetOutputSpacing(spacing); pol2stenc->SetOutputWholeExtent(whiteImage->GetExtent()); pol2stenc->Update(); // cut the corresponding white image and set the background: vtkSmartPointer<vtkImageStencil> imgstenc = vtkSmartPointer<vtkImageStencil>::New(); #if VTK_MAJOR_VERSION <= 5 imgstenc->SetInput(whiteImage); imgstenc->SetStencil(pol2stenc->GetOutput()); #else imgstenc->SetInputData(whiteImage); imgstenc->SetStencilConnection(pol2stenc->GetOutputPort()); #endif imgstenc->ReverseStencilOff(); imgstenc->SetBackgroundValue(outval); imgstenc->Update(); vtkSmartPointer<vtkMetaImageWriter> writer = vtkSmartPointer<vtkMetaImageWriter>::New(); writer->SetFileName("SphereVolume.mhd"); #if VTK_MAJOR_VERSION <= 5 writer->SetInput(imgstenc->GetOutput()); #else writer->SetInputData(imgstenc->GetOutput()); #endif writer->Write(); return EXIT_SUCCESS; }
CMakeLists.txt¶
cmake_minimum_required(VERSION 2.8) PROJECT(PolyDataToImageData) find_package(VTK REQUIRED) include(${VTK_USE_FILE}) add_executable(PolyDataToImageData MACOSX_BUNDLE PolyDataToImageData.cxx) target_link_libraries(PolyDataToImageData ${VTK_LIBRARIES})
Download and Build PolyDataToImageData¶
Danger
The generation of tar files has not been ported to the new VTKExamples. Some tarballs may be missing or out-of-date.
Click here to download PolyDataToImageData and its CMakeLists.txt file. Once the tarball PolyDataToImageData.tar has been downloaded and extracted,
cd PolyDataToImageData/build
If VTK is installed:
cmake ..
If VTK is not installed but compiled on your system, you will need to specify the path to your VTK build:
cmake -DVTK_DIR:PATH=/home/me/vtk_build ..
Build the project:
make
and run it:
./PolyDataToImageData
WINDOWS USERS PLEASE NOTE: Be sure to add the VTK bin directory to your path. This will resolve the VTK dll's at run time.