[vtkusers] stretching pixels in one dimension

Sankhesh Jhaveri sankhesh.jhaveri at kitware.com
Mon Nov 21 10:40:40 EST 2016


Take a look at vtkImageResample
<http://www.vtk.org/doc/nightly/html/classvtkImageResample.html#details>.
You can set the AxisMagnificationFactor or just provide a spacing value
explicitly using SetAxisOutputSpacing
​

On Mon, Nov 21, 2016 at 10:24 AM Michael Hansen <michaelsvenna at gmail.com>
wrote:

> Hi Sankhesh,
>
> Thank you for your comment. Can you tell me how I can adjust the spacing
> of the image data along the z-axis?
> Below is my code:
>
> from PyQt5.QtWidgets import (QMainWindow,
>                              QFrame, QVBoxLayout, QApplication)
> from PyQt5 import QtCore
> from QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
> import random
> import vtk
> import numpy as np
> import sys
> import h5py
> import skimage
> import matplotlib.pyplot as plt
>
>
> def misc2stdimage(img):
>     '''
>     Transform arbitrarily scaled image into
>     something scikit image understands,
>     ie. a ubyte numpy array
>     '''
>     # rescale to [x E -1.0;1.0], xER
>     img_rescaled = (((img - img.min()) / (img.max() - img.min()))*2)-1
>     return skimage.img_as_ubyte(img_rescaled)
>
> class MyEventFilter(QtCore.QObject):
>     def __init__(self, vtkwindow):
>         self.vtkwindow = vtkwindow
>         QtCore.QObject.__init__(self)
>
>     def eventFilter(self, receiver, event):
>         if(event.type() == QtCore.QEvent.KeyPress):
>             if event.text() == 'x':
>                 self.vtkwindow.slideX(1)
>             elif event.text() == 'X':
>                 self.vtkwindow.slideX(-1)
>             elif event.text() == 'y':
>                 self.vtkwindow.slideY(1)
>             elif event.text() == 'Y':
>                 self.vtkwindow.slideY(-1)
>             elif event.text() == 'z':
>                 self.vtkwindow.slideZ(1)
>             elif event.text() == 'Z':
>                 self.vtkwindow.slideZ(-1)
>         return super(MyEventFilter,self).eventFilter(receiver, event)
>
> def MakeLUTFromCTF(tableSize):
>     '''
>     Use a color transfer Function to generate the colors in the lookup
> table.
>     See:
> http://www.vtk.org/doc/nightly/html/classvtkColorTransferFunction.html
>     :param: tableSize - The table size
>     :return: The lookup table.
>     '''
>     ctf = vtk.vtkColorTransferFunction()
>     ctf.SetColorSpaceToDiverging()
>     # Green to tan.
>     ctf.AddRGBPoint(0.0, 0.085, 0.532, 0.201)
>     ctf.AddRGBPoint(0.5, 0.865, 0.865, 0.865)
>     ctf.AddRGBPoint(1.0, 0.677, 0.492, 0.093)
>
>     lut = vtk.vtkLookupTable()
>     lut.SetNumberOfTableValues(tableSize)
>     lut.Build()
>
>     for i in range(0,tableSize):
>         rgb = list(ctf.GetColor(float(i)/tableSize))+[1]
>         lut.SetTableValue(i,rgb)
>
>     return lut
>
> class MainWindow(QMainWindow):
>
>     def slideX(self, x):
>         self.planeWidgetX.SetSliceIndex(
>             self.planeWidgetX.GetSliceIndex() + x
>         )
>         print( self.planeWidgetX.GetSliceIndex() )
>         self.ren.ResetCameraClippingRange()
>         self.vtkWidget.GetRenderWindow().Render()
>
>     def slideY(self, y):
>         self.planeWidgetY.SetSliceIndex(
>             self.planeWidgetY.GetSliceIndex() + y
>         )
>         self.ren.ResetCameraClippingRange()
>         self.vtkWidget.GetRenderWindow().Render()
>
>     def slideZ(self, z):
>         self.planeWidgetZ.SetSliceIndex(
>             self.planeWidgetZ.GetSliceIndex() + z
>         )
>         self.ren.ResetCameraClippingRange()
>         self.vtkWidget.GetRenderWindow().Render()
>
>     def __init__(self, parent = None):
>         QMainWindow.__init__(self, parent)
>
>         self.frame = QFrame()
>
>         self.vl = QVBoxLayout()
>         self.vtkWidget = QVTKRenderWindowInteractor(self.frame)
>
>         self.vl.addWidget(self.vtkWidget)
>
>         self.ren = vtk.vtkRenderer()
>         self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
>         self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()
>
>         F = h5py.File('../realdata.h5','r')
>         volume = np.dstack(
>             (
>                 F['02']['03']['db'],
>                 F['02']['04']['db'],
>                 F['02']['05']['db'],
>                 F['02']['06']['db'],
>                 F['02']['07']['db'],
>                 F['02']['08']['db']
>             )
>         )
>         data_matrix = misc2stdimage(volume)
>         F.close()
>         m, n, p = data_matrix.shape
>
>         print(data_matrix.shape, data_matrix.dtype,
>               np.min(data_matrix), np.max(data_matrix)
>         )
>
>         v16 = vtk.vtkImageImport()
>         v16.CopyImportVoidPointer(data_matrix, data_matrix.nbytes)
>         v16.SetDataScalarTypeToUnsignedChar()
>         v16.SetNumberOfScalarComponents(1)
>         v16.SetDataExtent(0, p-1, 0, n-1, 0, m-1)
>         v16.SetWholeExtent(0, p-1, 0, n-1, 0, m-1)
>
>         xMin, xMax, yMin, yMax, zMin, zMax = v16.GetExecutive().\
>                                              GetWholeExtent(
>
>  v16.GetOutputInformation(0)
>                                              )
>
>         spacing = v16.GetOutput().GetSpacing()
>         sx, sy, sz = spacing
>
>         origin = v16.GetOutput().GetOrigin()
>         ox, oy, oz = origin
>
>         # An outline is shown for context.
>         outline = vtk.vtkOutlineFilter()
>         outline.SetInputConnection(v16.GetOutputPort())
>
>         outlineMapper = vtk.vtkPolyDataMapper()
>         outlineMapper.SetInputConnection(outline.GetOutputPort())
>
>         outlineActor = vtk.vtkActor()
>         outlineActor.SetMapper(outlineMapper)
>
>         # The shared picker enables us to use 3 planes at one time
>         # and gets the picking order right
>         picker = vtk.vtkCellPicker()
>         picker.SetTolerance(0.005)
>
>         norm = plt.Normalize()
>         colors = plt.cm.jet(norm(range(0, 255)))
>         colorFunc = vtk.vtkColorTransferFunction()
>         [colorFunc.AddRGBPoint(i, colors[i,0], colors[i,1], colors[i,2])
>          for i in range(0,255)]
>
>
>         # The 3 image plane widgets are used to probe the dataset.
>         self.planeWidgetX = vtk.vtkImagePlaneWidget()
>         self.planeWidgetX.DisplayTextOn()
>         self.planeWidgetX.SetInputConnection(v16.GetOutputPort())
>         self.planeWidgetX.SetPlaneOrientationToXAxes()
>         self.planeWidgetX.SetSliceIndex(32)
>         self.planeWidgetX.SetPicker(picker)
>         self.planeWidgetX.SetKeyPressActivationValue("x")
>         self.planeWidgetX.SetLookupTable(MakeLUTFromCTF(200))
>
>         prop1 = self.planeWidgetX.GetPlaneProperty()
>         prop1.SetColor(1, 0, 0)
>
>         self.planeWidgetY = vtk.vtkImagePlaneWidget()
>         self.planeWidgetY.DisplayTextOn()
>         self.planeWidgetY.SetInputConnection(v16.GetOutputPort())
>         self.planeWidgetY.SetPlaneOrientationToYAxes()
>         self.planeWidgetY.SetSliceIndex(32)
>         self.planeWidgetY.SetPicker(picker)
>         self.planeWidgetY.SetKeyPressActivationValue("y")
>         self.planeWidgetY.SetLookupTable(MakeLUTFromCTF(200))
>         prop2 = self.planeWidgetY.GetPlaneProperty()
>         prop2.SetColor(1, 1, 0)
>
> self.planeWidgetY.SetLookupTable(self.planeWidgetX.GetLookupTable())
>
>         self.planeWidgetZ = vtk.vtkImagePlaneWidget()
>         self.planeWidgetZ.DisplayTextOn()
>         self.planeWidgetZ.SetInputConnection(v16.GetOutputPort())
>         self.planeWidgetZ.SetPlaneOrientationToZAxes()
>         self.planeWidgetZ.SetSliceIndex(46)
>         self.planeWidgetZ.SetPicker(picker)
>         self.planeWidgetZ.SetKeyPressActivationValue("z")
>         self.planeWidgetZ.SetLookupTable(MakeLUTFromCTF(200))
>         prop3 = self.planeWidgetZ.GetPlaneProperty()
>         prop3.SetColor(0, 0, 1)
>
> self.planeWidgetZ.SetLookupTable(self.planeWidgetX.GetLookupTable())
>
>         self.ren.AddActor(outlineActor)
>
>         self.planeWidgetX.SetInteractor(self.iren)
>         self.planeWidgetX.On()
>         self.planeWidgetY.SetInteractor(self.iren)
>         self.planeWidgetY.On()
>         self.planeWidgetZ.SetInteractor(self.iren)
>         self.planeWidgetZ.On()
>
>         self.ren.ResetCamera()
>         self.ren.ResetCameraClippingRange()
>         self.ren.SetViewport(0,0,1,1)
>         self.vtkWidget.GetRenderWindow().SetSize(400, 400)
>
>         self.frame.setLayout(self.vl)
>         self.setCentralWidget(self.frame)
>
>         self.show()
>         self.iren.Initialize()
>
> if __name__ == "__main__":
>
>     app = QApplication(sys.argv)
>     window = MainWindow()
>     myFilter = MyEventFilter(window)
>     app.installEventFilter(myFilter)
>     window.ren.ResetCamera()
>
>     sys.exit(app.exec_())
>
>
> On Mon, Nov 21, 2016 at 3:00 PM, Sankhesh Jhaveri <
> sankhesh.jhaveri at kitware.com> wrote:
>
> Hi Michael,
>
> Depending on your use case, you could either use the vtkCamera API (or an
> appropriate interactor style) to zoom in on a section of the data or modify
> the spacing of the image data along the Z axis.
>
> Hope that helps.
> Sankhesh
>>
> On Mon, Nov 21, 2016 at 4:57 AM Michael Hansen <michaelsvenna at gmail.com>
> wrote:
>
> Hello. I have volumes which are of size 800x30000x6
>
> I am visualizing this using 3 vtkImagePlaneWidget.
>
> This is working ok, however when i am viewing the data in the dimension
> which only has columns its pretty much impossible to see the content of the
> 6 pixels....
> My question is... is there any way to stretch/zoom/scale the pixels in
> this dimension such that it becomes more visible to the viewer?
>
> Thanks
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at:
> http://www.vtk.org/Wiki/VTK_FAQ
>
> Search the list archives at: http://markmail.org/search/?q=vtkusers
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/vtkusers
>
> --
> Sankhesh Jhaveri *Sr. Research & Development Engineer* | Kitware
> <http://www.kitware.com/> | (518) 881-4417
>>
>
> --
Sankhesh Jhaveri *Sr. Research & Development Engineer* | Kitware
<http://www.kitware.com/> | (518) 881-4417
​
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20161121/3b328d8b/attachment.html>


More information about the vtkusers mailing list