Example #1
0
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent)

        self.frame = QtWidgets.QFrame()
        self.vl = QtWidgets.QVBoxLayout()
        self.QtInteractor = QVTKRenderWindowInteractor(self.frame)
        self.vl.addWidget(self.QtInteractor)

        self.dicom_image_path = 'IM-0008-0034.dcm'

        # '----------set up dicom reader---------------'
        self.dcmReader = vtk.vtkDICOMImageReader()
        self.dcmReader.SetDataByteOrderToLittleEndian()
        self.dcmReader.SetFileName(self.dicom_image_path)
        self.dcmReader.Update()

        # '----------init render---------------'
        self.ren = vtk.vtkRenderer()

        # show the dicom flie
        self.imageViewer = vtk.vtkImageViewer2()
        self.imageViewer.SetInputConnection(self.dcmReader.GetOutputPort())

        self.renderWindowInteractor = vtk.vtkRenderWindowInteractor()
        self.imageViewer.SetupInteractor(self.renderWindowInteractor)

        self.imageViewer.Render()
        self.imageViewer.GetRenderer().ResetCamera()
        self.imageViewer.Render()
        self.renderWindowInteractor.Start()
def show_image(image, actors=[]):
    viewer = vtk.vtkImageViewer2()
    viewer.SetInputData(image)

    istyle = vtk.vtkInteractorStyleImage()
    iren = vtk.vtkRenderWindowInteractor()
    viewer.SetupInteractor(iren)
    iren.SetInteractorStyle(istyle)

    min_slice = viewer.GetSliceMin()
    max_slice = viewer.GetSliceMax()

    actions = {'slice': min_slice}

    def mouse_wheel_forward_event(caller, event):
        if actions['slice'] > min_slice:
            actions['slice'] -= 1
            viewer.SetSlice(actions['slice'])
            viewer.Render()

    def mouse_wheel_backward_event(caller, event):
        if actions['slice'] < max_slice:
            actions['slice'] += 1
            viewer.SetSlice(actions['slice'])
            viewer.Render()

    istyle.AddObserver('MouseWheelForwardEvent', mouse_wheel_forward_event)
    istyle.AddObserver('MouseWheelBackwardEvent', mouse_wheel_backward_event)

    for actor in actors:
        viewer.GetRenderer().AddActor(actor)

    viewer.Render()
    iren.Initialize()
    iren.Start()
Example #3
0
    def viewSlice(self):
        data = [self.__cvt2ubyte(reader) for reader in self.readers]

        viewer_ranges = [(0.0, 0.5, 0.5, 1.0), (0.5, 0.5, 1.0, 1.0),
                         (0.0, 0.0, 0.5, 0.5), (0.5, 0.0, 1.0, 0.5)]
        text_pos = (20, 980)
        if self.isFlat:
            viewer_ranges = [(0.0, 0.0, 0.25, 1.0), (0.25, 0.0, 0.5, 1.0),
                             (0.50, 0.0, 0.75, 1.0), (0.75, 0.0, 1.0, 1.0)]
            text_pos = [20, 470]

        self.viewers = []
        for i, viewer_range in enumerate(viewer_ranges):
            viewer = vtk.vtkImageViewer2()
            viewer.SetInputConnection(data[i].GetOutputPort())
            viewer.SetupInteractor(self.iren)
            viewer.SetRenderWindow(self.renWin)
            viewer.SetColorLevel(127)
            viewer.SetColorWindow(255)
            viewer.GetImageActor().RotateY(180)  # flip top-bottom
            #viewer.GetRenderer().SetBackground(0.1, 0.1, 0.1)
            viewer.GetRenderer().SetViewport(viewer_range)
            self.viewers.append(viewer)

        # add text in the first viewer
        text = self.__formatText(self.sliceIdx, self.sliceNum)
        self.textActor = self.__addText(text, text_pos[0], text_pos[1])
        self.viewers[0].GetRenderer().AddActor2D(self.textActor)
        self.__updateSlice()

        self.__loop()
    def Initialize(self):

        # Get Volume from mrml Scene
        #self.volume = self.slicerRenderer.GetVolumes().GetItemAsObject(0)

        self.scene = CarmSimulatorScene()

        # Set up FOV and dummy renderer
        self.renderer = vtk.vtkRenderer()
        self.rendererFOV = vtk.vtkRenderer()
        self.pngReader = vtk.vtkPNGReader()
        self.imageViewer = vtk.vtkImageViewer2()
        self.fovPath = os.path.join(self.resourcePath,
                                    'Resources\FieldOfViewMedium.png')
        self.pngReader.SetFileName(self.fovPath)
        self.pngReader.Update()
        self.imageViewer.SetInputConnection(self.pngReader.GetOutputPort())
        self.imageViewer.SetRenderer(self.rendererFOV)
        #self.renderer.AddVolume(self.volume)
        self.renderWindow = vtk.vtkRenderWindow()
        self.renderWindow.SetNumberOfLayers(2)
        self.renderWindow.AddRenderer(self.renderer)
        self.renderWindow.AddRenderer(self.rendererFOV)
        # self.rendererFOV.ResetCamera()
        self.rendererFOV.GetActiveCamera().SetPosition(750.0, 750.0, 700)
        self.rendererFOV.GetActiveCamera().SetFocalPoint(750.0, 750.0, 0.0)
        self.renderer.SetLayer(0)
        self.rendererFOV.SetLayer(1)
        self.renderWindow.SetSize(530, 335)
        # self.ChangeFOV(0)
        self.renderWindow.SetOffScreenRendering(1)

        # Add Needle
        #self.needle = vtk.vtkCylinderSource()
        #self.needle.SetRadius(0.5)
        #self.needle.SetHeight(100)
        #self.needleMapper = vtk.vtkPolyDataMapper()
        #self.needleMapper.SetInputConnection(self.needle.GetOutputPort())
        #self.needleMapper.Update()
        #self.needleActor = vtk.vtkActor()
        #self.needleActor.SetMapper(self.needleMapper)
        #self.needleActor.GetProperty().SetColor(0.3, 0.3, 0.3)
        #self.renderer.AddActor(self.needleActor)

        # Initialize Carm Transforms
        self.cRotation = vtk.vtkTransform()
        self.gantryRotation = vtk.vtkTransform()
        self.wagRotation = vtk.vtkTransform()
        self.tableTranslationTransform = vtk.vtkTransform()
        self.focalPointTransform = vtk.vtkTransform()
        self.xRotationValue = 0.0
        self.zRotationValue = 0.0
        self.yRotationValue = 0.0
        self.tableTranslationValue = 0.0
        self.zoomFactor = 0.0
        self.DRRInitialized = False
        self.toggleDRR = False

        # Initialize DRR Model
        self.planeModelNode = None
    def __init__(self, orientation='transverse', parent=None):
        super(QSliceViewWidget, self).__init__(parent)
        # set up vtk pipeline and create vtkWidget
        colors = vtk.vtkNamedColors()
        self.orientation = orientation
        self.viewer = vtk.vtkImageViewer2()
        self.orientations = {'coronal': 0, 'sagittal': 1, 'transverse': 2}
        self.viewer.SetSliceOrientation(self.orientations[self.orientation])
        # get&set the camera
        self.camera = self.viewer.GetRenderer().GetActiveCamera()
        ras = [[-1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, -1.0]]
        self.camera.SetPosition(ras[self.orientations[self.orientation]])
        self.camera.ParallelProjectionOn()
        self.iren = vtk.vtkGenericRenderWindowInteractor()
        self.iren.SetRenderWindow(self.viewer.GetRenderWindow())
        kw = {'rw': self.viewer.GetRenderWindow(), 'iren': self.iren}
        self.vtkWidget = QVTKRenderWindowInteractor(parent, **kw)

        # create QSlider
        self.sliderWidget = QSlider(Qt.Horizontal)
        # create the MainLayout of the whole widget
        self.MainLayout = QVBoxLayout()
        self.MainLayout.addWidget(self.sliderWidget)
        self.MainLayout.addWidget(self.vtkWidget)
        self.setLayout(self.MainLayout)
        # set the signal and slot
        self.sliderWidget.valueChanged.connect(self.slider_changed)
Example #6
0
    def viewSlice(self):
        data = self.__cvt2ubyte(self.reader)

        viewer_ranges = [(0.0, 0.5, 0.5, 1.0), (0.5, 0.5, 1.0, 1.0),
                         (0.0, 0.0, 0.5, 0.5)]
        text_pos = [(20, 980), (550, 980), (20, 470), (550, 460)]
        if self.isSingleView:
            viewer_ranges = [(0.0, 0.0, 1.0, 1.0)]

        self.viewers = []
        self.textActors = []
        for i, viewer_range in enumerate(viewer_ranges):
            viewer = vtk.vtkImageViewer2()
            viewer.SetInputConnection(data.GetOutputPort())
            viewer.SetupInteractor(self.iren)
            viewer.SetRenderWindow(self.renWin)
            viewer.SetColorLevel(127)
            viewer.SetColorWindow(255)
            viewer.GetImageActor().RotateY(180)  # flip top-bottom
            #viewer.GetRenderer().SetBackground(0.1, 0.1, 0.1)
            viewer.GetRenderer().SetViewport(viewer_range)
            text = self.__formatText(self.orientation_dict[i][2],
                                     self.orientation_dict[i][1])
            textActor = self.__addText(text, text_pos[i][0], text_pos[i][1])
            viewer.GetRenderer().AddActor2D(textActor)
            self.orientation_dict[i][0](viewer)()
            self.viewers.append(viewer)
            self.textActors.append(textActor)

        self.__updateSlice()

        if not self.isSingleView:
            self.__renderVolumn(data, (0.5, 0.0, 1.0, 0.5))

        self.__loop()
Example #7
0
 def addImageToScene(self, msource):
     import vtk
     vsource = msource
     self.renderWindow = vtk.vtkImageViewer2()
     self.renderer = self.renderWindow.GetRenderer()
     self.renderWindow.SetInputConnection(vsource.GetOutputPort())
     self.renderWindow.SetupInteractor(self.interactor)
Example #8
0
 def addImageToScene(self, msource):
     import vtk
     vsource = msource
     self.renderWindow = vtk.vtkImageViewer2()
     self.renderer = self.renderWindow.GetRenderer()
     self.renderWindow.SetInputConnection(vsource.GetOutputPort())
     self.renderWindow.SetupInteractor(self.interactor)
Example #9
0
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent)

        self.dicom_image_path = './IM-0008-0034.dcm'

        # '----------set up dicom reader---------------'
        self.dcmReader = vtk.vtkDICOMImageReader()
        self.dcmReader.SetDataByteOrderToLittleEndian()
        self.dcmReader.SetDirectoryName(
            r"D:\Users\user\Desktop\NTUCT\1323\Ct_Without_ContrastBrain - 1323\InnerEar_C_06_U70u_4"
        )
        self.dcmRescaleSlope = self.dcmReader.GetRescaleSlope()
        self.dcmRescaleOffset = self.dcmReader.GetRescaleOffset()
        self.dcmReader.Update()

        # '----------viewer---------'
        self.dcmViewer = vtk.vtkImageViewer2()
        self.dcmViewer.SetInputConnection(self.dcmReader.GetOutputPort())
        # '------deal with WW & WL-----'
        self.ww = 3500  # WW
        self.wl = 600  # WL
        self.dcmViewer.SetColorLevel(self.wl)
        self.dcmViewer.SetColorWindow(self.ww)

        # '----------TextOverLay---------'
        # slice status message
        self.sliceTextProp = vtk.vtkTextProperty()
        self.sliceTextProp.SetFontFamilyToCourier()
        self.sliceTextProp.SetFontSize(20)
        self.sliceTextProp.SetVerticalJustificationToBottom()
        self.sliceTextProp.SetJustificationToLeft()
        # '---------set up Text Overlay mapper----------'
        self.sliceTextMapper = vtk.vtkTextMapper()
        cur_slice = self.dcmViewer.GetSlice()
        print('cur_slice  = ', cur_slice, ' viewer.GetSliceMax() = ',
              self.dcmViewer.GetSliceMax())
        msg = (
            ' %d / %d ' %
            (self.dcmViewer.GetSlice() + 1, self.dcmViewer.GetSliceMax() + 1))
        # '---------set up Text Overlay Actor----------'
        self.sliceTextMapper.SetInput(msg)
        sliceTextActor = vtk.vtkActor2D()
        sliceTextActor.SetMapper(self.sliceTextMapper)
        sliceTextActor.SetPosition(15, 10)

        self.window_interactor = vtk.vtkRenderWindowInteractor()
        self.dcmViewer.SetupInteractor(self.window_interactor)

        self.dcmViewer.GetRenderer().AddActor2D(sliceTextActor)

        '----------add keyboard observer---------'
        self.window_interactor.AddObserver(vtk.vtkCommand.KeyPressEvent,
                                           self.keyboard_callback_func)
        self.window_interactor.Initialize()

        self.dcmViewer.Render()
        self.dcmViewer.GetRenderer().ResetCamera()
        self.dcmViewer.Render()
        self.window_interactor.Start()
Example #10
0
def new(renderWindowInteractor):
    a = vtk.QVTKWidget()
    reader = vtk.vtkDICOMImageReader()
    reader.SetDirectoryName("D:\Anaconda\workspace\pytest\patient")
    # reader.SetDirectoryName("G:\Win64\Anaconda3.4\workplace\\vtk\dicom")
    reader.Update()
    imageViewer = vtk.vtkImageViewer2()
    imageViewer.SetInputConnection(reader.GetOutputPort())
    sliceTextProp = vtk.vtkTextProperty()
    sliceTextProp.SetFontFamilyToCourier()
    sliceTextProp.SetFontSize(20)
    sliceTextProp.SetVerticalJustificationToBottom()
    sliceTextProp.SetJustificationToLeft()

    sliceTextMapper = vtk.vtkTextMapper()
    msg = str(imageViewer.GetSliceMin()) + '/' + str(imageViewer.GetSliceMax())
    sliceTextMapper.SetInput(msg)
    sliceTextMapper.SetTextProperty(sliceTextProp)

    sliceTextActor = vtk.vtkActor2D()
    sliceTextActor.SetMapper(sliceTextMapper)
    sliceTextActor.SetPosition(15, 10)

    usageTextProp = vtk.vtkTextProperty()
    usageTextProp.SetFontFamilyToCourier()
    usageTextProp.SetFontSize(14)
    usageTextProp.SetVerticalJustificationToTop()
    usageTextProp.SetJustificationToLeft()

    usageTextMapper = vtk.vtkTextMapper()
    usageTextMapper.SetInput(
        "- Slice with mouse wheel\n  or Up/Down-Key\n- Zoom with pressed right\n  mouse button while dragging"
    )
    usageTextMapper.SetTextProperty(usageTextProp)

    usageTextActor = vtk.vtkActor2D()
    usageTextActor.SetMapper(usageTextMapper)
    usageTextActor.GetPositionCoordinate(
    ).SetCoordinateSystemToNormalizedDisplay()
    usageTextActor.GetPositionCoordinate().SetValue(0.05, 0.95)

    # renderWindowInteractor =vtk.vtkRenderWindowInteractor()

    # myInteractorStyle = vtk. myVtkInteractorStyleImage()
    #
    # myInteractorStyle.SetImageViewer(imageViewer)
    # myInteractorStyle.SetStatusMapper(sliceTextMapper)

    imageViewer.SetupInteractor(renderWindowInteractor)
    imageViewer.SetSlice(12)
    # style= vtk.vtkInteractorStyleUser(imageViewer=imageViewer)
    # renderWindowInteractor.SetInteractorStyle(style)
    imageViewer.GetRenderer().AddActor2D(sliceTextActor)
    imageViewer.GetRenderer().AddActor2D(usageTextActor)
    imageViewer.Render()
    imageViewer.GetRenderer().ResetCamera()
    imageViewer.Render()
def vtkKWHeaderAnnotationEditorEntryPoint(parent, win):

    app = parent.GetApplication()

    # -----------------------------------------------------------------------

    # Create a render widget
    # Set the header annotation visibility and set some text

    hae_renderwidget = vtkKWRenderWidget()
    hae_renderwidget.SetParent(parent)
    hae_renderwidget.Create()

    hae_renderwidget.HeaderAnnotationVisibilityOn()
    hae_renderwidget.SetHeaderAnnotationText("Hello, World!")

    app.Script("pack %s -side right -fill both -expand y -padx 0 -pady 0",
               hae_renderwidget.GetWidgetName())

    # -----------------------------------------------------------------------

    # Create a volume reader

    hae_reader = vtkXMLImageDataReader()
    hae_reader.SetFileName(
        os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..",
                     "..", "..", "Data", "head100x100x47.vti"))

    # Create an image viewer
    # Use the render window and renderer of the renderwidget

    hae_viewer = vtkImageViewer2()
    hae_viewer.SetRenderWindow(hae_renderwidget.GetRenderWindow())
    hae_viewer.SetRenderer(hae_renderwidget.GetRenderer())
    hae_viewer.SetInput(hae_reader.GetOutput())
    hae_viewer.SetupInteractor(
        hae_renderwidget.GetRenderWindow().GetInteractor())

    hae_renderwidget.ResetCamera()

    # -----------------------------------------------------------------------

    # Create a header annotation editor
    # Connect it to the render widget

    hae_anno_editor = vtkKWHeaderAnnotationEditor()
    hae_anno_editor.SetParent(parent)
    hae_anno_editor.Create()
    hae_anno_editor.SetRenderWidget(hae_renderwidget)

    app.Script("pack %s -side left -anchor nw -expand n -padx 2 -pady 2",
               hae_anno_editor.GetWidgetName())

    return "TypeVTK"
def vtkKWHeaderAnnotationEditorEntryPoint(parent, win):

    app = parent.GetApplication()
    
    # -----------------------------------------------------------------------
    
    # Create a render widget
    # Set the header annotation visibility and set some text
    
    hae_renderwidget = vtkKWRenderWidget()
    hae_renderwidget.SetParent(parent)
    hae_renderwidget.Create()
    
    hae_renderwidget.HeaderAnnotationVisibilityOn()
    hae_renderwidget.SetHeaderAnnotationText("Hello, World!")
    
    app.Script("pack %s -side right -fill both -expand y -padx 0 -pady 0",
        hae_renderwidget.GetWidgetName())
    
    # -----------------------------------------------------------------------
    
    # Create a volume reader
    
    hae_reader = vtkXMLImageDataReader()
    hae_reader.SetFileName(os.path.join(
        os.path.dirname(os.path.abspath(__file__)),
        "..", "..", "..", "..", "Data", "head100x100x47.vti"))
    
    # Create an image viewer
    # Use the render window and renderer of the renderwidget
    
    hae_viewer = vtkImageViewer2()
    hae_viewer.SetRenderWindow(hae_renderwidget.GetRenderWindow())
    hae_viewer.SetRenderer(hae_renderwidget.GetRenderer())
    hae_viewer.SetInput(hae_reader.GetOutput())
    hae_viewer.SetupInteractor(
        hae_renderwidget.GetRenderWindow().GetInteractor())
    
    hae_renderwidget.ResetCamera()
    
    # -----------------------------------------------------------------------
    
    # Create a header annotation editor
    # Connect it to the render widget
    
    hae_anno_editor = vtkKWHeaderAnnotationEditor()
    hae_anno_editor.SetParent(parent)
    hae_anno_editor.Create()
    hae_anno_editor.SetRenderWidget(hae_renderwidget)
    
    app.Script("pack %s -side left -anchor nw -expand n -padx 2 -pady 2",
        hae_anno_editor.GetWidgetName())
    
    return "TypeVTK"
Example #13
0
def displaySlice(image, slice=30, window=255, level=127):
    viewer = vtk.vtkImageViewer2() # permet de zoomer dans l'image
    viewer.SetInput(image)
    viewer.SetSlice(slice)
    viewer.SetColorWindow(window)
    viewer.SetColorLevel(level)
    viewer.Render()

    interact = vtk.vtkRenderWindowInteractor()
    viewer.SetupInteractor(interact)
    interact.Initialize()
    interact.Start()    
Example #14
0
    def _create_vtk_pipeline(self):
        if False:
            vf = self._view_frame
            ren = vtk.vtkRenderer()
            vf.rwi.GetRenderWindow().AddRenderer(ren)

        else:
            self._image_viewer = vtk.vtkImageViewer2()
            self._image_viewer.SetupInteractor(self._view_frame.rwi)
            self._image_viewer.GetRenderer().SetBackground(0.3, 0.3, 0.3)

            self._set_image_viewer_dummy_input()
Example #15
0
    def _create_vtk_pipeline(self):
        if False:
            vf = self._view_frame
            ren = vtk.vtkRenderer()
            vf.rwi.GetRenderWindow().AddRenderer(ren)

        else:
            self._image_viewer = vtk.vtkImageViewer2()
            self._image_viewer.SetupInteractor(self._view_frame.rwi)
            self._image_viewer.GetRenderer().SetBackground(0.3,0.3,0.3)

            self._set_image_viewer_dummy_input()
Example #16
0
    def _create_vtk_pipeline(self):
        """Create pipeline for viewing 2D image data.
        
        """
        if self._viewer is None and not self._view_frame is None:

            if True:
                self._viewer = vtk.vtkImageViewer2()
                self._viewer.SetupInteractor(self._view_frame._rwi)
                self._viewer.GetRenderer().SetBackground(0.3, 0.3, 0.3)

            else:
                ren = vtk.vtkRenderer()
                self._view_frame._rwi.GetRenderWindow().AddRenderer(ren)
Example #17
0
 def _create_vtk_pipeline(self):
     """Create pipeline for viewing 2D image data.
     
     """
     if self._viewer is None and not self._view_frame is None:
         
         if True:
             self._viewer = vtk.vtkImageViewer2()
             self._viewer.SetupInteractor(self._view_frame._rwi)
             self._viewer.GetRenderer().SetBackground(0.3,0.3,0.3)
             
         else:
             ren = vtk.vtkRenderer()
             self._view_frame._rwi.GetRenderWindow().AddRenderer(ren)
Example #18
0
    def Visualize2(self):
        #connect itk image to vtk image
        connector = self.i2vConnector.New()
        connector.SetInput(self.m_Image)

        viewer2 = vtk.vtkImageViewer2()
        viewer2.SetInput(connector.GetOutput())

        interactor = vtk.vtkRenderWindowInteractor()
        viewer2.SetupInteractor(interactor)
        viewer2.Render()
        viewer2.GetRenderer().ResetCamera()
        viewer2.Render()

        interactor.Start()
    def Visualize2(self):
        #connect itk image to vtk image
        connector = self.i2vConnector.New()
        connector.SetInput(self.m_Image)

        viewer2 = vtk.vtkImageViewer2()
        viewer2.SetInput(connector.GetOutput())

        interactor = vtk.vtkRenderWindowInteractor()
        viewer2.SetupInteractor(interactor)
        viewer2.Render()
        viewer2.GetRenderer().ResetCamera()
        viewer2.Render()

        interactor.Start()
    def imageView(self, imgData, **kwargs):
        view = vtk.vtkImageViewer2()
        interactor = vtk.vtkRenderWindowInteractor()

        view.SetInputData(imgData)
        view.SetupInteractor(interactor)
        view.SetSliceOrientationToYZ()

        if 'zslice' in kwargs:
            view.SetSlice(kwargs['zslice'])
        if 'window' in kwargs:
            view.SetColorWindow(kwargs['window'])
        if 'level' in kwargs:
            view.SetColorLevel(kwargs['level'])

        view.Render()
        interactor.Start()
Example #21
0
def main():
    filename = get_program_parameters()

    # Read the image
    png_reader = vtk.vtkPNGReader()

    png_reader.SetFileName(filename)

    # Visualize
    image_viewer = vtk.vtkImageViewer2()
    image_viewer.SetInputConnection(png_reader.GetOutputPort())
    render_window_interactor = vtk.vtkRenderWindowInteractor()

    image_viewer.SetupInteractor(render_window_interactor)
    image_viewer.Render()
    image_viewer.GetRenderer().ResetCamera()
    image_viewer.Render()

    render_window_interactor.Start()
Example #22
0
    def __init__(self, parent= None):
        QtWidgets.QMainWindow.__init__(self, parent)
        self.frame = QtWidgets.QFrame()

        self.vl = QtWidgets.QVBoxLayout()
        self.vtkWidget = QVTKRenderWindowInteractor(self.frame)
        self.vl.addWidget(self.vtkWidget)

        self.reader = vtk.vtkDICOMImageReader()
        self.reader.SetDirectoryName('P01dicom')
        self.reader.Update()

        self.imageViewer = vtk.vtkImageViewer2()
        self.imageViewer.SetInputConnection(self.reader.GetOutputPort())

        self.renderder = vtk.vtkRenderer()
        self.vtkWidget.GetRenderWindow().AddRenderer(self.renderder)
        self.imageViewer.SetRenderWindow(self.vtkWidget.GetRenderWindow())
        self.imageViewer.SetRenderer(self.renderder)
        self.myInteractorStyle = myVtkInteractorStyleImage()
        self.myInteractorStyle.SetImageViewer(self.imageViewer)
        self.renderWindowInteractor = self.vtkWidget.GetRenderWindow().GetInteractor()
        self.imageViewer.SetupInteractor(self.renderWindowInteractor)

        self.myInteractorStyle = myVtkInteractorStyleImage()
        self.myInteractorStyle.SetImageViewer(self.imageViewer)

        self.renderWindowInteractor.SetInteractorStyle(self.myInteractorStyle)
        self.renderWindowInteractor.RemoveObservers('MouseWheelForwardEvent')
        self.renderWindowInteractor.RemoveObservers('MouseWheelBackwardEvent')
        self.renderWindowInteractor.AddObserver('MouseWheelForwardEvent', DummyFunc1, 1.0)
        self.renderWindowInteractor.AddObserver('MouseWheelBackwardEvent', DummyFunc2, 1.0)

        self.imageViewer.Render()
        self.imageViewer.GetRenderer().ResetCamera()
        self.imageViewer.Render()

        self.frame.setLayout(self.vl)
        self.setCentralWidget(self.frame)

        self.renderWindowInteractor.Initialize()
Example #23
0
def main(argv):
  colors = vtk.vtkNamedColors()

  # Parse input arguments
  if len(argv) != 3:
    print("Usage: %s Input1Filename Input2Filename  e.g. Ox.jpg Gourds2.jpg" % (argv[0]))
    return

  # Read the images
  readerFactory = vtk.vtkImageReader2Factory()
  imgReader1 = vtk.vtkImageReader2()
  imgReader1 = readerFactory.CreateImageReader2(argv[1])
  imgReader1.SetFileName(argv[1])

  imgReader2 = vtk.vtkImageReader2()
  # imgReader2.TakeReference(readerFactory.CreateImageReader2(argv[2]))
  imgReader2 = readerFactory.CreateImageReader2(argv[2])
  imgReader2.SetFileName(argv[2])

  # Combine the images (blend takes multiple connections on the 0th input port)
  blend = vtk.vtkImageBlend()
  blend.AddInputConnection(imgReader1.GetOutputPort())
  blend.AddInputConnection(imgReader2.GetOutputPort())
  blend.SetOpacity(0, 0.5)
  blend.SetOpacity(1, 0.5)

  # Display the result
  renderWindowInteractor = vtk.vtkRenderWindowInteractor()

  imageViewer = vtk.vtkImageViewer2()
  imageViewer.SetInputConnection(blend.GetOutputPort())
  imageViewer.SetupInteractor(renderWindowInteractor)
  imageViewer.GetRenderer().ResetCamera()
  imageViewer.GetRenderer().SetBackground(colors.GetColor3d("Peru"))
  imageViewer.GetRenderWindow().SetWindowName("CombineImages")

  imageViewer.GetRenderer().Render()
  renderWindowInteractor.Initialize()
  renderWindowInteractor.Start()

  return 0
Example #24
0
def show_image2(im_data):
    image = sitk.GetImageFromArray(im_data)

    castFilter = sitk.CastImageFilter()
    castFilter.SetOutputPixelType(sitk.sitkUInt8)
    image = castFilter.Execute(image)
    # sitk.Show(image)
    [z, y, x] = im_data.shape
    writerpath = '/Users/potato/Pictures/project_image/tmp/'  # 分割出来的图像保存路径
    filenames = []
    for i in range(z):
        tmpstr = writerpath + str(i) + '.jpg'
        filenames.append(tmpstr)
    sitk.WriteImage(image, filenames)
    reader = vtk.vtkJPEGReader()
    reader.SetFileName(filenames[0])
    reader.SetDataExtent(0, x, 0, y, 0, z)
    reader.SetDataScalarTypeToUnsignedInt()
    reader.SetFilePrefix(writerpath)
    reader.SetFilePattern('%s%d.jpg')
    reader.SetFileNameSliceOffset(0)
    reader.SetFileNameSliceSpacing(1)
    reader.SetDataSpacing(1, 1, 1)
    #
    # reader = vtk.vtkDICOMImageReader()
    # reader.SetFileName("/Users/potato/Pictures/project_image/head/ser003img00001.dcm")
    imageViewer = vtk.vtkImageViewer2()
    imageViewer.SetInputConnection(reader.GetOutputPort())
    renderWindowInteractor = vtk.vtkRenderWindowInteractor()
    imageViewer.SetupInteractor(renderWindowInteractor)
    # imageViewer.SetColorLevel(50)
    # imageViewer.SetColorWindow(90)
    imageViewer.SetSlice(40)
    imageViewer.SetSliceOrientationToXY()
    imageViewer.Render()
    imageViewer.Render()
    imageViewer.GetRenderer().ResetCamera()
    imageViewer.Render()
    renderWindowInteractor.Start()
Example #25
0
def displaySliceColors(image,sliceNo):
    """
    display 1 slice image in colors
    par rapport a la GUI, on a la couleur, et possibilite de faire un zoom
    (par contre, c'est pour 2D seulement)
    """
    
    lookup=vtk.vtkColorTransferFunction()
    lookup.AddRGBPoint(image.GetScalarRange()[0],0,0,0)
    lookup.AddRGBPoint(image.GetScalarRange()[1],0.0,1.0,0)
    lookup.AddRGBPoint(image.GetScalarRange()[1]*2,1.0,0.0,0)
       
    viewer = vtk.vtkImageViewer2()
    viewer.SetInput(image)
    viewer.SetSlice (sliceNo)
    viewer.GetWindowLevel().SetLookupTable(lookup)
    
    iren = vtk.vtkRenderWindowInteractor()
    viewer.SetupInteractor(iren)
    viewer.Render()
    
    iren.Initialize()
    iren.Start() 
Example #26
0
    def __init__(self, parent=None):
        self.reader = vtk.vtkDICOMImageReader()
        self.dataExtent = []
        self.dataDimensions = []
        self.dataRange = ()

        # initialize GUI
        super(DicomVis, self).__init__()
        self.setupUi(self)

        # Replace widgets
        parent = self.XYPlaneWidget.parentWidget()
        tmp = QVTKRenderWindowInteractor(self)
        parent.layout().replaceWidget(self.XYPlaneWidget, tmp)
        self.XYPlaneWidget = tmp

        parent = self.YZPlaneWidget.parentWidget()
        tmp = QVTKRenderWindowInteractor(self)
        parent.layout().replaceWidget(self.YZPlaneWidget, tmp)
        self.YZPlaneWidget = tmp

        parent = self.XZPlaneWidget.parentWidget()
        tmp = QVTKRenderWindowInteractor(self)
        parent.layout().replaceWidget(self.XZPlaneWidget, tmp)
        self.XZPlaneWidget = tmp

        parent = self.VolumeWidget.parentWidget()
        tmp = QVTKRenderWindowInteractor(self)
        parent.layout().replaceWidget(self.VolumeWidget, tmp)
        self.VolumeWidget = tmp

        self.WindowCenterSlider.setRange(0, 1000)
        self.WindowWidthSlider.setRange(0, 1000)

        # define viewers
        [self.viewerXY, self.viewerYZ,
         self.viewerXZ] = [vtk.vtkImageViewer2() for x in range(3)]

        # attach interactors to viewers
        self.viewerXY.SetupInteractor(self.XYPlaneWidget)
        self.viewerYZ.SetupInteractor(self.YZPlaneWidget)
        self.viewerXZ.SetupInteractor(self.XZPlaneWidget)

        # set render windows for viewers
        self.viewerXY.SetRenderWindow(self.XYPlaneWidget.GetRenderWindow())
        self.viewerYZ.SetRenderWindow(self.YZPlaneWidget.GetRenderWindow())
        self.viewerXZ.SetRenderWindow(self.XZPlaneWidget.GetRenderWindow())

        # set slicing orientation for viewers
        self.viewerXY.SetSliceOrientationToXZ()
        self.viewerYZ.SetSliceOrientationToYZ()
        self.viewerXZ.SetSliceOrientationToXY()

        # rotate image
        act = self.viewerYZ.GetImageActor()
        act.SetOrientation(90, 0, 0)

        # setup volume rendering
        self.volRender = vtk.vtkRenderer()
        self.volRenWin = self.VolumeWidget.GetRenderWindow()
        self.volRenWin.AddRenderer(self.volRender)

        #self.volumeMapper = vtk.vtkFixedPointVolumeRayCastMapper()
        self.volumeMapper = vtk.vtkGPUVolumeRayCastMapper()

        volumeColor = vtk.vtkColorTransferFunction()
        volumeColor.AddRGBPoint(0, 0.0, 0.0, 0.0)
        volumeColor.AddRGBPoint(500, 1.0, 0.5, 0.3)
        volumeColor.AddRGBPoint(1000, 1.0, 0.5, 0.3)
        volumeColor.AddRGBPoint(1150, 1.0, 1.0, 0.9)
        self.volumeColor = volumeColor

        volumeScalarOpacity = vtk.vtkPiecewiseFunction()
        volumeScalarOpacity.AddPoint(0, 0.00)
        volumeScalarOpacity.AddPoint(50, 0.15)
        volumeScalarOpacity.AddPoint(100, 0.15)
        volumeScalarOpacity.AddPoint(115, 0.85)
        self.volumeScalarOpacity = volumeScalarOpacity

        volumeGradientOpacity = vtk.vtkPiecewiseFunction()
        volumeGradientOpacity.AddPoint(0, 0.0)
        volumeGradientOpacity.AddPoint(100, 0.5)
        volumeGradientOpacity.AddPoint(500, 1)
        self.volumeGradientOpacity = volumeGradientOpacity

        volumeProperty = vtk.vtkVolumeProperty()
        volumeProperty.SetColor(volumeColor)
        volumeProperty.SetScalarOpacity(volumeScalarOpacity)
        volumeProperty.SetGradientOpacity(volumeGradientOpacity)
        volumeProperty.SetInterpolationTypeToLinear()
        volumeProperty.ShadeOn()
        volumeProperty.SetAmbient(0.4)
        volumeProperty.SetDiffuse(0.6)
        volumeProperty.SetSpecular(0.2)
        self.volumeProperty = volumeProperty

        volume = vtk.vtkVolume()
        volume.SetMapper(self.volumeMapper)
        volume.SetProperty(self.volumeProperty)
        self.volume = volume

        self.volRender.AddViewProp(volume)
v16.SetDataSpacing(3.2, 3.2, 1.5)
v16.ReleaseDataFlagOn()
v16.SetDataMask(0x7fff)
v16.Update()

range = v16.GetOutput().GetScalarRange()

shifter = vtk.vtkImageShiftScale()
shifter.SetShift(-1.0*range[0])
shifter.SetScale(255.0/(range[1]-range[0]))
shifter.SetOutputScalarTypeToUnsignedChar()
shifter.SetInputConnection(v16.GetOutputPort())
shifter.ReleaseDataFlagOff()
shifter.Update()

ImageViewer = vtk.vtkImageViewer2()
ImageViewer.SetInput(shifter.GetOutput())
ImageViewer.SetColorLevel(127)
ImageViewer.SetColorWindow(255)

iren = vtk.vtkRenderWindowInteractor()
ImageViewer.SetupInteractor(iren)
ImageViewer.Render()
ImageViewer.GetRenderer().ResetCamera()

ImageViewer.Render()

SliderRepres = vtk.vtkSliderRepresentation2D()
min = ImageViewer.GetSliceMin()
max = ImageViewer.GetSliceMax()
SliderRepres.SetMinimumValue(min)
Example #28
0
def main():

    argc = len(sys.argv)

    # Verify input arguments
    if argc != 2:
        print "Usage: ", sys.argv[0], " FolderName"
        return sys.exit(1)

    folder = sys.argv[1]

    # Read all the DICOM files in the specified directory.
    reader = vtk.vtkDICOMImageReader()
    reader.SetDirectoryName(folder)
    reader.Update()

    # Visualize
    imageViewer = vtk.vtkImageViewer2()
    imageViewer.SetInputConnection(reader.GetOutputPort())

    # slice status message
    sliceTextProp = vtk.vtkTextProperty()
    sliceTextProp.SetFontFamilyToCourier()
    sliceTextProp.SetFontSize(20)
    sliceTextProp.SetVerticalJustificationToBottom()
    sliceTextProp.SetJustificationToLeft()

    sliceTextMapper = vtk.vtkTextMapper()
    msg = "Slice {} out of {}".format(imageViewer.GetSliceMin() + 1, \
                                      imageViewer.GetSliceMax() + 1)
    sliceTextMapper.SetInput(msg)
    sliceTextMapper.SetTextProperty(sliceTextProp)

    sliceTextActor = vtk.vtkActor2D()
    sliceTextActor.SetMapper(sliceTextMapper)
    sliceTextActor.SetPosition(15, 10)

    # usage hint message
    usageTextProp = vtk.vtkTextProperty()
    usageTextProp.SetFontFamilyToCourier()
    usageTextProp.SetFontSize(14)
    usageTextProp.SetVerticalJustificationToTop()
    usageTextProp.SetJustificationToLeft()

    usageTextMapper = vtk.vtkTextMapper()
    usageTextMapper.SetInput(
        "- Slice with mouse wheel\n  or Up/Down-Key\n- Zoom with pressed right\n  mouse button while dragging"
    )
    usageTextMapper.SetTextProperty(usageTextProp)

    usageTextActor = vtk.vtkActor2D()
    usageTextActor.SetMapper(usageTextMapper)
    usageTextActor.GetPositionCoordinate(
    ).SetCoordinateSystemToNormalizedDisplay()
    usageTextActor.GetPositionCoordinate().SetValue(0.05, 0.95)

    interactor = vtk.vtkInteractorStyleImage()
    #interactor.SetImageViewer(imageViewer)
    #interactor.SetStatusMapper(sliceTextMapper)

    #imageViewer.SetupInteractor(renWin)
    #renderWindowInteractor.SetInteractorStyle(myInteractorStyle)
    # add slice status message and usage hint message to the renderer
    imageViewer.GetRenderer().AddActor2D(sliceTextActor)
    imageViewer.GetRenderer().AddActor2D(usageTextActor)
  def __init__(self,
               input_file,
               gaussian,
               radius,
               thresh,
               zoom,
               zSlice,
               brightness,
               window_size,
               *args, **kwargs):
    """MainWindow constructor"""
    super().__init__(*args, **kwargs)

    # Window setup
    self.resize(window_size[0],window_size[1])
    self.title = "Qt Viewer for Lesion Augmentation"

    self.statusBar().showMessage("Welcome.",8000)

    # Capture defaults
    self.gaussian = gaussian
    self.radius = radius
    self.thresh = thresh
    self.zoom = zoom
    self.brightness = brightness
    self.shape_dic = None
    self.lesion_dic = {}
    self.thresholdArray = None
    self.imageArray = None
    self.zSlice = 100
    self.shape = None
    self.crop = None
    self.colorWindow = 1000
    self.colorLevel = 500
    # Initialize the window
    self.initUI()

    # Set up some VTK pipeline classes
    self.reader = None
    self.gauss = vtk.vtkImageGaussianSmooth()
    self.lesion = vtk.vtkImageData()
    self.threshold = vtk.vtkImageThreshold()
    self.mapToColors = vtk.vtkImageMapToColors()

    self.imageViewer = vtk.vtkImageViewer2()

    self.resizeImage = vtk.vtkImageResize()
    self.resizeSeg = vtk.vtkImageResize()

    self.contourRep = vtk.vtkOrientedGlyphContourRepresentation()
    self.contourWidget = vtk.vtkContourWidget()
    self.placer = vtk.vtkImageActorPointPlacer()

    self.polyData = None

    self.origmapper = vtk.vtkImageMapper()#vtkImageSliceMapper()#
    self.mapper = vtk.vtkImageMapper()
    self.stencilmapper = vtk.vtkPolyDataMapper()

    self.origactor = vtk.vtkActor2D() #vtkImageActor()
    self.actor = vtk.vtkActor2D()
    self.stencilactor = vtk.vtkActor()
    # Take inputs from command line. Only use these if there is an input file specified
    if (input_file != None):
      if (not os.path.exists(input_file)):
        qtw.QMessageBox.warning(self, "Error", "Invalid input file.")
        return

      self.createPipeline(input_file)
      self.statusBar().showMessage("Loading file " + input_file,4000)
      self.changeSigma(gaussian)
      self.changeRadius(radius)
      self.changeThreshold(thresh)
      self.changeBrightness(brightness)
      self.changeSlice(zSlice)
def main():

   argc = len(sys.argv)

   # Verify input arguments
   if argc != 2:
      print "Usage: ", sys.argv[0], " FolderName"
      return sys.exit(1)
 
   folder = sys.argv[1]
 
   # Read all the DICOM files in the specified directory.
   reader = vtk.vtkDICOMImageReader()
   reader.SetDirectoryName(folder)
   reader.Update()
 
   # Visualize
   imageViewer = vtk.vtkImageViewer2()
   imageViewer.SetInputConnection(reader.GetOutputPort())
 
   # slice status message
   sliceTextProp = vtk.vtkTextProperty()
   sliceTextProp.SetFontFamilyToCourier()
   sliceTextProp.SetFontSize(20)
   sliceTextProp.SetVerticalJustificationToBottom()
   sliceTextProp.SetJustificationToLeft()
 
   sliceTextMapper = vtk.vtkTextMapper()
   msg = "Slice {} out of {}".format(imageViewer.GetSliceMin() + 1, \
                                     imageViewer.GetSliceMax() + 1)
   sliceTextMapper.SetInput(msg)
   sliceTextMapper.SetTextProperty(sliceTextProp)
 
   sliceTextActor = vtk.vtkActor2D()
   sliceTextActor.SetMapper(sliceTextMapper)
   sliceTextActor.SetPosition(15, 10)
 
   # usage hint message
   usageTextProp = vtk.vtkTextProperty()
   usageTextProp.SetFontFamilyToCourier()
   usageTextProp.SetFontSize(14)
   usageTextProp.SetVerticalJustificationToTop()
   usageTextProp.SetJustificationToLeft()
 
   usageTextMapper = vtk.vtkTextMapper()
   usageTextMapper.SetInput("- Slice with mouse wheel\n  or Up/Down-Key\n- Zoom with pressed right\n  mouse button while dragging")
   usageTextMapper.SetTextProperty(usageTextProp)
 
   usageTextActor = vtk.vtkActor2D()
   usageTextActor.SetMapper(usageTextMapper)
   usageTextActor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay()
   usageTextActor.GetPositionCoordinate().SetValue( 0.05, 0.95)

   interactor = vtk.vtkInteractorStyleImage()
   #interactor.SetImageViewer(imageViewer)
   #interactor.SetStatusMapper(sliceTextMapper)
 
   #imageViewer.SetupInteractor(renWin)
   #renderWindowInteractor.SetInteractorStyle(myInteractorStyle)
   # add slice status message and usage hint message to the renderer
   imageViewer.GetRenderer().AddActor2D(sliceTextActor)
   imageViewer.GetRenderer().AddActor2D(usageTextActor)
Example #31
0
def main():
    folder = get_program_parameters()

    # Read all the DICOM files in the specified directory.
    reader = vtk.vtkDICOMImageReader()

    reader.SetDirectoryName(folder)
    reader.Update()

    # Visualize
    imageViewer = vtk.vtkImageViewer2()
    imageViewer.SetInputConnection(reader.GetOutputPort())

    # slice status message
    sliceTextProp = vtk.vtkTextProperty()
    sliceTextProp.SetFontFamilyToCourier()
    sliceTextProp.SetFontSize(20)
    sliceTextProp.SetVerticalJustificationToBottom()
    sliceTextProp.SetJustificationToLeft()

    sliceTextMapper = vtk.vtkTextMapper()
    msg = StatusMessage.Format(imageViewer.GetSliceMin(),
                               imageViewer.GetSliceMax())
    sliceTextMapper.SetInput(msg)
    sliceTextMapper.SetTextProperty(sliceTextProp)

    sliceTextActor = vtk.vtkActor2D()
    sliceTextActor.SetMapper(sliceTextMapper)
    sliceTextActor.SetPosition(15, 10)

    # usage hint message
    usageTextProp = vtk.vtkTextProperty()
    usageTextProp.SetFontFamilyToCourier()
    usageTextProp.SetFontSize(20)
    usageTextProp.SetVerticalJustificationToTop()
    usageTextProp.SetJustificationToLeft()

    usageTextMapper = vtk.vtkTextMapper()
    usageTextMapper.SetInput(
        "- Slice with mouse wheel\n  or Up/Down-Key\n- Zoom with pressed right\n  mouse button while dragging"
    )
    usageTextMapper.SetTextProperty(usageTextProp)

    usageTextActor = vtk.vtkActor2D()
    usageTextActor.SetMapper(usageTextMapper)
    usageTextActor.GetPositionCoordinate(
    ).SetCoordinateSystemToNormalizedDisplay()
    usageTextActor.GetPositionCoordinate().SetValue(0.05, 0.95)

    # create an interactor with our own style (inherit from vtkInteractorStyleImage)
    # in order to catch mousewheel and key events
    renderWindowInteractor = vtk.vtkRenderWindowInteractor()

    myInteractorStyle = myVtkInteractorStyleImage(imageViewer, sliceTextMapper,
                                                  renderWindowInteractor)

    # make imageviewer2 and sliceTextMapper visible to our interactorstyle
    # to enable slice status message updates when scrolling through the slices

    imageViewer.SetupInteractor(renderWindowInteractor)

    myInteractorStyle.start()
    # make the interactor use our own interactorstyle
    # cause SetupInteractor() is defining it's own default interatorstyle
    # this must be called after SetupInteractor()
    renderWindowInteractor.SetInteractorStyle(myInteractorStyle)
    # add slice status message and usage hint message to the renderer
    imageViewer.GetRenderer().AddActor2D(sliceTextActor)
    imageViewer.GetRenderer().AddActor2D(usageTextActor)

    # initialize rendering and interaction
    imageViewer.GetRenderWindow().SetSize(400, 300)
    imageViewer.GetRenderer().SetBackground(0.2, 0.3, 0.4)
    imageViewer.Render()
    imageViewer.GetRenderer().ResetCamera()
    imageViewer.Render()
    renderWindowInteractor.Start()

# distance transform to get foreground


# maker labelling


# run watershed algorithm


# display
viewer = QuickView.QuickView(itk.UL)
viewer.AddImage(image)
viewer.Visualize2()

i2vConnector = itk.ImageToVTKImageFilter[ImageType]
connector = i2vConnector.New()
connector.SetInput(image)

viewer2 = vtk.vtkImageViewer2()
viewer2.SetInput(connector.GetOutput())

interactor = vtk.vtkRenderWindowInteractor()
viewer2.SetupInteractor(interactor)
viewer2.Render()
viewer2.GetRenderer().ResetCamera()
viewer2.Render()

interactor.Start()
Example #33
0
# open to remove noise

# dilate to get background area

# distance transform to get foreground

# maker labelling

# run watershed algorithm

# display
viewer = QuickView.QuickView(itk.UL)
viewer.AddImage(image)
viewer.Visualize2()

i2vConnector = itk.ImageToVTKImageFilter[ImageType]
connector = i2vConnector.New()
connector.SetInput(image)

viewer2 = vtk.vtkImageViewer2()
viewer2.SetInput(connector.GetOutput())

interactor = vtk.vtkRenderWindowInteractor()
viewer2.SetupInteractor(interactor)
viewer2.Render()
viewer2.GetRenderer().ResetCamera()
viewer2.Render()

interactor.Start()
Example #34
0
def main(argv):
  if os.name == 'nt':
    VTK_DATA_ROOT = "c:/VTK82/build_Release/ExternalData/Testing/"
  else:
    VTK_DATA_ROOT = "/home/jmh/"

  if 1:
    v16 = vtk.vtkMetaImageReader()
    v16.SetFileName("/home/jmh/github/fis/data/Abdomen/CT-Abdomen.mhd")
    v16.Update()
  elif 0:
    fname = os.path.join(VTK_DATA_ROOT, "Data/headsq/quarter")
    v16 = vtk.vtkVolume16Reader()
    v16.SetDataDimensions(64, 64)
    v16.SetDataByteOrderToLittleEndian()
    v16.SetImageRange(1, 93)
    v16.SetDataSpacing(3.2, 3.2, 1.5)
    v16.SetFilePrefix(fname)
    v16.ReleaseDataFlagOn()
    v16.SetDataMask(0x7fff)
    v16.Update()
  else:
    v16 = vtk.vtkMetaImageReader()
    v16.SetFileName("c:/github/fis/data/Abdomen/CT-Abdomen.mhd")
    v16.Update()

  rng = v16.GetOutput().GetScalarRange()

  shifter = vtk.vtkImageShiftScale()
  shifter.SetShift(-1.0*rng[0])
  shifter.SetScale(255.0/(rng[1]-rng[0]))
  shifter.SetOutputScalarTypeToUnsignedChar()
  shifter.SetInputConnection(v16.GetOutputPort())
  shifter.ReleaseDataFlagOff()
  shifter.Update()

 
  ImageViewer = vtk.vtkImageViewer2()
  ImageViewer.SetInputData(shifter.GetOutput())
  ImageViewer.SetColorLevel(127)
  ImageViewer.SetColorWindow(255)

  iren = vtk.vtkRenderWindowInteractor()
  ImageViewer.SetupInteractor(iren)

  ImageViewer.Render()
  ImageViewer.GetRenderer().ResetCamera()

  ImageViewer.Render()    
 
  dims = v16.GetOutput().GetDimensions()

  global minArea
  spacing = v16.GetOutput().GetSpacing()
  minArea = ( spacing[0] * spacing[1] ) / 0.1

  # Slider screen representation
  SliderRepres = vtk.vtkSliderRepresentation2D()
  _min = ImageViewer.GetSliceMin()
  _max = ImageViewer.GetSliceMax()
  SliderRepres.SetMinimumValue(_min)
  SliderRepres.SetMaximumValue(_max)
  SliderRepres.SetValue(int((_min + _max) / 2))
  SliderRepres.SetTitleText("Slice")
  SliderRepres.GetPoint1Coordinate().SetCoordinateSystemToNormalizedDisplay()
  SliderRepres.GetPoint1Coordinate().SetValue(0.3, 0.05)
  SliderRepres.GetPoint2Coordinate().SetCoordinateSystemToNormalizedDisplay()
  SliderRepres.GetPoint2Coordinate().SetValue(0.7, 0.05)
  SliderRepres.SetSliderLength(0.02)
  SliderRepres.SetSliderWidth(0.03)
  SliderRepres.SetEndCapLength(0.01)
  SliderRepres.SetEndCapWidth(0.03)
  SliderRepres.SetTubeWidth(0.005)
  SliderRepres.SetLabelFormat("%3.0lf")
  SliderRepres.SetTitleHeight(0.02)
  SliderRepres.SetLabelHeight(0.02)

  # Slider widget
  SliderWidget = vtk.vtkSliderWidget()
  SliderWidget.SetInteractor(iren)
  SliderWidget.SetRepresentation(SliderRepres)
  SliderWidget.KeyPressActivationOff()
  SliderWidget.SetAnimationModeToAnimate()
  SliderWidget.SetEnabled(True)
 
  SliderCb = vtkSliderCallback()
  SliderCb.SetImageViewer(ImageViewer)
  SliderWidget.AddObserver(vtk.vtkCommand.InteractionEvent, SliderCb.Execute)  

  ImageViewer.SetSlice(int(SliderRepres.GetValue()))

  # Contour representation - responsible for placement of points, calculation of lines and contour manipulation
  global rep
  rep = vtk.vtkOrientedGlyphContourRepresentation()
  # vtkContourRepresentation has GetActiveNodeWorldPostion/Orientation
  rep.GetProperty().SetOpacity(0) #1
  prop = rep.GetLinesProperty()
  from vtkUtils import renderLinesAsTubes
  from vtk.util.colors import red, green, pink, yellow
  renderLinesAsTubes(prop)
  prop.SetColor(yellow)
  propActive = rep.GetActiveProperty()
  #propActive.SetOpacity(0) # 2
  
  renderLinesAsTubes(propActive)

  propActive.SetColor(green)
  shapeActive = rep.GetActiveCursorShape()

  warp = vtk.vtkWarpVector()
  warp.SetInputData(shapeActive)
  warp.SetInputArrayToProcess(0, 0, 0,
                              vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS,
                              vtk.vtkDataSetAttributes.NORMALS)
  scale = 0.4
  warp.SetScaleFactor(scale)
  warp.Update()
  rep.SetActiveCursorShape(warp.GetOutput())

  # Use vtkContourTriangulator to fill contours

  # Point placer
  imageActorPointPlacer = vtk.vtkImageActorPointPlacer()
  imageActorPointPlacer.SetImageActor(ImageViewer.GetImageActor())
  rep.SetPointPlacer(imageActorPointPlacer)

  global ContourWidget
  # Contour widget - has a  vtkWidgetEventTranslator which translate events to vtkContourWidget events
  ContourWidget = vtk.vtkContourWidget()
  ContourWidget.SetRepresentation(rep)
  ContourWidget.SetInteractor(iren)
  ContourWidget.SetEnabled(True)
  ContourWidget.ProcessEventsOn()
  ContourWidget.ContinuousDrawOn()

  # Can be Initialize() using polydata

  # Override methods that returns display position to get an overlay
  # (display postions) instead of computing it from world position and
  # the method BuildLines to interpolate using display positions
  # instead of world positions

  # Thinning of contour control points
  # AddFinalPointAction
  ContourWidget.AddObserver(vtk.vtkCommand.EndInteractionEvent, callback)



  if 0:
    # TODO: Make interior transparent
    contour = ContourWidget.GetContourRepresentation().GetContourRepresentationAsPolyData()
    tc = vtk.vtkContourTriangulator()
    tc.SetInputData(contour)
    tc.Update()

    # Extrusion towards camera
    extruder = vtk.vtkLinearExtrusionFilter()
    extruder.CappingOn()
    extruder.SetScalaFactor(1.0)
    extruder.SetInputData(tc.GetOutput())
    extruder.SetVector(0,0,1.0)
    extruder.SetExtrusionTypeToNormalExtrusion()
    
    polyMapper = vtk.vtkPolyMapper()
    polyMapper.SetInputConnection(extruder.GetOutputPort())
    polyMapper.ScalarVisibilityOn()
    polyMapper.Update()
    polyActor = vtk.vtkActor()
    polyActor.SetMapper(polyMapper)
    prop = polyActor.GetProperty()
    prop.SetColor(0,1,0)
    #prop.SetRepresentationToWireframe()
    renderer.AddActor(polyActor)
    renderer.GetRenderWindow().Render()
  


  iren.Start()
Example #35
0
import vtk
import os

file = os.path.join(os.path.dirname(__file__), "output.png")

reader = vtk.vtkPNGReader()
reader.SetFileName(file)

imageViewer = vtk.vtkImageViewer2()
imageViewer.SetInputConnection(reader.GetOutputPort())

renderWindowInteractor = vtk.vtkRenderWindowInteractor()
imageViewer.SetupInteractor(renderWindowInteractor)
imageViewer.Render()
imageViewer.GetRenderer().ResetCamera()
imageViewer.Render()

renderWindowInteractor.Start()
Example #36
0
    def __init__(self, parent=None, dcm_dir='', view_plane='Transverse'):
        """
        建立DICOM VTK 畫布
        :param dcm_dir: 影像路徑
        :param view_plane: 切面:預設'Transverse',可選'Coronal','Sagittal'
        """
        QtWidgets.QMainWindow.__init__(self, parent)
        self.frame = QtWidgets.QFrame()
        self.vl = QtWidgets.QVBoxLayout()
        self.vtkWidget = QVTKRenderWindowInteractor(self)
        self.vl.addWidget(self.vtkWidget)

        if dcm_dir != '':
            self.dcm_series_path = Path(dcm_dir).expanduser()

        # set up VTK dicom reader
        self.dcmReader = vtkDICOMImageReader()
        self.dcmReader.SetDataByteOrderToLittleEndian()
        self.dcmReader.SetDirectoryName(str(self.dcm_series_path))
        self.dcmRescaleSlope = self.dcmReader.GetRescaleSlope()
        self.dcmRescaleOffset = self.dcmReader.GetRescaleOffset()
        self.dcmReader.Update()
        # '------default with WW & WL-----'
        self.ww = 3500  # WW
        self.wl = 600  # WL
        # '----------viewer---------'
        self.dcmViewer = vtk.vtkImageViewer2()
        self.dcmViewer.SetInputConnection(self.dcmReader.GetOutputPort())
        self.dcmViewer.SetColorLevel(500)
        self.dcmViewer.SetColorWindow(3500)
        self.dcmViewer.SetSize(600, 600)
        self.dcmViewer.UpdateDisplayExtent()
        # #!下面那一行確保不會多渲染出一個視窗物件! ##
        self.dcmViewer.SetRenderWindow(
            self.vtkWidget.GetRenderWindow())  # #!這一行確保不會多渲染出一個視窗物件! # #
        # #!上面那一行確保不會多渲染出一個視窗物件! ##
        #   下面三個方法可渲染不同人體不同的切面
        self.viewPlane = view_plane
        if self.viewPlane == 'Coronal':
            self.dcmViewer.SetSliceOrientationToXZ()  # 冠狀面 (Coronal plane)
        elif self.viewPlane == 'Sagittal':
            self.dcmViewer.SetSliceOrientationToYZ()  # 縱切面 (Sagittal plane)
        else:
            self.dcmViewer.SetSliceOrientationToXY(
            )  # Default: 橫狀面 (Transverse plane)

        # '----------TextOverLay---------'
        # slice status message
        self.sliceTextProp = vtk.vtkTextProperty()
        self.sliceTextProp.SetFontFamilyToCourier()
        self.sliceTextProp.SetFontSize(60)
        self.sliceTextProp.SetVerticalJustificationToBottom()
        self.sliceTextProp.SetJustificationToLeft()
        # '---------set up Text Overlay mapper----------'
        self.sliceTextMapper = vtk.vtkTextMapper()
        self.current_slice = self.dcmViewer.GetSlice()
        print('cur_slice  = ', self.current_slice, ' viewer.GetSliceMax() = ',
              self.dcmViewer.GetSliceMax())
        msg = (
            ' %d / %d ' %
            (self.dcmViewer.GetSlice() + 1, self.dcmViewer.GetSliceMax() + 1))
        self.sliceTextMapper.SetInput(msg)
        # '---------set up Text Overlay Actor----------'
        self.sliceTextActor = vtk.vtkActor2D()
        self.sliceTextActor.SetMapper(self.sliceTextMapper)
        self.sliceTextActor.SetPosition(15, 10)

        # ########--Get RENDERER--############
        self.renderer = self.dcmViewer.GetRenderer()
        self.renderer.AddActor2D(self.sliceTextActor)
        # ########--Set Up RENDER Window--############
        self.renderWindow = self.vtkWidget.GetRenderWindow()
        self.renderWindow.AddRenderer(self.renderer)
        self.vtkWidget.GetRenderWindow().AddRenderer(self.renderer)
        # '---------    Interactor  ----------'
        self.inter = self.renderWindow.GetInteractor()
        # ----!Stay in 2D View!-----
        self.inter.SetInteractorStyle(
            vtkInteractionStyle.vtkInteractorStyleImage())

        # '----------add keyboard observer---------'
        self.vtkWidget.AddObserver(vtk.vtkCommand.KeyPressEvent,
                                   self.keyboard_callback_func)
        self.cam = self.renderer.GetActiveCamera()
        if self.viewPlane == 'Coronal':
            # self.cam.SetFocalPoint(0, 0, 0)     # 设焦点
            # self.cam.SetPosition(0, 0, -1)  # Camera in Z so it display XY planes. # 设观察对象位
            self.cam.SetViewUp(
                0, 0, -1
            )  # Up direction is the X not the y. #(0,0,-1) for Coronal plane
        # self.cam.ComputeViewPlaneNormal()  # 自动

        self.renderer.ResetCamera()
        self.frame.setLayout(self.vl)
        self.setCentralWidget(self.frame)
        self.show()
        self.inter.Initialize()
def vtkKWCornerAnnotationEditorEntryPoint(parent, win):

    app = parent.GetApplication()
    
    # -----------------------------------------------------------------------
    
    # Create a render widget
    # Set the corner annotation visibility
    
    cae_renderwidget = vtkKWRenderWidget()
    cae_renderwidget.SetParent(parent)
    cae_renderwidget.Create()
    cae_renderwidget.CornerAnnotationVisibilityOn()
    
    app.Script("pack %s -side right -fill both -expand y -padx 0 -pady 0",
        cae_renderwidget.GetWidgetName())
    
    # -----------------------------------------------------------------------
    
    # Create a volume reader
    
    cae_reader = vtkXMLImageDataReader()
    cae_reader.SetFileName(os.path.join(
        os.path.dirname(os.path.abspath(__file__)),
        "..", "..", "..", "..", "Data", "head100x100x47.vti"))
    
    # Create an image viewer
    # Use the render window and renderer of the renderwidget
    
    cae_viewer = vtkImageViewer2()
    cae_viewer.SetRenderWindow(cae_renderwidget.GetRenderWindow())
    cae_viewer.SetRenderer(cae_renderwidget.GetRenderer())
    cae_viewer.SetInput(cae_reader.GetOutput())
    cae_viewer.SetupInteractor(
        cae_renderwidget.GetRenderWindow().GetInteractor())
    
    # Reset the window/level and the camera
    
    cae_reader.Update()
    range = cae_reader.GetOutput().GetScalarRange()
    cae_viewer.SetColorWindow(range[1] - range[0])
    cae_viewer.SetColorLevel(0.5 * (range[1] + range[0]))
    
    cae_renderwidget.ResetCamera()
    
    # -----------------------------------------------------------------------
    
    # The corner annotation has the ability to parse "tags" and fill
    # them with information gathered from other objects.
    # For example, let's display the slice and window/level in one corner
    # by connecting the corner annotation to our image actor and
    # image mapper
    
    ca = cae_renderwidget.GetCornerAnnotation()
    ca.SetImageActor(cae_viewer.GetImageActor())
    ca.SetWindowLevel(cae_viewer.GetWindowLevel())
    ca.SetText(2, "<slice>")
    ca.SetText(3, "<window>\n<level>")
    ca.SetText(1, "Hello, World!")
    
    # -----------------------------------------------------------------------
    
    # Create a corner annotation editor
    # Connect it to the render widget
    
    cae_anno_editor = vtkKWCornerAnnotationEditor()
    cae_anno_editor.SetParent(parent)
    cae_anno_editor.Create()
    cae_anno_editor.SetRenderWidget(cae_renderwidget)
    
    app.Script("pack %s -side left -anchor nw -expand n -padx 2 -pady 2",
        cae_anno_editor.GetWidgetName())
    
    return "TypeVTK"
Example #38
0
    def __init__(self, parent = None):

        self.reader = vtk.vtkNrrdReader()

        self.dataExtent = []
        self.dataDimensions = []
        self.dataRange = ()


        # initialize GUI
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.ui.WindowCenterSlider.setRange(0, 1000)
        self.ui.WindowWidthSlider.setRange(0, 1000)

        # define viewers
        [self.viewerXY, self.viewerYZ, self.viewerXZ] = [vtk.vtkImageViewer2() for x in range(3)]
        [self.viewerXY2, self.viewerYZ2, self.viewerXZ2] = [vtk.vtkImageViewer2() for x in range(3)]

        # attach interactors to viewers
        self.viewerXY.SetupInteractor(self.ui.XYPlaneWidget)
        self.viewerYZ.SetupInteractor(self.ui.YZPlaneWidget)
        self.viewerXZ.SetupInteractor(self.ui.XZPlaneWidget)

        self.colorTable = vtk.vtkLookupTable()
        self.colorTable.SetNumberOfColors(1)
        self.colorTable.SetTableValue(0, 0, 1, 0, 1)
        self.colorTable.Build()
        self.colorMap = vtk.vtkImageMapToColors()


        # set render windows for viewers
        self.viewerXY.SetRenderWindow(self.ui.XYPlaneWidget.GetRenderWindow())
        self.viewerYZ.SetRenderWindow(self.ui.YZPlaneWidget.GetRenderWindow())
        self.viewerXZ.SetRenderWindow(self.ui.XZPlaneWidget.GetRenderWindow())
        # set slicing orientation for viewers
        self.viewerXY.SetSliceOrientationToXZ()
        self.viewerYZ.SetSliceOrientationToYZ()
        self.viewerXZ.SetSliceOrientationToXY()



        # setup volume rendering
        self.volRender = vtk.vtkRenderer()
        self.volRenWin = self.ui.VolumeWidget.GetRenderWindow()
        self.volRenWin.AddRenderer(self.volRender)

        #self.rayCastFunction = vtk.vtkVolumeRayCastCompositeFunction()
        #self.volumeMapper = vtk.vtkFixedPointVolumeRayCastMapper()
        #self.volumeMapper.SetBlendModeToComposite()
        #self.volumeMapper.SetVolumeRayCastFunction(self.rayCastFunction)
        self.volumeMapper = vtk.vtkGPUVolumeRayCastMapper()


        volumeColor = vtk.vtkColorTransferFunction()
        volumeColor.AddRGBPoint(0,    0.0, 0.0, 0.0)
        volumeColor.AddRGBPoint(500,  1.0, 0.5, 0.3)
        volumeColor.AddRGBPoint(1000, 1.0, 0.5, 0.3)
        volumeColor.AddRGBPoint(1150, 1.0, 1.0, 0.9)
        self.volumeColor = volumeColor

        volumeScalarOpacity = vtk.vtkPiecewiseFunction()
        volumeScalarOpacity.AddPoint(0, 0.00)
        volumeScalarOpacity.AddPoint(50, 0.15)
        volumeScalarOpacity.AddPoint(100, 0.15)
        volumeScalarOpacity.AddPoint(115, 0.85)
        self.volumeScalarOpacity = volumeScalarOpacity

        volumeGradientOpacity = vtk.vtkPiecewiseFunction()
        volumeGradientOpacity.AddPoint(0,   0.0)
        volumeGradientOpacity.AddPoint(100,  0.5)
        volumeGradientOpacity.AddPoint(500, 1)
        self.volumeGradientOpacity = volumeGradientOpacity

        volumeProperty = vtk.vtkVolumeProperty()
        volumeProperty.SetColor(volumeColor)
        volumeProperty.SetScalarOpacity(volumeScalarOpacity)
        volumeProperty.SetGradientOpacity(volumeGradientOpacity)
        volumeProperty.SetInterpolationTypeToLinear()
        volumeProperty.ShadeOn()
        volumeProperty.SetAmbient(0.4)
        volumeProperty.SetDiffuse(0.6)
        volumeProperty.SetSpecular(0.2)
        self.volumeProperty = volumeProperty

        volume = vtk.vtkVolume()
        volume.SetMapper(self.volumeMapper)
        volume.SetProperty(self.volumeProperty)
        self.volume = volume
        self.volRender.AddViewProp(volume)



        width_bar = self.ui.WindowWidthSlider
        center_bar = self.ui.WindowCenterSlider
        width_bar.valueChanged.connect(self.changeValue)
        center_bar.valueChanged.connect(self.changeValue)
Example #39
0

# roi1 = rm.Roi((xs, ys, zs, w, h, t), r"TDI072.mostd")
# used_image = roi1.getImages()
tiff3d_obj = libtiff.TIFF3D.open(r'G:\\sulei\\workplace\\Swc\\res\\22_24_12.tif', 'r')
used_image = tiff3d_obj.read_image()
im = np.require(used_image, dtype=np.uint8)
im_strs = im.tostring()
im_importer = vtk.vtkImageImport()
im_importer.CopyImportVoidPointer(im_strs, len(im_strs))
im_importer.SetDataScalarTypeToUnsignedChar()
im_importer.SetNumberOfScalarComponents(1)
im_importer.SetDataExtent(0, w - 1, 0, h - 1, 0, t - 1)
im_importer.SetWholeExtent(0, w - 1, 0, h - 1, 0, t - 1)

im_view = vtk.vtkImageViewer2()
im_view.SetInput(im_importer.GetOutput())
style1 = MyStyle()
iren = vtk.vtkRenderWindowInteractor()

im_view.SetupInteractor(iren)
im_view.SetColorLevel(50)
im_view.SetColorWindow(100)
im_view.GetRenderWindow().SetSize(600, 600)
im_view.SetSlice(100)
im_view.SetSliceOrientationToXY()
im_view.Render()
iren.SetInteractorStyle(style1)
iren.Initialize()
iren.Start()
Example #40
0
    def __init__(self, parent = None):

        self.reader = vtk.vtkDICOMImageReader()
        self.dataExtent = []
        self.dataDimensions = []
        self.dataRange = ()

        # initialize GUI
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.ui.WindowCenterSlider.setRange(0, 1000)
        self.ui.WindowWidthSlider.setRange(0, 1000)

        # define viewers
        [self.viewerXY, self.viewerYZ, self.viewerXZ] = [vtk.vtkImageViewer2() for x in range(3)]

        # attach interactors to viewers
        self.viewerXY.SetupInteractor(self.ui.XYPlaneWidget)
        self.viewerYZ.SetupInteractor(self.ui.YZPlaneWidget)
        self.viewerXZ.SetupInteractor(self.ui.XZPlaneWidget)

        # set render windows for viewers
        self.viewerXY.SetRenderWindow(self.ui.XYPlaneWidget.GetRenderWindow())
        self.viewerYZ.SetRenderWindow(self.ui.YZPlaneWidget.GetRenderWindow())
        self.viewerXZ.SetRenderWindow(self.ui.XZPlaneWidget.GetRenderWindow())

        # set slicing orientation for viewers
        self.viewerXY.SetSliceOrientationToXZ()
        self.viewerYZ.SetSliceOrientationToYZ()
        self.viewerXZ.SetSliceOrientationToXY()

        # rotate image
        act = self.viewerYZ.GetImageActor()
        act.SetOrientation(90, 0, 0)

        # setup volume rendering
        self.volRender = vtk.vtkRenderer()
        self.volRenWin = self.ui.VolumeWidget.GetRenderWindow()
        self.volRenWin.AddRenderer(self.volRender)

        self.rayCastFunction = vtk.vtkVolumeRayCastCompositeFunction()
        self.volumeMapper = vtk.vtkVolumeRayCastMapper()
        self.volumeMapper.SetVolumeRayCastFunction(self.rayCastFunction)

        volumeColor = vtk.vtkColorTransferFunction()
        volumeColor.AddRGBPoint(0,    0.0, 0.0, 0.0)
        volumeColor.AddRGBPoint(500,  1.0, 0.5, 0.3)
        volumeColor.AddRGBPoint(1000, 1.0, 0.5, 0.3)
        volumeColor.AddRGBPoint(1150, 1.0, 1.0, 0.9)
        self.volumeColor = volumeColor

        volumeScalarOpacity = vtk.vtkPiecewiseFunction()
        volumeScalarOpacity.AddPoint(0,    0.00)
        volumeScalarOpacity.AddPoint(50,  0.15)
        volumeScalarOpacity.AddPoint(100, 0.15)
        volumeScalarOpacity.AddPoint(115, 0.85)
        self.volumeScalarOpacity = volumeScalarOpacity

        volumeGradientOpacity = vtk.vtkPiecewiseFunction()
        volumeGradientOpacity.AddPoint(0,   0.0)
        volumeGradientOpacity.AddPoint(100,  0.5)
        volumeGradientOpacity.AddPoint(500, 1)
        self.volumeGradientOpacity = volumeGradientOpacity

        volumeProperty = vtk.vtkVolumeProperty()
        volumeProperty.SetColor(volumeColor)
        volumeProperty.SetScalarOpacity(volumeScalarOpacity)
        volumeProperty.SetGradientOpacity(volumeGradientOpacity)
        volumeProperty.SetInterpolationTypeToLinear()
        volumeProperty.ShadeOn()
        volumeProperty.SetAmbient(0.4)
        volumeProperty.SetDiffuse(0.6)
        volumeProperty.SetSpecular(0.2)
        self.volumeProperty = volumeProperty

        volume = vtk.vtkVolume()
        volume.SetMapper(self.volumeMapper)
        volume.SetProperty(self.volumeProperty)
        self.volume = volume

        self.volRender.AddViewProp(volume)
Example #41
0
def main(argv):
    imageViewer = vtk.vtkImageViewer2()
    if len(argv) < 2:
        noiseSource = vtk.vtkImageNoiseSource()
        noiseSource.SetWholeExtent(0, 512, 0, 512, 0, 0)
        noiseSource.SetMinimum(0.0)
        noiseSource.SetMaximum(65535.0)

        # cast noise image to unsigned short
        imageCast = vtk.vtkImageCast()
        imageCast.SetInputConnection(noiseSource.GetOutputPort())
        imageCast.SetOutputScalarTypeToUnsignedShort()
        imageCast.Update()
        # connect to image viewer pipeline
        imageViewer.SetInputConnection(imageCast.GetOutputPort())
    else:
        # Parse input argument
        inputFilename = str(argv[1])

        # Read the image
        tiffReader = vtk.vtkTIFFReader()
        if not tiffReader.CanReadFile(inputFilename):
            return
        tiffReader.SetFileName(inputFilename)

        # connect to image viewer pipeline
        imageViewer.SetInputConnection(tiffReader.GetOutputPort())

    # Picker to pick pixels
    propPicker = vtk.vtkPropPicker()
    propPicker.PickFromListOn()

    # Give the picker a prop to pick
    imageActor = imageViewer.GetImageActor()
    propPicker.AddPickList(imageActor)

    # disable interpolation, so we can see each pixel
    imageActor.InterpolateOff()

    # Visualize
    renderWindowInteractor = vtk.vtkRenderWindowInteractor()
    imageViewer.SetupInteractor(renderWindowInteractor)
    imageViewer.SetSize(600, 600)

    renderer = imageViewer.GetRenderer()
    renderer.ResetCamera()
    renderer.GradientBackgroundOn()
    renderer.SetBackground(0.6, 0.6, 0.5)
    renderer.SetBackground2(0.3, 0.3, 0.2)

    # Annotate the image with window/level and mouse over pixel
    # information
    cornerAnnotation = vtk.vtkCornerAnnotation()
    cornerAnnotation.SetLinearFontScaleFactor(2)
    cornerAnnotation.SetNonlinearFontScaleFactor(1)
    cornerAnnotation.SetMaximumFontSize(20)
    cornerAnnotation.SetText(0, "Off Image")
    cornerAnnotation.SetText(3, "<window>\n<level>")
    cornerAnnotation.GetTextProperty().SetColor(1, 0, 0)

    imageViewer.GetRenderer().AddViewProp(cornerAnnotation)

    # Callback listens to MouseMoveEvents invoked by the interactor's style
    callback = vtkImageInteractionCallback()
    callback.SetViewer(imageViewer)
    callback.SetAnnotation(cornerAnnotation)
    callback.SetPicker(propPicker)

    # InteractorStyleImage allows for the following controls:
    # 1) middle mouse + move = camera pan
    # 2) left mouse + move = window/level
    # 3) right mouse + move = camera zoom
    # 4) middle mouse wheel scroll = zoom
    # 5) 'r' = reset window/level
    # 6) shift + 'r' = reset camera
    imageStyle = imageViewer.GetInteractorStyle()
    imageStyle.AddObserver('MouseMoveEvent', callback.Execute)

    if len(argv) > 1:
        imageViewer.GetImageActor().GetMapper().SetInputConnection(
            tiffReader.GetOutputPort())

    renderWindowInteractor.Initialize()
    renderWindowInteractor.Start()