def __init__(self, module_manager): SimpleVTKClassModuleBase.__init__( self, module_manager, vtk.vtkImageDilateErode3D(), 'Processing.', ('vtkImageData',), ('vtkImageData',), replaceDoc=True, inputFunctions=None, outputFunctions=None)
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 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()
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()
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)
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())
def __init__(self, module_manager): SimpleVTKClassModuleBase.__init__(self, module_manager, vtk.vtkImageDilateErode3D(), 'Processing.', ('vtkImageData', ), ('vtkImageData', ), replaceDoc=True, inputFunctions=None, outputFunctions=None)
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
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
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
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 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
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()
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()
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
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 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 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
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()
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()
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()