[vtkusers] Fixing vtkPolyDataToImageStencil

David Gobbi david.gobbi at gmail.com
Tue Jan 6 08:54:45 EST 2015


Hi Roman,

I think that the artifacts in the image are uninitialized memory.  The
vtkImageData::AllocateScalars method does not initialize the memory,
it only allocates it.

In VTK 6, you should be able to use the vtkImageStencilToImage filter
instead of vtkImageStencil.

I think that VTK really needs a simple vtkImageSource that creates a
blank image, it is definitely something that a lot of people would use.
I often create blank images with vtkImageGridSource:

source = vtk.vtkImageGridSource()
source.SetDataExtent(...)
source.SetDataOrigin(...)
source.SetDataSpacing(...)
source.SetDataScalarTypeToUnsignedChar()
source.SetFillValue(255)
source.SetLineValue(255)
(note: if source image is set to 255, then don't use ReverseStencilOn)

Please let me know if one of these solutions fixes the issue.

 - David

On Tue, Jan 6, 2015 at 1:41 AM, Dr. Roman Grothausmann <
grothausmann.roman at mh-hannover.de> wrote:

> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20150106/42c1fae0/attachment.html>


More information about the vtkusers mailing list