def performLaplaceOfGaussian(self, image):
        '''
        '''

        gaussian = vtk.vtkImageGaussianSmooth()
        gaussian.SetInputData(image)
        gaussian.Update()

        laplacian = vtk.vtkImageLaplacian()
        laplacian.SetInputData(gaussian.GetOutput())
        laplacian.Update()

        outImageData = vtk.vtkImageData()
        outImageData.DeepCopy(laplacian.GetOutput())

        return outImageData
Esempio n. 2
0
    def performLaplaceOfGaussian( self, image ):
        '''
        '''

        gaussian = vtk.vtkImageGaussianSmooth()
        gaussian.SetInputData( image )
        gaussian.Update()

        laplacian = vtk.vtkImageLaplacian()
        laplacian.SetInputData( gaussian.GetOutput() )
        laplacian.Update()

        outImageData = vtk.vtkImageData()
        outImageData.DeepCopy( laplacian.GetOutput() )

        return outImageData
    def filtro(self):

        escenafiltro = slicer.mrmlScene
        #Se recupera la escena cargada
        volumen4Dfiltro = self.inputSelector3.currentNode()
        imagenvtk4Dfiltro = volumen4Dfiltro.GetImageData()
        numero_imagenes = volumen4Dfiltro.GetNumberOfFrames()
        for i in range(0, numero_imagenes, 1):
            #extraer la imagen movil
            extract2 = vtk.vtkImageExtractComponents()
            extract2.SetInputData(imagenvtk4Dfiltro)
            extract2.SetComponents(i)
            extract2.Update()
            filtroGaussiano = vtk.vtkImageGaussianSmooth()

            filtroGaussiano.SetStandardDeviation(1, 1, 1)
            filtroGaussiano.SetInputData(extract2.GetOutput())
            filtroGaussiano.Update()

            ras2ijk = vtk.vtkMatrix4x4()
            ijk2ras = vtk.vtkMatrix4x4()

            volumen4Dfiltro.GetRASToIJKMatrix(ras2ijk)
            volumen4Dfiltro.GetIJKToRASMatrix(ijk2ras)

            volSalida = slicer.vtkMRMLScalarVolumeNode()
            volSalida.SetAndObserveImageData(filtroGaussiano.GetOutput())

            volSalida.SetRASToIJKMatrix(ras2ijk)
            volSalida.SetIJKToRASMatrix(ijk2ras)
            slicer.mrmlScene.AddNode(volSalida)

            slicer.util.saveNode(
                volSalida, 'filtrado' + str(i + 1) + '.nrrd'
            )  #se guarda el volumen registrado en la carpeta de documentos
            print("ya filtre" + str(i))
Esempio n. 4
0
    def createSyntheticDose(self, doseVolumeNode, radius, value):
        """
    Run the actual algorithm
    """

        roiSphere = vtk.vtkSphere()
        roiCenter = [0, 0, 0]
        roiOrigin = [0, 0, 0]
        roiSpacing = [1, 1, 1]
        roiDimension = [100, 100, 100]
        # roiDimension = refVolumeNode.GetImageData().GetDimensions()
        roiCenter[0] = roiOrigin[0] + roiDimension[0] * roiSpacing[0] / 2
        roiCenter[1] = roiOrigin[1] + roiDimension[1] * roiSpacing[1] / 2
        roiCenter[2] = roiOrigin[2] + roiDimension[2] * roiSpacing[2] / 2
        print "roiCenter", roiCenter
        """
    ijkToRas = vtk.vtkMatrix4x4()
    refVolumeNode.GetIJKToRASMatrix( ijkToRas )
    roiPoint = [0,0,0,1];
    roiPoint[0] = roiCenter[0]
    roiPoint[1] = roiCenter[1]
    roiPoint[2] = roiCenter[2]
    roiPoint = ijkToRas.MultiplyPoint(roiPoint)
    roiCenter[0] = roiPoint[0]
    roiCenter[1] = roiPoint[1]
    roiCenter[2] = roiPoint[2]
    print "roiCenter", roiCenter
    """
        roiSphere.SetCenter(roiCenter)
        roiSphere.SetRadius(radius + 5)

        # Determine the transform between the box and the image IJK coordinate systems

        rasToSphere = vtk.vtkMatrix4x4()
        # if roiNode.GetTransformNodeID() != None:
        # roiSphereTransformNode = slicer.mrmlScene.GetNodeByID(roiNode.GetTransformNodeID())
        # sphereToRas = vtk.vtkMatrix4x4()
        # roiSphereTransformNode.GetMatrixTransformToWorld(sphereToRas)
        # rasToSphere.DeepCopy(sphereToRas)
        # rasToSphere.Invert()
        """
    ijkToSphere = vtk.vtkMatrix4x4()
    vtk.vtkMatrix4x4.Multiply4x4(rasToSphere,ijkToRas,ijkToSphere)
    ijkToSphereTransform = vtk.vtkTransform()
    ijkToSphereTransform.SetMatrix(ijkToSphere)
    roiSphere.SetTransform(ijkToSphereTransform)
    """

        # Use the stencil to fill the volume
        # refImageData = refVolumeNode.GetImageData()

        imageSource = vtk.vtkImageNoiseSource()
        imageSource.SetMinimum(0)
        imageSource.SetMaximum(0)
        # extent = refImageData.GetWholeExtent()
        imageSource.SetWholeExtent(0, roiDimension[0] - 1, 0,
                                   roiDimension[1] - 1, 0, roiDimension[2] - 1)
        imageSource.Update()
        """
    changeInfo = vtk.vtkImageChangeInformation()
    changeInfo.SetInputData(imageSource.GetOutput())
    changeInfo.SetOutputOrigin(refImageData.GetOrigin())
    changeInfo.SetOutputSpacing(refImageData.GetSpacing())
    changeInfo.Update()
    """

        # Convert the implicit function to a stencil
        functionToStencil = vtk.vtkImplicitFunctionToImageStencil()
        functionToStencil.SetInput(roiSphere)
        functionToStencil.SetOutputOrigin(0, 0, 0)
        functionToStencil.SetOutputSpacing(1, 1, 1)
        functionToStencil.SetOutputWholeExtent(0, roiDimension[0] - 1, 0,
                                               roiDimension[1] - 1, 0,
                                               roiDimension[2] - 1)
        functionToStencil.Update()

        # Apply the stencil to the volume
        stencilToImage = vtk.vtkImageStencil()
        stencilToImage.SetInputData(imageSource.GetOutput())
        stencilToImage.SetStencilData(functionToStencil.GetOutput())
        stencilToImage.ReverseStencilOn()
        stencilToImage.SetBackgroundValue(value)
        stencilToImage.Update()

        smooth = vtk.vtkImageGaussianSmooth()
        smooth.SetInputData(stencilToImage.GetOutput())
        smooth.SetStandardDeviations(2.8, 2.8,
                                     2.8)  # place to change gradient size.
        smooth.SetRadiusFactors(3, 3, 3)
        smooth.SetDimensionality(3)
        smooth.Update()
        """
    resample = vtk.vtkImageReslice()
    resample.SetInputData(smooth.GetOutput())
    resample.SetOutputOrigin(refImageData.GetOrigin())
    resample.SetOutputSpacing(refImageData.GetSpacing()[0]/2, refImageData.GetSpacing()[1]/2, refImageData.GetSpacing()[2]/2 )
    resample.SetOutputExtent(extent[0], (extent[1]-extent[0])*2-1, 
                             extent[2], (extent[3]-extent[2])*2-1, 
                             extent[4], (extent[5]-extent[4])*2-1)
                             
    resample.Update()
    
    changeInfo2 = vtk.vtkImageChangeInformation()
    changeInfo2.SetInputData(resample.GetOutput())
    changeInfo2.SetOutputOrigin(refImageData.GetOrigin())
    changeInfo2.SetOutputSpacing(refImageData.GetSpacing())
    changeInfo2.Update()
    """

        # Update the volume with the stencil operation result
        doseVolumeNode.SetAndObserveImageData(smooth.GetOutput())
        doseVolumeNode.SetOrigin(0, 0, 0)
        doseVolumeNode.SetSpacing(1, 1, 1)
        # doseVolumeNode.CopyOrientation(refVolumeNode)
        doseVolumeNode.SetAttribute("DicomRtImport.DoseVolume", "1")

        mgr = slicer.app.layoutManager()
        mgr.sliceWidget(
            'Red').sliceLogic().GetSliceCompositeNode().SetBackgroundVolumeID(
                doseVolumeNode.GetID())
        mgr.sliceWidget('Yellow').sliceLogic().GetSliceCompositeNode(
        ).SetBackgroundVolumeID(doseVolumeNode.GetID())
        mgr.sliceWidget('Green').sliceLogic().GetSliceCompositeNode(
        ).SetBackgroundVolumeID(doseVolumeNode.GetID())
  def runCaliper(self):

    inputVolume = self.inputSelector.currentNode()
    if not (inputVolume):
      qt.QMessageBox.critical(
          slicer.util.mainWindow(),
          'Deploy Caliper', 'Input volume is required for calculation.')
      return

# If coordinates modified, use for calculation

    if self.coordinatesWidgetModified:
      widgetPointsList = slicer.vtkMRMLMarkupsFiducialNode()
      widgetPointsList.SetName('WPL')

   #   widgetNode = slicer.util.getNode('WPL')
      slicer.mrmlScene.AddNode(widgetPointsList)
      
   #  Grab first widget coordinate and display
      print "PointNum1 is: "
      pointNum1Str = (str(self.c1Select.coordinates)).split(",")
      pointNum1 = [float(i) for i in pointNum1Str]
      print pointNum1

      widgetPointsList.AddFiducial(pointNum1[0], pointNum1[1], pointNum1[2], 'WP-1')

      
   #  Grab second widget coordinate and display
      print "PointNum2 is: "
      pointNum2Str = (str(self.c2Select.coordinates)).split(",")
      pointNum2 = [float(i) for i in pointNum2Str]
      print pointNum2
          
      widgetPointsList.AddFiducial(pointNum2[0], pointNum2[1], pointNum2[2], 'WP-2')
      
  #   Center the slices on Point 1
      slicer.modules.markups.logic().JumpSlicesToLocation(pointNum1[0], pointNum1[1], pointNum1[2], True)

  #   Calculate distance in mm and print to console
      distanceValue = math.sqrt( math.pow((pointNum1[0] - pointNum2[0]), 2) + math.pow((pointNum1[1] - pointNum2[1]), 2) + math.pow((pointNum1[2] - pointNum2[2]), 2))

      self.distUpdate.setText("Distance: %.2f mm" % distanceValue)

  #   Add a ruler
      rulerNode = slicer.vtkMRMLAnnotationRulerNode()
      rulerNode.SetDistanceAnnotationVisibility(1)
      rulerNode.SetPosition1(pointNum1[0], pointNum1[1], pointNum1[2])
      rulerNode.SetPosition2(pointNum2[0], pointNum2[1], pointNum2[2])
      rulerNode.SetName('Distance 1')
      rulerNode.SetDistanceAnnotationVisibility(False)
      rulerNode.Initialize(slicer.mrmlScene)

      self.coordinatesWidgetModified = False

    else:

  #   Get interactive coordinates, if any
      intNode1 = slicer.util.getNode('IP1')
      intNode2 = slicer.util.getNode('IP2')
      if ((intNode1.GetNumberOfFiducials() == 1) and (intNode2.GetNumberOfFiducials() == 1)):
        z3point1 = [0.0, 0.0, 0.0]
        z3point2 = [0.0, 0.0, 0.0]
        intNode1.GetNthFiducialPosition(0, z3point1)
        intNode2.GetNthFiducialPosition(0, z3point2)
        print "Interactive Point 1:"
        print z3point1
        print "Interactive Point 2:"
        print z3point2
        interactiveDistance = math.sqrt( math.pow((z3point1[0] - z3point2[0]), 2) + math.pow((z3point1[1] - z3point2[1]), 2) + math.pow((z3point1[2] - z3point2[2]), 2))    
        self.intDistUpdate.setText("Distance: %.2f mm" % interactiveDistance)

        intRulerNode = slicer.vtkMRMLAnnotationRulerNode()
        intRulerNode.SetDistanceAnnotationVisibility(1)
        intRulerNode.SetPosition1(z3point1[0], z3point1[1], z3point1[2])
        intRulerNode.SetPosition2(z3point2[0], z3point2[1], z3point2[2])
        intRulerNode.SetName('Distance 2')
        intRulerNode.SetDistanceAnnotationVisibility(False)
        intRulerNode.Initialize(slicer.mrmlScene)     

#   Blur if checkbox is checked
    if self.blur.isChecked():
      gauss = vtk.vtkImageGaussianSmooth()
      gauss.SetInputData(inputVolume.GetImageData())
      gauss.SetDimensionality(3)
      
      fwhmValue = .01 * distanceValue
      gauss.SetStandardDeviation(fwhmValue)
      gauss.Update()
      
      ijkToRAS = vtk.vtkMatrix4x4()
      inputVolume.GetIJKToRASMatrix(ijkToRAS)
      inputVolume.SetAndObserveImageData(gauss.GetOutput())