def __init__(self, module_manager):
     SimpleVTKClassModuleBase.__init__(
         self, module_manager,
         vtk.vtkImageDilateErode3D(), 'Processing.',
         ('vtkImageData',), ('vtkImageData',),
         replaceDoc=True,
         inputFunctions=None, outputFunctions=None)
Example #2
0
def erode_and_dilate(image_stencil, inval, outval, kernel_size):

    erode = vtk.vtkImageDilateErode3D()
    if vtk.VTK_MAJOR_VERSION <= 5:
        erode.SetInput(image_stencil.GetOutput())
    else:
        erode.SetInputConnection(image_stencil.GetOutputPort())

    erode.SetErodeValue(inval)
    erode.SetDilateValue(outval)
    erode.SetKernelSize(kernel_size, kernel_size, kernel_size)
    erode.ReleaseDataFlagOff()
    erode.Update()

    dilate = vtk.vtkImageDilateErode3D()
    if vtk.VTK_MAJOR_VERSION <= 5:
        dilate.SetInput(erode.GetOutput())
    else:
        dilate.SetInputConnection(erode.GetOutputPort())

    dilate.SetDilateValue(inval)
    dilate.SetErodeValue(outval)
    dilate.SetKernelSize(kernel_size, kernel_size, kernel_size)
    dilate.ReleaseDataFlagOff()
    dilate.Update()

    return dilate
  def runMasking(self, ijkPoints, seedLabelmap, outputLabelmap):
    kernelSizePixel = self.getKernelSizePixel()

    self.floodFillingFilterIsland = vtk.vtkImageThresholdConnectivity()
    self.floodFillingFilterIsland.SetInputData(seedLabelmap)
    self.floodFillingFilterIsland.SetInValue(BACKGROUND_VALUE)
    self.floodFillingFilterIsland.ReplaceInOn()
    self.floodFillingFilterIsland.ReplaceOutOff()
    self.floodFillingFilterIsland.ThresholdBetween(LABEL_VALUE, LABEL_VALUE)
    self.floodFillingFilterIsland.SetSeedPoints(ijkPoints)

    self.dilate = vtk.vtkImageDilateErode3D()
    self.dilate.SetInputConnection(self.floodFillingFilterIsland.GetOutputPort())
    self.dilate.SetDilateValue(LABEL_VALUE)
    self.dilate.SetErodeValue(BACKGROUND_VALUE)
    self.dilate.SetKernelSize(
      2*kernelSizePixel[0]-1,
      2*kernelSizePixel[1]-1,
      2*kernelSizePixel[2]-1)
    self.dilate.Update()

    self.imageMask = vtk.vtkImageMask()
    self.imageMask.SetInputConnection(self.thresh.GetOutputPort())
    self.imageMask.SetMaskedOutputValue(BACKGROUND_VALUE)
    self.imageMask.NotMaskOn()
    self.imageMask.SetMaskInputData(self.dilate.GetOutput())

    self.floodFillingFilter = vtk.vtkImageThresholdConnectivity()
    self.floodFillingFilter.SetInputConnection(self.imageMask.GetOutputPort())
    self.floodFillingFilter.SetInValue(LABEL_VALUE)
    self.floodFillingFilter.SetOutValue(BACKGROUND_VALUE)
    self.floodFillingFilter.ThresholdBetween(LABEL_VALUE, LABEL_VALUE)
    self.floodFillingFilter.SetSeedPoints(ijkPoints)
    self.floodFillingFilter.Update()
    outputLabelmap.ShallowCopy(self.floodFillingFilter.GetOutput())
    def SeedInitialize(self):

        self.PrintLog('Seed initialization.')

        queryString = 'Please place seeds'
        seeds = self.SeedInput(queryString,0)
        
        self.InitialLevelSets = vtk.vtkImageData()
        self.InitialLevelSets.DeepCopy(self.Image)
        self.InitialLevelSets.Update()

        levelSetsInputScalars = self.InitialLevelSets.GetPointData().GetScalars()
        levelSetsInputScalars.FillComponent(0,1.0)

        dimensions = self.Image.GetDimensions()
        for i in range(seeds.GetNumberOfPoints()):
            id = self.Image.FindPoint(seeds.GetPoint(i))
            levelSetsInputScalars.SetComponent(id,0,-1.0)

        dilateErode = vtk.vtkImageDilateErode3D()
        dilateErode.SetInput(self.InitialLevelSets)
        dilateErode.SetDilateValue(-1.0)
        dilateErode.SetErodeValue(1.0)
        dilateErode.SetKernelSize(3,3,3)
        dilateErode.Update()

        self.InitialLevelSets.DeepCopy(dilateErode.GetOutput())

        self.IsoSurfaceValue = 0.0
    def SeedInitialize(self):

        self.PrintLog('Seed initialization.')

        queryString = 'Please place seeds'
        seeds = self.SeedInput(queryString,0)
        
        self.InitialLevelSets = vtk.vtkImageData()
        self.InitialLevelSets.DeepCopy(self.Image)
        self.InitialLevelSets.Update()

        levelSetsInputScalars = self.InitialLevelSets.GetPointData().GetScalars()
        levelSetsInputScalars.FillComponent(0,1.0)

        dimensions = self.Image.GetDimensions()
        for i in range(seeds.GetNumberOfPoints()):
            id = self.Image.FindPoint(seeds.GetPoint(i))
            levelSetsInputScalars.SetComponent(id,0,-1.0)

        dilateErode = vtk.vtkImageDilateErode3D()
        dilateErode.SetInput(self.InitialLevelSets)
        dilateErode.SetDilateValue(-1.0)
        dilateErode.SetErodeValue(1.0)
        dilateErode.SetKernelSize(3,3,3)
        dilateErode.Update()

        self.InitialLevelSets.DeepCopy(dilateErode.GetOutput())

        self.IsoSurfaceValue = 0.0
Example #6
0
def getImageMask(inputVtkImageData):
    """
    @type  inputVtkImageData: C{vtkImageData}
    @param inputVtkImageData: Image data to be normalized
    
    @rtype: C{vtkImageData}
    @return: Normalized (0-1) image data
    """
    t = vtk.vtkImageThreshold()
    #t.ThresholdBetween(1,255)
    t.ThresholdByUpper(114)
    t.ReplaceInOn()
    t.SetReplaceIn(0)
    t.ReplaceOutOn()
    t.SetReplaceOut(255)
    t.SetInput(inputVtkImageData)
        
    norm = vtk.vtkImageNormalize()
    norm.SetInput(t.GetOutput())
    #norm.SetInput(inputVtkImageData)
    norm.Update()

    d = vtk.vtkImageDilateErode3D()
    d.SetKernelSize(4,4,4)
    d.SetDilateValue(1)
    d.SetErodeValue(0)
    d.SetInput(norm.GetOutput())
    return d.GetOutput()
Example #7
0
def open_image(image, radius):
    openFilter = vtk.vtkImageDilateErode3D()
    openFilter.SetDilateValue(255)
    openFilter.SetErodeValue(0)
    openFilter.SetKernelSize(radius, radius, radius)
    openFilter.SetInputData(image)
    openFilter.Update()
    return openFilter.GetOutput()
Example #8
0
def createEyelidSegment(segmentation_node, ref_img_path,
                        out_segmentation_path):
    if segmentation_node is None or not ref_img_path.exists():
        print('Could not find: {}'.format(ref_img_path))
        return

    current_segmentation = segmentation_node.GetSegmentation()
    number_of_segments = current_segmentation.GetNumberOfSegments()
    if number_of_segments > 2:
        # Most probably has an eyelid already, return
        return

    # Export segment as vtkImageData (via temporary labelmap volume node)
    image_node = slicer.util.loadVolume(str(ref_img_path),
                                        {'singleFile': True})
    segmentIds = vtk.vtkStringArray()
    current_segmentation.GetSegmentIDs(segmentIds)
    labelmapVolumeNode = slicer.mrmlScene.AddNewNodeByClass(
        'vtkMRMLLabelMapVolumeNode')
    slicer.modules.segmentations.logic().ExportSegmentsToLabelmapNode(
        segmentation_node, segmentIds, labelmapVolumeNode, image_node,
        slicer.vtkSegmentation.EXTENT_REFERENCE_GEOMETRY)
    # Manipulate the mask values to add the third label
    mask = slicer.util.arrayFromVolume(labelmapVolumeNode)
    newmask = mask.copy()
    newmask[newmask > 0] = mask.max() + 1
    clone = slicer.modules.volumes.logic().CloneVolume(labelmapVolumeNode,
                                                       "CloneLabelMap")
    slicer.util.updateVolumeFromArray(clone, newmask)
    segmentImageData = clone.GetImageData()
    kernelSize = [20, 200, 1]
    erodeDilate = vtk.vtkImageDilateErode3D()
    erodeDilate.SetInputData(segmentImageData)
    erodeDilate.SetDilateValue(mask.max() + 1)
    erodeDilate.SetErodeValue(0)
    erodeDilate.SetKernelSize(*kernelSize)
    erodeDilate.Update()
    segmentImageData.DeepCopy(erodeDilate.GetOutput())
    newmask = slicer.util.arrayFromVolume(clone)
    # Combine both the masks together to add the new labelmap.
    newmask[mask > 0] = 0
    newmask = newmask + mask
    slicer.util.updateVolumeFromArray(clone, newmask)
    segmentIds.InsertNextValue('EyeLid')
    segmentation_node.GetSegmentation().AddEmptySegment('EyeLid')
    slicer.modules.segmentations.logic().ImportLabelmapToSegmentationNode(
        clone, segmentation_node, segmentIds)
    setSegmentationLabelNames(segmentation_node)

    # Save this label to image
    slicer.util.saveNode(clone, str(out_segmentation_path))
    slicer.mrmlScene.RemoveNode(
        labelmapVolumeNode.GetDisplayNode().GetColorNode())
    slicer.mrmlScene.RemoveNode(labelmapVolumeNode)
    slicer.mrmlScene.RemoveNode(clone.GetDisplayNode().GetColorNode())
    slicer.mrmlScene.RemoveNode(clone)
    slicer.mrmlScene.RemoveNode(image_node)
Example #9
0
 def dilateMask(label):
   imagedata = label.GetImageData()
   dilateErode = vtk.vtkImageDilateErode3D()
   dilateErode.SetInputData(imagedata)
   dilateErode.SetDilateValue(1.0)
   dilateErode.SetErodeValue(0.0)
   dilateErode.SetKernelSize(12, 12, 1)
   dilateErode.Update()
   label.SetAndObserveImageData(dilateErode.GetOutput())
Example #10
0
 def __init__(self, module_manager):
     SimpleVTKClassModuleBase.__init__(self,
                                       module_manager,
                                       vtk.vtkImageDilateErode3D(),
                                       'Processing.', ('vtkImageData', ),
                                       ('vtkImageData', ),
                                       replaceDoc=True,
                                       inputFunctions=None,
                                       outputFunctions=None)
Example #11
0
def locate_region_boundary_ids(im, label_id1, label_id2, size=1., bg_id=None):
    """
    Locate the boundary coordinates between two regions with different labels
    
    Args:
        im: vtkImage of the label map
        label_id1: class id of 1st region
        label_id2: class id of 2nd region
        bg_id: class id of background
    Returns
        ids: ids of the boundary points
    """
    new_Im = vtk.vtkImageData()
    new_Im.DeepCopy(im)
    if bg_id is not None:
        dilateErode = vtk.vtkImageDilateErode3D()
        dilateErode.SetInputData(new_Im)
        dilateErode.SetDilateValue(label_id1)
        dilateErode.SetErodeValue(bg_id)
        dilateErode.SetKernelSize(3, 3, 3)
        dilateErode.Update()
        new_Im = dilateErode.GetOutput()

    dilateErode = vtk.vtkImageDilateErode3D()
    dilateErode.SetInputData(new_Im)
    dilateErode.SetDilateValue(label_id1)
    dilateErode.SetErodeValue(label_id2)

    #kernel_size = np.rint(size/np.array(im.GetSpacing())).astype(int)
    kernel_size = (np.ones(3) * size).astype(int)
    dilateErode.SetKernelSize(*kernel_size)
    dilateErode.Update()
    newIm = dilateErode.GetOutput()

    from vtk.util.numpy_support import vtk_to_numpy, numpy_to_vtk

    x, y, z = newIm.GetDimensions()
    pyIm_new = vtk_to_numpy(newIm.GetPointData().GetScalars()).reshape(
        z, y, x).transpose(2, 1, 0)
    pyIm = vtk_to_numpy(im.GetPointData().GetScalars()).reshape(z, y,
                                                                x).transpose(
                                                                    2, 1, 0)
    ids = np.array(np.where(pyIm_new - pyIm != 0)).transpose()
    return ids
Example #12
0
    def applyDilateErode(self, imgData, dVal, eVal, kernel=[3, 3, 3]):

        deImg = vtk.vtkImageDilateErode3D()
        deImg.SetInputData(imgData.GetOutput())
        deImg.SetDilateValue(dVal)
        deImg.SetErodeValue(eVal)
        deImg.SetKernelSize(kernel[0], kernel[1], kernel[2])
        deImg.Update()

        return deImg
Example #13
0
    def SeedInitialize(self):

        self.PrintLog('Seed initialization.')

        seedIds = vtk.vtkIdList()
        if self.Interactive:
            queryString = 'Please place seeds'
            seeds = self.SeedInput(queryString, 0)
            for i in range(seeds.GetNumberOfPoints()):
                seedIds.InsertNextId(self.Image.FindPoint(seeds.GetPoint(i)))
        else:
            for i in range(len(self.SourcePoints) / 3):
                seedIds.InsertNextId(
                    self.Image.ComputePointId([
                        self.SourcePoints[3 * i + 0],
                        self.SourcePoints[3 * i + 1],
                        self.SourcePoints[3 * i + 2]
                    ]))
            for i in range(len(self.TargetPoints) / 3):
                seedIds.InsertNextId(
                    self.Image.ComputePointId([
                        self.TargetPoints[3 * i + 0],
                        self.TargetPoints[3 * i + 1],
                        self.TargetPoints[3 * i + 2]
                    ]))

        self.InitialLevelSets = vtk.vtkImageData()
        self.InitialLevelSets.DeepCopy(self.Image)
        self.InitialLevelSets.Update()

        levelSetsInputScalars = self.InitialLevelSets.GetPointData(
        ).GetScalars()
        levelSetsInputScalars.FillComponent(0, 1.0)

        dimensions = self.Image.GetDimensions()
        for i in range(seedIds.GetNumberOfIds()):
            levelSetsInputScalars.SetComponent(seedIds.GetId(i), 0, -1.0)

        dilateErode = vtk.vtkImageDilateErode3D()
        dilateErode.SetInput(self.InitialLevelSets)
        dilateErode.SetDilateValue(-1.0)
        dilateErode.SetErodeValue(1.0)
        dilateErode.SetKernelSize(3, 3, 3)
        dilateErode.Update()

        self.InitialLevelSets.DeepCopy(dilateErode.GetOutput())

        self.IsoSurfaceValue = 0.0
 def dilateMask(label, dilateValue=1.0, erodeValue=0.0, marginSize=5.0):
     imagedata = label.GetImageData()
     dilateErode = vtk.vtkImageDilateErode3D()
     dilateErode.SetInputData(imagedata)
     dilateErode.SetDilateValue(dilateValue)
     dilateErode.SetErodeValue(erodeValue)
     spacing = label.GetSpacing()
     kernelSizePixel = [
         int(
             round((abs(marginSize) / spacing[componentIndex] + 1) / 2) *
             2 - 1) for componentIndex in range(3)
     ]
     dilateErode.SetKernelSize(kernelSizePixel[0], kernelSizePixel[1],
                               kernelSizePixel[2])
     dilateErode.Update()
     label.SetAndObserveImageData(dilateErode.GetOutput())
    def onApply(self):

        self.scriptedEffect.saveStateForUndo()

        # Get modifier labelmap and parameters
        modifierLabelmap = self.scriptedEffect.defaultModifierLabelmap()
        selectedSegmentLabelmap = self.scriptedEffect.selectedSegmentLabelmap()

        marginSizeMm = self.scriptedEffect.doubleParameter("MarginSizeMm")
        kernelSizePixel = self.getKernelSizePixel()

        # We need to know exactly the value of the segment voxels, apply threshold to make force the selected label value
        labelValue = 1
        backgroundValue = 0
        thresh = vtk.vtkImageThreshold()
        thresh.SetInputData(selectedSegmentLabelmap)
        thresh.ThresholdByLower(0)
        thresh.SetInValue(backgroundValue)
        thresh.SetOutValue(labelValue)
        thresh.SetOutputScalarType(selectedSegmentLabelmap.GetScalarType())

        erodeDilate = vtk.vtkImageDilateErode3D()
        erodeDilate.SetInputConnection(thresh.GetOutputPort())
        if marginSizeMm > 0:
            # grow
            erodeDilate.SetDilateValue(labelValue)
            erodeDilate.SetErodeValue(backgroundValue)
        else:
            # shrink
            erodeDilate.SetDilateValue(backgroundValue)
            erodeDilate.SetErodeValue(labelValue)

        # This can be a long operation - indicate it to the user
        qt.QApplication.setOverrideCursor(qt.Qt.WaitCursor)

        erodeDilate.SetKernelSize(kernelSizePixel[0], kernelSizePixel[1],
                                  kernelSizePixel[2])
        erodeDilate.Update()
        modifierLabelmap.DeepCopy(erodeDilate.GetOutput())

        # Apply changes
        self.scriptedEffect.modifySelectedSegmentByLabelmap(
            modifierLabelmap,
            slicer.qSlicerSegmentEditorAbstractEffect.ModificationModeSet)

        qt.QApplication.restoreOverrideCursor()
  def onApply(self):

    self.scriptedEffect.saveStateForUndo()

    # Get modifier labelmap and parameters
    modifierLabelmap = self.scriptedEffect.defaultModifierLabelmap()
    selectedSegmentLabelmap = self.scriptedEffect.selectedSegmentLabelmap()

    marginSizeMm = self.scriptedEffect.doubleParameter("MarginSizeMm")
    kernelSizePixel = self.getKernelSizePixel()

    # We need to know exactly the value of the segment voxels, apply threshold to make force the selected label value
    labelValue = 1
    backgroundValue = 0
    thresh = vtk.vtkImageThreshold()
    thresh.SetInputData(selectedSegmentLabelmap)
    thresh.ThresholdByLower(0)
    thresh.SetInValue(backgroundValue)
    thresh.SetOutValue(labelValue)
    thresh.SetOutputScalarType(selectedSegmentLabelmap.GetScalarType())

    erodeDilate = vtk.vtkImageDilateErode3D()
    erodeDilate.SetInputConnection(thresh.GetOutputPort())
    if marginSizeMm>0:
      # grow
      erodeDilate.SetDilateValue(labelValue)
      erodeDilate.SetErodeValue(backgroundValue)
    else:
      # shrink
      erodeDilate.SetDilateValue(backgroundValue)
      erodeDilate.SetErodeValue(labelValue)

    # This can be a long operation - indicate it to the user
    qt.QApplication.setOverrideCursor(qt.Qt.WaitCursor)

    erodeDilate.SetKernelSize(kernelSizePixel[0],kernelSizePixel[1],kernelSizePixel[2])
    erodeDilate.Update()
    modifierLabelmap.DeepCopy(erodeDilate.GetOutput())

    # Apply changes
    self.scriptedEffect.modifySelectedSegmentByLabelmap(modifierLabelmap, slicer.qSlicerSegmentEditorAbstractEffect.ModificationModeSet)

    qt.QApplication.restoreOverrideCursor()
    def ErodeLabelMap(self, LabelMapNode, ErosionKernelSize):

        # Initialize new label map node
        ErodedLabelMapNode = slicer.vtkMRMLLabelMapVolumeNode()
        ErodedLabelMapNode.SetSpacing(LabelMapNode.GetSpacing())
        ErodedLabelMapNode.SetOrigin(LabelMapNode.GetOrigin())

        # Intialize vtkImageDilateErode3D
        Eroder = vtk.vtkImageDilateErode3D()
        Eroder.SetErodeValue(1)
        Eroder.SetDilateValue(0)
        Eroder.SetKernelSize(ErosionKernelSize[0], ErosionKernelSize[1],
                             ErosionKernelSize[2])

        # Erode label map
        Eroder.SetInputData(LabelMapNode.GetImageData())
        Eroder.Update()
        ErodedLabelMapNode.SetAndObserveImageData(Eroder.GetOutput())

        return ErodedLabelMapNode
Example #18
0
    def SeedInitialize(self):

        self.PrintLog('Seed initialization.')

        seedIds = vtk.vtkIdList()
        if self.Interactive:
            queryString = 'Please place seeds'
            seeds = self.SeedInput(queryString,0)
            for i in range(seeds.GetNumberOfPoints()):
                seedIds.InsertNextId(self.Image.FindPoint(seeds.GetPoint(i)))
        else:
            for i in range(len(self.SourcePoints)/3):
                seedIds.InsertNextId(self.Image.ComputePointId([self.SourcePoints[3*i+0],self.SourcePoints[3*i+1],self.SourcePoints[3*i+2]]))
            for i in range(len(self.TargetPoints)/3):
                seedIds.InsertNextId(self.Image.ComputePointId([self.TargetPoints[3*i+0],self.TargetPoints[3*i+1],self.TargetPoints[3*i+2]]))
        
        self.InitialLevelSets = vtk.vtkImageData()
        self.InitialLevelSets.DeepCopy(self.Image)
        self.InitialLevelSets.Update()

        levelSetsInputScalars = self.InitialLevelSets.GetPointData().GetScalars()
        levelSetsInputScalars.FillComponent(0,1.0)

        dimensions = self.Image.GetDimensions()
        for i in range(seedIds.GetNumberOfIds()):
            levelSetsInputScalars.SetComponent(seedIds.GetId(i),0,-1.0)

        dilateErode = vtk.vtkImageDilateErode3D()
        dilateErode.SetInput(self.InitialLevelSets)
        dilateErode.SetDilateValue(-1.0)
        dilateErode.SetErodeValue(1.0)
        dilateErode.SetKernelSize(3,3,3)
        dilateErode.Update()

        self.InitialLevelSets.DeepCopy(dilateErode.GetOutput())

        self.IsoSurfaceValue = 0.0
Example #19
0
def label_dilate_erode(im, label_id, bg_id, size):
    """
    Dilates a label
    
    Args:
        im: vtkImage of the label map
        label_id: class id to erode
        bg_id: class id of backgroud to dilate
        size: num of pixels of the erosion
    Returns
        newIm: vtkImage with dilated tissue structure
    """
    dilateErode = vtk.vtkImageDilateErode3D()
    dilateErode.SetInputData(im)
    dilateErode.SetDilateValue(label_id)
    dilateErode.SetErodeValue(bg_id)

    #kernel_size = np.rint(thickness/np.array(im.GetSpacing())).astype(int)
    kernel_size = (np.ones(3) * size).astype(int)
    dilateErode.SetKernelSize(*kernel_size)
    dilateErode.Update()
    newIm = dilateErode.GetOutput()

    return newIm
Example #20
0
def main():
    # colors = vtk.vtkNamedColors()

    fileName = get_program_parameters()

    # Read the image.
    readerFactory = vtk.vtkImageReader2Factory()
    reader = readerFactory.CreateImageReader2(fileName)
    reader.SetFileName(fileName)
    reader.Update()

    # Dilate
    dilate = vtk.vtkImageDilateErode3D()
    dilate.SetInputConnection(reader.GetOutputPort())
    dilate.SetDilateValue(0)
    dilate.SetErodeValue(255)
    dilate.SetKernelSize(31, 31, 1)

    # Erode
    erode = vtk.vtkImageDilateErode3D()
    erode.SetInputConnection(reader.GetOutputPort())
    erode.SetDilateValue(255)
    erode.SetErodeValue(0)
    erode.SetKernelSize(31, 31, 1)

    # Opening - dilate then erode.
    dilate1 = vtk.vtkImageDilateErode3D()
    dilate1.SetInputConnection(reader.GetOutputPort())
    dilate1.SetDilateValue(0)
    dilate1.SetErodeValue(255)
    dilate1.SetKernelSize(31, 31, 1)

    erode1 = vtk.vtkImageDilateErode3D()
    erode1.SetInputConnection(dilate1.GetOutputPort())
    erode1.SetDilateValue(255)
    erode1.SetErodeValue(0)
    erode1.SetKernelSize(31, 31, 1)

    # Closing - erode then dilate.
    erode2 = vtk.vtkImageDilateErode3D()
    erode2.SetInputConnection(reader.GetOutputPort())
    erode2.SetDilateValue(255)
    erode2.SetErodeValue(0)
    erode2.SetKernelSize(31, 31, 1)

    dilate2 = vtk.vtkImageDilateErode3D()
    dilate2.SetInputConnection(erode2.GetOutputPort())
    dilate2.SetDilateValue(0)
    dilate2.SetErodeValue(255)
    dilate2.SetKernelSize(31, 31, 1)

    # Connectivity
    con = vtk.vtkImageSeedConnectivity()
    con.SetInputConnection(reader.GetOutputPort())
    con.AddSeed(300, 200)
    con.SetInputConnectValue(0)
    con.SetOutputConnectedValue(0)
    con.SetOutputUnconnectedValue(255)

    # Actors
    originalActor = vtk.vtkImageActor()
    originalActor.GetMapper().SetInputConnection(reader.GetOutputPort())
    originalActor.GetProperty().SetInterpolationTypeToNearest()

    connectedActor = vtk.vtkImageActor()
    connectedActor.GetMapper().SetInputConnection(con.GetOutputPort())
    connectedActor.GetProperty().SetInterpolationTypeToNearest()

    erodeActor = vtk.vtkImageActor()
    erodeActor.GetMapper().SetInputConnection(erode.GetOutputPort())
    erodeActor.GetProperty().SetInterpolationTypeToNearest()

    dilateActor = vtk.vtkImageActor()
    dilateActor.GetMapper().SetInputConnection(dilate.GetOutputPort())
    dilateActor.GetProperty().SetInterpolationTypeToNearest()

    openingActor = vtk.vtkImageActor()
    openingActor.GetMapper().SetInputConnection(dilate2.GetOutputPort())
    openingActor.GetProperty().SetInterpolationTypeToNearest()

    closingActor = vtk.vtkImageActor()
    closingActor.GetMapper().SetInputConnection(erode1.GetOutputPort())
    closingActor.GetProperty().SetInterpolationTypeToNearest()

    # Setup renderers
    originalRenderer = vtk.vtkRenderer()
    originalRenderer.AddActor(originalActor)
    connectedRenderer = vtk.vtkRenderer()
    connectedRenderer.AddActor(connectedActor)
    dilateRenderer = vtk.vtkRenderer()
    dilateRenderer.AddActor(dilateActor)
    erodeRenderer = vtk.vtkRenderer()
    erodeRenderer.AddActor(erodeActor)
    closingRenderer = vtk.vtkRenderer()
    closingRenderer.AddActor(closingActor)
    openingRenderer = vtk.vtkRenderer()
    openingRenderer.AddActor(openingActor)

    renderers = list()
    renderers.append(originalRenderer)
    renderers.append(connectedRenderer)
    renderers.append(erodeRenderer)
    renderers.append(dilateRenderer)
    renderers.append(openingRenderer)
    renderers.append(closingRenderer)

    # Setup viewports for the renderers
    rendererSize = 300
    xGridDimensions = 2
    yGridDimensions = 3

    renderWindow = vtk.vtkRenderWindow()
    renderWindow.SetSize(rendererSize * xGridDimensions,
                         rendererSize * yGridDimensions)
    for row in range(0, yGridDimensions):
        for col in range(xGridDimensions):
            index = row * xGridDimensions + col
            # (xmin, ymin, xmax, ymax)
            viewport = [
                float(col) / xGridDimensions,
                float(yGridDimensions - (row + 1)) / yGridDimensions,
                float(col + 1) / xGridDimensions,
                float(yGridDimensions - row) / yGridDimensions
            ]
            renderers[index].SetViewport(viewport)
            renderWindow.AddRenderer(renderers[index])
    renderWindow.SetWindowName('MorphologyComparison')

    renderWindowInteractor = vtk.vtkRenderWindowInteractor()
    style = vtk.vtkInteractorStyleImage()

    renderWindowInteractor.SetInteractorStyle(style)
    renderWindowInteractor.SetRenderWindow(renderWindow)

    # The renderers share one camera.
    renderWindow.Render()
    renderers[0].GetActiveCamera().Dolly(1.5)
    renderers[0].ResetCameraClippingRange()

    for r in range(1, len(renderers)):
        renderers[r].SetActiveCamera(renderers[0].GetActiveCamera())
    renderWindowInteractor.Initialize()
    renderWindowInteractor.Start()
Example #21
0
  def onApply(self):

    self.scriptedEffect.saveStateForUndo()

    # Get modifier labelmap and parameters
    modifierLabelmap = self.scriptedEffect.defaultModifierLabelmap()
    selectedSegmentLabelmap = self.scriptedEffect.selectedSegmentLabelmap()

    shellMode = self.scriptedEffect.parameter("ShellMode")

    marginSizeMm = self.scriptedEffect.doubleParameter("MarginSizeMm")
    kernelSizePixel = self.getKernelSizePixel()
    if shellMode == MEDIAL_SURFACE:
      # both erosion and dilation will be applied, so kernel size must be half on each side
      kernelSizePixel = [int(kernelSizePixel[0]/2), int(kernelSizePixel[1]/2), int(kernelSizePixel[2]/2)]

    # We need to know exactly the value of the segment voxels, apply threshold to make force the selected label value
    labelValue = 1
    backgroundValue = 0
    thresh = vtk.vtkImageThreshold()
    thresh.SetInputData(selectedSegmentLabelmap)
    thresh.ThresholdByLower(0)
    thresh.SetInValue(backgroundValue)
    thresh.SetOutValue(labelValue)
    thresh.SetOutputScalarType(selectedSegmentLabelmap.GetScalarType())
    thresh.Update()

    subtract = vtk.vtkImageMathematics()
    subtract.SetOperationToSubtract()

    if shellMode == INSIDE_SURFACE or shellMode == MEDIAL_SURFACE:
      dilate = vtk.vtkImageDilateErode3D()
      dilate.SetInputConnection(thresh.GetOutputPort())
      dilate.SetDilateValue(labelValue)
      dilate.SetErodeValue(backgroundValue)
      dilate.SetKernelSize(kernelSizePixel[0],kernelSizePixel[1],kernelSizePixel[2])
      dilate.Update()
      subtract.SetInput1Data(dilate.GetOutput())
    else:
      subtract.SetInput1Data(thresh.GetOutput())

    if shellMode == OUTSIDE_SURFACE or shellMode == MEDIAL_SURFACE:
      erode = vtk.vtkImageDilateErode3D()
      erode.SetInputConnection(thresh.GetOutputPort())
      erode.SetDilateValue(backgroundValue)
      erode.SetErodeValue(labelValue)
      erode.SetKernelSize(kernelSizePixel[0],kernelSizePixel[1],kernelSizePixel[2])
      erode.Update()
      subtract.SetInput2Data(erode.GetOutput())
    else:
      subtract.SetInput2Data(thresh.GetOutput())

    # This can be a long operation - indicate it to the user
    qt.QApplication.setOverrideCursor(qt.Qt.WaitCursor)

    subtract.Update()
    modifierLabelmap.DeepCopy(subtract.GetOutput())

    # Apply changes
    self.scriptedEffect.modifySelectedSegmentByLabelmap(modifierLabelmap, slicer.qSlicerSegmentEditorAbstractEffect.ModificationModeSet)

    qt.QApplication.restoreOverrideCursor()
Example #22
0
def autocontour_buie(img, args):

    # these hard-coded constants just make sure that the connectivity filter
    # actually works, they don't need to be configuable in my opinion
    CONN_SCALAR_RANGE = [1, args.in_value + 1]
    CONN_SIZE_RANGE = [0, int(1E10)]

    # Step 1 was just loading the AIM

    # Step 2: Threshold
    s2_threshold = vtk.vtkImageThreshold()
    s2_threshold.ThresholdByUpper(args.threshold_1)
    s2_threshold.SetInValue(args.in_value)
    s2_threshold.SetOutValue(args.out_value)
    s2_threshold.SetInputData(img)

    # Step 3: Median
    s3_median = vtk.vtkImageMedian3D()
    s3_median.SetKernelSize(*args.step_3_median_kernel)
    s3_median.SetInputConnection(s2_threshold.GetOutputPort())

    # Step 4: Dilate
    s4_dilate = vtk.vtkImageDilateErode3D()
    s4_dilate.SetDilateValue(args.in_value)
    s4_dilate.SetErodeValue(args.out_value)
    s4_dilate.SetKernelSize(*args.step_4_and_6_dilate_erode_kernel)
    s4_dilate.SetInputConnection(s3_median.GetOutputPort())

    # Step 5: Connectivity (applied to non-bone)
    # first flip 0 <-> 127
    s5a_invert = vtk.vtkImageThreshold()
    s5a_invert.ThresholdByLower(args.in_value / 2)
    s5a_invert.SetInValue(args.in_value)
    s5a_invert.SetOutValue(args.out_value)
    s5a_invert.SetInputConnection(s4_dilate.GetOutputPort())

    # then connectivity
    s5b_connectivity = vtk.vtkImageConnectivityFilter()
    s5b_connectivity.SetExtractionModeToLargestRegion()
    s5b_connectivity.SetScalarRange(*CONN_SCALAR_RANGE)
    s5b_connectivity.SetSizeRange(*CONN_SIZE_RANGE)
    s5b_connectivity.SetInputConnection(s5a_invert.GetOutputPort())

    # then flip 0 <-> 127 again
    s5c_invert = vtk.vtkImageThreshold()
    s5c_invert.ThresholdByLower(0.5)
    s5c_invert.SetInValue(args.in_value)
    s5c_invert.SetOutValue(args.out_value)
    s5c_invert.SetInputConnection(s5b_connectivity.GetOutputPort())

    # Step 6: Erode
    s6_erode = vtk.vtkImageDilateErode3D()
    s6_erode.SetDilateValue(args.out_value)
    s6_erode.SetErodeValue(args.in_value)
    s6_erode.SetKernelSize(*args.step_4_and_6_dilate_erode_kernel)
    s6_erode.SetInputConnection(s5c_invert.GetOutputPort())

    # Step 7: Threshold
    s7_threshold = vtk.vtkImageThreshold()
    s7_threshold.ThresholdByLower(args.threshold_2)
    s7_threshold.SetInValue(args.in_value)
    s7_threshold.SetOutValue(args.out_value)
    s7_threshold.SetInputData(img)

    # Step 8: Mask
    s8a_mask = vtk.vtkImageMask()
    s8a_mask.SetInputConnection(0, s7_threshold.GetOutputPort())
    s8a_mask.SetInputConnection(1, s6_erode.GetOutputPort())

    s8b_invert = vtk.vtkImageThreshold()
    s8b_invert.ThresholdByLower(args.in_value / 2)
    s8b_invert.SetInValue(args.in_value)
    s8b_invert.SetOutValue(args.out_value)
    s8b_invert.SetInputConnection(s8a_mask.GetOutputPort())

    # Step 9: Dilate
    s9_dilate = vtk.vtkImageDilateErode3D()
    s9_dilate.SetDilateValue(args.out_value)
    s9_dilate.SetErodeValue(args.in_value)
    s9_dilate.SetKernelSize(*args.step_9_and_11_dilate_erode_kernel)
    s9_dilate.SetInputConnection(s8b_invert.GetOutputPort())

    # Step 10: Connectivity
    # connectivity
    s10a_connectivity = vtk.vtkImageConnectivityFilter()
    s10a_connectivity.SetExtractionModeToLargestRegion()
    s10a_connectivity.SetScalarRange(*CONN_SCALAR_RANGE)
    s10a_connectivity.SetSizeRange(*CONN_SIZE_RANGE)
    s10a_connectivity.SetInputConnection(s9_dilate.GetOutputPort())

    # then convert to 127 and 0 again
    s10b_convert = vtk.vtkImageThreshold()
    s10b_convert.ThresholdByLower(0.5)
    s10b_convert.SetInValue(args.out_value)
    s10b_convert.SetOutValue(args.in_value)
    s10b_convert.SetInputConnection(s10a_connectivity.GetOutputPort())

    # Step 11: Erode
    s11_erode = vtk.vtkImageDilateErode3D()
    s11_erode.SetDilateValue(args.in_value)
    s11_erode.SetErodeValue(args.out_value)
    s11_erode.SetKernelSize(*args.step_9_and_11_dilate_erode_kernel)
    s11_erode.SetInputConnection(s10b_convert.GetOutputPort())

    # Step 12: Gaussian Smooth
    s12_gauss = vtk.vtkImageGaussianSmooth()
    s12_gauss.SetStandardDeviation(args.step_12_gaussian_std)
    s12_gauss.SetRadiusFactors(*args.step_12_gaussian_kernel)
    s12_gauss.SetInputConnection(s11_erode.GetOutputPort())

    # Step 13: Threshold
    s13_threshold = vtk.vtkImageThreshold()
    s13_threshold.ThresholdByLower(S13_THRESH)
    s13_threshold.SetInValue(args.out_value)
    s13_threshold.SetOutValue(args.in_value)
    s13_threshold.SetInputConnection(s12_gauss.GetOutputPort())

    # Step 14: Mask
    s14_mask = vtk.vtkImageMask()
    s14_mask.SetInputConnection(0, s6_erode.GetOutputPort())
    s14_mask.SetInputConnection(1, s13_threshold.GetOutputPort())

    # Step 15: Invert the Trabecular Mask
    s15_invert = vtk.vtkImageThreshold()
    s15_invert.ThresholdByLower(args.in_value / 2)
    s15_invert.SetInValue(args.in_value)
    s15_invert.SetOutValue(args.out_value)
    s15_invert.SetInputConnection(s13_threshold.GetOutputPort())

    # update the pipeline
    s14_mask.Update()
    s15_invert.Update()

    # get masks
    cort_mask = s14_mask.GetOutput()
    trab_mask = s15_invert.GetOutput()

    return cort_mask, trab_mask
def vortvelvolumei(args):
    #inputfile, outputfile, sx, ex, sy, ey, sz, ez, dataset):
    p = args[0]
    cubenum = args[1]
    print("Cube", cubenum)
    #Check for additonal parameters
    if (p["param1"] != ''):
        comptype = p["param1"]
    else:
        comptype = "q" #Default to q criterion
    if (p["param2"] != ''):
        thresh = float(p["param2"])
    else:
        thresh = 783.3 #Default for q threshold on isotropic data

    inputfile = p["inputfile"] +str(cubenum) + ".npy" 
    outputfile = p["outputfile"] + str(cubenum) + ".vti" #always VTK Image Data for this.
    sx = p["sx"]
    sy = p["sy"]
    sz = p["sz"]
    ex = p["ex"]
    ey = p["ey"]
    ez = p["ez"]
        
    print ("Loading file, %s" % inputfile)
    #Determine if file is h5 or numpy
    rs = timeit.default_timer()
    vel = np.load(inputfile)
    print ("File Loaded")
    re = timeit.default_timer()
    #convert numpy array to vtk
    cs = timeit.default_timer()
    #convert numpy array to vtk
    vtkdata = numpy_support.numpy_to_vtk(vel.flat, deep=True, array_type=vtk.VTK_FLOAT)
    vtkdata.SetNumberOfComponents(3)
    vtkdata.SetName("Velocity")
    image = vtk.vtkImageData()
    image.GetPointData().SetVectors(vtkdata)
    image.SetExtent(sx,ex,sy,ey,sz,ez)
    #NOTE: Hardcoding Spacing

    image.SetSpacing(.006135923, .006135923, .006135923)
    ce = timeit.default_timer()
    vs = timeit.default_timer()
    print ("Beginning computation: " + comptype)
    if (comptype == "v"):
        vorticity = vtk.vtkCellDerivatives()
        vorticity.SetVectorModeToComputeVorticity()
        vorticity.SetTensorModeToPassTensors()
        vorticity.SetInputData(image)
        vorticity.Update()
    elif (comptype == "q"):
        vorticity = vtk.vtkGradientFilter()
        vorticity.SetInputData(image)
        vorticity.SetInputScalars(image.FIELD_ASSOCIATION_POINTS,"Velocity")
        vorticity.ComputeQCriterionOn()
        vorticity.SetComputeGradient(0)
        vorticity.Update()
    ve = timeit.default_timer()
    print("Initial calculation done")
    ms = timeit.default_timer()
    if (comptype == "v"):
        mag = vtk.vtkImageMagnitude()
        cp = vtk.vtkCellDataToPointData()
        cp.SetInputData(vorticity.GetOutput())
        cp.Update()
        image.GetPointData().SetScalars(cp.GetOutput().GetPointData().GetVectors())
        mag.SetInputData(image)
        mag.Update()
        m = mag.GetOutput()
        m.GetPointData().RemoveArray("Velocity")
    else:
        image.GetPointData().SetScalars(vorticity.GetOutput().GetPointData().GetVectors("Q-criterion"))
    me = timeit.default_timer()
    print("Generating screenshot")
    c = vtk.vtkContourFilter()
    c.SetValue(0,thresh)
    c.SetInputData(image)
    c.Update()
    contour = c.GetOutput()
    mapper = vtk.vtkPolyDataMapper()
    mapper.SetInputData(contour)
    mapper.ScalarVisibilityOn()
    mapper.SetScalarRange(-1,1)
    mapper.SetScalarModeToUsePointFieldData()
    mapper.ColorByArrayComponent("Velocity", 0)
    actor = vtk.vtkActor()
    actor.SetMapper(mapper)
    
    ren = vtk.vtkRenderer()
    ren.AddActor(actor)
    ren.SetBackground(1,1,1)
    camera = vtk.vtkCamera()
    ren.SetActiveCamera(camera)
    ren.ResetCamera()
    camera.Zoom(1.5) #This reduces the whitespace around the image

    renWin = vtk.vtkRenderWindow()
    renWin.SetSize(1024,1024)
    renWin.AddRenderer(ren)
    renWin.SetOffScreenRendering(1)

    windowToImageFilter = vtk.vtkWindowToImageFilter()
    windowToImageFilter.SetInput(renWin)
    windowToImageFilter.Update()
    
    w = vtk.vtkPNGWriter()
    pngfilename = p["outputfile"] + str(cubenum) + ".png"
    w.SetFileName(pngfilename)
    w.SetInputConnection(windowToImageFilter.GetOutputPort())
    w.Write()

    #Shift camera angle and take snapshots around the cube.
    for aznum in range(4):
        camera.Azimuth(90)
        windowToImageFilter = vtk.vtkWindowToImageFilter()
        windowToImageFilter.SetInput(renWin)
        windowToImageFilter.Update()
        pngfilename = p["outputfile"] + str(cubenum) + "-r" + str(aznum)+ ".png"
        w.SetFileName(pngfilename)
        w.SetInputConnection(windowToImageFilter.GetOutputPort())
        w.Write()

    camera.Elevation(90) #Rotate camera to top
    windowToImageFilter = vtk.vtkWindowToImageFilter()
    windowToImageFilter.SetInput(renWin)
    windowToImageFilter.Update()
    pngfilename = p["outputfile"] + str(cubenum) + "-t1.png"
    w.SetFileName(pngfilename)
    w.SetInputConnection(windowToImageFilter.GetOutputPort())
    w.Write()

    camera.Elevation(180) #Rotate camera to bottom
    windowToImageFilter = vtk.vtkWindowToImageFilter()
    windowToImageFilter.SetInput(renWin)
    windowToImageFilter.Update()
    pngfilename = p["outputfile"] + str(cubenum) + "-b1.png"
    w.SetFileName(pngfilename)
    w.SetInputConnection(windowToImageFilter.GetOutputPort())
    w.Write()

    print ("Thresholding.")
    ts = timeit.default_timer()
    t = vtk.vtkImageThreshold() #Dense represenation (0's included, structured grid)
    #t = vtk.vtkThreshold() #sparse representation

    if (comptype == "q"):
        t.SetInputData(image)
        t.ThresholdByUpper(thresh) #.25*67.17^2 = 1127
        #t.SetInputArrayToProcess(0,0,0, vorticity.GetOutput().FIELD_ASSOCIATION_POINTS, "Q-criterion")
        print("q criterion")
    else:
        t.SetInputData(m)
        t.SetInputArrayToProcess(0,0,0, mag.GetOutput().FIELD_ASSOCIATION_POINTS, "Magnitude")
        t.ThresholdByUpper(thresh) #44.79)
    #Set values in range to 1 and values out of range to 0
    t.SetInValue(1)
    t.SetOutValue(0)
    #t.ReplaceInOn()
    #t.ReplaceOutOn()
    print("Update thresh")
    t.Update()
    #wt = vtk.vtkXMLImageDataWriter()
    #wt.SetInputData(t.GetOutput())
    #wt.SetFileName("thresh.vti")
    #wt.Write()

    d = vtk.vtkImageDilateErode3D()
    d.SetInputData(t.GetOutput())
    d.SetKernelSize(4,4,4)
    d.SetDilateValue(1)
    d.SetErodeValue(0)
    print ("Update dilate")
    d.Update()

    iis = vtk.vtkImageToImageStencil()
    iis.SetInputData(d.GetOutput())
    iis.ThresholdByUpper(1)
    stencil = vtk.vtkImageStencil()
    stencil.SetInputConnection(2, iis.GetOutputPort())
    stencil.SetBackgroundValue(0)
    #image.GetPointData().RemoveArray("Vorticity")
    #Set scalars to velocity so it can be cut by the stencil
    image.GetPointData().SetScalars(image.GetPointData().GetVectors())
    #if (comptype == "q"):  #Use this to get just q-criterion data instead of velocity data.  Do we need both?
    #    image.GetPointData().SetScalars(vorticity.GetOutput().GetPointData().GetScalars("Q-criterion"))
    stencil.SetInputData(image)
    print ("Update stencil")    
    stencil.Update()
    te = timeit.default_timer()
    print("Setting up write")
    ws = timeit.default_timer()
    #Make velocity a vector again
    velarray = stencil.GetOutput().GetPointData().GetScalars()
    image.GetPointData().RemoveArray("Velocity")
    image.GetPointData().SetVectors(velarray)
    w = vtk.vtkXMLImageDataWriter()
    w.SetCompressorTypeToZLib()
    #w.SetCompressorTypeToNone() Need to figure out why this fails.
    w.SetEncodeAppendedData(0) #turn of base 64 encoding for fast write
    w.SetFileName(outputfile)
    w.SetInputData(image)
    if (0):
        w.SetCompressorTypeToZfp()
        w.GetCompressor().SetNx(ex-sx+1)
        w.GetCompressor().SetNy(ey-sy+1)
        w.GetCompressor().SetNz(ez-sz+1)
        w.GetCompressor().SetTolerance(1e-2)
        w.GetCompressor().SetNumComponents(3)

    #result = w.Write()
    result = 1 #don't write for benchmarking
    we = timeit.default_timer()

    print("Results:")
    print("Read time: %s" % str(re-rs))
    print ("Convert to vtk: %s" % str(ce-cs))
    if (comptype == "q"):
        print ("Q Computation: %s" % str(ve-vs))
        print ("Q Magnitude: %s" % str(me-ms))
    else:
        print ("Vorticity Computation: %s" % str(ve-vs))
        print ("Vorticity Magnitude: %s" % str(me-ms))
    print ("Threshold: %s" % str(te-ts))
    print ("Write %s" % str(we-ws))
    print ("Total time: %s" % str(we-rs))
    if (result):
        p["message"] = "Success"
        p["computetime"] = str(we-rs)
    return p #return the packet
Example #24
0
t.SetInputArrayToProcess(0, 0, 0,
                         mag.GetOutput().FIELD_ASSOCIATION_POINTS, "Magnitude")
#t.ThresholdByUpper(44.79)
t.ThresholdByUpper(22.39)
#t.ThresholdByUpper(67.17)

#Set values in range to 1 and values out of range to 0
#t.SetInValue(1)
t.SetOutValue(0)
#t.ReplaceInOn()
t.ReplaceOutOn()
t.Update()

rt = t.GetOutput()

d = vtk.vtkImageDilateErode3D()
d.SetInputData(t.GetOutput())
d.SetKernelSize(3, 3, 3)
d.SetDilateValue(1)
d.SetErodeValue(0)
d.Update()

iis = vtk.vtkImageToImageStencil()
iis.SetInputData(d.GetOutput())
iis.ThresholdByUpper(1)
stencil = vtk.vtkImageStencil()
stencil.SetInputConnection(2, iis.GetOutputPort())
image.GetPointData().RemoveArray("Vorticity")
image.GetPointData().SetScalars(image.GetPointData().GetVectors())
stencil.SetInputData(image)
stencil.Update()
Example #25
0
def getthresh(args):
    inputfile = args[0]
    outputfile = args[1]
    sx = args[2]
    ex = args[3]
    sy = args[4]
    ey = args[5]
    sz = args[6]
    ez = args[7]
    dataset = args[8]
    comptype = args[9]
    print("Loading file, %s" % inputfile)
    #Determine if file is h5 or numpy
    if (inputfile.split(".")[1] == "npy"):
        rs = timeit.default_timer()
        vel = np.load(inputfile)
        re = timeit.default_timer()
    else:
        #read in file
        rs = timeit.default_timer()
        data_file = h5py.File(inputfile, 'r')
        vel = np.array(data_file[dataset])
        data_file.close()
        re = timeit.default_timer()

    cs = timeit.default_timer()
    #convert numpy array to vtk
    vtkdata = numpy_support.numpy_to_vtk(vel.flat,
                                         deep=True,
                                         array_type=vtk.VTK_FLOAT)
    vtkdata.SetNumberOfComponents(3)
    vtkdata.SetName("Velocity")
    image = vtk.vtkImageData()
    image.GetPointData().SetVectors(vtkdata)
    image.SetExtent(sx, ex, sy, ey, sz, ez)
    #NOTE: Hardcoding Spacing

    image.SetSpacing(.006135923, .006135923, .006135923)
    print("Doing computation")
    ce = timeit.default_timer()
    vs = timeit.default_timer()
    if (comptype == "v"):
        vorticity = vtk.vtkCellDerivatives()
        vorticity.SetVectorModeToComputeVorticity()
        vorticity.SetTensorModeToPassTensors()
        vorticity.SetInputData(image)
        vorticity.Update()
    elif (comptype == "q"):
        vorticity = vtk.vtkGradientFilter()
        vorticity.SetInputData(image)
        vorticity.SetInputScalars(image.FIELD_ASSOCIATION_POINTS, "Velocity")
        vorticity.ComputeQCriterionOn()
        vorticity.SetComputeGradient(0)
        vorticity.Update()
    ve = timeit.default_timer()
    #Generate contour for comparison
    c = vtk.vtkContourFilter()
    c.SetValue(0, 1128)
    if (comptype == "q"):
        image.GetPointData().SetScalars(
            vorticity.GetOutput().GetPointData().GetVectors("Q-criterion"))
    else:
        image.GetPointData().SetScalars(
            vorticity.GetOutput().GetPointData().GetVectors())

    c.SetInputData(image)

    c.Update()
    w = vtk.vtkXMLPolyDataWriter()
    w.SetEncodeAppendedData(0)  #turn of base 64 encoding for fast write
    w.SetFileName("contour.vtp")
    w.SetInputData(c.GetOutput())
    ws = timeit.default_timer()
    w.Write()

    ms = timeit.default_timer()
    if (comptype == "v"):
        mag = vtk.vtkImageMagnitude()
        cp = vtk.vtkCellDataToPointData()
        cp.SetInputData(vorticity.GetOutput())
        cp.Update()
        image.GetPointData().SetScalars(
            cp.GetOutput().GetPointData().GetVectors())
        mag.SetInputData(image)
        mag.Update()
        m = mag.GetOutput()
        m.GetPointData().RemoveArray("Velocity")
    else:
        image.GetPointData().SetScalars(
            vorticity.GetOutput().GetPointData().GetVectors("Q-criterion"))
    me = timeit.default_timer()
    print("Thresholding.")
    ts = timeit.default_timer()
    t = vtk.vtkImageThreshold()
    #t = vtk.vtkThreshold() #sparse representation

    if (comptype == "q"):
        t.SetInputData(image)
        t.ThresholdByUpper(783.3)  #.25*67.17^2 = 1127
        #t.SetInputArrayToProcess(0,0,0, vorticity.GetOutput().FIELD_ASSOCIATION_POINTS, "Q-criterion")
        print("q criterion")
    else:
        t.SetInputData(m)
        t.SetInputArrayToProcess(0, 0, 0,
                                 mag.GetOutput().FIELD_ASSOCIATION_POINTS,
                                 "Magnitude")
        t.ThresholdByUpper(44.79)  #44.79)
    #Set values in range to 1 and values out of range to 0
    t.SetInValue(1)
    t.SetOutValue(0)
    #t.ReplaceInOn()
    #t.ReplaceOutOn()
    print("Update thresh")
    t.Update()
    #wt = vtk.vtkXMLImageDataWriter()
    #wt.SetInputData(t.GetOutput())
    #wt.SetFileName("thresh.vti")
    #wt.Write()

    d = vtk.vtkImageDilateErode3D()
    d.SetInputData(t.GetOutput())
    d.SetKernelSize(3, 3, 3)
    d.SetDilateValue(1)
    d.SetErodeValue(0)
    print("Update dilate")
    d.Update()

    iis = vtk.vtkImageToImageStencil()
    iis.SetInputData(d.GetOutput())
    iis.ThresholdByUpper(1)
    stencil = vtk.vtkImageStencil()
    stencil.SetInputConnection(2, iis.GetOutputPort())
    stencil.SetBackgroundValue(0)
    #image.GetPointData().RemoveArray("Vorticity")
    #Set scalars to velocity so it can be cut by the stencil
    image.GetPointData().SetScalars(image.GetPointData().GetVectors())
    #if (comptype == "q"):  #Use this to get just q-criterion data instead of velocity data.  Do we need both?
    #    image.GetPointData().SetScalars(vorticity.GetOutput().GetPointData().GetScalars("Q-criterion"))
    stencil.SetInputData(image)
    print("Update stencil")
    stencil.Update()
    te = timeit.default_timer()
    print("Setting up write")
    ws = timeit.default_timer()
    #Make velocity a vector again
    velarray = stencil.GetOutput().GetPointData().GetScalars()
    image.GetPointData().RemoveArray("Velocity")
    image.GetPointData().SetVectors(velarray)
    w = vtk.vtkXMLImageDataWriter()
    w.SetCompressorTypeToZLib()
    #w.SetCompressorTypeToNone() Need to figure out why this fails.
    w.SetEncodeAppendedData(0)  #turn of base 64 encoding for fast write
    w.SetFileName(outputfile)
    w.SetInputData(image)
    if (0):
        w.SetCompressorTypeToZfp()
        w.GetCompressor().SetNx(ex - sx + 1)
        w.GetCompressor().SetNy(ey - sy + 1)
        w.GetCompressor().SetNz(ez - sz + 1)
        w.GetCompressor().SetTolerance(1e-1)
        w.GetCompressor().SetNumComponents(3)

    w.Write()
    we = timeit.default_timer()

    print("Results:")
    print("Read time: %s" % str(re - rs))
    print("Convert to vtk: %s" % str(ce - cs))
    if (comptype == "q"):
        print("Q Computation: %s" % str(ve - vs))
        print("Q Magnitude: %s" % str(me - ms))
    else:
        print("Vorticity Computation: %s" % str(ve - vs))
        print("Vorticity Magnitude: %s" % str(me - ms))
    print("Threshold: %s" % str(te - ts))
    print("Write %s" % str(we - ws))
    print("Total time: %s" % str(we - rs))
Example #26
0
def getthresh(args):
    inputfile = args[0] 
    outputfile = args[1]
    sx = args[2]
    ex = args[3]
    sy = args[4]
    ey = args[5]
    sz = args[6]
    ez = args[7]
    dataset = args[8]
    comptype = args[9]
    print ("Loading file, %s" % inputfile)
    #Determine if file is h5 or numpy
    if (inputfile.split(".")[1] == "npy"):
        rs = timeit.default_timer()
        vel = np.load(inputfile)
        re = timeit.default_timer()
    else:
        #read in file
        rs = timeit.default_timer()
        data_file = h5py.File(inputfile, 'r')
        vel = np.array(data_file[dataset])
        data_file.close()
        re = timeit.default_timer()

    cs = timeit.default_timer()
    #convert numpy array to vtk
    vtkdata = numpy_support.numpy_to_vtk(vel.flat, deep=True, array_type=vtk.VTK_FLOAT)
    vtkdata.SetNumberOfComponents(3)
    vtkdata.SetName("Velocity")
    image = vtk.vtkImageData()
    image.GetPointData().SetVectors(vtkdata)
    image.SetExtent(sx,ex,sy,ey,sz,ez)
    #NOTE: Hardcoding Spacing

    image.SetSpacing(.006135923, .006135923, .006135923)
    print ("Doing computation")
    ce = timeit.default_timer()
    vs = timeit.default_timer()
    if (comptype == "v"):
        vorticity = vtk.vtkCellDerivatives()
        vorticity.SetVectorModeToComputeVorticity()
        vorticity.SetTensorModeToPassTensors()
        vorticity.SetInputData(image)
        vorticity.Update()
    elif (comptype == "q"):
        vorticity = vtk.vtkGradientFilter()
        vorticity.SetInputData(image)
        vorticity.SetInputScalars(image.FIELD_ASSOCIATION_POINTS,"Velocity")
        vorticity.ComputeQCriterionOn()
        vorticity.SetComputeGradient(0)
        vorticity.Update()
    ve = timeit.default_timer()
    #Generate contour for comparison
    c = vtk.vtkContourFilter()
    c.SetValue(0,1128)
    if (comptype == "q"):
        image.GetPointData().SetScalars(vorticity.GetOutput().GetPointData().GetVectors("Q-criterion"))
    else:
        image.GetPointData().SetScalars(vorticity.GetOutput().GetPointData().GetVectors())
        
    c.SetInputData(image)
    
    c.Update()
    w = vtk.vtkXMLPolyDataWriter()
    w.SetEncodeAppendedData(0) #turn of base 64 encoding for fast write
    w.SetFileName("contour.vtp")
    w.SetInputData(c.GetOutput())
    ws = timeit.default_timer()
    w.Write()


    ms = timeit.default_timer()
    if (comptype == "v"):
        mag = vtk.vtkImageMagnitude()
        cp = vtk.vtkCellDataToPointData()
        cp.SetInputData(vorticity.GetOutput())
        cp.Update()
        image.GetPointData().SetScalars(cp.GetOutput().GetPointData().GetVectors())
        mag.SetInputData(image)
        mag.Update()
        m = mag.GetOutput()
        m.GetPointData().RemoveArray("Velocity")
    else:
        image.GetPointData().SetScalars(vorticity.GetOutput().GetPointData().GetVectors("Q-criterion"))
    me = timeit.default_timer()
    print ("Thresholding.")
    ts = timeit.default_timer()
    t = vtk.vtkImageThreshold()
    #t = vtk.vtkThreshold() #sparse representation

    if (comptype == "q"):
        t.SetInputData(image)
        t.ThresholdByUpper(783.3) #.25*67.17^2 = 1127
        #t.SetInputArrayToProcess(0,0,0, vorticity.GetOutput().FIELD_ASSOCIATION_POINTS, "Q-criterion")
        print("q criterion")
    else:
        t.SetInputData(m)
        t.SetInputArrayToProcess(0,0,0, mag.GetOutput().FIELD_ASSOCIATION_POINTS, "Magnitude")
        t.ThresholdByUpper(44.79) #44.79)
    #Set values in range to 1 and values out of range to 0
    t.SetInValue(1)
    t.SetOutValue(0)
    #t.ReplaceInOn()
    #t.ReplaceOutOn()
    print("Update thresh")
    t.Update()
    #wt = vtk.vtkXMLImageDataWriter()
    #wt.SetInputData(t.GetOutput())
    #wt.SetFileName("thresh.vti")
    #wt.Write()

    d = vtk.vtkImageDilateErode3D()
    d.SetInputData(t.GetOutput())
    d.SetKernelSize(3,3,3)
    d.SetDilateValue(1)
    d.SetErodeValue(0)
    print ("Update dilate")
    d.Update()

    iis = vtk.vtkImageToImageStencil()
    iis.SetInputData(d.GetOutput())
    iis.ThresholdByUpper(1)
    stencil = vtk.vtkImageStencil()
    stencil.SetInputConnection(2, iis.GetOutputPort())
    stencil.SetBackgroundValue(0)
    #image.GetPointData().RemoveArray("Vorticity")
    #Set scalars to velocity so it can be cut by the stencil
    image.GetPointData().SetScalars(image.GetPointData().GetVectors())
    #if (comptype == "q"):  #Use this to get just q-criterion data instead of velocity data.  Do we need both?
    #    image.GetPointData().SetScalars(vorticity.GetOutput().GetPointData().GetScalars("Q-criterion"))
    stencil.SetInputData(image)
    print ("Update stencil")    
    stencil.Update()
    te = timeit.default_timer()
    print("Setting up write")
    ws = timeit.default_timer()
    #Make velocity a vector again
    velarray = stencil.GetOutput().GetPointData().GetScalars()
    image.GetPointData().RemoveArray("Velocity")
    image.GetPointData().SetVectors(velarray)
    w = vtk.vtkXMLImageDataWriter()
    w.SetCompressorTypeToZLib()
    #w.SetCompressorTypeToNone() Need to figure out why this fails.
    w.SetEncodeAppendedData(0) #turn of base 64 encoding for fast write
    w.SetFileName(outputfile)
    w.SetInputData(image)
    if (0):
        w.SetCompressorTypeToZfp()
        w.GetCompressor().SetNx(ex-sx+1)
        w.GetCompressor().SetNy(ey-sy+1)
        w.GetCompressor().SetNz(ez-sz+1)
        w.GetCompressor().SetTolerance(1e-1)
        w.GetCompressor().SetNumComponents(3)

    w.Write()
    we = timeit.default_timer()

    print("Results:")
    print("Read time: %s" % str(re-rs))
    print ("Convert to vtk: %s" % str(ce-cs))
    if (comptype == "q"):
        print ("Q Computation: %s" % str(ve-vs))
        print ("Q Magnitude: %s" % str(me-ms))
    else:
        print ("Vorticity Computation: %s" % str(ve-vs))
        print ("Vorticity Magnitude: %s" % str(me-ms))
    print ("Threshold: %s" % str(te-ts))
    print ("Write %s" % str(we-ws))
    print ("Total time: %s" % str(we-rs))
def vortvelvolume(args):
    #inputfile, outputfile, sx, ex, sy, ey, sz, ez, dataset):
    p = args[0]
    cubenum = args[1]
    print("Cube", cubenum)
    #Check for additonal parameters
    if (p["param1"] != ''):
        comptype = p["param1"]
    else:
        comptype = "q" #Default to q criterion
    if (p["param2"] != ''):
        thresh = float(p["param2"])
    else:
        thresh = 783.3 #Default for q threshold on isotropic data
    #We use 0 for structured grid (vti) and 1 for unstructured grid (vtu)
    if (p["param3"] != ''):
        grid = 0
    else:
        grid = 1
    if (p["param4"] != ''):
        kernelsize = int(p["param4"])
    else:
        kernelsize = 3
    inputfile = p["inputfile"] +str(cubenum) + ".npy" 
    outputfile = p["outputfile"] + str(cubenum) + ".vti" #always VTK Image Data for this.
    sx = p["sx"]
    sy = p["sy"]
    sz = p["sz"]
    ex = p["ex"]
    ey = p["ey"]
    ez = p["ez"]
        
    print ("Loading file, %s" % inputfile)
    #Determine if file is h5 or numpy
    rs = timeit.default_timer()
    vel = np.load(inputfile)
    re = timeit.default_timer()
    #convert numpy array to vtk
    cs = timeit.default_timer()
    #convert numpy array to vtk
    vtkdata = numpy_support.numpy_to_vtk(vel.flat, deep=True, array_type=vtk.VTK_FLOAT)
    vtkdata.SetNumberOfComponents(3)
    vtkdata.SetName("Velocity")
    image = vtk.vtkImageData()
    image.GetPointData().SetVectors(vtkdata)
    image.SetExtent(sx,ex,sy,ey,sz,ez)
    #NOTE: Hardcoding Spacing

    image.SetSpacing(.006135923, .006135923, .006135923)
    ce = timeit.default_timer()
    vs = timeit.default_timer()
    if (comptype == "v"):
        vorticity = vtk.vtkCellDerivatives()
        vorticity.SetVectorModeToComputeVorticity()
        vorticity.SetTensorModeToPassTensors()
        vorticity.SetInputData(image)
        vorticity.Update()
    elif (comptype == "q"):
        vorticity = vtk.vtkGradientFilter()
        vorticity.SetInputData(image)
        vorticity.SetInputScalars(image.FIELD_ASSOCIATION_POINTS,"Velocity")
        vorticity.ComputeQCriterionOn()
        vorticity.SetComputeGradient(0)
        vorticity.Update()
    ve = timeit.default_timer()

    ms = timeit.default_timer()
    if (comptype == "v"):
        mag = vtk.vtkImageMagnitude()
        cp = vtk.vtkCellDataToPointData()
        cp.SetInputData(vorticity.GetOutput())
        cp.Update()
        image.GetPointData().SetScalars(cp.GetOutput().GetPointData().GetVectors())
        mag.SetInputData(image)
        mag.Update()
        m = mag.GetOutput()
        m.GetPointData().RemoveArray("Velocity")
    else:
        image.GetPointData().SetScalars(vorticity.GetOutput().GetPointData().GetVectors("Q-criterion"))
    me = timeit.default_timer()
    print ("Thresholding.")
    ts = timeit.default_timer()
    t = vtk.vtkImageThreshold()
    #t = vtk.vtkThreshold() #sparse representation

    if (comptype == "q"):
        t.SetInputData(image)
        t.ThresholdByUpper(thresh) #.25*67.17^2 = 1127
        #t.SetInputArrayToProcess(0,0,0, vorticity.GetOutput().FIELD_ASSOCIATION_POINTS, "Q-criterion")
        print("q criterion")
    else:
        t.SetInputData(m)
        t.SetInputArrayToProcess(0,0,0, mag.GetOutput().FIELD_ASSOCIATION_POINTS, "Magnitude")
        t.ThresholdByUpper(thresh) #44.79)
    #Set values in range to 1 and values out of range to 0
    t.SetInValue(1)
    t.SetOutValue(0)
    #t.ReplaceInOn()
    #t.ReplaceOutOn()
    print("Update thresh")
    t.Update()
    #wt = vtk.vtkXMLImageDataWriter()
    #wt.SetInputData(t.GetOutput())
    #wt.SetFileName("thresh.vti")
    #wt.Write()

    d = vtk.vtkImageDilateErode3D()
    d.SetInputData(t.GetOutput())
    d.SetKernelSize(kernelsize,kernelsize,kernelsize)
    d.SetDilateValue(1)
    d.SetErodeValue(0)
    print ("Update dilate")
    d.Update()

    iis = vtk.vtkImageToImageStencil()
    iis.SetInputData(d.GetOutput())
    iis.ThresholdByUpper(1)
    stencil = vtk.vtkImageStencil()
    stencil.SetInputConnection(2, iis.GetOutputPort())
    stencil.SetBackgroundValue(0)
    #image.GetPointData().RemoveArray("Vorticity")
    #Set scalars to velocity so it can be cut by the stencil
    image.GetPointData().SetScalars(image.GetPointData().GetVectors())
    #if (comptype == "q"):  #Use this to get just q-criterion data instead of velocity data.  Do we need both?
    #    image.GetPointData().SetScalars(vorticity.GetOutput().GetPointData().GetScalars("Q-criterion"))
    stencil.SetInputData(image)
    print ("Update stencil")    
    stencil.Update()
    te = timeit.default_timer()
    print("Setting up write")
    ws = timeit.default_timer()
    #Make velocity a vector again
    velarray = stencil.GetOutput().GetPointData().GetScalars()
    image.GetPointData().RemoveArray("Velocity")
    image.GetPointData().SetVectors(velarray)
    if (grid == 0):
        w = vtk.vtkXMLImageDataWriter()
    else:
        w = vtk.vtkXMLUnstructuredGridWriter()
    w.SetCompressorTypeToZLib()
    #w.SetCompressorTypeToNone() Need to figure out why this fails.
    w.SetEncodeAppendedData(0) #turn of base 64 encoding for fast write
    w.SetFileName(outputfile)
    w.SetInputData(image)
    if (0):
        w.SetCompressorTypeToZfp()
        w.GetCompressor().SetNx(ex-sx+1)
        w.GetCompressor().SetNy(ey-sy+1)
        w.GetCompressor().SetNz(ez-sz+1)
        w.GetCompressor().SetTolerance(1e-2)
        w.GetCompressor().SetNumComponents(3)

    result = w.Write()
    result = 1 #don't write for benchmarking
    we = timeit.default_timer()

    print("Results:")
    print("Read time: %s" % str(re-rs))
    print ("Convert to vtk: %s" % str(ce-cs))
    if (comptype == "q"):
        print ("Q Computation: %s" % str(ve-vs))
        print ("Q Magnitude: %s" % str(me-ms))
    else:
        print ("Vorticity Computation: %s" % str(ve-vs))
        print ("Vorticity Magnitude: %s" % str(me-ms))
    print ("Threshold: %s" % str(te-ts))
    print ("Write %s" % str(we-ws))
    print ("Total time: %s" % str(we-rs))
    if (result):
        p["message"] = "Success"
        p["computetime"] = str(we-rs)
    return p #return the packet
Example #28
0
  def apply(self, ijkPoints):
    kernelSizePixel = self.getKernelSizePixel()
    if kernelSizePixel[0]<=0 and kernelSizePixel[1]<=0 and kernelSizePixel[2]<=0:
      return

    qt.QApplication.setOverrideCursor(qt.Qt.WaitCursor)

    # Get parameter set node
    parameterSetNode = self.scriptedEffect.parameterSetNode()

    # Get parameters
    minimumThreshold = self.scriptedEffect.doubleParameter("MinimumThreshold")
    maximumThreshold = self.scriptedEffect.doubleParameter("MaximumThreshold")

    # Get modifier labelmap
    modifierLabelmap = self.scriptedEffect.defaultModifierLabelmap()

    # Get master volume image data
    masterImageData = self.scriptedEffect.masterVolumeImageData()

    # Set intensity range
    oldMasterVolumeIntensityMask = parameterSetNode.GetMasterVolumeIntensityMask()
    parameterSetNode.MasterVolumeIntensityMaskOn()
    oldIntensityMaskRange = parameterSetNode.GetMasterVolumeIntensityMaskRange()
    intensityRange = [265.00, 1009.00]
    if oldMasterVolumeIntensityMask:
      intensityRange = [max(oldIntensityMaskRange[0], minimumThreshold), min(oldIntensityMaskRange[1], maximumThreshold)]
    parameterSetNode.SetMasterVolumeIntensityMaskRange(intensityRange)

    roiNode = lumbarSeed ##self.roiSelector.currentNode()
    clippedMasterImageData = masterImageData
    if roiNode is not None:
      worldToImageMatrix = vtk.vtkMatrix4x4()
      masterImageData.GetWorldToImageMatrix(worldToImageMatrix)

      bounds = [0,0,0,0,0,0]
      roiNode.GetRASBounds(bounds)
      corner1RAS = [bounds[0], bounds[2], bounds[4], 1]
      corner1IJK = [0, 0, 0, 0]
      worldToImageMatrix.MultiplyPoint(corner1RAS, corner1IJK)

      corner2RAS = [bounds[1], bounds[3], bounds[5], 1]
      corner2IJK = [0, 0, 0, 0]
      worldToImageMatrix.MultiplyPoint(corner2RAS, corner2IJK)

      extent = [0, -1, 0, -1, 0, -1]
      for i in range(3):
          lowerPoint = min(corner1IJK[i], corner2IJK[i])
          upperPoint = max(corner1IJK[i], corner2IJK[i])
          extent[2*i] = int(math.floor(lowerPoint))
          extent[2*i+1] = int(math.ceil(upperPoint))

      imageToWorldMatrix = vtk.vtkMatrix4x4()
      masterImageData.GetImageToWorldMatrix(imageToWorldMatrix)
      clippedMasterImageData = slicer.vtkOrientedImageData()
      self.padder = vtk.vtkImageConstantPad()
      self.padder.SetInputData(masterImageData)
      self.padder.SetOutputWholeExtent(extent)
      self.padder.Update()
      clippedMasterImageData.ShallowCopy(self.padder.GetOutput())
      clippedMasterImageData.SetImageToWorldMatrix(imageToWorldMatrix)

    # Pipeline
    self.thresh = vtk.vtkImageThreshold()
    self.thresh.SetInValue(LABEL_VALUE)
    self.thresh.SetOutValue(BACKGROUND_VALUE)
    self.thresh.SetInputData(clippedMasterImageData)
    self.thresh.ThresholdBetween(minimumThreshold, maximumThreshold)
    self.thresh.SetOutputScalarTypeToUnsignedChar()
    self.thresh.Update()

    self.erode = vtk.vtkImageDilateErode3D()
    self.erode.SetInputConnection(self.thresh.GetOutputPort())
    self.erode.SetDilateValue(BACKGROUND_VALUE)
    self.erode.SetErodeValue(LABEL_VALUE)
    self.erode.SetKernelSize(
      kernelSizePixel[0],
      kernelSizePixel[1],
      kernelSizePixel[2])

    self.erodeCast = vtk.vtkImageCast()
    self.erodeCast.SetInputConnection(self.erode.GetOutputPort())
    self.erodeCast.SetOutputScalarTypeToUnsignedInt()
    self.erodeCast.Update()

    # Remove small islands
    self.islandMath = vtkITK.vtkITKIslandMath()
    self.islandMath.SetInputConnection(self.erodeCast.GetOutputPort())
    self.islandMath.SetFullyConnected(False)
    self.islandMath.SetMinimumSize(125)  # remove regions smaller than 5x5x5 voxels

    self.islandThreshold = vtk.vtkImageThreshold()
    self.islandThreshold.SetInputConnection(self.islandMath.GetOutputPort())
    self.islandThreshold.ThresholdByLower(BACKGROUND_VALUE)
    self.islandThreshold.SetInValue(BACKGROUND_VALUE)
    self.islandThreshold.SetOutValue(LABEL_VALUE)
    self.islandThreshold.SetOutputScalarTypeToUnsignedChar()
    self.islandThreshold.Update()

    # Points may be outside the region after it is eroded.
    # Snap the points to LABEL_VALUE voxels,
    snappedIJKPoints = self.snapIJKPointsToLabel(ijkPoints, self.islandThreshold.GetOutput())
    if snappedIJKPoints.GetNumberOfPoints() == 0:
      qt.QApplication.restoreOverrideCursor()
      return

    # Convert points to real data coordinates. Required for vtkImageThresholdConnectivity.
    seedPoints = vtk.vtkPoints()
    origin = masterImageData.GetOrigin()
    spacing = masterImageData.GetSpacing()
    for i in range(snappedIJKPoints.GetNumberOfPoints()):
      ijkPoint = snappedIJKPoints.GetPoint(i)
      seedPoints.InsertNextPoint(
        origin[0]+ijkPoint[0]*spacing[0],
        origin[1]+ijkPoint[1]*spacing[1],
        origin[2]+ijkPoint[2]*spacing[2])

    segmentationAlgorithm = self.scriptedEffect.parameter(SEGMENTATION_ALGORITHM_PARAMETER_NAME)
    if segmentationAlgorithm == SEGMENTATION_ALGORITHM_MASKING:
      self.runMasking(seedPoints, self.islandThreshold.GetOutput(), modifierLabelmap)

    else:
      self.floodFillingFilterIsland = vtk.vtkImageThresholdConnectivity()
      self.floodFillingFilterIsland.SetInputConnection(self.islandThreshold.GetOutputPort())
      self.floodFillingFilterIsland.SetInValue(SELECTED_ISLAND_VALUE)
      self.floodFillingFilterIsland.ReplaceInOn()
      self.floodFillingFilterIsland.ReplaceOutOff()
      self.floodFillingFilterIsland.ThresholdBetween(265.00, 1009.00)
      self.floodFillingFilterIsland.SetSeedPoints(seedPoints)
      self.floodFillingFilterIsland.Update()

      self.maskCast = vtk.vtkImageCast()
      self.maskCast.SetInputData(self.thresh.GetOutput())
      self.maskCast.SetOutputScalarTypeToUnsignedChar()
      self.maskCast.Update()

      self.imageMask = vtk.vtkImageMask()
      self.imageMask.SetInputConnection(self.floodFillingFilterIsland.GetOutputPort())
      self.imageMask.SetMaskedOutputValue(OUTSIDE_THRESHOLD_VALUE)
      self.imageMask.SetMaskInputData(self.maskCast.GetOutput())
      self.imageMask.Update()

      imageMaskOutput = slicer.vtkOrientedImageData()
      imageMaskOutput.ShallowCopy(self.imageMask.GetOutput())
      imageMaskOutput.CopyDirections(clippedMasterImageData)

      imageToWorldMatrix = vtk.vtkMatrix4x4()
      imageMaskOutput.GetImageToWorldMatrix(imageToWorldMatrix)

      segmentOutputLabelmap = slicer.vtkOrientedImageData()
      if segmentationAlgorithm == SEGMENTATION_ALGORITHM_GROWCUT:
        self.runGrowCut(clippedMasterImageData, imageMaskOutput, segmentOutputLabelmap)
      elif segmentationAlgorithm == SEGMENTATION_ALGORITHM_WATERSHED:
        self.runWatershed(clippedMasterImageData, imageMaskOutput, segmentOutputLabelmap)
      else:
        logging.error("Unknown segmentation algorithm: \"" + segmentationAlgorithm + "\"")

      segmentOutputLabelmap.SetImageToWorldMatrix(imageToWorldMatrix)

      self.selectedSegmentThreshold = vtk.vtkImageThreshold()
      self.selectedSegmentThreshold.SetInputData(segmentOutputLabelmap)
      self.selectedSegmentThreshold.ThresholdBetween(SELECTED_ISLAND_VALUE, SELECTED_ISLAND_VALUE)
      self.selectedSegmentThreshold.SetInValue(LABEL_VALUE)
      self.selectedSegmentThreshold.SetOutValue(BACKGROUND_VALUE)
      self.selectedSegmentThreshold.SetOutputScalarType(modifierLabelmap.GetScalarType())
      self.selectedSegmentThreshold.Update()
      modifierLabelmap.ShallowCopy(self.selectedSegmentThreshold.GetOutput())

    self.scriptedEffect.saveStateForUndo()
    self.scriptedEffect.modifySelectedSegmentByLabelmap(modifierLabelmap, slicer.qSlicerSegmentEditorAbstractEffect.ModificationModeAdd)

    parameterSetNode.SetMasterVolumeIntensityMask(oldMasterVolumeIntensityMask)
    parameterSetNode.SetMasterVolumeIntensityMaskRange(oldIntensityMaskRange)

    qt.QApplication.restoreOverrideCursor()
Example #29
0
t.SetInputData(mag.GetOutput())
t.SetInputArrayToProcess(0,0,0, mag.GetOutput().FIELD_ASSOCIATION_POINTS, "Magnitude")
#t.ThresholdByUpper(44.79)
t.ThresholdByUpper(22.39)
#t.ThresholdByUpper(67.17)

#Set values in range to 1 and values out of range to 0
#t.SetInValue(1)
t.SetOutValue(0)
#t.ReplaceInOn()
t.ReplaceOutOn()
t.Update()

rt = t.GetOutput()

d = vtk.vtkImageDilateErode3D()
d.SetInputData(t.GetOutput())
d.SetKernelSize(3,3,3)
d.SetDilateValue(1)
d.SetErodeValue(0)
d.Update()

iis = vtk.vtkImageToImageStencil()
iis.SetInputData(d.GetOutput())
iis.ThresholdByUpper(1)
stencil = vtk.vtkImageStencil()
stencil.SetInputConnection(2, iis.GetOutputPort())
image.GetPointData().RemoveArray("Vorticity")
image.GetPointData().SetScalars(image.GetPointData().GetVectors())
stencil.SetInputData(image)
stencil.Update()
  def onApply(self):

    self.scriptedEffect.saveStateForUndo()

    # Get modifier labelmap and parameters
    modifierLabelmap = self.scriptedEffect.defaultModifierLabelmap()
    selectedSegmentLabelmap = self.scriptedEffect.selectedSegmentLabelmap()

    shellMode = self.scriptedEffect.parameter("ShellMode")

    marginSizeMm = self.scriptedEffect.doubleParameter("MarginSizeMm")
    kernelSizePixel = self.getKernelSizePixel()
    if shellMode == MEDIAL_SURFACE:
      # both erosion and dilation will be applied, so kernel size must be half on each side
      kernelSizePixel = [int(kernelSizePixel[0],2), int(kernelSizePixel[1],2), int(kernelSizePixel[2],2)]

    # We need to know exactly the value of the segment voxels, apply threshold to make force the selected label value
    labelValue = 1
    backgroundValue = 0
    thresh = vtk.vtkImageThreshold()
    thresh.SetInputData(selectedSegmentLabelmap)
    thresh.ThresholdByLower(0)
    thresh.SetInValue(backgroundValue)
    thresh.SetOutValue(labelValue)
    thresh.SetOutputScalarType(selectedSegmentLabelmap.GetScalarType())
    thresh.Update()

    subtract = vtk.vtkImageMathematics()
    subtract.SetOperationToSubtract()

    if shellMode == INSIDE_SURFACE or shellMode == MEDIAL_SURFACE:
      dilate = vtk.vtkImageDilateErode3D()
      dilate.SetInputConnection(thresh.GetOutputPort())
      dilate.SetDilateValue(labelValue)
      dilate.SetErodeValue(backgroundValue)
      dilate.SetKernelSize(kernelSizePixel[0],kernelSizePixel[1],kernelSizePixel[2])
      dilate.Update()
      subtract.SetInput1Data(dilate.GetOutput())
    else:
      subtract.SetInput1Data(thresh.GetOutput())

    if shellMode == OUTSIDE_SURFACE or shellMode == MEDIAL_SURFACE:
      erode = vtk.vtkImageDilateErode3D()
      erode.SetInputConnection(thresh.GetOutputPort())
      erode.SetDilateValue(backgroundValue)
      erode.SetErodeValue(labelValue)
      erode.SetKernelSize(kernelSizePixel[0],kernelSizePixel[1],kernelSizePixel[2])
      erode.Update()
      subtract.SetInput2Data(erode.GetOutput())
    else:
      subtract.SetInput2Data(thresh.GetOutput())

    # This can be a long operation - indicate it to the user
    qt.QApplication.setOverrideCursor(qt.Qt.WaitCursor)

    subtract.Update()
    modifierLabelmap.DeepCopy(subtract.GetOutput())

    # Apply changes
    self.scriptedEffect.modifySelectedSegmentByLabelmap(modifierLabelmap, slicer.qSlicerSegmentEditorAbstractEffect.ModificationModeSet)

    qt.QApplication.restoreOverrideCursor()
Example #31
0
  def onApply(self):

    self.scriptedEffect.saveStateForUndo()

    # Get modifier labelmap and parameters
    modifierLabelmap = self.scriptedEffect.defaultModifierLabelmap()
    selectedSegmentLabelmap = self.scriptedEffect.selectedSegmentLabelmap()

    # We need to know exactly the value of the segment voxels, apply threshold to make force the selected label value
    labelValue = 1
    backgroundValue = 0
    thresh = vtk.vtkImageThreshold()
    thresh.SetInputData(selectedSegmentLabelmap)
    thresh.ThresholdByLower(0)
    thresh.SetInValue(backgroundValue)
    thresh.SetOutValue(labelValue)
    thresh.SetOutputScalarType(selectedSegmentLabelmap.GetScalarType())
    thresh.Update()

    subtract = vtk.vtkImageMathematics()
    subtract.SetOperationToSubtract()
    kernelSizePixel = self.getKernelSizePixel()
    shellMode = self.scriptedEffect.parameter("ShellMode")
    if shellMode == MEDIAL_SURFACE:
      dilateKernelSizePixel = [int((kernelSizePixel[i]+1.0)/4.0)*2+1 for i in range(3)]
      erodeKernelSizePixel = [int((kernelSizePixel[i]-1.0)/4.0)*2+1 for i in range(3)]
    elif shellMode == INSIDE_SURFACE:
      dilateKernelSizePixel = kernelSizePixel
      erodeKernelSizePixel = [1, 1, 1]
    elif shellMode == OUTSIDE_SURFACE:
      dilateKernelSizePixel = [1, 1, 1]
      erodeKernelSizePixel = kernelSizePixel

    if dilateKernelSizePixel[0]>1 or dilateKernelSizePixel[1]>1 or dilateKernelSizePixel[2]>1:
      dilate = vtk.vtkImageDilateErode3D()
      dilate.SetInputConnection(thresh.GetOutputPort())
      dilate.SetDilateValue(labelValue)
      dilate.SetErodeValue(backgroundValue)
      dilate.SetKernelSize(*dilateKernelSizePixel)
      dilate.Update()
      subtract.SetInput1Data(dilate.GetOutput())
    else:
      subtract.SetInput1Data(thresh.GetOutput())

    if erodeKernelSizePixel[0]>1 or erodeKernelSizePixel[1]>1 or erodeKernelSizePixel[2]>1:
      erode = vtk.vtkImageDilateErode3D()
      erode.SetInputConnection(thresh.GetOutputPort())
      erode.SetDilateValue(backgroundValue)
      erode.SetErodeValue(labelValue)
      erode.SetKernelSize(*erodeKernelSizePixel)
      erode.Update()
      subtract.SetInput2Data(erode.GetOutput())
    else:
      subtract.SetInput2Data(thresh.GetOutput())

    # This can be a long operation - indicate it to the user
    qt.QApplication.setOverrideCursor(qt.Qt.WaitCursor)

    subtract.Update()
    modifierLabelmap.DeepCopy(subtract.GetOutput())

    # Apply changes
    self.scriptedEffect.modifySelectedSegmentByLabelmap(modifierLabelmap, slicer.qSlicerSegmentEditorAbstractEffect.ModificationModeSet)

    qt.QApplication.restoreOverrideCursor()