[vtkusers] displaying dicom images with the right orientation

Lic. José M. Rodriguez Bacallao jmrbcu at gmail.com
Mon Mar 14 11:27:46 EDT 2011


i folks, I just finished two versions of a pipeline for displaying
dicom images with the right display position and orientation. I am
using gdcm vtkGDCMImageReader to read the images (and IPPSort to
sort). In both pipelines I set the reader's FileLoewerLeft to "On" and
in both I achieve the desired result. The question is which pipeline
is better for wat I am trying to do (display the images the right way
and later display a MPR view) or use one for display simple slices and
the other one to make a MPR. One pipeline version is using the camera
to achieve the right visualization and the other one is using
vtkImageReslice.

here is an example program with the two pipelines (left: Camera,
right: vtkImageReslice)


def get_left_renderer(input, dir_cosines):
    image_actor = vtk.vtkImageActor()
    image_actor.SetInput(input.GetOutput())

    ren_left = vtk.vtkRenderer()
    ren_left.SetViewport(0.0, 0.0, 0.5, 1.0)
    ren_left.AddActor(image_actor)

    camera_left = ren_left.GetActiveCamera()
    axial_matrix = vtk.vtkMatrix4x4()
    axial_matrix.DeepCopy(dir_cosines)
    axial_matrix.SetElement(1, 1, -1)
    t = vtk.vtkTransform()
    t.Identity()
    t.Concatenate(axial_matrix)
    camera_left.SetUserTransform(t)
    ren_left.ResetCamera()

    return ren_left

def get_right_renderer(input):
    image = input.GetOutput()
    (x_min, x_max, y_min, y_max, z_min, z_max) = image.GetWholeExtent()
    (x_spacing, y_spacing, z_spacing) = image.GetSpacing()
    (x0, y0, z0) = image.GetOrigin()

    center = (
        x0 + x_spacing * 0.5 * (x_min + x_max),
        y0 + y_spacing * 0.5 * (y_min + y_max),
        z0
    )#+ z_spacing * 0.5 * (z_min + z_max))

    axial = vtk.vtkMatrix4x4()
    axial.DeepCopy((
        1, 0, 0, center[0],
        0, -1, 0, center[1],
        0, 0, 1, center[2],
        0, 0, 0, 1
    ))

    reslice = vtk.vtkImageReslice()
    reslice.SetInput(input.GetOutput())
    reslice.SetOutputDimensionality(3)
    reslice.SetAutoCropOutput(True)
    reslice.SetResliceAxes(axial)

    image_actor = vtk.vtkImageActor()
    image_actor.SetInput(reslice.GetOutput())

    ren_right = vtk.vtkRenderer()
    ren_right.SetViewport(0.5, 0.0, 1.0, 1.0)

    ren_right.AddActor(image_actor)
    ren_right.ResetCamera()

    return ren_right

import vtk, vtkgdcm, sys
from PyQt4 import QtGui

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)

    isi = vtk.vtkInteractorStyleImage()
    vtk_widget = vtk.QVTKWidget()
    vtk_widget.resize(1280,800)
    vtk_widget.GetInteractor().SetInteractorStyle(isi)
    rwin = vtk_widget.GetRenderWindow()

    # read the image from disk
    image_reader = vtkgdcm.vtkGDCMImageReader()
    image_reader.SetFileName('/home/jmrbcu/pictures/workpictures/dicom/IM66.dcm')
    image_reader.FileLowerLeftOn()
    image_reader.Update()

    # calculate the middle window center and width
    image = image_reader.GetOutput()
    range = image.GetScalarRange()
    center = 0.5 * (range[1] + range[0])
    width  = range[1] - range[0]

    # create the colormap
    colormap = vtkgdcm.vtkImageMapToWindowLevelColors2()
    colormap.SetInputConnection(image_reader.GetOutputPort())
    colormap.SetWindow(width)
    colormap.SetLevel(center)
    colormap.Update()

    # create left and right renderers
    rwin.AddRenderer(get_left_renderer(colormap,
image_reader.GetDirectionCosines()))
    rwin.AddRenderer(get_right_renderer(colormap))

    rwin.Render()
    vtk_widget.show()

    app.exec_()

#    ipp = reader.GetImagePositionPatient()
#    iop = reader.GetImageOrientationPatient()
#    row = iop[:3]
#    col = iop[3:]
#    slice = [0,0,0]
#    vtk.vtkMath().Cross(row, col, slice)
#
#    matrix = vtk.vtkMatrix4x4()
#    for j in range(3):
#        matrix.SetElement(j, 0, row[j])
#        matrix.SetElement(j, 1, col[j])
#        matrix.SetElement(j, 2, slice[j])
#

#
#    ca.SetUserTransform(t)
#    ca.SetViewUp(0, -1, 0)
#    ca.SetFocalPoint(0, 0, 1)
#    ca.SetPosition(0,0,0)

#    ca.ComputeViewPlaneNormal()
#    ca.OrthogonalizeViewUp()
#    ca.ParallelProjectionOn()
#    ca.SetParallelScale(1)



-- 
Lic. José M. Rodriguez Bacallao
Centro de Biofisica Medica
-----------------------------------------------------------------
Todos somos muy ignorantes, lo que ocurre es que no todos ignoramos lo mismo.

Recuerda: El arca de Noe fue construida por aficionados, el titanic
por profesionales
-----------------------------------------------------------------



More information about the vtkusers mailing list