You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
3.8 KiB
132 lines
3.8 KiB
2 years ago
|
"""
|
||
|
vtkImageExportToArray - a NumPy front-end to vtkImageExport
|
||
|
|
||
|
This class converts a VTK image to a Numeric Python array.
|
||
|
|
||
|
To use this class, you must have the LLNL Numeric Python distribution
|
||
|
(http://numpy.sf.net)
|
||
|
|
||
|
Methods
|
||
|
|
||
|
SetInput(input) -- connect to VTK image pipeline
|
||
|
GetArray() -- execute pipeline and return a Numeric array
|
||
|
|
||
|
Convert VTK_UNSIGNED_SHORT to python Int
|
||
|
(this might be necessary because Python doesn't support unsigned short,
|
||
|
the default is to cast unsigned short to signed short).
|
||
|
|
||
|
SetConvertUnsignedShortToInt(yesno)
|
||
|
ConvertUnsignedShortToIntOn()
|
||
|
ConvertUnsignedShortToIntOff()
|
||
|
|
||
|
From vtkImageExport
|
||
|
|
||
|
GetDataExtent()
|
||
|
GetDataSpacing()
|
||
|
GetDataOrigin()
|
||
|
"""
|
||
|
|
||
|
import Numeric
|
||
|
import umath
|
||
|
from vtk import vtkImageExport
|
||
|
from vtkConstants import *
|
||
|
|
||
|
_NEW_NUMERIC = 0
|
||
|
try:
|
||
|
val = float(Numeric.__version__)
|
||
|
except ValueError:
|
||
|
_NEW_NUMERIC = 0
|
||
|
else:
|
||
|
if val > 20.0:
|
||
|
_NEW_NUMERIC = 1
|
||
|
else:
|
||
|
_NEW_NUMERIC = 0
|
||
|
|
||
|
|
||
|
class vtkImageExportToArray:
|
||
|
def __init__(self):
|
||
|
self.__export = vtkImageExport()
|
||
|
self.__ConvertUnsignedShortToInt = 0
|
||
|
|
||
|
# type dictionary: note that python doesn't support
|
||
|
# unsigned integers!
|
||
|
|
||
|
__typeDict = { VTK_CHAR:Numeric.Int8,
|
||
|
VTK_UNSIGNED_CHAR:Numeric.UnsignedInt8,
|
||
|
VTK_SHORT:Numeric.Int16,
|
||
|
VTK_UNSIGNED_SHORT:Numeric.Int16,
|
||
|
VTK_INT:Numeric.Int32,
|
||
|
VTK_FLOAT:Numeric.Float32,
|
||
|
VTK_DOUBLE:Numeric.Float64 }
|
||
|
|
||
|
__sizeDict = { VTK_CHAR:1,
|
||
|
VTK_UNSIGNED_CHAR:1,
|
||
|
VTK_SHORT:2,
|
||
|
VTK_UNSIGNED_SHORT:2,
|
||
|
VTK_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 = 1
|
||
|
|
||
|
def ConvertUnsignedShortToIntOff(self):
|
||
|
self.__ConvertUnsignedShortToInt = 0
|
||
|
|
||
|
# set the input
|
||
|
def SetInput(self,input):
|
||
|
return self.__export.SetInput(input)
|
||
|
|
||
|
def GetInput(self):
|
||
|
return self.__export.GetInput()
|
||
|
|
||
|
def GetArray(self):
|
||
|
input = self.__export.GetInput()
|
||
|
input.UpdateInformation()
|
||
|
type = input.GetScalarType()
|
||
|
extent = input.GetWholeExtent()
|
||
|
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,)
|
||
|
size = dim[0]*dim[1]*dim[2]*numComponents*self.__sizeDict[type]
|
||
|
|
||
|
if _NEW_NUMERIC:
|
||
|
imArray = Numeric.zeros((size,),Numeric.UnsignedInt8)
|
||
|
self.__export.Export(imArray)
|
||
|
else:
|
||
|
imString = Numeric.zeros((size,),
|
||
|
Numeric.UnsignedInt8).tostring()
|
||
|
self.__export.Export(imString)
|
||
|
imArray = Numeric.fromstring(imString,self.__typeDict[type])
|
||
|
# just to remind myself of the dangers of memory management
|
||
|
del imString
|
||
|
|
||
|
# reshape array appropriately.
|
||
|
imArray = Numeric.reshape(imArray, dim)
|
||
|
# convert unsigned short to int to avoid sign issues
|
||
|
if (type == VTK_UNSIGNED_SHORT and self.__ConvertUnsignedShortToInt):
|
||
|
imArray = umath.bitwise_and(imArray.astype(Numeric.Int32),0xffff)
|
||
|
|
||
|
return imArray
|
||
|
|
||
|
def GetDataExtent(self):
|
||
|
return self.__export.GetDataExtent()
|
||
|
|
||
|
def GetDataSpacing(self):
|
||
|
return self.__export.GetDataSpacing()
|
||
|
|
||
|
def GetDataOrigin(self):
|
||
|
return self.__export.GetDataOrigin()
|
||
|
|
||
|
|