[vtkusers] image moved afer an orientation change
José M. Rodriguez Bacallao
jmrbcu at gmail.com
Tue Dec 11 09:45:27 EST 2012
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/20121211/22880fb5/attachment.htm>
More information about the vtkusers
mailing list