[vtkusers] vtkImageResliceMapper and vtkImageSliceMapper
José M. Rodriguez Bacallao
jmrbcu at gmail.com
Wed Jul 4 07:59:49 EDT 2012
sorry, It was a false alarm, it doen't work on my laptop (i845), in
fact, when I change the mapper from vtkImageSliceMapper to
vtkImageResliceMapper and set the mapper: SliceAtFocalPointOff, not
even the first image is shown on the laptop, in the desktop everything
is working as should be. Any ideas, this is the code I am using with
the changes:
import os, sys
import vtk, vtkgdcm, gdcm
def files_to_read(path):
files = os.listdir(path)
return [os.path.join(path, x) for x in files]
def sort_files(files):
ipp = gdcm.IPPSorter()
ipp.SetComputeZSpacing(True)
ipp.SetZSpacingTolerance(1e-3);
result = ipp.Sort(files);
if result:
return (ipp.GetFilenames(), ipp.GetZSpacing())
return files, 0
def to_vtk_file_array(files):
vtk_files = vtk.vtkStringArray()
map(vtk_files.InsertNextValue, files)
return vtk_files
images = []
current = 0
def next(o, e):
global im, renWin, ren1, current, iren
if iren.GetKeySym() == 'Right':
current = (current + 1) % 200
elif iren.GetKeySym() == 'Left':
current = (current - 1) % 200
im.SetInput(images[current])
ren1.ResetCameraClippingRange()
renWin.Render()
if __name__ == '__main__':
# 200 images
path = '/home/jmrbcu/pictures/workpictures/dicom/BRAIN/'
print 'Reading files from %s' % path
sorted_files, zspacing = sort_files(files_to_read(path))
#sorted_files = to_vtk_file_array(sorted_files)
print 'Files sorted, Z spacing is: %s' % zspacing
for name in sorted_files:
reader = vtkgdcm.vtkGDCMImageReader()
reader.SetFileName(name)
reader.Update()
images.append(reader.GetOutput())
ren1 = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren1)
im = vtk.vtkImageResliceMapper()
im.SetInput(images[current])
im.SliceFacesCameraOn()
im.SliceAtFocalPointOff()
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)
ren1.AddViewProp(ia)
ren1.SetBackground(0, 0, 0)
renWin.SetSize(300, 300)
iren = vtk.vtkRenderWindowInteractor()
style = vtk.vtkInteractorStyleImage()
style.SetInteractionModeToImageSlicing()
style.SetImageOrientation([1, 0, 0], [0, -1, 0])
style.AddObserver('KeyPressEvent', next)
iren.SetInteractorStyle(style)
renWin.SetInteractor(iren)
renWin.Render();
ren1.ResetCameraClippingRange()
ren1.ResetCamera()
renWin.Render()
iren.Start()
On Tue, Jul 3, 2012 at 9:18 AM, José M. Rodriguez Bacallao
<jmrbcu at gmail.com> wrote:
> ohhhh, it works now, thank you very much, but I think that this need
> to be pointed out in the documentation.
>
> On Mon, Jul 2, 2012 at 5:21 PM, David Gobbi <david.gobbi at gmail.com> wrote:
>> The SliceAtFocalPointOn() should not be used if the mapper input
>> is just one slice. This method is meant to be used when you want
>> to show one slice out of a whole volume. Because your input is just
>> one slice, use SliceAtFocalPointOff().
>>
>> About the gfx board issue, I suspect that the difference is that your
>> laptop has a low-precision depth buffer and/or does camera clipping
>> differently from your desktop. Try resetting the depth clipping with
>> renderer.ResetCameraClippingRange() after changing slices.
>>
>> - David
>>
>> On Mon, Jul 2, 2012 at 2:30 PM, José M. Rodriguez Bacallao
>> <jmrbcu at gmail.com> wrote:
>>> hi folks, I am testing the following code, this example just change
>>> from one slice to another in a mapper (slices are in a list of 2D
>>> images, not a single 3D one) and update the render window:
>>>
>>> import os, sys
>>> import vtk, vtkgdcm, gdcm
>>>
>>> def files_to_read(path):
>>> files = os.listdir(path)
>>> return [os.path.join(path, x) for x in files]
>>>
>>> def sort_files(files):
>>> ipp = gdcm.IPPSorter()
>>> ipp.SetComputeZSpacing(True)
>>> ipp.SetZSpacingTolerance(1e-3);
>>> result = ipp.Sort(files);
>>> if result:
>>> return (ipp.GetFilenames(), ipp.GetZSpacing())
>>>
>>> return files, 0
>>>
>>> def to_vtk_file_array(files):
>>> vtk_files = vtk.vtkStringArray()
>>> map(vtk_files.InsertNextValue, files)
>>> return vtk_files
>>>
>>> images = []
>>> current = 0
>>> def next(o, e):
>>> global im, renWind, current, iren
>>>
>>> if iren.GetKeySym() == 'Right':
>>> current = (current + 1) % 200
>>> elif iren.GetKeySym() == 'Left':
>>> current = (current - 1) % 200
>>>
>>> im.SetInput(images[current])
>>> renWin.Render()
>>>
>>>
>>> if __name__ == '__main__':
>>> # 200 images
>>> path = '/home/jmrbcu/pictures/workpictures/dicom/BRAIN/'
>>> print 'Reading files from %s' % path
>>>
>>> sorted_files, zspacing = sort_files(files_to_read(path))
>>> #sorted_files = to_vtk_file_array(sorted_files)
>>> print 'Files sorted, Z spacing is: %s' % zspacing
>>>
>>> for name in sorted_files:
>>> reader = vtkgdcm.vtkGDCMImageReader()
>>> reader.SetFileName(name)
>>> reader.Update()
>>> images.append(reader.GetOutput())
>>>
>>> ren1 = vtk.vtkRenderer()
>>> renWin = vtk.vtkRenderWindow()
>>> renWin.AddRenderer(ren1)
>>>
>>> im = vtk.vtkImageResliceMapper()
>>> im.SetInput(images[current])
>>> 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)
>>>
>>> ren1.AddViewProp(ia)
>>> ren1.SetBackground(0, 0, 0)
>>> renWin.SetSize(300, 300)
>>>
>>> iren = vtk.vtkRenderWindowInteractor()
>>> style = vtk.vtkInteractorStyleImage()
>>> style.SetInteractionModeToImageSlicing()
>>> style.SetImageOrientation([1, 0, 0], [0, -1, 0])
>>> style.AddObserver('KeyPressEvent', next)
>>> iren.SetInteractorStyle(style)
>>> renWin.SetInteractor(iren)
>>>
>>> renWin.Render();
>>> cam1 = ren1.GetActiveCamera()
>>> cam1.ParallelProjectionOn()
>>> ren1.ResetCameraClippingRange()
>>> renWin.Render()
>>>
>>> iren.Start()
>>>
>>>
>>> the problem is that with my main machine (graphic card Intel G33,
>>> Ubuntu Linux), it work flawlessly but with my laptop (Intel i845g
>>> without hardware acceleration, Archlinux), it just show the first
>>> slice (the mapper is not updated very well I think). The problem is
>>> solved in the laptop changing from vtkImageResliceMapper to
>>> vtkImageSliceMapper and all slice are showed when the slice change
>>> action is requested, so, what to do, I really like to use
>>> vtkImageResliceMapper over vtkImageSliceMapper as documentation says.
More information about the vtkusers
mailing list