def avgProjectionsVtk(self, filenames , extent): '''Returns the average of the input images Input is passed as filenames pointing to 2D TIFF Output is a vtkImageData gives the same result as avgProjections within machine precision. ''' num = len(filenames) readers = [vtk.vtkTIFFReader() for i in range(num)] scalers = [vtk.vtkImageShiftScale() for i in range(num)] vois = [vtk.vtkExtractVOI() for i in range(num)] avger = vtk.vtkImageWeightedSum() counter = 0 for reader, voi, scaler, filename in zip(readers, vois , scalers ,filenames): reader.SetFileName(filename) reader.Update() print ("reading {0}".format(filename)) voi.SetInputData(reader.GetOutput()) voi.SetVOI(extent) voi.Update() print ("extracting VOI") scaler.SetInputData(voi.GetOutput()) scaler.SetOutputScalarTypeToDouble() scaler.SetScale(1) scaler.SetShift(0) scaler.Update() avger.AddInputData(scaler.GetOutput()) avger.SetWeight(counter , 1/float(num)) counter = counter + 1 print ("adding input connection {0}".format(counter)) avger.Update() return avger.GetOutput()
def onApply(self): inputVolume = self.inputSelector.currentNode() outputVolume = self.outputSelector.currentNode() if not (inputVolume): qt.QMessageBox.critical(slicer.util.mainWindow(), 'Averaging', 'Input volumes are required') return outVolumeNode = self.outputSelector.currentNode() volumesLogic = slicer.modules.volumes.logic() # newNode = volumesLogic.CloneVolume(slicer.mrmlScene, sourceVolumeNode, 'average volume') # create output volume by cloning the selected reference volume # volumesLogic = slicer.modules.volumes.logic() newNode = volumesLogic.CloneVolume(self.inputSelector.currentNode(), "average volume") # vtk function to average the images imgsum = vtk.vtkImageWeightedSum() imgsum.NormalizeByWeightOn() # add all of the input image data for (i, n) in enumerate(self.inputSelector.checkedNodes()): print("adding input image: {0}".format(n.GetName())) cast = vtk.vtkImageCast() cast.SetOutputScalarTypeToFloat() cast.AddInputConnection(n.GetImageDataConnection()) imgsum.AddInputConnection(cast.GetOutputPort()) imgsum.SetWeight(i, 1.) # run the filter and set the result to the output image imgsum.Update() newNode.SetAndObserveImageData(imgsum.GetOutput())
def onApply(self): inputVolume = self.inputSelector.currentNode() outputVolume = self.outputSelector.currentNode() if not (inputVolume): qt.QMessageBox.critical( slicer.util.mainWindow(), 'Averaging', 'Input volumes are required') return outVolumeNode = self.outputSelector.currentNode() volumesLogic = slicer.modules.volumes.logic() # newNode = volumesLogic.CloneVolume(slicer.mrmlScene, sourceVolumeNode, 'average volume') # create output volume by cloning the selected reference volume # volumesLogic = slicer.modules.volumes.logic() newNode = volumesLogic.CloneVolume(self.inputSelector.currentNode(), "average volume") # vtk function to average the images imgsum = vtk.vtkImageWeightedSum() imgsum.NormalizeByWeightOn() # add all of the input image data for (i,n) in enumerate(self.inputSelector.checkedNodes()): print("adding input image: {0}".format(n.GetName())) cast = vtk.vtkImageCast() cast.SetOutputScalarTypeToFloat() cast.AddInputConnection(n.GetImageDataConnection()) imgsum.AddInputConnection(cast.GetOutputPort()) imgsum.SetWeight(i, 1.) # run the filter and set the result to the output image imgsum.Update() newNode.SetAndObserveImageData(imgsum.GetOutput())
def __init__(self, module_manager): SimpleVTKClassModuleBase.__init__( self, module_manager, vtk.vtkImageWeightedSum(), 'Processing.', ('vtkImageData',), ('vtkImageData',), replaceDoc=True, inputFunctions=None, outputFunctions=None)
def SumVTKImages(ImageSets, Weights): NumOfImages = len(ImageSets) SumFilter = vtk.vtkImageWeightedSum() for x in range(0, NumOfImages, 1): SumFilter.AddInputConnection(ImageSets[x]) SumFilter.SetWeight(x, Weights[x]) SumFilter.Update() # Return summed Image as vtkImageData return SumFilter.GetOutput()
def CombineGaussians(bounds, coords, weights, sizes): """Forms a linear combination of Gaussians""" assert len(bounds) == 6, 'Invalid bounds' assert len(coords) == len(weights) == len(sizes), 'Different numbers of coordinates and weights' combo = vtk.vtkImageWeightedSum() for i in range(len(coords)): primitive = vtk.vtkImageGaussianSource() primitive.SetWholeExtent(*bounds) primitive.SetCenter(coords[i]) primitive.SetStandardDeviation(sizes[i]) primitive.SetMaximum(weights[i]) #WRONG normalization combo.AddInputConnection(primitive.GetOutputPort()) combo.SetWeight(i, 1.0) return combo
def average_all_images(image_datas, fname='average_image.raw'): # how cool is this, this class was from my masters' thesis. # though the new vtk coding is not recognizable anymore... sum = vtk.vtkImageWeightedSum() weights = vtk.vtkDoubleArray() for image in image_datas: weights.InsertNextTuple1(1.0) sum.AddInput(image) sum.SetWeights(weights) sum.NormalizeByWeightOn() sum.Update() writer = vtk.vtkImageWriter() writer.SetInput(sum.GetOutput()) writer.SetFileName(fname) writer.SetFileDimensionality(3) writer.Write() return(sum.GetOutput())
def CombineGaussians(bounds, coords, weights, sizes): """Forms a linear combination of Gaussians""" assert len(bounds) == 6, 'Invalid bounds' assert len(coords) == len(weights) == len( sizes), 'Different numbers of coordinates and weights' combo = vtk.vtkImageWeightedSum() for i in range(len(coords)): primitive = vtk.vtkImageGaussianSource() primitive.SetWholeExtent(*bounds) primitive.SetCenter(coords[i]) primitive.SetStandardDeviation(sizes[i]) primitive.SetMaximum(weights[i]) #WRONG normalization combo.AddInputConnection(primitive.GetOutputPort()) combo.SetWeight(i, 1.0) return combo
def runConversionMethodAverage(self, inputVolumeNode, outputVolumeNode): ijkToRAS = vtk.vtkMatrix4x4() inputVolumeNode.GetIJKToRASMatrix(ijkToRAS) outputVolumeNode.SetIJKToRASMatrix(ijkToRAS) numberOfComponents = inputVolumeNode.GetImageData( ).GetNumberOfScalarComponents() weightedSum = vtk.vtkImageWeightedSum() weights = vtk.vtkDoubleArray() weights.SetNumberOfValues(numberOfComponents) # TODO: Average could be extended to let the user choose the weights of the components. evenWeight = 1.0 / numberOfComponents logging.debug("ImageWeightedSum: weight value for all components: %s" % evenWeight) for comp in range(numberOfComponents): weights.SetValue(comp, evenWeight) weightedSum.SetWeights(weights) for comp in range(numberOfComponents): extract = vtk.vtkImageExtractComponents() extract.SetInputConnection( inputVolumeNode.GetImageDataConnection()) extract.SetComponents(comp) extract.Update() # Cast component to Double compToDouble = vtk.vtkImageCast() compToDouble.SetInputConnection(0, extract.GetOutputPort()) compToDouble.SetOutputScalarTypeToDouble() # Add to the weighted sum weightedSum.AddInputConnection(compToDouble.GetOutputPort()) logging.debug("TotalInputConnections in weightedSum: %s" % weightedSum.GetTotalNumberOfInputConnections()) weightedSum.SetNormalizeByWeight( False) # It is already normalized in the evenWeight case. weightedSum.Update() # Cast back to the type of the InputVolume, for consistency with other ConversionMethods castBack = vtk.vtkImageCast() castBack.SetInputConnection(0, weightedSum.GetOutputPort()) castBack.SetOutputScalarType( inputVolumeNode.GetImageData().GetScalarType()) outputVolumeNode.SetImageDataConnection(castBack.GetOutputPort())
def runConversionMethodAverage(self, inputVolumeNode, outputVolumeNode): ijkToRAS = vtk.vtkMatrix4x4() inputVolumeNode.GetIJKToRASMatrix(ijkToRAS) outputVolumeNode.SetIJKToRASMatrix(ijkToRAS) numberOfComponents = inputVolumeNode.GetImageData().GetNumberOfScalarComponents() weightedSum = vtk.vtkImageWeightedSum() weights = vtk.vtkDoubleArray() weights.SetNumberOfValues(numberOfComponents) # TODO: Average could be extended to let the user choose the weights of the components. evenWeight = 1.0/numberOfComponents logging.debug("ImageWeightedSum: weight value for all components: %s" % evenWeight) for comp in range(numberOfComponents): weights.SetValue(comp, evenWeight) weightedSum.SetWeights(weights) for comp in range(numberOfComponents): extract = vtk.vtkImageExtractComponents() extract.SetInputConnection(inputVolumeNode.GetImageDataConnection()) extract.SetComponents(comp) extract.Update() # Cast component to Double compToDouble = vtk.vtkImageCast() compToDouble.SetInputConnection(0, extract.GetOutputPort()) compToDouble.SetOutputScalarTypeToDouble() # Add to the weighted sum weightedSum.AddInputConnection(compToDouble.GetOutputPort()) logging.debug("TotalInputConnections in weightedSum: %s" % weightedSum.GetTotalNumberOfInputConnections()) weightedSum.SetNormalizeByWeight(False) # It is already normalized in the evenWeight case. weightedSum.Update() # Cast back to the type of the InputVolume, for consistency with other ConversionMethods castBack = vtk.vtkImageCast() castBack.SetInputConnection(0, weightedSum.GetOutputPort()) castBack.SetOutputScalarType(inputVolumeNode.GetImageData().GetScalarType()) outputVolumeNode.SetImageDataConnection(castBack.GetOutputPort())
def main(): colors = vtk.vtkNamedColors() colors.SetColor('leftBkg', [0.6, 0.5, 0.4, 1.0]) colors.SetColor('centreBkg', [0.1, 0.5, 0.4, 1.0]) colors.SetColor('rightBkg', [0.4, 0.5, 0.6, 1.0]) # Create image 1 source1 = vtk.vtkImageMandelbrotSource() source1.SetWholeExtent(0, 255, 0, 255, 0, 0) source1.Update() source1Double = vtk.vtkImageCast() source1Double.SetInputConnection(0, source1.GetOutputPort()) source1Double.SetOutputScalarTypeToDouble() # Create image 2 source2 = vtk.vtkImageSinusoidSource() source2.SetWholeExtent(0, 255, 0, 255, 0, 0) source2.Update() # Do the sum sumFilter = vtk.vtkImageWeightedSum() sumFilter.SetWeight(0, 0.8) sumFilter.SetWeight(1, 0.2) sumFilter.AddInputConnection(source1Double.GetOutputPort()) sumFilter.AddInputConnection(source2.GetOutputPort()) sumFilter.Update() # Display the images source1CastFilter = vtk.vtkImageCast() source1CastFilter.SetInputConnection(source1.GetOutputPort()) source1CastFilter.SetOutputScalarTypeToUnsignedChar() source1CastFilter.Update() source2CastFilter = vtk.vtkImageCast() source2CastFilter.SetInputConnection(source2.GetOutputPort()) source2CastFilter.SetOutputScalarTypeToUnsignedChar() source2CastFilter.Update() summedCastFilter = vtk.vtkImageCast() summedCastFilter.SetInputConnection(sumFilter.GetOutputPort()) summedCastFilter.SetOutputScalarTypeToUnsignedChar() summedCastFilter.Update() # Create actors source1Actor = vtk.vtkImageActor() source1Actor.GetMapper().SetInputConnection( source1CastFilter.GetOutputPort()) source2Actor = vtk.vtkImageActor() source2Actor.GetMapper().SetInputConnection( source2CastFilter.GetOutputPort()) summedActor = vtk.vtkImageActor() summedActor.GetMapper().SetInputConnection( summedCastFilter.GetOutputPort()) # There will be one render window renderWindow = vtk.vtkRenderWindow() renderWindow.SetSize(600, 300) # And one interactor interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) # Define viewport ranges # (xmin, ymin, xmax, ymax) leftViewport = [0.0, 0.0, 0.33, 1.0] centerViewport = [0.33, 0.0, .66, 1.0] rightViewport = [0.66, 0.0, 1.0, 1.0] # Setup renderers leftRenderer = vtk.vtkRenderer() renderWindow.AddRenderer(leftRenderer) leftRenderer.SetViewport(leftViewport) leftRenderer.SetBackground(colors.GetColor3d('leftBkg')) centerRenderer = vtk.vtkRenderer() renderWindow.AddRenderer(centerRenderer) centerRenderer.SetViewport(centerViewport) centerRenderer.SetBackground(colors.GetColor3d('centreBkg')) rightRenderer = vtk.vtkRenderer() renderWindow.AddRenderer(rightRenderer) rightRenderer.SetViewport(rightViewport) rightRenderer.SetBackground(colors.GetColor3d('rightBkg')) leftRenderer.AddActor(source1Actor) centerRenderer.AddActor(source2Actor) rightRenderer.AddActor(summedActor) leftRenderer.ResetCamera() centerRenderer.ResetCamera() rightRenderer.ResetCamera() renderWindow.Render() interactor.Start()
th.SetInputConnection(mag.GetOutputPort()) th.SetReplaceIn(1) th.SetReplaceOut(1) th.ThresholdBetween(-1000, 1000) th.SetOutValue(0) th.SetInValue(2000) cast = vtk.vtkImageCast() cast.SetInputConnection(mag.GetOutputPort()) cast.SetOutputScalarTypeToFloat() cast2 = vtk.vtkImageCast() cast2.SetInputConnection(th.GetOutputPort()) cast2.SetOutputScalarTypeToFloat() sum = vtk.vtkImageWeightedSum() sum.AddInputConnection(cast.GetOutputPort()) sum.AddInputConnection(cast2.GetOutputPort()) sum.SetWeight(0, 10) sum.SetWeight(1, 4) viewer = vtk.vtkImageViewer() viewer.SetInputConnection(sum.GetOutputPort()) viewer.SetZSlice(22) viewer.SetColorWindow(1819) viewer.SetColorLevel(939) sum.SetWeight(0, 1) # make interface viewer.SetSize(256, 256) viewer.Render()
# Create image 1 source1 = vtk.vtkImageMandelbrotSource() source1.SetWholeExtent(0, 255, 0, 255, 0, 0) source1.Update() source1Double = vtk.vtkImageCast() source1Double.SetInputConnection(0, source1.GetOutputPort()) source1Double.SetOutputScalarTypeToDouble() # Create image 2 source2 = vtk.vtkImageSinusoidSource() source2.SetWholeExtent(0, 255, 0, 255, 0, 0) source2.Update() # Do the sum sumFilter = vtk.vtkImageWeightedSum() sumFilter.SetWeight(0, 0.8) sumFilter.SetWeight(1, 0.2) sumFilter.AddInputConnection(source1Double.GetOutputPort()) sumFilter.AddInputConnection(source2.GetOutputPort()) sumFilter.Update() # Display the images source1CastFilter = vtk.vtkImageCast() source1CastFilter.SetInputConnection(source1.GetOutputPort()) source1CastFilter.SetOutputScalarTypeToUnsignedChar() source1CastFilter.Update() source2CastFilter = vtk.vtkImageCast() source2CastFilter.SetInputConnection(source2.GetOutputPort()) source2CastFilter.SetOutputScalarTypeToUnsignedChar()