[vtkusers] Cut slices out of polydata

Marc Huber marchuber.hft at gmx.de
Fri May 10 02:40:51 EDT 2013


I want to reach a jpg file because I have to process the image afterwards.
It works fine for the circle so I expect it should also work for my 
polydata.

But yes I have tried it with a *.mhd file.
When I display it with a vtkImageViewer2 and move the mouse I get a 
white square, but this is not my expected slice.
If I render my slice in 3D ("circle" object) it shows it correctly.

Best regards
Marc

Am 5/10/2013 1:25 AM, schrieb Alex Malyushytskyy:
> Have you tried to use vtkMetaImageWriter
> to write data for your code, so you can stop questioning  if problem 
> is with the way you write jpg?
>
> Alex
>
>
>
>
> On Thu, May 9, 2013 at 11:35 AM, Marc Huber <marchuber.hft at gmx.de 
> <mailto:marchuber.hft at gmx.de>> wrote:
>
>     Hi,
>
>     I wanted to cut a polydata object in several slices
>
>     When I apply this example it works all fine:
>     http://www.vtk.org/Wiki/VTK/Examples/Cxx/PolyData/PolyDataContourToImageData
>
>     But I have a polydata object and no sphere and I want to produce a
>     *.jpg file.
>     My result is just a black image and I'm wondering what the problem
>     might be.
>     Has anyone an idea?
>
>     Here is my code (Original code commented out and mine in red):
>
>     //ORIGINAL CODE
>         //vtkSmartPointer<vtkSphereSource> sphereSource =
>     vtkSmartPointer<vtkSphereSource>::New();
>         //    sphereSource->SetPhiResolution(30);
>         //    sphereSource->SetThetaResolution(30);
>         //    sphereSource->SetCenter(40, 40, 0);
>         //    sphereSource->SetRadius(20);
>
>         //MY CODE
>         vtkSmartPointer<vtkPolyData> polydata =
>     vtkSmartPointer<vtkPolyData>::New();
>     polydata->ShallowCopy(stlActor->GetMapper()->GetInputAsDataSet());
>
>         vtkSmartPointer<vtkCutter> circleCutter =
>     vtkSmartPointer<vtkCutter>::New();
>     //circleCutter->SetInputConnection(sphereSource->GetOutputPort());
>     //ORIGINAL
>     circleCutter->SetInputConnection(polydata->GetProducerPort());
>     //MY CODE
>         vtkSmartPointer<vtkPlane> cutPlane =
>     vtkSmartPointer<vtkPlane>::New();
>     //cutPlane->SetOrigin(sphereSource->GetCenter()); //ORIGINAL
>     cutPlane->SetOrigin(polydata->GetCenter()); //MY CODE
>             cutPlane->SetNormal(0, 0, 1);
>         circleCutter->SetCutFunction(cutPlane);
>         vtkSmartPointer<vtkStripper> stripper =
>     vtkSmartPointer<vtkStripper>::New();
>     stripper->SetInputConnection(circleCutter->GetOutputPort()); //
>     valid circle
>             stripper->Update();
>         // that's our circle
>         vtkSmartPointer<vtkPolyData> circle = stripper->GetOutput();
>
>         // write circle out
>         vtkSmartPointer<vtkXMLPolyDataWriter> polyDataWriter =
>     vtkSmartPointer<vtkXMLPolyDataWriter>::New();
>             polyDataWriter->SetInput(circle);
>             polyDataWriter->SetFileName("circle.vtp");
>             polyDataWriter->SetCompressorTypeToNone();
>             polyDataWriter->SetDataModeToAscii();
>             polyDataWriter->Write();
>
>         // prepare the binary image's voxel grid
>         double bounds[6];
>         circle->GetBounds(bounds);
>         double spacing[3]; // desired volume spacing
>         spacing[0] = 0.5;
>         spacing[1] = 0.5;
>         spacing[2] = 0.5;
>         vtkSmartPointer<vtkImageData> whiteImage =
>     vtkSmartPointer<vtkImageData>::New();
>             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])) + 1;
>             if (dim[i] < 1){ dim[i] = 1;}
>         }
>         whiteImage->SetDimensions(dim);
>         whiteImage->SetExtent(0, dim[0] - 1, 0, dim[1] - 1, 0, dim[2]
>     - 1);
>         double origin[3];
>         // NOTE: I am not sure whether or not we had to add some offset!
>         origin[0] = bounds[0];// + spacing[0] / 2;
>         origin[1] = bounds[2];// + spacing[1] / 2;
>         origin[2] = bounds[4];// + spacing[2] / 2;
>         whiteImage->SetOrigin(origin);
>         whiteImage->SetScalarTypeToUnsignedChar();
>         whiteImage->AllocateScalars();
>         // 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);
>         }
>
>         // sweep polygonal data (this is the important thing with
>     contours!)
>         vtkSmartPointer<vtkLinearExtrusionFilter> extruder =
>     vtkSmartPointer<vtkLinearExtrusionFilter>::New();
>             extruder->SetInput(circle);
>             extruder->SetScaleFactor(1.);
>             extruder->SetExtrusionTypeToNormalExtrusion();
>             extruder->SetVector(0, 0, 1);
>             extruder->Update();
>
>         // polygonal data --> image stencil:
>         vtkSmartPointer<vtkPolyDataToImageStencil> pol2stenc =
>     vtkSmartPointer<vtkPolyDataToImageStencil>::New();
>             pol2stenc->SetTolerance(0); // important if
>     extruder->SetVector(0, 0, 1) !!!
>     pol2stenc->SetInputConnection(extruder->GetOutputPort());
>             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();
>             imgstenc->SetInput(whiteImage);
>     imgstenc->SetStencil(pol2stenc->GetOutput());
>             imgstenc->ReverseStencilOff();
>             imgstenc->SetBackgroundValue(outval);
>             imgstenc->Update();
>
>         //ORIGINAL CODE
>         //vtkSmartPointer<vtkMetaImageWriter> imageWriter =
>         // vtkSmartPointer<vtkMetaImageWriter>::New();
>         //imageWriter->SetFileName("labelImage.mhd");
>     //imageWriter->SetInputConnection(imgstenc->GetOutputPort());
>         //imageWriter->Write();
>
>         //MY CODE
>           vtkSmartPointer<vtkJPEGWriter> cutWriter =
>     vtkSmartPointer<vtkJPEGWriter>::New();
>             cutWriter->SetFileName("cut1.jpg");
>     cutWriter->SetInputConnection(imgstenc->GetOutputPort());
>             cutWriter->Write();
>
>
>     _______________________________________________
>     Powered by www.kitware.com <http://www.kitware.com>
>
>     Visit other Kitware open-source projects at
>     http://www.kitware.com/opensource/opensource.html
>
>     Please keep messages on-topic and check the VTK FAQ at:
>     http://www.vtk.org/Wiki/VTK_FAQ
>
>     Follow this link to subscribe/unsubscribe:
>     http://www.vtk.org/mailman/listinfo/vtkusers
>
>


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20130510/c594a4e6/attachment.htm>


More information about the vtkusers mailing list