def VTKGrowN(x,n=2,m=None,numret=False,origsize=None,interp=False,wrap=False, constant=None,mirror=False,xshift=0,yshift=0): if type(x) == np.ndarray: i = NumToVTKImage(x) else: i = x d = i.GetDimensions() if not m: m = n if d[0] == 1: n = 1 if d[1] == 1: m = 1 im = vtk.vtkImageMagnify() im.SetMagnificationFactors(n,m,1) if interp: im.InterpolateOn() else: im.InterpolateOff() im.SetInputData(i) o = im.GetOutput() im.Update() o.SetSpacing(1,1,1) #o.Update() o = VTKImageShift(o,xshift,yshift,interp=True,wrap=wrap,constant=constant, mirror=mirror) if origsize is not None: if len(origsize) == 1: origsize=(1,)+origsize p = vtk.vtkImageMirrorPad() p.SetOutputWholeExtent(0,origsize[1]-1,0,origsize[0]-1,0,0) p.SetInputData(o) f = p.GetOutput() p.Update() o = f if numret: return VTKImageToNum(o) else: return o
def buildPipeline(self): """ execute() -> None Dispatch the vtkRenderer to the actual rendering widget """ self.initialOrigin = self.input.GetOrigin() self.initialExtent = self.input.GetExtent() self.initialSpacing = self.input.GetSpacing() self.initialAoi = self.getUnscaledWorldExtent( self.initialExtent, self.initialSpacing ) self.currentAoi = list( self.initialAoi ) self.clip = vtk.vtkExtractVOI() self.inputModule.inputToAlgorithm( self.clip ) self.pad = vtk.vtkImageMagnify() self.pad.InterpolateOn() self.pad.SetInputConnection( self.clip.GetOutputPort() ) self.imageInfo = vtk.vtkImageChangeInformation() self.imageInfo.SetInputConnection( self.pad.GetOutputPort() ) self.imageInfo.SetOutputOrigin( self.initialOrigin[0], self.initialOrigin[1], self.initialOrigin[2] ) self.imageInfo.SetOutputExtentStart( self.initialExtent[0], self.initialExtent[2], self.initialExtent[4] ) self.imageInfo.SetOutputSpacing( self.initialSpacing[0], self.initialSpacing[1], self.initialSpacing[2] ) self.setExtent( self.initialExtent ) self.set3DOutput( port=self.imageInfo.GetOutputPort() )
def __init__(self, module_manager): SimpleVTKClassModuleBase.__init__( self, module_manager, vtk.vtkImageMagnify(), 'Processing.', ('vtkImageData',), ('vtkImageData',), replaceDoc=True, inputFunctions=None, outputFunctions=None)
def ImageActor(img): reader = vtkImageImportFromArray() reader.SetArray(img) ImageDataGeometryFilter = vtk.vtkImageDataGeometryFilter() ImageDataGeometryFilter.SetInputConnection(reader.GetOutputPort()) ImageDataGeometryFilter.Update() # textureCoordinates = vtk.vtkFloatArray() # textureCoordinates.SetNumberOfComponents(2) # textureCoordinates.InsertNextTuple2(0.0, 1.0) # textureCoordinates.InsertNextTuple2(1.0, 1.0) # textureCoordinates.InsertNextTuple2(1.0, 0.0) # textureCoordinates.InsertNextTuple2(0.0, 0.0) mag = vtk.vtkImageMagnify() mag.SetMagnificationFactors(512, 512, 1) mag.InterpolateOff() mag.SetInputConnection(reader.GetOutputPort()) mapper = vtk.vtkImageMapper() # mapper.SetInputConnection(reader.GetOutputPort()) # mapper.SetColorWindow(4) # mapper.SetColorLevel(255) # mapper.SetZSlice(0) mapper.SetInputConnection(mag.GetOutputPort()) # mapper.SetColorlevel(1000) viewer = vtk.vtkImageViewer() viewer.SetInputConnection(reader.GetOutputPort()) viewer.SetColorWindow(4) viewer.SetColorLevel(255) # viewer.SetZSlice(0) viewer.Render() actor = vtk.vtkActor2D() actor.SetMapper(mapper.GetOutputPort()) # actor=vtk.vtkImageActor() # actor.SetMapper(mapper) # actor.SetInputData(reader.GetOutput()) return actor, viewer
# Derived from Cursor3D. This script increases the coverage of the # vtkImageInplaceFilter super class. # global values CURSOR_X = 20 CURSOR_Y = 20 CURSOR_Z = 20 IMAGE_MAG_X = 2 IMAGE_MAG_Y = 2 IMAGE_MAG_Z = 1 # pipeline stuff reader = vtk.vtkSLCReader() reader.SetFileName(VTK_DATA_ROOT + "/Data/nut.slc") # make the image a little bigger magnify1 = vtk.vtkImageMagnify() magnify1.SetInputConnection(reader.GetOutputPort()) magnify1.SetMagnificationFactors(IMAGE_MAG_X, IMAGE_MAG_Y, IMAGE_MAG_Z) magnify1.ReleaseDataFlagOn() magnify2 = vtk.vtkImageMagnify() magnify2.SetInputConnection(reader.GetOutputPort()) magnify2.SetMagnificationFactors(IMAGE_MAG_X, IMAGE_MAG_Y, IMAGE_MAG_Z) magnify2.ReleaseDataFlagOn() # a filter that does in place processing (magnify ReleaseDataFlagOn) cursor = vtk.vtkImageCursor3D() cursor.SetInputConnection(magnify1.GetOutputPort()) cursor.SetCursorPosition(CURSOR_X * IMAGE_MAG_X, CURSOR_Y * IMAGE_MAG_Y, CURSOR_Z * IMAGE_MAG_Z)
# Shift and scale an image (in that order) # This filter is useful for converting to a lower precision data type. # This script tests the clamp overflow feature. reader = vtk.vtkImageReader() reader.GetExecutive().SetReleaseDataFlag(0,0) reader.SetDataByteOrderToLittleEndian() reader.SetDataExtent(0,63,0,63,1,93) reader.SetFilePrefix("" + str(VTK_DATA_ROOT) + "/Data/headsq/quarter") reader.SetDataMask(0x7fff) shiftScale = vtk.vtkImageShiftScale() shiftScale.SetInputConnection(reader.GetOutputPort()) shiftScale.SetShift(-1000.0) shiftScale.SetScale(4.0) shiftScale.SetOutputScalarTypeToUnsignedShort() shiftScale.ClampOverflowOn() shiftScale2 = vtk.vtkImageShiftScale() shiftScale2.SetInputConnection(shiftScale.GetOutputPort()) shiftScale2.SetShift(0) shiftScale2.SetScale(2.0) mag = vtk.vtkImageMagnify() mag.SetInputConnection(shiftScale2.GetOutputPort()) mag.SetMagnificationFactors(4,4,1) mag.InterpolateOff() viewer = vtk.vtkImageViewer() viewer.SetInputConnection(mag.GetOutputPort()) viewer.SetColorWindow(1024) viewer.SetColorLevel(512) #make interface #skipping source # --- end of script --
def SetUp(self): ''' Set up cursor3D ''' def OnClosing(): self.root.quit() def ViewerDown(tkvw): viewer = tkvw.GetImageViewer() ViewerSetZSlice(tkvw, viewer.GetZSlice() - 1) def ViewerUp(tkvw): viewer = tkvw.GetImageViewer() ViewerSetZSlice(tkvw, viewer.GetZSlice() + 1) def ViewerSetZSlice(tkvw, z): viewer = tkvw.GetImageViewer() viewer.SetZSlice(z) txt = 'slice: ' + str(z) sliceLabel.configure(text=txt) tkvw.Render() def SetCursorFromViewer(event): x = int(event.x) y = int(event.y) # We have to flip y axis because tk uses upper right origin. self.root.update_idletasks() height = int(self.tkvw.configure()['height'][4]) y = height - y z = self.tkvw.GetImageViewer().GetZSlice() SetCursor(x / IMAGE_MAG_X, y / IMAGE_MAG_Y, z / IMAGE_MAG_Z) def SetCursor(x, y, z): CURSOR_X = x CURSOR_Y = y CURSOR_Z = z axes.SetOrigin(CURSOR_X, CURSOR_Y, CURSOR_Z) imageCursor.SetCursorPosition(CURSOR_X * IMAGE_MAG_X, CURSOR_Y * IMAGE_MAG_Y, CURSOR_Z * IMAGE_MAG_Z) self.viewer.Render() self.tkrw.Render() # Pipeline stuff. reader = vtk.vtkSLCReader() reader.SetFileName(VTK_DATA_ROOT + "/Data/neghip.slc") # Cursor stuff magnify = vtk.vtkImageMagnify() magnify.SetInputConnection(reader.GetOutputPort()) magnify.SetMagnificationFactors(IMAGE_MAG_X, IMAGE_MAG_Y, IMAGE_MAG_Z) imageCursor = vtk.vtkImageCursor3D() imageCursor.SetInputConnection(magnify.GetOutputPort()) imageCursor.SetCursorPosition(CURSOR_X * IMAGE_MAG_X, CURSOR_Y * IMAGE_MAG_Y, CURSOR_Z * IMAGE_MAG_Z) imageCursor.SetCursorValue(255) imageCursor.SetCursorRadius(50 * IMAGE_MAG_X) axes = vtk.vtkAxes() axes.SymmetricOn() axes.SetOrigin(CURSOR_X, CURSOR_Y, CURSOR_Z) axes.SetScaleFactor(50.0) axes_mapper = vtk.vtkPolyDataMapper() axes_mapper.SetInputConnection(axes.GetOutputPort()) axesActor = vtk.vtkActor() axesActor.SetMapper(axes_mapper) axesActor.GetProperty().SetAmbient(0.5) # Image viewer stuff. viewer = vtk.vtkImageViewer() viewer.SetInputConnection(imageCursor.GetOutputPort()) viewer.SetZSlice(CURSOR_Z * IMAGE_MAG_Z) viewer.SetColorWindow(256) viewer.SetColorLevel(128) # Create transfer functions for opacity and color. opacity_transfer_function = vtk.vtkPiecewiseFunction() opacity_transfer_function.AddPoint(20, 0.0) opacity_transfer_function.AddPoint(255, 0.2) color_transfer_function = vtk.vtkColorTransferFunction() color_transfer_function.AddRGBPoint(0, 0, 0, 0) color_transfer_function.AddRGBPoint(64, 1, 0, 0) color_transfer_function.AddRGBPoint(128, 0, 0, 1) color_transfer_function.AddRGBPoint(192, 0, 1, 0) color_transfer_function.AddRGBPoint(255, 0, .2, 0) # Create properties, mappers, volume actors, and ray cast function. volume_property = vtk.vtkVolumeProperty() volume_property.SetColor(color_transfer_function) # volume_property.SetColor(color_transfer_function[0], # color_transfer_function[1], # color_transfer_function[2]) volume_property.SetScalarOpacity(opacity_transfer_function) volume_mapper = vtk.vtkFixedPointVolumeRayCastMapper() volume_mapper.SetInputConnection(reader.GetOutputPort()) volume = vtk.vtkVolume() volume.SetMapper(volume_mapper) volume.SetProperty(volume_property) # Create outline. outline = vtk.vtkOutlineFilter() outline.SetInputConnection(reader.GetOutputPort()) outline_mapper = vtk.vtkPolyDataMapper() outline_mapper.SetInputConnection(outline.GetOutputPort()) outlineActor = vtk.vtkActor() outlineActor.SetMapper(outline_mapper) outlineActor.GetProperty().SetColor(1, 1, 1) # Create the renderer. ren = vtk.vtkRenderer() ren.AddActor(axesActor) ren.AddVolume(volume) ren.SetBackground(0.1, 0.2, 0.4) renWin = vtk.vtkRenderWindow() renWin.AddRenderer(ren) renWin.SetSize(256, 256) # Create the GUI: two renderer widgets and a quit button. self.root = tkinter.Tk() self.root.title("cursor3D") # Define what to do when the user explicitly closes a window. self.root.protocol("WM_DELETE_WINDOW", OnClosing) # Help label, frame and quit button helpLabel = tkinter.Label( self.root, text= "MiddleMouse (or shift-LeftMouse) in image viewer to place cursor") displayFrame = tkinter.Frame(self.root) quitButton = tkinter.Button(self.root, text="Quit", command=OnClosing) # Pack the GUI. helpLabel.pack() displayFrame.pack(fill=BOTH, expand=TRUE) quitButton.pack(fill=X) # Create the viewer widget. viewerFrame = tkinter.Frame(displayFrame) viewerFrame.pack(padx=3, pady=3, side=LEFT, anchor=N, fill=BOTH, expand=FALSE) self.tkvw = vtkTkImageViewerWidget(viewerFrame, iv=viewer, width=264, height=264) viewerControls = tkinter.Frame(viewerFrame) viewerControls.pack(side=BOTTOM, anchor=S, fill=BOTH, expand=TRUE) self.tkvw.pack(side=TOP, anchor=N, fill=BOTH, expand=FALSE) downButton = tkinter.Button(viewerControls, text="Down", command=[ViewerDown, self.tkvw]) upButton = tkinter.Button(viewerControls, text="Up", command=[ViewerUp, self.tkvw]) sliceLabel = tkinter.Label(viewerControls, text="slice: " + str(CURSOR_Z * IMAGE_MAG_Z)) downButton.pack(side=LEFT, expand=TRUE, fill=BOTH) upButton.pack(side=LEFT, expand=TRUE, fill=BOTH) sliceLabel.pack(side=LEFT, expand=TRUE, fill=BOTH) # Create the render widget renderFrame = tkinter.Frame(displayFrame) renderFrame.pack(padx=3, pady=3, side=LEFT, anchor=N, fill=BOTH, expand=TRUE) self.tkrw = vtkTkRenderWidget(renderFrame, rw=renWin, width=264, height=264) self.tkrw.pack(side=TOP, anchor=N, fill=BOTH, expand=TRUE) # Bindings self.tkvw.BindTkImageViewer() self.tkrw.BindTkRenderWidget() # Lets add an extra binding of the middle button in the image viewer # to set the cursor location. self.tkvw.bind('<Button-2>', SetCursorFromViewer) self.tkvw.bind('<Shift-Button-1>', SetCursorFromViewer) # Associate the functions with the buttons and label. # downButton.config(command=partial(ViewerDown, self.tkvw)) upButton.config(command=partial(ViewerUp, self.tkvw))
# Derived from Cursor3D. This script increases the coverage of the # vtkImageInplaceFilter super class. # global values CURSOR_X = 20 CURSOR_Y = 20 CURSOR_Z = 20 IMAGE_MAG_X = 2 IMAGE_MAG_Y = 2 IMAGE_MAG_Z = 1 # pipeline stuff reader = vtk.vtkSLCReader() reader.SetFileName(VTK_DATA_ROOT + "/Data/nut.slc") # make the image a little bigger magnify1 = vtk.vtkImageMagnify() magnify1.SetInputConnection(reader.GetOutputPort()) magnify1.SetMagnificationFactors(IMAGE_MAG_X, IMAGE_MAG_Y, IMAGE_MAG_Z) magnify1.ReleaseDataFlagOn() magnify2 = vtk.vtkImageMagnify() magnify2.SetInputConnection(reader.GetOutputPort()) magnify2.SetMagnificationFactors(IMAGE_MAG_X, IMAGE_MAG_Y, IMAGE_MAG_Z) magnify2.ReleaseDataFlagOn() # a filter that does in place processing (magnify ReleaseDataFlagOn) cursor = vtk.vtkImageCursor3D() cursor.SetInputConnection(magnify1.GetOutputPort()) cursor.SetCursorPosition(CURSOR_X * IMAGE_MAG_X, CURSOR_Y * IMAGE_MAG_Y, CURSOR_Z * IMAGE_MAG_Z) cursor.SetCursorValue(255)
def testAllShrinks(self): prefix = VTK_DATA_ROOT + "/Data/headsq/quarter" renWin = vtk.vtkRenderWindow() # Image pipeline reader = vtk.vtkImageReader() reader.SetDataExtent(0, 63, 0, 63, 1, 93) reader.SetFilePrefix(prefix) reader.SetDataByteOrderToLittleEndian() reader.SetDataMask(0x7fff) factor = 4 magFactor = 8 ops = ["Minimum", "Maximum", "Mean", "Median", "NoOp"] shrink = dict() mag = dict() mapper = dict() actor = dict() imager = dict() for operator in ops: shrink.update({operator:vtk.vtkImageShrink3D()}) shrink[operator].SetMean(0) if operator != "NoOp": eval('shrink[operator].' + operator + 'On()') shrink[operator].SetShrinkFactors(factor, factor, factor) shrink[operator].SetInputConnection(reader.GetOutputPort()) mag.update({operator:vtk.vtkImageMagnify()}) mag[operator].SetMagnificationFactors(magFactor, magFactor, magFactor) mag[operator].InterpolateOff() mag[operator].SetInputConnection(shrink[operator].GetOutputPort()) mapper.update({operator:vtk.vtkImageMapper()}) mapper[operator].SetInputConnection(mag[operator].GetOutputPort()) mapper[operator].SetColorWindow(2000) mapper[operator].SetColorLevel(1000) mapper[operator].SetZSlice(45) actor.update({operator:vtk.vtkActor2D()}) actor[operator].SetMapper(mapper[operator]) imager.update({operator:vtk.vtkRenderer()}) imager[operator].AddActor2D(actor[operator]) renWin.AddRenderer(imager[operator]) shrink["Minimum"].Update shrink["Maximum"].Update shrink["Mean"].Update shrink["Median"].Update imager["Minimum"].SetViewport(0, 0, .5, .33) imager["Maximum"].SetViewport(0, .33, .5, .667) imager["Mean"].SetViewport(.5, 0, 1, .33) imager["Median"].SetViewport(.5, .33, 1, .667) imager["NoOp"].SetViewport(0, .667, 1, 1) renWin.SetSize(256, 384) # render and interact with data iRen = vtk.vtkRenderWindowInteractor() iRen.SetRenderWindow(renWin); renWin.Render() img_file = "TestAllShrinks.png" vtk.test.Testing.compareImage(iRen.GetRenderWindow(), vtk.test.Testing.getAbsImagePath(img_file), threshold=25) vtk.test.Testing.interact()
def main(): fileName = get_program_parameters() colors = vtk.vtkNamedColors() # Read the CT data of the human head. reader = vtk.vtkMetaImageReader() reader.SetFileName(fileName) reader.Update() cast = vtk.vtkImageCast() cast.SetInputConnection(reader.GetOutputPort()) cast.SetOutputScalarTypeToFloat() # Magnify the image. magnify = vtk.vtkImageMagnify() magnify.SetInputConnection(cast.GetOutputPort()) magnify.SetMagnificationFactors(2, 2, 1) magnify.InterpolateOn() # Smooth the data. # Remove high frequency artifacts due to linear interpolation. smooth = vtk.vtkImageGaussianSmooth() smooth.SetInputConnection(magnify.GetOutputPort()) smooth.SetDimensionality(2) smooth.SetStandardDeviations(1.5, 1.5, 0.0) smooth.SetRadiusFactors(2.01, 2.01, 0.0) # Compute the 2D gradient. gradient = vtk.vtkImageGradient() gradient.SetInputConnection(smooth.GetOutputPort()) gradient.SetDimensionality(2) # Convert the data to polar coordinates. # The image magnitude is mapped into saturation value, # whilst the gradient direction is mapped into hue value. polar = vtk.vtkImageEuclideanToPolar() polar.SetInputConnection(gradient.GetOutputPort()) polar.SetThetaMaximum(255.0) # Add a third component to the data. # This is needed since the gradient filter only generates two components, # and we need three components to represent color. pad = vtk.vtkImageConstantPad() pad.SetInputConnection(polar.GetOutputPort()) pad.SetOutputNumberOfScalarComponents(3) pad.SetConstant(200.0) # At this point we have Hue, Value, Saturation. # Permute components so saturation will be constant. # Re-arrange components into HSV order. permute = vtk.vtkImageExtractComponents() permute.SetInputConnection(pad.GetOutputPort()) permute.SetComponents(0, 2, 1) # Convert back into RGB values. rgb = vtk.vtkImageHSVToRGB() rgb.SetInputConnection(permute.GetOutputPort()) rgb.SetMaximum(255.0) # Set up a viewer for the image. # Note that vtkImageViewer and vtkImageViewer2 are convenience wrappers around # vtkActor2D, vtkImageMapper, vtkRenderer, and vtkRenderWindow. # So all that needs to be supplied is the interactor. viewer = vtk.vtkImageViewer() viewer.SetInputConnection(rgb.GetOutputPort()) viewer.SetZSlice(22) viewer.SetColorWindow(255.0) viewer.SetColorLevel(127.0) viewer.GetRenderWindow().SetSize(512, 512) viewer.GetRenderer().SetBackground(colors.GetColor3d("Silver")) # Create the RenderWindowInteractor. iren = vtk.vtkRenderWindowInteractor() viewer.SetupInteractor(iren) viewer.Render() iren.Initialize() iren.Start()
def testAllShrinks(self): prefix = VTK_DATA_ROOT + "/Data/headsq/quarter" renWin = vtk.vtkRenderWindow() # Image pipeline reader = vtk.vtkImageReader() reader.SetDataExtent(0, 63, 0, 63, 1, 93) reader.SetFilePrefix(prefix) reader.SetDataByteOrderToLittleEndian() reader.SetDataMask(0x7fff) factor = 4 magFactor = 8 ops = ["Minimum", "Maximum", "Mean", "Median", "NoOp"] shrink = dict() mag = dict() mapper = dict() actor = dict() imager = dict() for operator in ops: shrink.update({operator: vtk.vtkImageShrink3D()}) shrink[operator].SetMean(0) if operator != "NoOp": eval('shrink[operator].' + operator + 'On()') shrink[operator].SetShrinkFactors(factor, factor, factor) shrink[operator].SetInputConnection(reader.GetOutputPort()) mag.update({operator: vtk.vtkImageMagnify()}) mag[operator].SetMagnificationFactors(magFactor, magFactor, magFactor) mag[operator].InterpolateOff() mag[operator].SetInputConnection(shrink[operator].GetOutputPort()) mapper.update({operator: vtk.vtkImageMapper()}) mapper[operator].SetInputConnection(mag[operator].GetOutputPort()) mapper[operator].SetColorWindow(2000) mapper[operator].SetColorLevel(1000) mapper[operator].SetZSlice(45) actor.update({operator: vtk.vtkActor2D()}) actor[operator].SetMapper(mapper[operator]) imager.update({operator: vtk.vtkRenderer()}) imager[operator].AddActor2D(actor[operator]) renWin.AddRenderer(imager[operator]) shrink["Minimum"].Update shrink["Maximum"].Update shrink["Mean"].Update shrink["Median"].Update imager["Minimum"].SetViewport(0, 0, .5, .33) imager["Maximum"].SetViewport(0, .33, .5, .667) imager["Mean"].SetViewport(.5, 0, 1, .33) imager["Median"].SetViewport(.5, .33, 1, .667) imager["NoOp"].SetViewport(0, .667, 1, 1) renWin.SetSize(256, 384) # render and interact with data iRen = vtk.vtkRenderWindowInteractor() iRen.SetRenderWindow(renWin) renWin.Render() img_file = "TestAllShrinks.png" vtk.test.Testing.compareImage( iRen.GetRenderWindow(), vtk.test.Testing.getAbsImagePath(img_file), threshold=25) vtk.test.Testing.interact()
def SetUp(self): """ Set up cursor3D """ def OnClosing(): self.root.quit() def ViewerDown(tkvw): viewer = tkvw.GetImageViewer() ViewerSetZSlice(tkvw, viewer.GetZSlice() - 1) def ViewerUp(tkvw): viewer = tkvw.GetImageViewer() ViewerSetZSlice(tkvw, viewer.GetZSlice() + 1) def ViewerSetZSlice(tkvw, z): viewer = tkvw.GetImageViewer() viewer.SetZSlice(z) txt = "slice: " + str(z) sliceLabel.configure(text=txt) tkvw.Render() def SetCursorFromViewer(event): x = int(event.x) y = int(event.y) # We have to flip y axis because tk uses upper right origin. self.root.update_idletasks() height = int(self.tkvw.configure()["height"][4]) y = height - y z = self.tkvw.GetImageViewer().GetZSlice() SetCursor(x / IMAGE_MAG_X, y / IMAGE_MAG_Y, z / IMAGE_MAG_Z) def SetCursor(x, y, z): CURSOR_X = x CURSOR_Y = y CURSOR_Z = z axes.SetOrigin(CURSOR_X, CURSOR_Y, CURSOR_Z) imageCursor.SetCursorPosition(CURSOR_X * IMAGE_MAG_X, CURSOR_Y * IMAGE_MAG_Y, CURSOR_Z * IMAGE_MAG_Z) self.viewer.Render() self.tkrw.Render() # Pipeline stuff. reader = vtk.vtkSLCReader() reader.SetFileName(VTK_DATA_ROOT + "/Data/neghip.slc") # Cursor stuff magnify = vtk.vtkImageMagnify() magnify.SetInputConnection(reader.GetOutputPort()) magnify.SetMagnificationFactors(IMAGE_MAG_X, IMAGE_MAG_Y, IMAGE_MAG_Z) imageCursor = vtk.vtkImageCursor3D() imageCursor.SetInputConnection(magnify.GetOutputPort()) imageCursor.SetCursorPosition(CURSOR_X * IMAGE_MAG_X, CURSOR_Y * IMAGE_MAG_Y, CURSOR_Z * IMAGE_MAG_Z) imageCursor.SetCursorValue(255) imageCursor.SetCursorRadius(50 * IMAGE_MAG_X) axes = vtk.vtkAxes() axes.SymmetricOn() axes.SetOrigin(CURSOR_X, CURSOR_Y, CURSOR_Z) axes.SetScaleFactor(50.0) axes_mapper = vtk.vtkPolyDataMapper() axes_mapper.SetInputConnection(axes.GetOutputPort()) axesActor = vtk.vtkActor() axesActor.SetMapper(axes_mapper) axesActor.GetProperty().SetAmbient(0.5) # Image viewer stuff. viewer = vtk.vtkImageViewer() viewer.SetInputConnection(imageCursor.GetOutputPort()) viewer.SetZSlice(CURSOR_Z * IMAGE_MAG_Z) viewer.SetColorWindow(256) viewer.SetColorLevel(128) # Create transfer functions for opacity and color. opacity_transfer_function = vtk.vtkPiecewiseFunction() opacity_transfer_function.AddPoint(20, 0.0) opacity_transfer_function.AddPoint(255, 0.2) color_transfer_function = vtk.vtkColorTransferFunction() color_transfer_function.AddRGBPoint(0, 0, 0, 0) color_transfer_function.AddRGBPoint(64, 1, 0, 0) color_transfer_function.AddRGBPoint(128, 0, 0, 1) color_transfer_function.AddRGBPoint(192, 0, 1, 0) color_transfer_function.AddRGBPoint(255, 0, 0.2, 0) # Create properties, mappers, volume actors, and ray cast function. volume_property = vtk.vtkVolumeProperty() volume_property.SetColor(color_transfer_function) # volume_property.SetColor(color_transfer_function[0], # color_transfer_function[1], # color_transfer_function[2]) volume_property.SetScalarOpacity(opacity_transfer_function) volume_mapper = vtk.vtkFixedPointVolumeRayCastMapper() volume_mapper.SetInputConnection(reader.GetOutputPort()) volume = vtk.vtkVolume() volume.SetMapper(volume_mapper) volume.SetProperty(volume_property) # Create outline. outline = vtk.vtkOutlineFilter() outline.SetInputConnection(reader.GetOutputPort()) outline_mapper = vtk.vtkPolyDataMapper() outline_mapper.SetInputConnection(outline.GetOutputPort()) outlineActor = vtk.vtkActor() outlineActor.SetMapper(outline_mapper) outlineActor.GetProperty().SetColor(1, 1, 1) # Create the renderer. ren = vtk.vtkRenderer() ren.AddActor(axesActor) ren.AddVolume(volume) ren.SetBackground(0.1, 0.2, 0.4) renWin = vtk.vtkRenderWindow() renWin.AddRenderer(ren) renWin.SetSize(256, 256) # Create the GUI: two renderer widgets and a quit button. self.root = tkinter.Tk() self.root.title("cursor3D") # Define what to do when the user explicitly closes a window. self.root.protocol("WM_DELETE_WINDOW", OnClosing) # Help label, frame and quit button helpLabel = tkinter.Label(self.root, text="MiddleMouse (or shift-LeftMouse) in image viewer to place cursor") displayFrame = tkinter.Frame(self.root) quitButton = tkinter.Button(self.root, text="Quit", command=OnClosing) # Pack the GUI. helpLabel.pack() displayFrame.pack(fill=BOTH, expand=TRUE) quitButton.pack(fill=X) # Create the viewer widget. viewerFrame = tkinter.Frame(displayFrame) viewerFrame.pack(padx=3, pady=3, side=LEFT, anchor=N, fill=BOTH, expand=FALSE) self.tkvw = vtkTkImageViewerWidget(viewerFrame, iv=viewer, width=264, height=264) viewerControls = tkinter.Frame(viewerFrame) viewerControls.pack(side=BOTTOM, anchor=S, fill=BOTH, expand=TRUE) self.tkvw.pack(side=TOP, anchor=N, fill=BOTH, expand=FALSE) downButton = tkinter.Button(viewerControls, text="Down", command=[ViewerDown, self.tkvw]) upButton = tkinter.Button(viewerControls, text="Up", command=[ViewerUp, self.tkvw]) sliceLabel = tkinter.Label(viewerControls, text="slice: " + str(CURSOR_Z * IMAGE_MAG_Z)) downButton.pack(side=LEFT, expand=TRUE, fill=BOTH) upButton.pack(side=LEFT, expand=TRUE, fill=BOTH) sliceLabel.pack(side=LEFT, expand=TRUE, fill=BOTH) # Create the render widget renderFrame = tkinter.Frame(displayFrame) renderFrame.pack(padx=3, pady=3, side=LEFT, anchor=N, fill=BOTH, expand=TRUE) self.tkrw = vtkTkRenderWidget(renderFrame, rw=renWin, width=264, height=264) self.tkrw.pack(side=TOP, anchor=N, fill=BOTH, expand=TRUE) # Bindings self.tkvw.BindTkImageViewer() self.tkrw.BindTkRenderWidget() # Lets add an extra binding of the middle button in the image viewer # to set the cursor location. self.tkvw.bind("<Button-2>", SetCursorFromViewer) self.tkvw.bind("<Shift-Button-1>", SetCursorFromViewer) # Associate the functions with the buttons and label. # downButton.config(command=partial(ViewerDown, self.tkvw)) upButton.config(command=partial(ViewerUp, self.tkvw))