[vtkusers] displaying dicom images with the right orientation

David Gobbi david.gobbi at gmail.com
Thu Mar 17 14:26:19 EDT 2011


For extracting slices in the orthogonal directions, it is not enough
to just use the camera unless you are using the new classes
(vtkImageSliceMapper, vtkImageResliceMapper) that I mentioned.

Without these classes, there are several ways that the orthogonal
slices can be extracted, and vtkImageReslice is my favorite.  But
it is also possible to use vtkImageActor::SetDisplayExtent() or to
use a combination of vtkImageClip and vtkImagePermute.

See the following wiki page for the new vtkImageSliceMapper and
vtkImageResliceMapper classes:
http://www.vtk.org/Wiki/VTK/Image_Rendering_Classes

 - David


On Thu, Mar 17, 2011 at 12:09 PM, Lic. José M. Rodriguez Bacallao
<jmrbcu at gmail.com> wrote:
> oohh, I am understanding better now, for example, if I need to view
> ortho slices (MPR) I need to use vtkImageReslice, just one question,
> this cannot be achieved with camera as well?
> for axial slice viewing with camera is sufficient no?
>
> PS: vtkImageSliceMapper and vtkImageResliceMapper? what are they for?
>
> On 3/17/11, David Gobbi <david.gobbi at gmail.com> wrote:
>> Use the camera (but also see below).  In the VTK development head,
>> I added a method to the vtkInteractorStyleImage class that makes it
>> easier to set the camera orientation:
>>
>>   SetImageOrientation(double leftToRight[3], double bottomToTop[3]);
>>
>> This method sets the vectors that correspond to the window "up" and "right"
>> directions, i.e. bottomToTop is exactly the same as the camera ViewUp.
>>
>>
>> When I say "use the camera" it is not quite as simple as just that,
>> unless you are only viewing axial slices.  For other orientations,
>> look at e.g. Examples/ImageProcessing/Python/ImageSlicing.py
>> or even better get the VTK development head and use the new
>> classes vtkImageSliceMapper and vtkImageResliceMapper.
>>
>> I only use vtkImageReslice to transform a whole image if that is
>> what I really need, for example if I am reslicing an image after
>> doing an image registration.  For general image visualization
>> pipelines, I use vtkImageReslice to extract single slices in the view
>> orientations that I need.  But it is not something so simple that I can
>> explain it in an email, that is why there are examples like ImageSlicing.py.
>>
>>  - David
>>
>>
>> On Thu, Mar 17, 2011 at 10:28 AM, Lic. José M. Rodriguez Bacallao
>> <jmrbcu at gmail.com> wrote:
>>> well, I give up vtkIMageViewer2 long time ago. Right now I am reading
>>> all my images with FileLoewerLeftOn  to maintain the dicom coordinates
>>> system. So my question is, which is better, to use the camera to
>>> achive the right orientation or to use vtkImageReslice?
>>>
>>> On 3/17/11, David Gobbi <david.gobbi at gmail.com> wrote:
>>>> There is no "VTK system" per se when it comes to patient coordinate
>>>> systems.  That is just a vicious rumor.  The problem lies almost entirely
>>>> in vtkImageViewer2, which cannot provide the view orientations needed
>>>> for DICOM.
>>>>
>>>> If someone wrote a new image viewer, i.e. "vtkMedicalImageViewer",
>>>> that provides proper DICOM view orientations then the problem will go
>>>> away, as long as people use FileLowerLeftOn() when reading images.
>>>> Changing the coordinate system of the image so that it "works" with
>>>> vtkImageViewer2 is a bad thing, because vtkImageViewer2 is broken
>>>> with respect to DICOM.
>>>>
>>>> Until someone writes a new image viewer, I will continue to advise
>>>> people to use vtkImageActor when viewing medical images.
>>>>
>>>>  - David
>>>>
>>>>
>>>> On Thu, Mar 17, 2011 at 9:03 AM, Jothy <jothybasu at gmail.com> wrote:
>>>>> If you use vtkImageReslice you will be doing the transformation with
>>>>> vtkImageReslice (indirectly). But again you will have problems with
>>>>> different Image Orientation patient.
>>>>>
>>>>> By transforming , I am not modifying the pixel values, its only the
>>>>> coordinates to match the vtk system.
>>>>>
>>>>> Jothy
>>>>>
>>>>> On Thu, Mar 17, 2011 at 2:53 PM, Lic. José M. Rodriguez Bacallao
>>>>> <jmrbcu at gmail.com> wrote:
>>>>>> well, I think it could be done that way but I have read in some place
>>>>>> (the book from BioImage) that one never should modify the original
>>>>>> image, that's why I am asking. In one pipeline I use the camera, in
>>>>>> the other one I use vtkImageReslice, which one is more suited to what
>>>>>> I need to achieve.
>>>>>>
>>>>>> On 3/17/11, Jothy <jothybasu at gmail.com> wrote:
>>>>>>> Hi Lic
>>>>>>>
>>>>>>> I uses vtkTransform to transform the vtkImageData rather than
>>>>>>> transforming the camera. Because I wanted to overlay the RT dose on
>>>>>>> the image. It works very well. The only problem is the  the
>>>>>>> coordinates too get transformed. I mean if you have +30, -50, it will
>>>>>>> become -30,50.
>>>>>>>
>>>>>>> Jothy
>>>>>>>
>>>>>>> On Thu, Mar 17, 2011 at 1:59 PM, Lic. José M. Rodriguez Bacallao
>>>>>>> <jmrbcu at gmail.com> wrote:
>>>>>>>> so, no one at all?
>>>>>>>>
>>>>>>>> On 3/14/11, Lic. José M. Rodriguez Bacallao <jmrbcu at gmail.com> wrote:
>>>>>>>>> any ideas?
>>>>>>>>>
>>>>>>>>> On 3/14/11, Lic. José M. Rodriguez Bacallao <jmrbcu at gmail.com>
>>>>>>>>> wrote:
>>>>>>>>>> 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
>>>>>>>>>> -----------------------------------------------------------------
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> 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
>>>>>>>>> -----------------------------------------------------------------
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> 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
>>>>>>>> -----------------------------------------------------------------
>>>>>>>> _______________________________________________
>>>>>>>> Powered by www.kitware.com
>>>>>>>>
>>>>>>>> Visit other Kitware open-source projects at
>>>>>>>> http://www.kitware.com/opensource/opensource.html
>>>>>>>>
>>>>>>>> Please keep messages on-topic and check the VTK FAQ at:
>>>>>>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>>>>>>
>>>>>>>> Follow this link to subscribe/unsubscribe:
>>>>>>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> 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
>>>>>> -----------------------------------------------------------------
>>>>>>
>>>>> _______________________________________________
>>>>> Powered by www.kitware.com
>>>>>
>>>>> Visit other Kitware open-source projects at
>>>>> http://www.kitware.com/opensource/opensource.html
>>>>>
>>>>> Please keep messages on-topic and check the VTK FAQ at:
>>>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>>>
>>>>> Follow this link to subscribe/unsubscribe:
>>>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>>>
>>>>
>>>
>>>
>>> --
>>> 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
>>> -----------------------------------------------------------------
>>>
>>
>
>
> --
> 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