123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- """
- vtkImageExportToArray - a NumPy front-end to vtkImageExport
- This class converts a VTK image to a numpy array. The output
- array will always have 3 dimensions (or 4, if the image had
- multiple scalar components).
- To use this class, you must have numpy installed (http://numpy.scipy.org)
- Methods
- SetInputConnection(vtkAlgorithmOutput) -- connect to VTK image pipeline
- SetInputData(vtkImageData) -- set an vtkImageData to export
- GetArray() -- execute pipeline and return a numpy array
- Methods from vtkImageExport
- GetDataExtent()
- GetDataSpacing()
- GetDataOrigin()
- """
- import numpy
- import numpy.core.umath as umath
- from vtkmodules.vtkIOImage import vtkImageExport
- from vtkmodules.vtkCommonExecutionModel import vtkStreamingDemandDrivenPipeline
- from vtkmodules.vtkCommonCore import VTK_SIGNED_CHAR
- from vtkmodules.vtkCommonCore import VTK_UNSIGNED_CHAR
- from vtkmodules.vtkCommonCore import VTK_SHORT
- from vtkmodules.vtkCommonCore import VTK_UNSIGNED_SHORT
- from vtkmodules.vtkCommonCore import VTK_INT
- from vtkmodules.vtkCommonCore import VTK_UNSIGNED_INT
- from vtkmodules.vtkCommonCore import VTK_LONG
- from vtkmodules.vtkCommonCore import VTK_UNSIGNED_LONG
- from vtkmodules.vtkCommonCore import VTK_FLOAT
- from vtkmodules.vtkCommonCore import VTK_DOUBLE
- class vtkImageExportToArray:
- def __init__(self):
- self.__export = vtkImageExport()
- self.__ConvertUnsignedShortToInt = False
- # type dictionary
- __typeDict = { VTK_SIGNED_CHAR:'b',
- VTK_UNSIGNED_CHAR:'B',
- VTK_SHORT:'h',
- VTK_UNSIGNED_SHORT:'H',
- VTK_INT:'i',
- VTK_UNSIGNED_INT:'I',
- VTK_FLOAT:'f',
- VTK_DOUBLE:'d'}
- __sizeDict = { VTK_SIGNED_CHAR:1,
- VTK_UNSIGNED_CHAR:1,
- VTK_SHORT:2,
- VTK_UNSIGNED_SHORT:2,
- VTK_INT:4,
- VTK_UNSIGNED_INT:4,
- VTK_FLOAT:4,
- VTK_DOUBLE:8 }
- # convert unsigned shorts to ints, to avoid sign problems
- def SetConvertUnsignedShortToInt(self,yesno):
- self.__ConvertUnsignedShortToInt = yesno
- def GetConvertUnsignedShortToInt(self):
- return self.__ConvertUnsignedShortToInt
- def ConvertUnsignedShortToIntOn(self):
- self.__ConvertUnsignedShortToInt = True
- def ConvertUnsignedShortToIntOff(self):
- self.__ConvertUnsignedShortToInt = False
- # set the input
- def SetInputConnection(self,input):
- return self.__export.SetInputConnection(input)
- def SetInputData(self,input):
- return self.__export.SetInputData(input)
- def GetInput(self):
- return self.__export.GetInput()
- def GetArray(self):
- self.__export.Update()
- input = self.__export.GetInput()
- extent = input.GetExtent()
- type = input.GetScalarType()
- numComponents = input.GetNumberOfScalarComponents()
- dim = (extent[5]-extent[4]+1,
- extent[3]-extent[2]+1,
- extent[1]-extent[0]+1)
- if (numComponents > 1):
- dim = dim + (numComponents,)
- imArray = numpy.zeros(dim, self.__typeDict[type])
- self.__export.Export(imArray)
- # convert unsigned short to int to avoid sign issues
- if (type == VTK_UNSIGNED_SHORT and self.__ConvertUnsignedShortToInt):
- imArray = umath.bitwise_and(imArray.astype('i'),0xffff)
- return imArray
- def GetDataExtent(self):
- return self.__export.GetDataExtent()
- def GetDataSpacing(self):
- return self.__export.GetDataSpacing()
- def GetDataOrigin(self):
- return self.__export.GetDataOrigin()
|