[vtkusers] vtkImageResliceMapper and vtkImageSliceMapper

José M. Rodriguez Bacallao jmrbcu at gmail.com
Thu Jul 5 08:41:14 EDT 2012


no one please?

On Wed, Jul 4, 2012 at 7:59 AM, José M. Rodriguez Bacallao
<jmrbcu at gmail.com> wrote:
> 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