[vtkusers] image moved afer an orientation change

José M. Rodriguez Bacallao jmrbcu at gmail.com
Wed Dec 12 12:10:27 EST 2012


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?
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20121212/4b38ca81/attachment.htm>


More information about the vtkusers mailing list