vtkImage::GetScalarPointer from Python (to numpy array)?

It returns a str on the format _00007f55d65c1010_p_void. Any way to get a Python array to the underlying image data in a zero copy way? I looked at numpy_support.py but couldn’t find anything like that.

Replying to self, I think I found the answer in Common/Core/Testing/Python/TestSwigPointer.py.

One can create a VTK array and use SetVoidArray(..).

Worked like a charm. Excerpt from my code:

    from vtk import vtkUnsignedCharArray
    from vtk.util.numpy_support import vtk_to_numpy
    ...
    array = vtkUnsignedCharArray()
    array.SetNumberOfTuples(numBytes)
    array.SetVoidArray(image.GetScalarPointer(), numBytes, 1)

    frame = vtk_to_numpy(array)

FYI, vtki has some very useful numpy-VTK array access helpers that might help you down the road!

say you have some image data (vtkImageData = vtki.UniformGrid) given in the example dataset:

>>> import vtk
>>> from vtki import examples
>>> import numpy as np
>>> data = examples.load_uniform()
>>> isinstance(data, vtk.vtkImageData)
True
>>> isinstance(data.active_scalar, np.ndarray)
True

See Berk’s 5-part series of blog posts on VTK/NumPy integration, starting with Improved VTK – numpy integration.

1 Like

Thanks for the pointers to both of you.

In this case I could make due with just vtk_to_numpy. I needed to write the RGB bytes of the image to stdin of an ffmpeg process. Perhaps I could have done that without involving numpy at all (what I did was process.stdin.write(nparray.tobytes()))

(The image came from a vtkWindowToImage filter.)