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()
示例#2
0
    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())
示例#3
0
  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())
示例#4
0
 def __init__(self, module_manager):
     SimpleVTKClassModuleBase.__init__(
         self, module_manager,
         vtk.vtkImageWeightedSum(), 'Processing.',
         ('vtkImageData',), ('vtkImageData',),
         replaceDoc=True,
         inputFunctions=None, outputFunctions=None)
示例#5
0
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 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()
示例#7
0
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())
示例#9
0
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())
示例#11
0
  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())
示例#12
0
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()
示例#13
0
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()
示例#14
0
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()
示例#15
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()
示例#16
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()