[vtkusers] displaying dicom images with the right orientation

Lic. José M. Rodriguez Bacallao jmrbcu at gmail.com
Thu Mar 17 15:30:01 EDT 2011


in my program, the very first thing I need to show is the series of
images in it's original orientation, then, if the user want, sow
orthogonal slices. So, for viewing the images in their original
orientation, what is better, the camera method or the reslice method?
and for the MPR view (ortho slices) the image reslice method no?

PS: until now I was using vtkImageReslice to view the images in their
original orientation and for MPR too, my code is based in example:
Examples/ImageProcessing/Python/ImageSlicing.py

On 3/17/11, David Gobbi <david.gobbi at gmail.com> wrote:
> 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
>> -----------------------------------------------------------------
>>
>


-- 
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