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()
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)
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()
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)
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()
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"
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()
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()
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()
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)
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)
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()
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()
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()
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
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()
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()
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)
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)
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()
# 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()
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()
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()
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"
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)
# 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()
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)
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()