[vtkusers] Fixing vtkPolyDataToImageStencil

Dr. Roman Grothausmann grothausmann.roman at mh-hannover.de
Tue Jan 6 03:41:51 EST 2015


Hi David,

On 05/01/15 16:00, David Gobbi wrote:
> Do the attached images match the artifacts that you see?

Yes.

> The output of vtkPolyDataToImageStencil is binary (each voxel is "on" or "off"), so
> it is impossible for it, on its own, to produce different shades of grey.

That's a good point, though I thought it only creates the stencil to pass to 
vtkImageStencil which then should only return a binary image.

> What filters are you using downstream of vtkPolyDataToImageStencil?

Well, basically only vtkImageStencil and the meta-image writer see below:


def voxelizer_vol_naa(selection, scale):
     """ volume voxelization not anti-aliased """

     # Get selection boundaries.
     (minX, maxX, minY, maxY, minZ, maxZ) = [int(x*scale) for x in 
selection.GetBounds()] #convert tuple of floats to ints
     (minX, maxX, minY, maxY, minZ, maxZ) = (minX-1, maxX+1, minY-1, maxY+1, 
minZ-1, maxZ+1)
     print_info(VERB, "  Selection bounds are %s\n"%str((minX, maxX, minY, maxY, 
minZ, maxZ)) ) #dimensions of the resulting image

     ps1= 1.0/scale  # pixel size for the stencil, make sure it's a float division!
     ps2= 1.0        # pixel size for the image

     ## Convert a surface mesh into an image stencil that can be used to mask an 
image with vtkImageStencil.
     polyToStencilFilter = vtk.vtkPolyDataToImageStencil()
     polyToStencilFilter.SetInputData(selection)
     polyToStencilFilter.SetOutputWholeExtent(minX, maxX, minY, maxY, minZ, maxZ)
     polyToStencilFilter.SetOutputSpacing(ps1, ps1, ps1)
     polyToStencilFilter.SetOutputOrigin(0.0, 0.0, 0.0)
     add_progress_observer(polyToStencilFilter)
     polyToStencilFilter.Update()

     # Create an empty (3D) image of appropriate size.
     image = vtk.vtkImageData();
     image.SetSpacing(ps2, ps2, ps2);
     image.SetOrigin(0.0, 0.0, 0.0);
     image.SetExtent(minX, maxX, minY, maxY, minZ, maxZ);
     # image.SetScalarTypeToUnsignedChar();
     # image.AllocateScalars(); # this causes blender to crash if not enough 
space can be allocated
     ##see patch: 
http://vtk.1045678.n5.nabble.com/Re-patch-for-turning-almost-all-VTK-errors-into-Python-exceptions-IMPROVED-td1251918.html
     image.AllocateScalars(vtk.VTK_UNSIGNED_CHAR, 1) #vtk-6.x
     # Mask the empty image with the image stencil.
     stencil = vtk.vtkImageStencil()
     stencil.SetInputData(image)
     #stencil.SetStencil(polyToStencilFilter.GetOutput())
     stencil.SetStencilConnection(polyToStencilFilter.GetOutputPort()) #vtk-6.x
     stencil.ReverseStencilOn()
     stencil.SetBackgroundValue(255)

     add_progress_observer(stencil)
     stencil.Update()

     return stencil.GetOutput()


The result is then passed to the writer:


def write_image(image, filename):
     """Write vtk image data to file."""
     aWriter = vtk.vtkMetaImageWriter()
     aWriter.SetInputData(image)
     aWriter.SetFileName(filename)
     aWriter.SetFileDimensionality(3) #blender only knows 3D
     aWriter.SetCompression(False)
     add_progress_observer(aWriter)
     aWriter.Write()


Am I doing something inappropriate somewhere that could cause the varying grey 
values?

Many thanks for looking into this.
Roman


>
> On Mon, Jan 5, 2015 at 7:33 AM, Dr. Roman Grothausmann
> <grothausmann.roman at mh-hannover.de <mailto:grothausmann.roman at mh-hannover.de>>
> wrote:
>
>     Hi David,
>
>     On 05/01/15 15:20, David Gobbi wrote:
>     > The .mha file that you attached is giving me an error:
>     >
>     >    MetaImage: M_ReadElementsData: data not read completely
>     >       ideal = 1316134911 : actual = 87431
>
>     Sorry, it was compressed with my MHA plugin for fiji which does not
>     recompute CompressedDataSize because ITK happily ignores any mismatches
>     except for reporting;-)
>     Attached the file compressed with ITK itself (possible because the data is
>     less than 4GB, see https://issues.itk.org/jira/__browse/ITK-3321
>     <https://issues.itk.org/jira/browse/ITK-3321>).
>
>     Just noticed: it also contains artifacts in slices 130 to 142.
>
>     Many thanks for looking into this.
>     Roman
>
>
>         On Mon, Jan 5, 2015 at 5:55 AM, Dr. Roman Grothausmann
>         <grothausmann.roman at mh-__hannover.de
>         <mailto:grothausmann.roman at mh-hannover.de>
>         <mailto:grothausmann.roman at mh-__hannover.de
>         <mailto:grothausmann.roman at mh-hannover.de>>>
>         wrote:
>
>              Hi David,
>
>
>              Many thanks for improving vtkPolyDataToImageStencil. I tested the
>         git branch
>              on 141229 in conjunction with my Voxelizer plug-in for Blender
>              (http://www.midasjournal.org/____browse/publication/882
>         <http://www.midasjournal.org/__browse/publication/882>
>              <http://www.midasjournal.org/__browse/publication/882
>         <http://www.midasjournal.org/browse/publication/882>>) and I still get some
>              artifacts in the result (see first two slices of attached MHA) with
>         e.g. an
>              icosahedron (scale set to 100) as found in the attachment. Is that
>         related
>              to the bugs of vtkPolyDataToImageStencil?
>
>              Kind regards,
>              Roman
>

-- 
Dr. Roman Grothausmann

Tomographie und Digitale Bildverarbeitung
Tomography and Digital Image Analysis

Institut für Funktionelle und Angewandte Anatomie, OE 4120
Medizinische Hochschule Hannover
Carl-Neuberg-Str. 1
D-30625 Hannover

Tel. +49 511 532-9574


More information about the vtkusers mailing list