[vtkusers] image moved afer an orientation change

David Gobbi david.gobbi at gmail.com
Wed Dec 12 12:35:45 EST 2012


Do you have a copy of the VTK source code, specifically the file
vtkImageData.cxx?  Take a look at the C++ code for the following
method:

vtkIdType vtkImageData::FindPoint(double x[3])

This code takes a point in data coords, computes the ijk structured
coords (i.e. the voxel), and then computes a point index.  You've been
dealing with images in VTK for long enough that all the code inside
this method should be 100% obvious to you... if it isn't, then study
it until it DOES become obvious.

 - David


On Wed, Dec 12, 2012 at 10:10 AM, José M. Rodriguez Bacallao
<jmrbcu at gmail.com> wrote:
> sorry for my ineptitude, how do I do that?
>
>
> On Wed, Dec 12, 2012 at 11:39 AM, David Gobbi <david.gobbi at gmail.com> wrote:
>>
>> Hi José,
>>
>> You have to compute the slice number from the focal point.
>> The focal point defines a position (x,y,z) in World coords.
>> Compute the closest voxel to that point, and you have the slice.
>>
>>  - David
>>
>>
>> On Wed, Dec 12, 2012 at 9:21 AM, José M. Rodriguez Bacallao
>> <jmrbcu at gmail.com> wrote:
>> > hi David:
>> >
>> > saving the focal point did the trick!!! thanks very much
>> > another question, how do I know the current slice number given the
>> > camera
>> > parameters, for example, if my image have the following dimensions: (0,
>> > 256,
>> > 0, 256, 0, 199), the vtkInteractorStyleImage put the initial view in the
>> > center using an axial orientation, this is the slice: 99. If I want the
>> > user
>> > of my class can call a function named, for example:
>> > set_slice(slice_number)
>> > where slice_number will be the number of the desired slice to view, in
>> > this
>> > example a number between 0 and 199, how do I do that?
>> >
>> >
>> > On Wed, Dec 12, 2012 at 8:54 AM, David Gobbi <david.gobbi at gmail.com>
>> > wrote:
>> >>
>> >> Arrgh.  Another typo.  The code should be:
>> >>
>> >>   camera.SetFocalPoint(focal_point_for_axial_view)
>> >>   style.SetImageOrientation(orientation_for_axial_view)
>> >>
>> >> And of course you should save the focal point for the
>> >> previous orientation at the same time.
>> >>
>> >>  - David
>> >>
>> >> On Wed, Dec 12, 2012 at 6:53 AM, David Gobbi <david.gobbi at gmail.com>
>> >> wrote:
>> >> > On Wed, Dec 12, 2012 at 6:51 AM, David Gobbi <david.gobbi at gmail.com>
>> >> > wrote:
>> >> >> The slicing and the panning are both controlled via the camera's
>> >> >> focal
>> >> >> point.  So slicing through the axial images causes the camera's
>> >> >> FocalPoint to move in and out along the Z axis.  Then, when you
>> >> >> switch
>> >> >> to a new orientation, this "Z" position is centered in the window.
>> >> >>
>> >> >> If you want to avoid this, you should save the FocalPoint for each
>> >> >> view orientation.  Then, you can restore the focal point before you
>> >> >> call SetImageOrientation, e.g.
>> >> >>
>> >> >> camera.SetFocalPoint(focal_point_for_axial_view)
>> >> >> camera.SetImageOrientation(orientation_for_axial_view)
>> >> >>
>> >> >>  - David
>> >> >>
>> >> >> On Wed, Dec 12, 2012 at 5:24 AM, José M. Rodriguez Bacallao
>> >> >> <jmrbcu at gmail.com> wrote:
>> >> >>> no one please, is this normal?
>> >> >>>
>> >> >>>
>> >> >>> On Tue, Dec 11, 2012 at 9:45 AM, José M. Rodriguez Bacallao
>> >> >>> <jmrbcu at gmail.com> wrote:
>> >> >>>>
>> >> >>>> hi folks, I am trying to implement a MPR viewer, so far so good. I
>> >> >>>> am
>> >> >>>> using the new image classes, this is test code:
>> >> >>>>
>> >> >>>> #!/usr/bin/env python
>> >> >>>>
>> >> >>>> import os
>> >> >>>> import gdcm, vtkgdcm, vtk
>> >> >>>>
>> >> >>>>
>> >> >>>> def key_press(sender, event):
>> >> >>>>     key = interactor.GetKeySym()
>> >> >>>>     style.SetCurrentRenderer(renderer)
>> >> >>>>     if key == 'a':
>> >> >>>>         print 'axial'
>> >> >>>>         style.SetImageOrientation(
>> >> >>>>             style.GetZViewRightVector(),
>> >> >>>>             style.GetZViewUpVector()
>> >> >>>>         )
>> >> >>>>     elif key == 'c':
>> >> >>>>         print 'coronal'
>> >> >>>>         style.SetImageOrientation(
>> >> >>>>             style.GetYViewRightVector(),
>> >> >>>>             style.GetYViewUpVector()
>> >> >>>>         )
>> >> >>>>     elif key == 's':
>> >> >>>>         print 'axial'
>> >> >>>>         style.SetImageOrientation(
>> >> >>>>             style.GetXViewRightVector(),
>> >> >>>>             style.GetXViewUpVector()
>> >> >>>>         )
>> >> >>>>     render_window.Render()
>> >> >>>>
>> >> >>>>
>> >> >>>>
>> >> >>>> interactor = vtk.vtkRenderWindowInteractor()
>> >> >>>> render_window = vtk.vtkRenderWindow()
>> >> >>>> render_window.SetSize(400, 400)
>> >> >>>> interactor.SetRenderWindow(render_window)
>> >> >>>>
>> >> >>>> style = vtk.vtkInteractorStyleImage()
>> >> >>>> style.SetInteractionModeToImageSlicing()
>> >> >>>> interactor.SetInteractorStyle(style)
>> >> >>>> style.AddObserver('CharEvent', key_press)
>> >> >>>>
>> >> >>>> print 'sorting files...'
>> >> >>>> path = '/home/jmrbcu/pictures/workpictures/dicom/BRAIN/'
>> >> >>>> files = [os.path.join(path, x) for x in os.listdir(path)]
>> >> >>>>
>> >> >>>> ipp = gdcm.IPPSorter()
>> >> >>>> ipp.SetComputeZSpacing(True)
>> >> >>>> ipp.SetZSpacingTolerance(1e-3)
>> >> >>>> result = ipp.Sort(files)
>> >> >>>>
>> >> >>>> sorted_files, zspacing = files, 0
>> >> >>>> if result:
>> >> >>>>     sorted_files = ipp.GetFilenames()
>> >> >>>>     zspacing = ipp.GetZSpacing()
>> >> >>>>     print 'files sorted, z spacing is: %s' % zspacing
>> >> >>>> else:
>> >> >>>>     print 'cannot sort files, this is not a valid volume'
>> >> >>>>
>> >> >>>> vtk_files = vtk.vtkStringArray()
>> >> >>>> map(vtk_files.InsertNextValue, sorted_files)
>> >> >>>>
>> >> >>>> reader = vtkgdcm.vtkGDCMImageReader()
>> >> >>>> reader.FileLowerLeftOn()
>> >> >>>> reader.SetFileNames(vtk_files)
>> >> >>>> reader.Update()
>> >> >>>>
>> >> >>>> spacing = reader.GetOutput().GetSpacing()
>> >> >>>> change = vtk.vtkImageChangeInformation()
>> >> >>>> change.SetInputConnection(reader.GetOutputPort())
>> >> >>>> change.SetOutputSpacing(spacing[0], spacing[1], zspacing)
>> >> >>>>
>> >> >>>> im = vtk.vtkImageResliceMapper()
>> >> >>>> im.SetInputConnection(change.GetOutputPort())
>> >> >>>> im.SliceFacesCameraOn()
>> >> >>>> im.SliceAtFocalPointOn()
>> >> >>>> im.BorderOff()
>> >> >>>>
>> >> >>>> ip = vtk.vtkImageProperty()
>> >> >>>> ip.SetColorWindow(255)
>> >> >>>> ip.SetColorLevel(128)
>> >> >>>> ip.SetAmbient(0.0)
>> >> >>>> ip.SetDiffuse(1.0)
>> >> >>>> ip.SetOpacity(1.0)
>> >> >>>> ip.SetInterpolationTypeToLinear()
>> >> >>>>
>> >> >>>> ia = vtk.vtkImageSlice()
>> >> >>>> ia.SetMapper(im)
>> >> >>>> ia.SetProperty(ip)
>> >> >>>>
>> >> >>>> renderer = vtk.vtkRenderer()
>> >> >>>> renderer.AddViewProp(ia)
>> >> >>>> renderer.SetBackground(0 , 0, 0)
>> >> >>>> render_window.AddRenderer(renderer)
>> >> >>>>
>> >> >>>> style.SetCurrentRenderer(renderer)
>> >> >>>> style.SetZViewRightVector((1, 0, 0))
>> >> >>>> style.SetZViewUpVector((0, -1, 0))
>> >> >>>>
>> >> >>>> style.SetXViewRightVector((0, 1, 0))
>> >> >>>> style.SetXViewUpVector((0, 0, 1))
>> >> >>>>
>> >> >>>> style.SetYViewRightVector((1, 0, 0))
>> >> >>>> style.SetYViewUpVector((0, 0, 1))
>> >> >>>> style.SetImageOrientation(style.GetZViewRightVector(),
>> >> >>>> style.GetZViewUpVector())
>> >> >>>>
>> >> >>>> # render the image
>> >> >>>> renderer.ResetCamera()
>> >> >>>> renderer.GetActiveCamera().ParallelProjectionOn()
>> >> >>>> renderer.ResetCameraClippingRange()
>> >> >>>> render_window.Render()
>> >> >>>>
>> >> >>>> interactor.Initialize()
>> >> >>>> interactor.Start()
>> >> >>>>
>> >> >>>> the problems arise in this sequence:
>> >> >>>>
>> >> >>>> 1-  initially display the image: ok
>> >> >>>> 2-  slice the image to a different slice with ctrl + mosue left:
>> >> >>>> ok
>> >> >>>> 3-  change the orientation to a different one (sagital or coronal,
>> >> >>>> doesn't
>> >> >>>> matter): this is the problem, orientation of the image is changed
>> >> >>>> fine to
>> >> >>>> the new one but the image is panned to a different position in the
>> >> >>>> render
>> >> >>>> window/renderer, not the center of it and in a different slice
>> >> >>>> (the
>> >> >>>> middle
>> >> >>>> slice of the whole image)
>> >> >>>>
>> >> >>>> how can I avoid this, I mean, keep the image centered in the
>> >> >>>> render
>> >> >>>> window/renderer when the image orientation is changed and in the
>> >> >>>> correct
>> >> >>>> slice location?
>> >
>> >
>
>



More information about the vtkusers mailing list