mangle images of vtk from itk

399 views Asked by At

I am reading an image from SimpleITK but I get these results in vtk any help? I am not sure where things are going wrong here.

Please see image here.

#### 
CODE 
def sitk2vtk(img): 

    size     = list(img.GetSize()) 
    origin   = list(img.GetOrigin()) 
    spacing  = list(img.GetSpacing()) 
    sitktype = img.GetPixelID() 
    vtktype  = pixelmap[sitktype] 
    ncomp    = img.GetNumberOfComponentsPerPixel() 

    # there doesn't seem to be a way to specify the image orientation in VTK 

    # convert the SimpleITK image to a numpy array 
    i2 = sitk.GetArrayFromImage(img) 
    #import pylab 
    #i2 = reshape(i2, size) 

    i2_string = i2.tostring() 

    # send the numpy array to VTK with a vtkImageImport object 
    dataImporter = vtk.vtkImageImport() 

    dataImporter.CopyImportVoidPointer( i2_string, len(i2_string) ) 

    dataImporter.SetDataScalarType(vtktype) 

    dataImporter.SetNumberOfScalarComponents(ncomp) 

    # VTK expects 3-dimensional parameters 
    if len(size) == 2: 
        size.append(1) 

    if len(origin) == 2: 
        origin.append(0.0) 

    if len(spacing) == 2: 
        spacing.append(spacing[0]) 

    # Set the new VTK image's parameters 
    # 
    dataImporter.SetDataExtent (0, size[0]-1, 0, size[1]-1, 0, size[2]-1) 
    dataImporter.SetWholeExtent(0, size[0]-1, 0, size[1]-1, 0, size[2]-1) 

    dataImporter.SetDataOrigin(origin) 
    dataImporter.SetDataSpacing(spacing) 

    dataImporter.Update() 

    vtk_image = dataImporter.GetOutput() 
    return vtk_image 
### 
END CODE
1

There are 1 answers

1
siavashk On

You are ignoring two things:

  1. There is an order change when you perform GetArrayFromImage:

The order of index and dimensions need careful attention during conversion. Quote from SimpleITK Notebooks at http://insightsoftwareconsortium.github.io/SimpleITK-Notebooks/01_Image_Basics.html:

ITK's Image class does not have a bracket operator. It has a GetPixel which takes an ITK Index object as an argument, which is an array ordered as (x,y,z). This is the convention that SimpleITK's Image class uses for the GetPixel method as well. While in numpy, an array is indexed in the opposite order (z,y,x).

  1. There is a change of coordinates between ITK and VTK image representations. Historically, in computer graphics there is a tendency to align the camera in such a way that the positive Y axis is pointing down. This results in a change of coordinates between ITK and VTK images.