Esempio n. 1
0
    def compare_png_images(self, image1_filename, image2_filename,
                           threshold=16, allow_shift=False):

        """Compare two PNG images on disc.  No two pixels may differ with more
        than the default threshold.
        """

        import vtk

        r1 = vtk.vtkPNGReader()
        r1.SetFileName(image1_filename)
        r1.Update()
        
        r2 = vtk.vtkPNGReader()
        r2.SetFileName(image2_filename)
        r2.Update()

        # there's a bug in VTK 5.0.1 where input images of unequal size
        # (depending on which input is larger) will cause a segfault
        # see http://www.vtk.org/Bug/bug.php?op=show&bugid=3586
        # se we check for that situation and bail if it's the case
        if r1.GetOutput().GetDimensions() != r2.GetOutput().GetDimensions():
            em = 'Input images %s and %s are not of equal size.' % \
                 (image1_filename, image2_filename)
            raise RuntimeError, em

        # sometimes PNG files have an ALPHA component we have to chuck away
        # do this for both images
        ec1 = vtk.vtkImageExtractComponents()
        ec1.SetComponents(0,1,2)
        ec1.SetInput(r1.GetOutput())
        
        ec2 = vtk.vtkImageExtractComponents()
        ec2.SetComponents(0,1,2)
        ec2.SetInput(r2.GetOutput())

        idiff = vtk.vtkImageDifference()
        idiff.SetThreshold(threshold)

        if allow_shift:
            idiff.AllowShiftOn()
        else:
            idiff.AllowShiftOff()

        idiff.SetImage(ec1.GetOutput())
        idiff.SetInputConnection(ec2.GetOutputPort())

        idiff.Update()

        return idiff.GetThresholdedError()
    def __init__(self, source, component):
        """
		Initialization
		"""
        DataSource.__init__(self)
        self.source = source
        self.component = component
        self.extract = vtk.vtkImageExtractComponents()
        self.extract.SetComponents(self.component)
        self.setPath = source.setPath
        self.getPath = source.getPath
        self.setMask = source.setMask
        self.getSpacing = source.getSpacing
        self.getVoxelSize = source.getVoxelSize
        self.setResampleDimensions = source.setResampleDimensions
        self.getOriginalScalarRange = source.getOriginalScalarRange
        self.getOriginalDimensions = source.getOriginalDimensions
        self.getResampleFactors = source.getResampleFactors
        self.getResampledVoxelSize = source.getResampledVoxelSize
        self.getResampleDimensions = source.getResampleDimensions
        self.setIntensityScale = source.setIntensityScale
        self.getIntensityScaledData = source.getIntensityScaledData
        self.getResampledData = source.getResampledData
        self.getEmissionWavelength = source.getEmissionWavelength
        self.getExcitationWavelength = source.getExcitationWavelength
        self.getNumericalAperture = source.getNumericalAperture
        self.getDataSetCount = source.getDataSetCount
        self.getFileName = source.getFileName
        self.getDimensions = source.getDimensions
        self.getScalarRange = source.getScalarRange
        self.ctf = None
 def __init__(self, module_manager):
     SimpleVTKClassModuleBase.__init__(
         self, module_manager,
         vtk.vtkImageExtractComponents(), 'Processing.',
         ('vtkImageData',), ('vtkImageData',),
         replaceDoc=True,
         inputFunctions=None, outputFunctions=None)
Esempio n. 4
0
 def onApply(self):
   inputVolume = self.inputSelector.currentNode()
   outputVolume = self.outputSelector.currentNode()
   # check for input data
   if not (inputVolume and outputVolume):
     slicer.util.errorDisplay('Input and output volumes are required for conversion', windowTitle='Luminance')
     return
   # check that data has enough components
   inputImage = inputVolume.GetImageData()
   if not inputImage or inputImage.GetNumberOfScalarComponents() < 3:
     slicer.util.errorDisplay('Input does not have enough components for conversion',
                              windowTitle='Vector to Scalar Volume')
     return
   # run the filter
   # - extract the RGB portions
   extract = vtk.vtkImageExtractComponents()
   extract.SetComponents(0,1,2)
   luminance = vtk.vtkImageLuminance()
   extract.SetInputConnection(inputVolume.GetImageDataConnection())
   luminance.SetInputConnection(extract.GetOutputPort())
   luminance.Update()
   ijkToRAS = vtk.vtkMatrix4x4()
   inputVolume.GetIJKToRASMatrix(ijkToRAS)
   outputVolume.SetIJKToRASMatrix(ijkToRAS)
   outputVolume.SetImageDataConnection(luminance.GetOutputPort())
   # make the output volume appear in all the slice views
   selectionNode = slicer.app.applicationLogic().GetSelectionNode()
   selectionNode.SetReferenceActiveVolumeID(outputVolume.GetID())
   slicer.app.applicationLogic().PropagateVolumeSelection(0)
Esempio n. 5
0
    def __init__(self, module_manager):
        ModuleBase.__init__(self, module_manager)

        self._extract = vtk.vtkImageExtractComponents()

        module_utils.setup_vtk_object_progress(self, self._extract,
                                           'Extracting components.')
        

        self._config.component1 = 0
        self._config.component2 = 1
        self._config.component3 = 2
        self._config.numberOfComponents = 1
        self._config.fileLowerLeft = False

        configList = [
            ('Component 1:', 'component1', 'base:int', 'text',
             'Zero-based index of first component to extract.'),
            ('Component 2:', 'component2', 'base:int', 'text',
             'Zero-based index of second component to extract.'),
            ('Component 3:', 'component3', 'base:int', 'text',
             'Zero-based index of third component to extract.'),
            ('Number of components:', 'numberOfComponents', 'base:int',
             'choice',
             'Number of components to extract.  Only this number of the '
             'above-specified component indices will be used.',
             ('1', '2', '3'))]

        ScriptedConfigModuleMixin.__init__(
            self, configList,
            {'Module (self)' : self,
             'vtkImageExtractComponents' : self._extract})

        self.sync_module_logic_with_config()
Esempio n. 6
0
    def __init__(self, binsCount, reader):
        self.Reader = reader
        self.BinsCount = binsCount
        self.BinStep = 0
        self.ScalarRange = [0, 0]
        self.FreqArray = vtk.vtkDataArray.CreateDataArray(vtk.VTK_INT)
        self.FreqArray.SetNumberOfComponents(1)

        extract = vtk.vtkImageExtractComponents()
        extract.SetInputConnection(self.Reader.GetOutputPort())
        extract.SetComponents(0)
        extract.Update()
        extract.GetOutput().GetScalarRange(self.ScalarRange)

        self.BinStep = (self.ScalarRange[1] - self.ScalarRange[0]) / self.BinsCount

        histo = vtk.vtkImageAccumulate()
        histo.SetInputConnection(extract.GetOutputPort())
        histo.SetComponentExtent(0, self.BinsCount, 0, 0, 0, 0)
        histo.SetComponentOrigin(self.ScalarRange[0], 0, 0)
        histo.SetComponentSpacing(self.BinStep,  0, 0)
        histo.SetIgnoreZero(False)
        histo.Update()

        for j in range(0, self.BinsCount):
            compValue = histo.GetOutput().GetPointData().GetScalars().GetValue(j)
            self.FreqArray.InsertNextTuple1(compValue)

        lastBinValue = self.FreqArray.GetComponent(self.BinsCount - 1, 0)
        binValue = histo.GetOutput().GetPointData().GetScalars().GetValue(self.BinsCount)
        self.FreqArray.SetComponent(self.BinsCount - 1, 0, lastBinValue + binValue)
Esempio n. 7
0
 def removeAlpha(file):
     freader = vtk.vtkPNGReader()
     freader.SetFileName(file)
     removealpha = vtk.vtkImageExtractComponents()
     removealpha.SetComponents(0,1,2)
     removealpha.SetInputConnection(freader.GetOutputPort())
     removealpha.Update()
     return removealpha.GetOutput()
Esempio n. 8
0
  def compute(self, vertexShader, fragmentShader, keys={}, iterations=1):
    """Perform an iterated filter"""

    import time
    startTime = time.time()
    logging.info('-'*40)
    logging.info('Processing started')

    import ShaderComputation
    sceneShader = ShaderComputation.SceneShader.getInstance()
    sceneShader.resetFieldSamplers()
    sceneShader.updateFieldSamplers()

    volume0Texture = sceneShader.fieldSamplersByNodeID[self.volume0.GetID()]
    outputTextures = {}
    outputTextures[0] = sceneShader.fieldSamplersByNodeID[self.outputVolume.GetID()]
    outputTextures[1] = sceneShader.fieldSamplersByNodeID[self.iterationVolume.GetID()]
    self.volumeTextures = [volume0Texture,] + outputTextures.values()

    logging.info('%f Acquired renderer' % (time.time() - startTime))

    for iteration in range(iterations):
      # build the source
      keys['iteration'] = iteration
      if iteration == 0:
        keys['inputTextureUnit'] = volume0Texture.textureUnit
        keys['inputTextureUnitIdentifier'] = volume0Texture.textureUnitIdentifier()
      else:
        keys['inputTextureUnit'] = outputTextures[(iteration+1)%2].textureUnit
        keys['inputTextureUnitIdentifier'] = outputTextures[(iteration+1)%2].textureUnitIdentifier()
      sceneShader.shaderComputation.SetVertexShaderSource(vertexShader % keys)
      samplersSource = sceneShader.textureUnitDeclarationSource()
      for volumeTexture in self.volumeTextures:
        samplersSource += volumeTexture.fieldSampleSource()
      shaders = self.header + samplersSource + fragmentShader
      sceneShader.shaderComputation.SetFragmentShaderSource(shaders % keys)
      # set the target
      targetTextureImage = outputTextures[iteration%2].textureImage
      self.iteration(sceneShader, targetTextureImage)
      logging.info('%f iteration %d' % (time.time() - startTime, iteration))
      #print(sceneShader.shaderComputation.GetFragmentShaderSource())
      #break

    sceneShader.render()
    if True or self.readBackToVolumeNode:
      targetTextureImage.ReadBack()

      logging.info('%f readback finished' % (time.time() - startTime))

      extractComponents = vtk.vtkImageExtractComponents()
      extractComponents.SetInputData(targetTextureImage.GetImageData())
      extractComponents.Update()
      self.outputVolume.SetAndObserveImageData(extractComponents.GetOutputDataObject(0))
    else:
      sceneShader.render()

    logging.info('%f computation finished' % (time.time() - startTime))
    logging.info('-'*40)
  def runConversionMethodSingleComponent(self, inputVolumeNode, outputVolumeNode, componentToExtract):
    ijkToRAS = vtk.vtkMatrix4x4()
    inputVolumeNode.GetIJKToRASMatrix(ijkToRAS)
    outputVolumeNode.SetIJKToRASMatrix(ijkToRAS)

    extract = vtk.vtkImageExtractComponents()
    extract.SetInputConnection(inputVolumeNode.GetImageDataConnection())
    extract.SetComponents(componentToExtract)
    extract.Update()
    outputVolumeNode.SetImageDataConnection(extract.GetOutputPort())
def computeImageHessian(
        image=None,
        image_filename=None,
        verbose=0):

    myVTK.myPrint(verbose, "*** computeImageHessian ***")

    image = myVTK.initImage(image, image_filename, verbose-1)

    image_dimensionality = myVTK.computeImageDimensionality(
        image=image,
        verbose=verbose-1)

    image_gradient = vtk.vtkImageGradient()
    if (vtk.vtkVersion.GetVTKMajorVersion() >= 6):
        image_gradient.SetInputData(image)
    else:
        image_gradient.SetInput(image)
    image_gradient.SetDimensionality(image_dimensionality)
    image_gradient.Update()
    image_w_gradient = image_gradient.GetOutput()

    image_append_components = vtk.vtkImageAppendComponents()
    for k_dim in xrange(image_dimensionality):
        image_extract_components = vtk.vtkImageExtractComponents()
        if (vtk.vtkVersion.GetVTKMajorVersion() >= 6):
            image_extract_components.SetInputData(image_w_gradient)
        else:
            image_extract_components.SetInput(image_w_gradient)
        image_extract_components.SetComponents(k_dim)
        image_extract_components.Update()
        image_w_gradient_component = image_extract_components.GetOutput()

        image_gradient = vtk.vtkImageGradient()
        if (vtk.vtkVersion.GetVTKMajorVersion() >= 6):
            image_gradient.SetInputData(image_w_gradient_component)
        else:
            image_gradient.SetInput(image_w_gradient_component)
        image_gradient.SetDimensionality(image_dimensionality)
        image_gradient.Update()
        image_w_hessian_component = image_gradient.GetOutput()
        if (vtk.vtkVersion.GetVTKMajorVersion() >= 6):
            image_append_components.AddInputData(image_w_hessian_component)
        else:
            image_append_components.AddInput(image_w_hessian_component)

    image_append_components.Update()
    image_w_hessian = image_append_components.GetOutput()

    name = image.GetPointData().GetScalars().GetName()
    image.GetPointData().AddArray(image_w_gradient.GetPointData().GetArray(name+"Gradient"))
    image.GetPointData().AddArray(image_w_hessian.GetPointData().GetArray(name+"GradientGradient"))
    image.GetPointData().SetActiveScalars(name+"GradientGradient")

    return image
	def __init__(self):
		"""
		Initialization
		"""        
		lib.ProcessingFilter.ProcessingFilter.__init__(self, (1, 1))
		self.vtkfilter = vtk.vtkImageExtractComponents()
		self.vtkfilter.AddObserver("ProgressEvent", lib.messenger.send)
		lib.messenger.connect(self.vtkfilter, 'ProgressEvent', self.updateProgress)
		
		self.descs = {"Component1": "Component #1", "Component2": "Component #2", "Component3": "Component #3"}
		self.filterDesc = "Extracts the red and/or green and/or blue components of an RGB color image into separate greyscale channels\nInput: RGB image\nOutput: 3 grayscale images"
    def runConversionMethodLuminance(self, inputVolumeNode, outputVolumeNode):
        ijkToRAS = vtk.vtkMatrix4x4()
        inputVolumeNode.GetIJKToRASMatrix(ijkToRAS)
        outputVolumeNode.SetIJKToRASMatrix(ijkToRAS)

        extract = vtk.vtkImageExtractComponents()
        extract.SetInputConnection(inputVolumeNode.GetImageDataConnection())
        extract.SetComponents(0, 1, 2)
        luminance = vtk.vtkImageLuminance()
        luminance.SetInputConnection(extract.GetOutputPort())
        luminance.Update()
        outputVolumeNode.SetImageDataConnection(luminance.GetOutputPort())
Esempio n. 13
0
    def frequencyPassFilter(self, lowcutoff=None, highcutoff=None, order=3):
        """
        Low-pass and high-pass filtering become trivial in the frequency domain.
        A portion of the pixels/voxels are simply masked or attenuated.
        This function applies a high pass Butterworth filter that attenuates the
        frequency domain image with the function

        |G_Of_Omega|

        The gradual attenuation of the filter is important.
        A simple high-pass filter would simply mask a set of pixels in the frequency domain,
        but the abrupt transition would cause a ringing effect in the spatial domain.

        :param list lowcutoff:  the cutoff frequencies
        :param list highcutoff: the cutoff frequencies
        :param int order: order determines sharpness of the cutoff curve
        """
        #https://lorensen.github.io/VTKExamples/site/Cxx/ImageProcessing/IdealHighPass
        fft = vtk.vtkImageFFT()
        fft.SetInputData(self._data)
        fft.Update()
        out = fft.GetOutput()

        if highcutoff:
            butterworthLowPass = vtk.vtkImageButterworthLowPass()
            butterworthLowPass.SetInputData(out)
            butterworthLowPass.SetCutOff(highcutoff)
            butterworthLowPass.SetOrder(order)
            butterworthLowPass.Update()
            out = butterworthLowPass.GetOutput()

        if lowcutoff:
            butterworthHighPass = vtk.vtkImageButterworthHighPass()
            butterworthHighPass.SetInputData(out)
            butterworthHighPass.SetCutOff(lowcutoff)
            butterworthHighPass.SetOrder(order)
            butterworthHighPass.Update()
            out = butterworthHighPass.GetOutput()

        butterworthRfft = vtk.vtkImageRFFT()
        butterworthRfft.SetInputData(out)
        butterworthRfft.Update()

        butterworthReal = vtk.vtkImageExtractComponents()
        butterworthReal.SetInputData(butterworthRfft.GetOutput())
        butterworthReal.SetComponents(0)
        butterworthReal.Update()

        caster = vtk.vtkImageCast()
        caster.SetOutputScalarTypeToUnsignedChar()
        caster.SetInputData(butterworthReal.GetOutput())
        caster.Update()
        return self._update(caster.GetOutput())
Esempio n. 14
0
  def runConversionMethodLuminance(self, inputVolumeNode, outputVolumeNode):
    ijkToRAS = vtk.vtkMatrix4x4()
    inputVolumeNode.GetIJKToRASMatrix(ijkToRAS)
    outputVolumeNode.SetIJKToRASMatrix(ijkToRAS)

    extract = vtk.vtkImageExtractComponents()
    extract.SetInputConnection(inputVolumeNode.GetImageDataConnection())
    extract.SetComponents(0, 1, 2)
    luminance = vtk.vtkImageLuminance()
    luminance.SetInputConnection(extract.GetOutputPort())
    luminance.Update()
    outputVolumeNode.SetImageDataConnection(luminance.GetOutputPort())
Esempio n. 15
0
def image_from_file(fname):
    try:
        rd = vtk.vtkPNGReader()
        rd.SetFileName(fname)
        removeAlpha = vtk.vtkImageExtractComponents()
        removeAlpha.SetComponents(0, 1, 2)
        removeAlpha.SetInputConnection(rd.GetOutputPort())
        removeAlpha.Update()
        return removeAlpha.GetOutput()
    except Exception, err:
        print "Problem opening file '%s': %s" % (fname, err)
        return None
Esempio n. 16
0
def image_from_file(fname):
    try:
        rd = vtk.vtkPNGReader()
        rd.SetFileName(fname)
        removeAlpha = vtk.vtkImageExtractComponents()
        removeAlpha.SetComponents(0, 1, 2)
        removeAlpha.SetInputConnection(rd.GetOutputPort())
        removeAlpha.Update()
        return removeAlpha.GetOutput()
    except Exception, err:
        print "Problem opening file '%s': %s" % (fname, err)
        return None
Esempio n. 17
0
    def updateRendering(self):
        """
		Update the Rendering of this module
		"""
        data = self.getInput(1)
        x, y, z = self.dataUnit.getDimensions()
        data = optimize.optimize(image=data,
                                 updateExtent=(0, x - 1, 0, y - 1, 0, z - 1))
        if data.GetNumberOfScalarComponents() > 3:
            extract = vtk.vtkImageExtractComponents()
            extract.SetInput(data)
            extract.SetComponents(1, 1, 1)
            data = extract.GetOutput()
        if data.GetNumberOfScalarComponents() > 1:
            self.luminance.SetInput(data)
            data = self.luminance.GetOutput()

        z = self.parameters["Slice"]
        ext = (0, x - 1, 0, y - 1, z, z)

        voi = vtk.vtkExtractVOI()
        voi.SetVOI(ext)
        voi.SetInput(data)
        slice = voi.GetOutput()
        self.geometry.SetInput(slice)

        self.warp.SetInput(self.geometry.GetOutput())
        self.warp.SetScaleFactor(self.parameters["Scale"])
        self.merge.SetGeometry(self.warp.GetOutput())

        if slice.GetNumberOfScalarComponents() == 1:
            maptocol = vtk.vtkImageMapToColors()
            ctf = self.getInputDataUnit(1).getColorTransferFunction()
            maptocol.SetInput(slice)
            maptocol.SetLookupTable(ctf)
            maptocol.Update()
            scalars = maptocol.GetOutput()
        else:
            scalars = slice

        self.merge.SetScalars(scalars)
        data = self.merge.GetOutput()

        if self.parameters["Normals"]:
            self.normals.SetInput(data)
            self.normals.SetFeatureAngle(self.parameters["FeatureAngle"])
            print "Feature angle=", self.parameters["FeatureAngle"]
            data = self.normals.GetOutput()

        self.mapper.SetInput(data)
        self.mapper.Update()
        VisualizationModule.updateRendering(self)
        self.parent.Render()
    def runConversionMethodSingleComponent(self, inputVolumeNode,
                                           outputVolumeNode,
                                           componentToExtract):
        ijkToRAS = vtk.vtkMatrix4x4()
        inputVolumeNode.GetIJKToRASMatrix(ijkToRAS)
        outputVolumeNode.SetIJKToRASMatrix(ijkToRAS)

        extract = vtk.vtkImageExtractComponents()
        extract.SetInputConnection(inputVolumeNode.GetImageDataConnection())
        extract.SetComponents(componentToExtract)
        extract.Update()
        outputVolumeNode.SetImageDataConnection(extract.GetOutputPort())
	def updateRendering(self):
		"""
		Update the Rendering of this module
		"""
		data = self.getInput(1)
		x,y,z = self.dataUnit.getDimensions()
		data = optimize.optimize(image = data, updateExtent = (0, x-1, 0, y-1, 0, z-1))
		if data.GetNumberOfScalarComponents() > 3:
			extract = vtk.vtkImageExtractComponents()
			extract.SetInput(data)
			extract.SetComponents(1, 1, 1)
			data = extract.GetOutput()
		if data.GetNumberOfScalarComponents() > 1:
			self.luminance.SetInput(data)
			data = self.luminance.GetOutput()
		
		z = self.parameters["Slice"]
		ext = (0, x - 1, 0, y - 1, z, z)

		voi = vtk.vtkExtractVOI()
		voi.SetVOI(ext)
		voi.SetInput(data)
		slice = voi.GetOutput()
		self.geometry.SetInput(slice)         
		
		self.warp.SetInput(self.geometry.GetOutput())
		self.warp.SetScaleFactor(self.parameters["Scale"])		
		self.merge.SetGeometry(self.warp.GetOutput())
		
		if slice.GetNumberOfScalarComponents() == 1:
			maptocol = vtk.vtkImageMapToColors()
			ctf = self.getInputDataUnit(1).getColorTransferFunction()
			maptocol.SetInput(slice)
			maptocol.SetLookupTable(ctf)
			maptocol.Update()
			scalars = maptocol.GetOutput()
		else:
			scalars = slice
			
		self.merge.SetScalars(scalars)
		data = self.merge.GetOutput()
		
		if self.parameters["Normals"]:
			self.normals.SetInput(data)
			self.normals.SetFeatureAngle(self.parameters["FeatureAngle"])
			print "Feature angle=", self.parameters["FeatureAngle"]            
			data = self.normals.GetOutput()
		
		self.mapper.SetInput(data)
		self.mapper.Update()
		VisualizationModule.updateRendering(self)
		self.parent.Render()
Esempio n. 20
0
  def run(self, inputFile, enableScreenshots=0):
    """
    Run the actual algorithm
    """
    #parse logfile
    logging.info('Processing started')
    imageLogFile = LogDataObject()   #initialize log object 
    imageLogFile.ImportFromFile(inputFile)  #import image parameters of log object
    
    if not(imageLogFile.VerifyParameters()): #check that all parameters were set 
      logging.info('Failed: Log file parameters not set')
      return False
    if not(self.isValidImageFileType(imageLogFile.FileType)): #check for valid file type
      logging.info('Failed: Invalid image type')
      logging.info(imageLogFile.FileType)
      return False
    
    # read image 
    (inputDirectory,logPath) = os.path.split(inputFile)
    imageFileTemplate = os.path.join(inputDirectory, imageLogFile.Prefix + imageLogFile.SequenceStart + "." + imageLogFile.FileType)
    [success, outputVolumeNode] = slicer.util.loadVolume(imageFileTemplate, returnNode=True)
    if not(success):
      logging.info('Failed to load image')
      return False  
    #calculate image spacing
    spacing = [imageLogFile.Resolution, imageLogFile.Resolution, imageLogFile.Resolution]
    
    # if vector image, convert to scalar using luminance (0.30*R + 0.59*G + 0.11*B + 0.0*A)
    #check if loaded volume is vector type, if so convert to scalar
    if outputVolumeNode.GetClassName() =='vtkMRMLVectorVolumeNode':
      scalarVolumeNode = slicer.mrmlScene.AddNewNodeByClass('vtkMRMLScalarVolumeNode', imageLogFile.Prefix)
      scalarVolumeNode.SetSpacing(spacing)
      extractVTK = vtk.vtkImageExtractComponents()
      extractVTK.SetInputConnection(outputVolumeNode.GetImageDataConnection())
      extractVTK.SetComponents(0, 1, 2)
      luminance = vtk.vtkImageLuminance()
      luminance.SetInputConnection(extractVTK.GetOutputPort())
      luminance.Update()
      scalarVolumeNode.SetImageDataConnection(luminance.GetOutputPort()) # apply
      slicer.mrmlScene.RemoveNode(outputVolumeNode)
      slicer.util.resetSliceViews() #update the field of view
    else:
      outputVolumeNode.SetSpacing(spacing)
      outputVolumeNode.SetName(imageLogFile.Prefix)
      slicer.util.resetSliceViews() #update the field of view
    # Capture screenshot      
    if enableScreenshots:
      self.takeScreenshot('SkyscanReconImportTest-Start','MyScreenshot',-1)
    logging.info('Processing completed')

    return True
Esempio n. 21
0
def addImageHessian(image, image_dimensionality=None, verbose=0):

    mypy.my_print(verbose, "*** addImageHessian ***")

    if (image_dimensionality is None):
        image_dimensionality = myvtk.getImageDimensionality(image=image,
                                                            verbose=verbose -
                                                            1)

    image_gradient = vtk.vtkImageGradient()
    if (vtk.vtkVersion.GetVTKMajorVersion() >= 6):
        image_gradient.SetInputData(image)
    else:
        image_gradient.SetInput(image)
    image_gradient.SetDimensionality(image_dimensionality)
    image_gradient.Update()
    image_w_gradient = image_gradient.GetOutput()

    image_append_components = vtk.vtkImageAppendComponents()
    for k_dim in xrange(image_dimensionality):
        image_extract_components = vtk.vtkImageExtractComponents()
        if (vtk.vtkVersion.GetVTKMajorVersion() >= 6):
            image_extract_components.SetInputData(image_w_gradient)
        else:
            image_extract_components.SetInput(image_w_gradient)
        image_extract_components.SetComponents(k_dim)
        image_extract_components.Update()
        image_w_gradient_component = image_extract_components.GetOutput()

        image_gradient = vtk.vtkImageGradient()
        if (vtk.vtkVersion.GetVTKMajorVersion() >= 6):
            image_gradient.SetInputData(image_w_gradient_component)
        else:
            image_gradient.SetInput(image_w_gradient_component)
        image_gradient.SetDimensionality(image_dimensionality)
        image_gradient.Update()
        image_w_hessian_component = image_gradient.GetOutput()
        if (vtk.vtkVersion.GetVTKMajorVersion() >= 6):
            image_append_components.AddInputData(image_w_hessian_component)
        else:
            image_append_components.AddInput(image_w_hessian_component)

    image_append_components.Update()
    image_w_hessian = image_append_components.GetOutput()

    name = image.GetPointData().GetScalars().GetName()
    image.GetPointData().AddArray(
        image_w_gradient.GetPointData().GetArray(name + "Gradient"))
    image.GetPointData().AddArray(
        image_w_hessian.GetPointData().GetArray(name + "GradientGradient"))
    image.GetPointData().SetActiveScalars(name + "GradientGradient")
Esempio n. 22
0
    def __init__(self):
        """
		Initialization
		"""
        lib.ProcessingFilter.ProcessingFilter.__init__(self, (1, 1))
        self.vtkfilter = vtk.vtkImageExtractComponents()
        self.vtkfilter.AddObserver("ProgressEvent", lib.messenger.send)
        lib.messenger.connect(self.vtkfilter, 'ProgressEvent',
                              self.updateProgress)

        self.descs = {
            "Component1": "Component #1",
            "Component2": "Component #2",
            "Component3": "Component #3"
        }
        self.filterDesc = "Extracts the red and/or green and/or blue components of an RGB color image into separate greyscale channels\nInput: RGB image\nOutput: 3 grayscale images"
Esempio n. 23
0
    def bw(self):
        """Make it black and white"""
        n = self._data.GetPointData().GetNumberOfComponents()
        if n==4:
            ecr = vtk.vtkImageExtractComponents()
            ecr.SetInputData(self._data)
            ecr.SetComponents(0,1,2)
            ecr.Update()
            img = ecr.GetOutput()
        else:
            img = self._data

        ecr = vtk.vtkImageLuminance()
        ecr.SetInputData(img)
        ecr.Update()
        return self._update(ecr.GetOutput())
Esempio n. 24
0
    def depthDataCallback(self, caller, eventId):
        extractFilterDepth = vtk.vtkImageExtractComponents()
        extractFilterDepth.SetInputData(depthMap.GetImageData())
        extractFilterDepth.SetComponents(0)
        extractFilterDepth.Update()
        imageDepth = extractFilterDepth.GetOutput()
        vtkDataDepth = imageDepth.GetPointData().GetScalars()
        numpyDataDepth = numpy_support.vtk_to_numpy(vtkDataDepth)
        numpyDataDepth = numpyDataDepth.reshape(dims[0], dims[1])
        listOfPoints = generate_pointcloud(numpyDataDepth)
        polyData = generatePolyData(listOfPoints)
        pointCloudModel.SetAndObservePolyData(polyData)

        {
            "focalLength": self.ui.focalLength.value,
            "principlePointX": self.ui.principlePointX.value,
            "principlePointY": self.ui.principlePointY.value
        }
Esempio n. 25
0
 def insert(self, document):
     if not self.view:
         return
     if self.CaptureDepth:
         image = self.view.CaptureDepthBuffer()
         idata = numpy_support.vtk_to_numpy(image) * 256
         rw = self.view.GetRenderWindow()
         width,height = rw.GetSize()
         imageslice = np.flipud(idata.reshape(height,width))
         #import Image
         #img = Image.fromarray(imageslice)
         #img.show()
         #try:
         #    input("Press enter to continue ")
         #except NameError:
         #    pass
         document.data = imageslice
         self.CaptureDepth = False
     else:
         image = self.view.CaptureWindow(1)
         if self.CaptureLuminance:  #TODO: this is still preOpenGL2
             rth = vtk.vtkImageRGBToHSI()
             rth.SetInputData(image)
             ec = vtk.vtkImageExtractComponents()
             ec.SetInputConnection(rth.GetOutputPort())
             ec.SetComponents(2,2,2)
             ec.Update()
             image = ec.GetOutput()
         npview = dsa.WrapDataObject(image)
         idata = npview.PointData[0]
         ext = image.GetExtent()
         width = ext[1] - ext[0] + 1
         height = ext[3] - ext[2] + 1
         imageslice = np.flipud(idata.reshape(height,width,3))
         #import Image
         #img = Image.fromarray(imageslice)
         #img.show()
         #try:
         #    input("Press enter to continue ")
         #except NameError:
         #    pass
         document.data = imageslice
     super(ImageExplorer, self).insert(document)
    def runConversionMethodAverage(self, inputVolumeNode, outputVolumeNode):
        ijkToRAS = vtk.vtkMatrix4x4()
        inputVolumeNode.GetIJKToRASMatrix(ijkToRAS)
        outputVolumeNode.SetIJKToRASMatrix(ijkToRAS)

        numberOfComponents = inputVolumeNode.GetImageData(
        ).GetNumberOfScalarComponents()
        weightedSum = vtk.vtkImageWeightedSum()
        weights = vtk.vtkDoubleArray()
        weights.SetNumberOfValues(numberOfComponents)
        # TODO: Average could be extended to let the user choose the weights of the components.
        evenWeight = 1.0 / numberOfComponents
        logging.debug("ImageWeightedSum: weight value for all components: %s" %
                      evenWeight)
        for comp in range(numberOfComponents):
            weights.SetValue(comp, evenWeight)
        weightedSum.SetWeights(weights)

        for comp in range(numberOfComponents):
            extract = vtk.vtkImageExtractComponents()
            extract.SetInputConnection(
                inputVolumeNode.GetImageDataConnection())
            extract.SetComponents(comp)
            extract.Update()
            # Cast component to Double
            compToDouble = vtk.vtkImageCast()
            compToDouble.SetInputConnection(0, extract.GetOutputPort())
            compToDouble.SetOutputScalarTypeToDouble()
            # Add to the weighted sum
            weightedSum.AddInputConnection(compToDouble.GetOutputPort())

        logging.debug("TotalInputConnections in weightedSum: %s" %
                      weightedSum.GetTotalNumberOfInputConnections())
        weightedSum.SetNormalizeByWeight(
            False)  # It is already normalized in the evenWeight case.
        weightedSum.Update()
        # Cast back to the type of the InputVolume, for consistency with other ConversionMethods
        castBack = vtk.vtkImageCast()
        castBack.SetInputConnection(0, weightedSum.GetOutputPort())
        castBack.SetOutputScalarType(
            inputVolumeNode.GetImageData().GetScalarType())
        outputVolumeNode.SetImageDataConnection(castBack.GetOutputPort())
Esempio n. 27
0
    def getScalarNodeFrom2DNode(self, vectorNode):
        """ Get a 3D vtkMRMLScalarVolumeNode (1 slice) from a vtkMRMLVectorVolumeNode
        :param vectorNode:
        :return: output volume
        """
        extract = vtk.vtkImageExtractComponents()
        extract.SetComponents(0, 1, 2)
        luminance = vtk.vtkImageLuminance()
        extract.SetInputConnection(vectorNode.GetImageDataConnection())
        luminance.SetInputConnection(extract.GetOutputPort())
        luminance.Update()
        ijkToRAS = vtk.vtkMatrix4x4()
        vectorNode.GetIJKToRASMatrix(ijkToRAS)

        outputVolume = slicer.mrmlScene.CreateNodeByClass(
            "vtkMRMLScalarVolumeNode")
        slicer.mrmlScene.AddNode(outputVolume)
        outputVolume.SetName(vectorNode.GetName() + "_3D")
        outputVolume.SetIJKToRASMatrix(ijkToRAS)
        outputVolume.SetImageDataConnection(luminance.GetOutputPort())
        return outputVolume
Esempio n. 28
0
    def run(self, inputVolume, outputVolume, cameraParams, pointCloudParams):
        """
    Run the actual algorithm
    """

        if not self.isValidInputOutputData(inputVolume, outputVolume):
            slicer.util.errorDisplay(
                'Input volume is the same as output volume. Choose a different output volume.'
            )
            return False

        if not self.hasImageData(inputVolume):
            return False

        logging.info('Processing started')

        inputImage = inputVolume.GetImageData()
        imageDims = inputImage.GetDimensions()[0:2]

        #Extract the vtkImageData from the vtkMRMLScalarVolumeNode
        extractFilterDepth = vtk.vtkImageExtractComponents()
        extractFilterDepth.SetInputData(inputImage)
        extractFilterDepth.SetComponents(0)
        extractFilterDepth.Update()
        imageDepth = extractFilterDepth.GetOutput()

        #Convert depth data to numpy array
        vtkDataDepth = imageDepth.GetPointData().GetScalars()
        numpyDataDepth = numpy_support.vtk_to_numpy(vtkDataDepth)
        numpyDataDepth = numpyDataDepth.reshape(imageDims[1], imageDims[0])

        listOfPoints = self.generate_pointcloud(numpyDataDepth, cameraParams,
                                                pointCloudParams)
        polyData = self.generatePolyData(listOfPoints)

        outputVolume.SetAndObservePolyData(polyData)

        logging.info('Processing completed')

        return True
Esempio n. 29
0
 def onApply(self):
   inputVolume = self.inputSelector.currentNode()
   outputVolume = self.outputSelector.currentNode()
   # check for input data
   if not (inputVolume and outputVolume):
     qt.QMessageBox.critical(
         slicer.util.mainWindow(),
         'Luminance', 'Input and output volumes are required for conversion')
     return
   # check that data has enough components
   inputImage = inputVolume.GetImageData()
   if not inputImage or inputImage.GetNumberOfScalarComponents() < 3:
     qt.QMessageBox.critical(
         slicer.util.mainWindow(),
         'Vector to Scalar Volume', 'Input does not have enough components for conversion')
     return
   # run the filter
   # - extract the RGB portions
   extract = vtk.vtkImageExtractComponents()
   extract.SetComponents(0,1,2)
   luminance = vtk.vtkImageLuminance()
   if vtk.VTK_MAJOR_VERSION <= 5:
     extract.SetInput(inputVolume.GetImageData())
     luminance.SetInput(extract.GetOutput())
     luminance.GetOutput().Update()
   else:
     extract.SetInputConnection(inputVolume.GetImageDataConnection())
     luminance.SetInputConnection(extract.GetOutputPort())
     luminance.Update()
   ijkToRAS = vtk.vtkMatrix4x4()
   inputVolume.GetIJKToRASMatrix(ijkToRAS)
   outputVolume.SetIJKToRASMatrix(ijkToRAS)
   if vtk.VTK_MAJOR_VERSION <= 5:
     outputVolume.SetAndObserveImageData(luminance.GetOutput())
   else:
     outputVolume.SetImageDataConnection(luminance.GetOutputPort())
   # make the output volume appear in all the slice views
   selectionNode = slicer.app.applicationLogic().GetSelectionNode()
   selectionNode.SetReferenceActiveVolumeID(outputVolume.GetID())
   slicer.app.applicationLogic().PropagateVolumeSelection(0)
Esempio n. 30
0
    def execute(self, inputs=(1, 1), update=0, last=0):
        """
		Execute filter in input image and return output image
		"""
        if not lib.ProcessingFilter.ProcessingFilter.execute(self, inputs):
            return None

        self.eventDesc = "Calculating inverse FFT"
        inputImage = self.getInput(1)

        self.filter = vtk.vtkImageRFFT()
        extract = vtk.vtkImageExtractComponents()
        extract.SetComponents(0)

        self.filter.SetInput(inputImage)
        extract.SetInputConnection(self.filter.GetOutputPort())
        outputImage = extract.GetOutput()

        if update:
            outputImage.Update()

        return outputImage
	def execute(self, inputs = (1,1), update = 0, last = 0):
		"""
		Execute filter in input image and return output image
		"""
		if not lib.ProcessingFilter.ProcessingFilter.execute(self,inputs):
			return None

		self.eventDesc = "Calculating inverse FFT"
		inputImage = self.getInput(1)

		self.filter = vtk.vtkImageRFFT()
		extract = vtk.vtkImageExtractComponents()
		extract.SetComponents(0)

		self.filter.SetInput(inputImage)
		extract.SetInputConnection(self.filter.GetOutputPort())
		outputImage = extract.GetOutput()
		
		if update:
			outputImage.Update()

		return outputImage
def imageDataTo3Component(image, ctf):
    """
	Processes image data to get it to proper 3 component RGB data
	"""
    image.UpdateInformation()
    ncomps = image.GetNumberOfScalarComponents()

    if ncomps == 1:
        maptocolor = vtk.vtkImageMapToColors()
        maptocolor.SetInputConnection(image.GetProducerPort())
        maptocolor.SetLookupTable(ctf)
        maptocolor.SetOutputFormatToRGB()
        imagedata = maptocolor.GetOutput()
    elif ncomps > 3:
        Logging.info("Data has %d components, extracting" % ncomps, kw="imageop")
        extract = vtk.vtkImageExtractComponents()
        extract.SetComponents(0, 1, 2)
        extract.SetInputConnection(image.GetProducerPort())
        imagedata = extract.GetOutput()

    else:
        imagedata = image
    return imagedata
Esempio n. 33
0
    def processOutputData(self, data):
        """
		Process the data before it's send to the preview
		"""
        data.UpdateInformation()
        ncomps = data.GetNumberOfScalarComponents()
        if ncomps > 3:
            extract = vtk.vtkImageExtractComponents()
            extract.SetComponents(0, 1, 2)
            extract.SetInput(data)
            data = extract.GetOutput()

        if ncomps == 1:
            Logging.info("Mapping trough ctf", kw="preview")
            self.mapToColors = vtk.vtkImageMapToColors()
            self.mapToColors.SetInput(data)
            self.updateColor()
            colorImage = self.mapToColors.GetOutput()

            outdata = colorImage
            return outdata

        return data
	def processOutputData(self, data):
		"""
		Process the data before it's send to the preview
		"""
		data.UpdateInformation()
		ncomps = data.GetNumberOfScalarComponents()
		if ncomps > 3:
			extract = vtk.vtkImageExtractComponents()
			extract.SetComponents(0, 1, 2)
			extract.SetInput(data)
			data = extract.GetOutput()

		if ncomps == 1:
			Logging.info("Mapping trough ctf", kw = "preview")
			self.mapToColors = vtk.vtkImageMapToColors()
			self.mapToColors.SetInput(data)
			self.updateColor()
			colorImage = self.mapToColors.GetOutput()

			outdata  = colorImage
			return outdata

		return data
  def extractFrame(scalarVolumeNode, multiVolumeNode, frameId):
    # Extract frame from multiVolumeNode and put it into scalarVolumeNode
    # if no scalar volume given, create one
    if scalarVolumeNode is None:
      scalarVolumeNode = slicer.vtkMRMLScalarVolumeNode()
      scalarVolumeNode.SetScene(slicer.mrmlScene)
      slicer.mrmlScene.AddNode(scalarVolumeNode)

    # Extract the image data
    mvImage = multiVolumeNode.GetImageData()
    extract = vtk.vtkImageExtractComponents()
    if vtk.VTK_MAJOR_VERSION <= 5:
      extract.SetInput(mvImage)
    else:
      extract.SetInputData(mvImage)
    extract.SetComponents(frameId)
    extract.Update()

    ras2ijk = vtk.vtkMatrix4x4()
    ijk2ras = vtk.vtkMatrix4x4()
    multiVolumeNode.GetRASToIJKMatrix(ras2ijk)
    multiVolumeNode.GetIJKToRASMatrix(ijk2ras)
    scalarVolumeNode.SetRASToIJKMatrix(ras2ijk)
    scalarVolumeNode.SetIJKToRASMatrix(ijk2ras)

    scalarVolumeNode.SetAndObserveImageData(extract.GetOutput())

    displayNode = scalarVolumeNode.GetDisplayNode()
    if displayNode is None:
      displayNode = slicer.mrmlScene.CreateNodeByClass('vtkMRMLScalarVolumeDisplayNode')
      displayNode.SetReferenceCount(1)
      displayNode.SetScene(slicer.mrmlScene)
      slicer.mrmlScene.AddNode(displayNode)
      displayNode.SetDefaultColorMap()
      scalarVolumeNode.SetAndObserveDisplayNodeID(displayNode.GetID())
    return scalarVolumeNode
Esempio n. 36
0
  def runConversionMethodAverage(self, inputVolumeNode, outputVolumeNode):
    ijkToRAS = vtk.vtkMatrix4x4()
    inputVolumeNode.GetIJKToRASMatrix(ijkToRAS)
    outputVolumeNode.SetIJKToRASMatrix(ijkToRAS)

    numberOfComponents = inputVolumeNode.GetImageData().GetNumberOfScalarComponents()
    weightedSum = vtk.vtkImageWeightedSum()
    weights = vtk.vtkDoubleArray()
    weights.SetNumberOfValues(numberOfComponents)
    # TODO: Average could be extended to let the user choose the weights of the components.
    evenWeight = 1.0/numberOfComponents
    logging.debug("ImageWeightedSum: weight value for all components: %s" % evenWeight)
    for comp in range(numberOfComponents):
      weights.SetValue(comp, evenWeight)
    weightedSum.SetWeights(weights)

    for comp in range(numberOfComponents):
      extract = vtk.vtkImageExtractComponents()
      extract.SetInputConnection(inputVolumeNode.GetImageDataConnection())
      extract.SetComponents(comp)
      extract.Update()
      # Cast component to Double
      compToDouble = vtk.vtkImageCast()
      compToDouble.SetInputConnection(0, extract.GetOutputPort())
      compToDouble.SetOutputScalarTypeToDouble()
      # Add to the weighted sum
      weightedSum.AddInputConnection(compToDouble.GetOutputPort())

    logging.debug("TotalInputConnections in weightedSum: %s" % weightedSum.GetTotalNumberOfInputConnections())
    weightedSum.SetNormalizeByWeight(False)  # It is already normalized in the evenWeight case.
    weightedSum.Update()
    # Cast back to the type of the InputVolume, for consistency with other ConversionMethods
    castBack = vtk.vtkImageCast()
    castBack.SetInputConnection(0, weightedSum.GetOutputPort())
    castBack.SetOutputScalarType(inputVolumeNode.GetImageData().GetScalarType())
    outputVolumeNode.SetImageDataConnection(castBack.GetOutputPort())
Esempio n. 37
0
def imageDataTo3Component(image, ctf):
    """
	Processes image data to get it to proper 3 component RGB data
	"""
    image.UpdateInformation()
    ncomps = image.GetNumberOfScalarComponents()

    if ncomps == 1:
        maptocolor = vtk.vtkImageMapToColors()
        maptocolor.SetInputConnection(image.GetProducerPort())
        maptocolor.SetLookupTable(ctf)
        maptocolor.SetOutputFormatToRGB()
        imagedata = maptocolor.GetOutput()
    elif ncomps > 3:
        Logging.info("Data has %d components, extracting" % ncomps,
                     kw="imageop")
        extract = vtk.vtkImageExtractComponents()
        extract.SetComponents(0, 1, 2)
        extract.SetInputConnection(image.GetProducerPort())
        imagedata = extract.GetOutput()

    else:
        imagedata = image
    return imagedata
Esempio n. 38
0
    def getDataSet(self, i, raw=0):
        """
		@return Timepoint i
		@param i The timepoint to return
		"""
        data = self.getTimepoint(i)
        if self.isRGB and self.numberOfComponents == 4:
            extract = vtk.vtkImageExtractComponents()
            extract.SetComponents(0, 1, 2)
            extract.SetInput(data)
            data = extract.GetOutput()

        if self.flipVertically:
            flip = vtk.vtkImageFlip()
            flip.SetFilteredAxis(1)
            flip.SetInput(data)
            data = flip.GetOutput()
        if self.flipHorizontally:
            flip = vtk.vtkImageFlip()
            flip.SetFilteredAxis(0)
            flip.SetInput(data)
            data = flip.GetOutput()

        return data
	def getDataSet(self, i, raw = 0):
		"""
		@return Timepoint i
		@param i The timepoint to return
		"""
		data = self.getTimepoint(i)
		if self.isRGB and self.numberOfComponents == 4:
			extract = vtk.vtkImageExtractComponents()
			extract.SetComponents(0, 1, 2)
			extract.SetInput(data)
			data = extract.GetOutput()

		if self.flipVertically:
			flip = vtk.vtkImageFlip()
			flip.SetFilteredAxis(1)
			flip.SetInput(data)
			data = flip.GetOutput()
		if self.flipHorizontally:
			flip = vtk.vtkImageFlip()
			flip.SetFilteredAxis(0)
			flip.SetInput(data)
			data = flip.GetOutput()
			
		return data
Esempio n. 40
0
    def OnCurveButton(self):
        if (str(self.inputSmoothSelector.currentNode())
                or str(self.imagenMultuply.currentNode())) == "None":
            print('ERROR: Select Input Volume Node and Label Mask')
            qt.QMessageBox.information(
                slicer.util.mainWindow(), 'Slicer Python',
                'ERROR: Select Input Volume Node and Label Mask')

            return True
        else:

            mvNode = slicer.vtkMRMLMultiVolumeNode(
            )  #creación nodo multivolumen
            slicer.mrmlScene.AddNode(mvNode)  #añadir a la escena el nodo
            escena = slicer.mrmlScene
            volumen4D = self.inputSmoothSelector.currentNode()
            imagenvtk4D = volumen4D.GetImageData()
            numero_imagenes = volumen4D.GetNumberOfFrames(
            )  #numero de frames del MV
            #print('imagenes: ' + str(numero_imagenes))
            #filtro vtk para descomponer un volumen 4D
            extract1 = vtk.vtkImageExtractComponents()
            extract1.SetInputData(imagenvtk4D)
            #matriz de transformacion
            ras2ijk = vtk.vtkMatrix4x4()
            ijk2ras = vtk.vtkMatrix4x4()
            #le solicitamos al volumen original que nos devuelva sus matrices
            volumen4D.GetRASToIJKMatrix(ras2ijk)
            volumen4D.GetIJKToRASMatrix(ijk2ras)
            #creo un volumen nuevo
            #volumenFijo = self.inputVolumeSelector.currentNode();
            #le asigno las transformaciones

            #le asigno el volumen 3D fijo
            extract1.SetComponents(0)
            extract1.Update()
            volumenFiltro = slicer.vtkMRMLScalarVolumeNode()
            volumenFiltro.SetName('Filtro')
            volumenFiltro.SetAndObserveImageData(extract1.GetOutput())
            volumenFiltro.SetRASToIJKMatrix(ras2ijk)
            volumenFiltro.SetIJKToRASMatrix(ijk2ras)
            #anado el nuevo volumen a la escena
            escena.AddNode(volumenFiltro)

            volumenSalida = slicer.vtkMRMLScalarVolumeNode()
            #creacion de volumen de salida
            slicer.mrmlScene.AddNode(volumenSalida)
            j = 1
            bandera = 0

            frameLabelsAttr = ''
            volumeLabels = vtk.vtkDoubleArray()
            volumeLabels.SetNumberOfTuples(numero_imagenes)
            volumeLabels.SetNumberOfComponents(1)
            volumeLabels.Allocate(numero_imagenes)

            mvImage = vtk.vtkImageData()
            mvImage.SetExtent(volumenFiltro.GetImageData().GetExtent()
                              )  ##Se le asigna la dimension del miltuvolumen
            mvImage.AllocateScalars(
                volumenFiltro.GetImageData().GetScalarType(), numero_imagenes
            )  ##Se le asigna el tipo y numero de cortes al multivolumen
            mvImageArray = vtk.util.numpy_support.vtk_to_numpy(
                mvImage.GetPointData().GetScalars()
            )  ## Se crea la matriz de datos donde va a ir la imagen

            mat = vtk.vtkMatrix4x4()

            ##Se hace la conversion y se obtiene la matriz de transformacion del nodo
            volumenFiltro.GetRASToIJKMatrix(mat)
            mvNode.SetRASToIJKMatrix(mat)
            volumenFiltro.GetIJKToRASMatrix(mat)
            mvNode.SetIJKToRASMatrix(mat)
            ##
            vector_int = []
            for i in range(numero_imagenes):
                # extraigo la imagen movil
                extract1.SetComponents(i)  #Seleccionar un volumen lejano
                extract1.Update()
                #Creo un volumen movil, y realizamos el mismo procedimiento que con el fijo

                volumenFiltro.SetAndObserveImageData(extract1.GetOutput())
                volumenFiltro.SetName('Filtrado')
                escena.AddNode(volumenFiltro)

                #parametros para la operacion de registro que seran entregados al modulo cli "brainsfit" segun tipo de registro
                parameters = {}
                parameters['Conductance'] = 1
                parameters['numberOfIterations'] = 5
                parameters['timeStep'] = 0.0625
                parameters['inputVolume'] = volumenFiltro.GetID()
                parameters['outputVolume'] = volumenFiltro.GetID()
                cliNode = slicer.cli.run(
                    slicer.modules.gradientanisotropicdiffusion,
                    None,
                    parameters,
                    wait_for_completion=True)

                slicer.util.saveNode(volumenFiltro,
                                     'volumenFilter' + str(i) + '.nrrd')

                vol = slicer.vtkMRMLScalarVolumeNode()
                escena = slicer.mrmlScene
                vol.SetName('salida')
                escena.AddNode(vol)
                Label = self.imagenMultuply.currentNode()
                Label = slicer.util.getNode('vtkMRMLLabelMapVolumeNode1')

                #parametros para la operacion de registro
                parameters = {}
                parameters['inputVolume1'] = escena.GetNodeByID(
                    'vtkMRMLLabelMapVolumeNode1'
                )  #dos volumenes de la escena, uno de ellos debe ser la mascara creada en el EDITOR
                parameters['inputVolume2'] = volumenFiltro
                parameters['outputVolume'] = vol
                cliNode = slicer.cli.run(slicer.modules.multiplyscalarvolumes,
                                         None,
                                         parameters,
                                         wait_for_completion=True)
                slicer.util.saveNode(vol, 'volumenMulty' + str(i) + '.nrrd')
                print(vol)
                a = slicer.util.arrayFromVolume(vol)
                intensidad = np.mean(a[:])
                vector_int.append(intensidad)

        # Switch to a layout (24) that contains a Chart View to initiate the construction of the widget and Chart View Node
            lns = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode')
            lns.InitTraversal()
            ln = lns.GetNextItemAsObject()
            ln.SetViewArrangement(24)

            # Get the Chart View Node
            cvns = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode')
            cvns.InitTraversal()
            cvn = cvns.GetNextItemAsObject()

            # Create an Array Node and add some data
            dn = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode())
            a = dn.GetArray()
            a.SetNumberOfTuples(numero_imagenes)
            x = range(0, 600)
            i = 0
            for i in range(numero_imagenes):
                a.SetComponent(i, 0, i)
                a.SetComponent(i, 1, vector_int[i])
                a.SetComponent(i, 2, 0)

            # Create a Chart Node.
            cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode())

            # Add the Array Nodes to the Chart. The first argument is a string used for the legend and to refer to the Array when setting properties.
            cn.AddArray('Prostate perfusion', dn.GetID())

            # Set a few properties on the Chart. The first argument is a string identifying which Array to assign the property.
            # 'default' is used to assign a property to the Chart itself (as opposed to an Array Node).
            cn.SetProperty('default', 'title', 'Perfusion curves')
            cn.SetProperty('default', 'xAxisLabel', 'Time (s)')
            cn.SetProperty('default', 'yAxisLabel', 'Intensity')

            # Tell the Chart View which Chart to display
            cvn.SetChartNodeID(cn.GetID())
Esempio n. 41
0
    def __init__(self, obj=None, channels=(), flip=False):
        vtk.vtkImageActor.__init__(self)
        vedo.base.Base3DProp.__init__(self)

        if utils.isSequence(obj) and len(obj):  # passing array
            obj = np.asarray(obj)

            if len(obj.shape) == 3:  # has shape (nx,ny, ncolor_alpha_chan)
                iac = vtk.vtkImageAppendComponents()
                nchan = obj.shape[
                    2]  # get number of channels in inputimage (L/LA/RGB/RGBA)
                for i in range(nchan):
                    if flip:
                        arr = np.flip(np.flip(obj[:, :, i], 0), 0).ravel()
                    else:
                        arr = np.flip(obj[:, :, i], 0).ravel()
                    varb = numpy_to_vtk(arr,
                                        deep=True,
                                        array_type=vtk.VTK_UNSIGNED_CHAR)
                    varb.SetName("RGBA")
                    imgb = vtk.vtkImageData()
                    imgb.SetDimensions(obj.shape[1], obj.shape[0], 1)
                    imgb.GetPointData().AddArray(varb)
                    imgb.GetPointData().SetActiveScalars("RGBA")
                    iac.AddInputData(imgb)
                iac.Update()
                img = iac.GetOutput()

            elif len(obj.shape) == 2:  # black and white
                if flip:
                    arr = np.flip(obj[:, :], 0).ravel()
                else:
                    arr = obj.ravel()
                varb = numpy_to_vtk(arr,
                                    deep=True,
                                    array_type=vtk.VTK_UNSIGNED_CHAR)
                varb.SetName("RGBA")
                img = vtk.vtkImageData()
                img.SetDimensions(obj.shape[1], obj.shape[0], 1)
                img.GetPointData().AddArray(varb)
                img.GetPointData().SetActiveScalars("RGBA")

        elif isinstance(obj, vtk.vtkImageData):
            img = obj

        elif isinstance(obj, str):
            if "https://" in obj:
                obj = vedo.io.download(obj, verbose=False)

            fname = obj.lower()
            if fname.endswith(".png"):
                picr = vtk.vtkPNGReader()
            elif fname.endswith(".jpg") or fname.endswith(".jpeg"):
                picr = vtk.vtkJPEGReader()
            elif fname.endswith(".bmp"):
                picr = vtk.vtkBMPReader()
            elif fname.endswith(".tif") or fname.endswith(".tiff"):
                picr = vtk.vtkTIFFReader()
                picr.SetOrientationType(vedo.settings.tiffOrientationType)
            else:
                colors.printc("Cannot understand picture format", obj, c='r')
                return
            picr.SetFileName(obj)
            self.filename = obj
            picr.Update()
            img = picr.GetOutput()

        else:
            img = vtk.vtkImageData()

        # select channels
        nchans = len(channels)
        if nchans and img.GetPointData().GetScalars().GetNumberOfComponents(
        ) > nchans:
            pec = vtk.vtkImageExtractComponents()
            pec.SetInputData(img)
            if nchans == 3:
                pec.SetComponents(channels[0], channels[1], channels[2])
            elif nchans == 2:
                pec.SetComponents(channels[0], channels[1])
            elif nchans == 1:
                pec.SetComponents(channels[0])
            pec.Update()
            img = pec.GetOutput()

        self._data = img
        self.SetInputData(img)

        sx, sy, _ = img.GetDimensions()
        self.shape = np.array([sx, sy])

        self._mapper = self.GetMapper()
# Create the RenderWindow, Renderer and both Actors
#
ren1 = vtk.vtkRenderer()
ren1.SetBackground(1,1,1)
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren1)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)

# Read the data. Note this creates a 3-component scalar.
red = vtk.vtkPNGReader()
red.SetFileName(VTK_DATA_ROOT + "/Data/RedCircle.png")
red.Update()

# Next filter can only handle RGB *(&&*@
extract = vtk.vtkImageExtractComponents()
extract.SetInputConnection(red.GetOutputPort())
extract.SetComponents(0,1,2)

# Quantize the image into an index
quantize = vtk.vtkImageQuantizeRGBToIndex()
quantize.SetInputConnection(extract.GetOutputPort())
quantize.SetNumberOfColors(3)

# Create the pipeline
discrete = vtk.vtkDiscreteFlyingEdges2D()
discrete.SetInputConnection(quantize.GetOutputPort())
discrete.SetValue(0,0)

# Create polgons
polyLoops = vtk.vtkContourLoopExtraction()
Esempio n. 43
0
    def registrarButton(self):
        Tipo_registro = self.typeComboBox.currentText
        mvNode = slicer.vtkMRMLMultiVolumeNode()
        slicer.mrmlScene.AddNode(mvNode)
        escena = slicer.mrmlScene
        volumen4D = self.inputSelector.currentNode()
        imagenvtk4D = volumen4D.GetImageData()
        numero_imagenes = volumen4D.GetNumberOfFrames()
        print('imagenes: ' + str(numero_imagenes))
        #filtro vtk para descomponer un volumen 4D
        #matriz de transformacion
        ras2ijk = vtk.vtkMatrix4x4()
        ijk2ras = vtk.vtkMatrix4x4()
        #le solicitamos al volumen original que nos devuelva sus matrices
        volumen4D.GetRASToIJKMatrix(ras2ijk)
        volumen4D.GetIJKToRASMatrix(ijk2ras)

        extract1 = vtk.vtkImageExtractComponents()
        extract1.SetInputData(imagenvtk4D)
        ##    print(extract1)

        #creo un volumen nuevo
        volumenFijo = slicer.vtkMRMLScalarVolumeNode()
        #le asigno las transformaciones
        volumenFijo.SetRASToIJKMatrix(ras2ijk)
        volumenFijo.SetIJKToRASMatrix(ijk2ras)
        #le asigno el volumen 3D fijo
        extract1.SetComponents(0)
        extract1.Update()
        volumenFijo.SetName('Fijo')
        volumenFijo.SetAndObserveImageData(extract1.GetOutput())
        #anado el nuevo volumen a la escena
        escena.AddNode(volumenFijo)

        vol_desp = []

        ##    volumenSalida = self.volumeSelector.currentNode()
        volumenSalida = slicer.vtkMRMLScalarVolumeNode()
        slicer.mrmlScene.AddNode(volumenSalida)
        j = 1
        bandera = 0

        Desp_LR1 = 0
        Desp_PA1 = 0
        Desp_IS1 = 0

        frameLabelsAttr = ''
        frames = []
        volumeLabels = vtk.vtkDoubleArray()

        volumeLabels.SetNumberOfTuples(numero_imagenes)
        volumeLabels.SetNumberOfComponents(1)
        volumeLabels.Allocate(numero_imagenes)

        mvImage = vtk.vtkImageData()
        mvImage.SetExtent(volumenFijo.GetImageData().GetExtent()
                          )  ##Se le asigna la dimension del miltuvolumen
        mvImage.AllocateScalars(
            volumenFijo.GetImageData().GetScalarType(), numero_imagenes
        )  ##Se le asigna el tipo y numero de cortes al multivolumen
        mvImageArray = vtk.util.numpy_support.vtk_to_numpy(
            mvImage.GetPointData().GetScalars()
        )  ## Se crea la matriz de datos donde va a ir la imagen

        mat = vtk.vtkMatrix4x4()

        ##Se hace la conversion y se obtiene la matriz de transformacion del nodo
        volumenFijo.GetRASToIJKMatrix(mat)
        mvNode.SetRASToIJKMatrix(mat)
        volumenFijo.GetIJKToRASMatrix(mat)
        mvNode.SetIJKToRASMatrix(mat)
        ##
        for i in range(numero_imagenes):
            # extraigo la imagen movil
            extract1.SetComponents(i)  #Seleccionar un volumen lejano
            extract1.Update()
            #Creo un volumen movil, y realizamos el mismo procedimiento que con el fijo
            volumenMovil = slicer.vtkMRMLScalarVolumeNode()
            volumenMovil.SetRASToIJKMatrix(ras2ijk)
            volumenMovil.SetIJKToRASMatrix(ijk2ras)
            volumenMovil.SetAndObserveImageData(extract1.GetOutput())
            volumenMovil.SetName('movil')
            escena.AddNode(volumenMovil)

            ##      slicer.util.saveNode(volumenMovil,'volumenMovil'+str(i+1)+'.nrrd')

            #creamos la transformada para alinear los volumenes

            transformadaSalidaBSpline = slicer.vtkMRMLBSplineTransformNode()
            transformadaSalidaBSpline.SetName(
                'Transformada de registro BSpline' + str(i + 1))
            slicer.mrmlScene.AddNode(transformadaSalidaBSpline)

            transformadaSalidaLinear = slicer.vtkMRMLLinearTransformNode()
            transformadaSalidaLinear.SetName(
                'Transformada de registro Lineal' + str(i + 1))
            slicer.mrmlScene.AddNode(transformadaSalidaLinear)

            #parametros para la operacion de registro
            parameters = {}

            if Tipo_registro == 'Rigid-BSpline':
                parameters['fixedVolume'] = volumenFijo.GetID()
                parameters['movingVolume'] = volumenMovil.GetID()
                parameters['transformType'] = 'Rigid'
                parameters['outputTransform'] = transformadaSalidaLinear.GetID(
                )
                parameters['outputVolume'] = volumenSalida.GetID()

                cliNode = slicer.cli.run(slicer.modules.brainsfit,
                                         None,
                                         parameters,
                                         wait_for_completion=True)
                if bandera == 0:
                    bandera = 1
                    volumenFijo = volumenSalida

                parameters['fixedVolume'] = volumenFijo.GetID()
                parameters['movingVolume'] = volumenSalida.GetID()
                parameters['transformType'] = 'BSpline'
                parameters[
                    'outputTransform'] = transformadaSalidaBSpline.GetID()
                parameters['outputVolume'] = volumenSalida.GetID()

                cliNode = slicer.cli.run(slicer.modules.brainsfit,
                                         None,
                                         parameters,
                                         wait_for_completion=True)
                slicer.util.saveNode(volumenSalida,
                                     'volumenSalida' + str(i + 1) + '.nrrd')

                frameImage = volumenSalida.GetImageData()
                frameImageArray = vtk.util.numpy_support.vtk_to_numpy(
                    frameImage.GetPointData().GetScalars())
                mvImageArray.T[i] = frameImageArray

            elif Tipo_registro == 'Rigid-Affine':

                parameters['fixedVolume'] = volumenFijo.GetID()
                parameters['movingVolume'] = volumenMovil.GetID()
                parameters['transformType'] = 'Rigid'
                parameters['outputTransform'] = transformadaSalidaLinear.GetID(
                )
                parameters['outputVolume'] = volumenSalida.GetID()

                cliNode = slicer.cli.run(slicer.modules.brainsfit,
                                         None,
                                         parameters,
                                         wait_for_completion=True)

                Matriz = transformadaSalidaLinear.GetMatrixTransformToParent()
                Desp_LR1 = Matriz.GetElement(0, 3)
                Desp_PA1 = Matriz.GetElement(1, 3)
                Desp_IS1 = Matriz.GetElement(2, 3)
                print(Desp_LR1)

                if bandera == 0:
                    bandera = 1
                    volumenFijo = volumenSalida

                parameters['fixedVolume'] = volumenFijo.GetID()
                parameters['movingVolume'] = volumenSalida.GetID()
                parameters['transformType'] = 'Affine'
                parameters['outputTransform'] = transformadaSalidaLinear.GetID(
                )
                parameters['outputVolume'] = volumenSalida.GetID()

                cliNode = slicer.cli.run(slicer.modules.brainsfit,
                                         None,
                                         parameters,
                                         wait_for_completion=True)
                slicer.util.saveNode(volumenSalida,
                                     'volumenSalida' + str(i + 1) + '.nrrd')

                frameImage = volumenSalida.GetImageData()
                frameImageArray = vtk.util.numpy_support.vtk_to_numpy(
                    frameImage.GetPointData().GetScalars())
                mvImageArray.T[i] = frameImageArray

            elif (Tipo_registro == 'Rigid') or (Tipo_registro
                                                == 'Bspline') or (Tipo_registro
                                                                  == 'Affine'):

                parameters['fixedVolume'] = volumenFijo.GetID()
                parameters['movingVolume'] = volumenMovil.GetID()
                parameters['transformType'] = Tipo_registro
                ##        parameters['linearTransform'] = transformadaSalidaLinear.GetID()
                ##        parameters['bsplineTransform'] = transformadaSalidaBSpline.GetID()
                if Tipo_registro == 'Bspline':
                    parameters[
                        'outputTransform'] = transformadaSalidaBSpline.GetID()
                else:
                    parameters[
                        'outputTransform'] = transformadaSalidaLinear.GetID()
                parameters['outputVolume'] = volumenSalida.GetID()

                cliNode = slicer.cli.run(slicer.modules.brainsfit,
                                         None,
                                         parameters,
                                         wait_for_completion=True)

                slicer.util.saveNode(volumenSalida,
                                     'volumenSalida' + str(i + 1) + '.nrrd')
                print('entre')
                frameImage = volumenSalida.GetImageData()
                frameImageArray = vtk.util.numpy_support.vtk_to_numpy(
                    frameImage.GetPointData().GetScalars())
                mvImageArray.T[i] = frameImageArray

            mvDisplayNode = slicer.mrmlScene.CreateNodeByClass(
                'vtkMRMLMultiVolumeDisplayNode')
            mvDisplayNode.SetScene(slicer.mrmlScene)
            slicer.mrmlScene.AddNode(mvDisplayNode)
            mvDisplayNode.SetReferenceCount(mvDisplayNode.GetReferenceCount() -
                                            1)
            mvDisplayNode.SetDefaultColorMap()

            mvNode.SetAndObserveDisplayNodeID(mvDisplayNode.GetID())
            mvNode.SetAndObserveImageData(mvImage)
            mvNode.SetNumberOfFrames(numero_imagenes)

            mvNode.SetLabelArray(volumeLabels)
            mvNode.SetLabelName('na')
            mvNode.SetAttribute('MultiVolume.FrameLabels', frameLabelsAttr)
            mvNode.SetAttribute('MultiVolume.NumberOfFrames',
                                str(numero_imagenes))
            mvNode.SetAttribute('MultiVolume.FrameIdentifyingDICOMTagName',
                                'NA')
            mvNode.SetAttribute('MultiVolume.FrameIdentifyingDICOMTagUnits',
                                'na')

            mvNode.SetName('MultiVolume Registrado')
            Helper.SetBgFgVolumes(mvNode.GetID(), None)

            Matriz = transformadaSalidaLinear.GetMatrixTransformToParent()
            Desp_LR2 = Matriz.GetElement(0, 3)
            Desp_PA2 = Matriz.GetElement(1, 3)
            Desp_IS2 = Matriz.GetElement(2, 3)
            print(Desp_LR2)
            Desp_LR = Desp_LR2 + Desp_LR1
            Desp_PA = Desp_PA2 + Desp_PA1
            Desp_IS = Desp_IS2 + Desp_IS1

            if ((abs(Desp_LR) > 1) or (abs(Desp_PA) > 1)
                    or (abs(Desp_IS) > 1)):
                print(j)
                vol_des = 'VOLUMEN' + str(
                    i + 1) + ' Desplazamiento --> LR: ' + str(
                        Desp_LR) + ' PA: ' + str(Desp_PA) + ' IS: ' + str(
                            Desp_IS)
                vol_desp.append(vol_des)

        print('Registro completo')
        print(vol_desp)
        #al terminar el ciclo for con todos los volumenes registrados se genera una
        #ventana emergente con un mensaje("Registro completo!") y mostrando los
        #volumenes que se desplazaron mas de 4mm
        qt.QMessageBox.information(slicer.util.mainWindow(), 'Slicer Python',
                                   'Registro completo' + str(vol_desp))

        return True
Esempio n. 44
0
    def run(self, inputVolume):
        """
    Run the actual algorithm
    """
        #se obtiene la escena y se obtiene el volumen 4D a partir del Volumen 4D de
        #entrada de la ventana desplegable
        escena = slicer.mrmlScene
        imagenvtk4D = inputVolume.GetImageData()
        #Se obtiene el número de volúmenes que tiene el volumen 4D
        numero_imagenes = inputVolume.GetNumberOfFrames()
        print('imagenes: ' + str(numero_imagenes))
        #filtro vtk para descomponer un volumen 4D
        extract1 = vtk.vtkImageExtractComponents()
        extract1.SetInputData(imagenvtk4D)
        #matriz de transformación
        ras2ijk = vtk.vtkMatrix4x4()
        ijk2ras = vtk.vtkMatrix4x4()
        #le solicitamos al volumen original que nos devuelva sus matrices
        inputVolume.GetRASToIJKMatrix(ras2ijk)
        inputVolume.GetIJKToRASMatrix(ijk2ras)
        #creo un volumen nuevo
        volumenFijo = slicer.vtkMRMLScalarVolumeNode()
        volumenSalida = slicer.vtkMRMLScalarVolumeNode()
        #le asigno las transformaciones
        volumenFijo.SetRASToIJKMatrix(ras2ijk)
        volumenFijo.SetIJKToRASMatrix(ijk2ras)
        #le asigno el volumen 3D fijo
        imagen_fija = extract1.SetComponents(0)
        extract1.Update()
        volumenFijo.SetName('fijo')
        volumenFijo.SetAndObserveImageData(extract1.GetOutput())
        #anado el nuevo volumen a la escena
        escena.AddNode(volumenFijo)
        #se crea un vector para guardar el número del volumen que tenga un
        #desplazamiento de mas de 4mm en cualquier dirección
        v = []

        #se hace un ciclo for para registrar todos los demás volúmenes del volumen 4D
        #con el primer volumen que se definió como fijo
        for i in range(numero_imagenes - 1):
            # extraigo la imagen móvil en la posición i+1 ya que el primero es el fijo
            imagen_movil = extract1.SetComponents(
                i + 1)  #Seleccionar un volumen i+1
            extract1.Update()
            #Creo el volumen móvil, y realizo el mismo procedimiento que con el fijo
            volumenMovil = slicer.vtkMRMLScalarVolumeNode()
            volumenMovil.SetRASToIJKMatrix(ras2ijk)
            volumenMovil.SetIJKToRASMatrix(ijk2ras)
            volumenMovil.SetAndObserveImageData(extract1.GetOutput())
            volumenMovil.SetName('movil ' + str(i + 1))
            escena.AddNode(volumenMovil)
            #creamos la transformada para alinear los volúmenes
            transformadaSalida = slicer.vtkMRMLLinearTransformNode()
            transformadaSalida.SetName('Transformadaderegistro' + str(i + 1))
            slicer.mrmlScene.AddNode(transformadaSalida)
            #parámetros para la operación de registro
            parameters = {}
            #parameters['InitialTransform'] = transI.GetID()
            parameters['fixedVolume'] = volumenFijo.GetID()
            parameters['movingVolume'] = volumenMovil.GetID()
            parameters['transformType'] = 'Rigid'
            parameters['outputTransform'] = transformadaSalida.GetID()
            parameters['outputVolume'] = volumenSalida.GetID()
            #Realizo el registro
            cliNode = slicer.cli.run(slicer.modules.brainsfit,
                                     None,
                                     parameters,
                                     wait_for_completion=True)
            #obtengo la transformada lineal que se usó en el registro
            transformada = escena.GetFirstNodeByName('Transformadaderegistro' +
                                                     str(i + 1))
            #Obtengo la matriz de la transformada, esta matriz es de dimensiones 4x4
            #en la cual estan todos los desplazamientos y rotaciones que se hicieron
            #en la transformada, a partir de ella se obtienen los volumenes que se
            #desplazaron mas de 4mm en cualquier direccion

            Matriz = transformada.GetMatrixTransformToParent()

            LR = Matriz.GetElement(
                0, 3)  #dirección izquierda o derecha en la fila 1, columna 4
            PA = Matriz.GetElement(
                1, 3)  #dirección anterior o posterior en la fila 2, columna 4
            IS = Matriz.GetElement(
                2, 3)  #dirección inferior o superior en la fila 3, columna 4
            #Se mira si el volumen "i" en alguna dirección tuvo un desplazamiento
            #mayor a 4mm, en caso de ser cierto se guarda en el vector "v"
            if abs(LR) > 4:
                v.append(i + 2)
            elif abs(PA) > 4:
                v.append(i + 2)
            elif abs(IS) > 4:
                v.append(i + 2)
        print('Registro completo')
        #al terminar el ciclo for con todos los volúmenes registrados se genera una
        #ventana emergente con un mensaje("Registro completo!") y mostrando los
        #volúmenes que se desplazaron mas de 4mm
        qt.QMessageBox.information(
            slicer.util.mainWindow(), 'Slicer Python',
            'Registro completo!\nVolumenes con movimiento mayor a 4mm:\n' +
            str(v))
        return True
Esempio n. 45
0
def remove_alpha(img):
    """Remove the alpha channel from ``vtk.vtkImageData``."""
    ec = vtk.vtkImageExtractComponents()
    ec.SetComponents(0, 1, 2)
    ec.SetInputData(img)
    return ec.GetOutput()
Esempio n. 46
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()

    fft = vtk.vtkImageFFT()
    fft.SetInputConnection(reader.GetOutputPort())

    idealHighPass = vtk.vtkImageIdealHighPass()
    idealHighPass.SetInputConnection(fft.GetOutputPort())
    idealHighPass.SetXCutOff(0.1)
    idealHighPass.SetYCutOff(0.1)

    idealRfft = vtk.vtkImageRFFT()
    idealRfft.SetInputConnection(idealHighPass.GetOutputPort())

    idealReal = vtk.vtkImageExtractComponents()
    idealReal.SetInputConnection(idealRfft.GetOutputPort())
    idealReal.SetComponents(0)

    butterworthHighPass = vtk.vtkImageButterworthHighPass()
    butterworthHighPass.SetInputConnection(fft.GetOutputPort())
    butterworthHighPass.SetXCutOff(0.1)
    butterworthHighPass.SetYCutOff(0.1)

    butterworthRfft = vtk.vtkImageRFFT()
    butterworthRfft.SetInputConnection(butterworthHighPass.GetOutputPort())

    butterworthReal = vtk.vtkImageExtractComponents()
    butterworthReal.SetInputConnection(butterworthRfft.GetOutputPort())
    butterworthReal.SetComponents(0)

    # Create the actors.
    idealColor = vtk.vtkImageMapToWindowLevelColors()
    idealColor.SetWindow(500)
    idealColor.SetLevel(0)
    idealColor.SetInputConnection(idealReal.GetOutputPort())

    idealActor = vtk.vtkImageActor()
    idealActor.GetMapper().SetInputConnection(idealColor.GetOutputPort())
    idealActor.GetProperty().SetInterpolationTypeToNearest()

    butterworthColor = vtk.vtkImageMapToWindowLevelColors()
    butterworthColor.SetWindow(500)
    butterworthColor.SetLevel(0)
    butterworthColor.SetInputConnection(butterworthReal.GetOutputPort())

    butterworthActor = vtk.vtkImageActor()
    butterworthActor.GetMapper().SetInputConnection(butterworthColor.GetOutputPort())
    butterworthActor.GetProperty().SetInterpolationTypeToNearest()

    # Setup the renderers.
    idealRenderer = vtk.vtkRenderer()
    idealRenderer.SetViewport(0.0, 0.0, 0.5, 1.0)
    idealRenderer.AddActor(idealActor)
    idealRenderer.ResetCamera()
    idealRenderer.SetBackground(colors.GetColor3d("SlateGray"))

    butterworthRenderer = vtk.vtkRenderer()
    butterworthRenderer.SetViewport(0.5, 0.0, 1.0, 1.0)
    butterworthRenderer.AddActor(butterworthActor)
    butterworthRenderer.SetActiveCamera(idealRenderer.GetActiveCamera())
    butterworthRenderer.SetBackground(colors.GetColor3d("LightSlateGray"))

    renderWindow = vtk.vtkRenderWindow()
    renderWindow.SetSize(600, 300)
    renderWindow.SetWindowName('IdealHighPass')
    renderWindow.AddRenderer(idealRenderer)
    renderWindow.AddRenderer(butterworthRenderer)

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

    renderWindowInteractor.SetInteractorStyle(style)

    renderWindowInteractor.SetRenderWindow(renderWindow)
    idealRenderer.GetActiveCamera().Dolly(1.4)
    idealRenderer.ResetCameraClippingRange()
    renderWindowInteractor.Initialize()

    renderWindowInteractor.Start()
Esempio n. 47
0
    def process(
            self
    ):  #La funcion process es la encargada de realizar el registro.

        escena = slicer.mrmlScene
        #Se carga la escena
        volumen4D = self.inputSelector.currentNode()
        #Se carga el volumen seleccionado por el usuario
        estructual = self.inputSelector_estructural.currentNode()
        #se carga el volumen estructural seleccionado por el usuario
        imagenvtk4D = volumen4D.GetImageData(
        )  #Se recupera la informacion del volumen
        imagenvtkestructural = estructual.GetImageData()
        # se recupera la informacion del volumen estructual
        numero_imagenes = volumen4D.GetNumberOfFrames(
        )  #Numero de volumenes en el volumen 4D cargado

        RegistrationType = self.inputSelector2.currentText  #Se recupera el tipo de registro elegido
        KernelSize = self.inputSelector3.currentText  # se recupera el tamano del kernel
        extract1 = vtk.vtkImageExtractComponents(
        )  #filtro vtk para descomponer un volumen 4D
        extract1.SetInputData(
            imagenvtk4D)  #Se asigna el volumen 4D que se quiere descomponer

        #matriz vacia para la recuperar en ella la transformacion de coordenadas
        ras2ijk = vtk.vtkMatrix4x4()
        ijk2ras = vtk.vtkMatrix4x4()

        #le solicitamos al volumen original que nos devuelva sus matrices de transformaciones y se las asigne a las matrices vacias
        volumen4D.GetRASToIJKMatrix(ras2ijk)
        volumen4D.GetIJKToRASMatrix(ijk2ras)
        #se crea un volumen vacio que sera el volumen fijo
        volumenFijo = slicer.vtkMRMLScalarVolumeNode()
        #se le asignan las transformaciones de coordenadas
        volumenFijo.SetRASToIJKMatrix(ras2ijk)
        volumenFijo.SetIJKToRASMatrix(ijk2ras)
        #se le asigna el volumen 3D fijo
        imagen_fija = extract1.SetComponents(0)
        extract1.Update()  #IMPORTANTE: necesario para guardar los cambios
        volumenFijo.SetName('fijo')  #se le asigna un nombre
        volumenFijo.SetAndObserveImageData(
            extract1.GetOutput())  #se le asigna un volumen visible

        #se agrega el nuevo volumen a la escena
        escena.AddNode(volumenFijo)
        # el siguiente for Permite realizar la tranformacion de registro para cada uno de los volumenes diferentes al volumen fijo inicial
        for i in range(
                1,
                numero_imagenes):  #recorre todos los volumenes menos el fijo
            # se extrae la imagen movil
            imagen_movil = extract1.SetComponents(
                i)  #Selecciona un volumen cada vez
            extract1.Update()  #IMPORTANTE: sirve para actualizar los cambios

            #Creo un volumen movil, y realizamos el mismo procedimiento que con el fijo
            volumenMovil = slicer.vtkMRMLScalarVolumeNode()
            volumenMovil.SetRASToIJKMatrix(ras2ijk)
            volumenMovil.SetIJKToRASMatrix(ijk2ras)
            volumenMovil.SetAndObserveImageData(extract1.GetOutput())
            volumenMovil.SetName(
                'movil' + str(i)
            )  #Se nombra como movil(i) si no se marca todos tendrian el mismo nombre en la escena
            escena.AddNode(volumenMovil)

            #creamos la transformada para alinear los volumenes
            #en todos los casos se realiza una transformada rigida ya que esta brinda un punto de partida para las demas transformadas Bspline y Affine
            transformadaSalida = slicer.vtkMRMLLinearTransformNode(
            )  #se crea la transformacion lineal
            transformadaSalida.SetName(
                'Transformada de registro' +
                str(i))  #se nombra la transformada de registro(i)
            slicer.mrmlScene.AddNode(
                transformadaSalida)  #se anade la transformada a la escena

            #se asignan los parametros de la transformacion a una estructura parametros{}
            parameters = {}
            parameters['fixedVolume'] = volumenFijo.GetID()  #volumen fijo
            parameters['movingVolume'] = volumenMovil.GetID()  #volumen movil
            parameters[
                'transformType'] = 'Rigid'  #tipo de tranformacion: esta se hace en primer lugar para todas
            parameters['outputTransform'] = transformadaSalida.GetID(
            )  #transformacion de salida
            parameters['outputVolume'] = volumenMovil.GetID()
            #volumen luego de la transformacion

            cliNode = slicer.cli.run(
                slicer.modules.brainsfit,
                None,
                parameters,
                wait_for_completion=True
            )  #aplica la transformacion segun los parametros ingresados

            if RegistrationType == 'Rigid':  #Si el usuario elige el tipo de registro: rigido
                # SUAVIZADO
                parameters1 = {}  #parametros del filtro
                parameters1['inputVolume'] = volumenMovil.GetID()
                parameters1['outputVolume'] = volumenMovil.GetID()
                parameters1['sigma'] = self.inputSelector3.currentText
                cliNode = slicer.cli.run(
                    slicer.modules.gaussianblurimagefilter,
                    None,
                    parameters1,
                    wait_for_completion=True
                )  #se corre la transformada elegida bspline o affine

                slicer.util.saveNode(
                    volumenMovil, 'volumenmovil' + str(i) + '.nrrd'
                )  # se guarda cada volumen movil(i) transformado en mis documentos

                escena.RemoveNode(
                    volumenMovil
                )  #Una vez realizada la transformacion se remueve el volumen de la escena

            if not RegistrationType == 'Rigid':  #si el usuario no eligio una transformada rigida,
                escena.RemoveNode(
                    transformadaSalida)  #se remueve la transformada rigida
                if RegistrationType == "BSpline":  #si el usuario eligio la transformada bspline
                    transformadaSalida = slicer.vtkMRMLBSplineTransformNode(
                    )  #se crea una transformada no lineal bspline
                elif RegistrationType == "Affine":  #si el usuario eligio la transformada affine
                    transformadaSalida = slicer.vtkMRMLLinearTransformNode(
                    )  # se crea una transformacion lineal

                transformadaSalida.SetName(
                    'Transformada de registro' + str(i)
                )  #se nombra la transformada creada y se agrega a la escena
                slicer.mrmlScene.AddNode(transformadaSalida)

                parameters = {}  #parametros de la transformada
                parameters['fixedVolume'] = volumenFijo.GetID()
                parameters['movingVolume'] = volumenMovil.GetID()
                parameters[
                    'transformType'] = RegistrationType  #esta variable se recupera segun la eleccion del usuario
                parameters['outputTransform'] = transformadaSalida.GetID()
                parameters['outputVolume'] = volumenMovil.GetID()

                cliNode = slicer.cli.run(
                    slicer.modules.brainsfit,
                    None,
                    parameters,
                    wait_for_completion=True
                )  #se corre la transformada elegida bspline o affine

                parameters1 = {}  #parametros del filtro
                parameters1['inputVolume'] = volumenMovil.GetID()
                parameters1['outputVolume'] = volumenMovil.GetID()
                parameters1['sigma'] = self.inputSelector3.currentText

                cliNode = slicer.cli.run(
                    slicer.modules.gaussianblurimagefilter,
                    None,
                    parameters1,
                    wait_for_completion=True
                )  #se corre la transformada elegida bspline o affine

                slicer.util.saveNode(
                    volumenMovil, 'volumenmovil' + str(i) +
                    '.nrrd')  #se guarda el nodo y se remueve de la escena

                escena.RemoveNode(volumenMovil)

        estructual.GetRASToIJKMatrix(ras2ijk)
        estructual.GetIJKToRASMatrix(ijk2ras)
        #se crea un volumen vacio que sera el volumen fijo
        vol_estructural_movil = slicer.vtkMRMLScalarVolumeNode()
        #se le asignan las transformaciones de coordenadas
        vol_estructural_movil.SetRASToIJKMatrix(ras2ijk)
        vol_estructural_movil.SetIJKToRASMatrix(ijk2ras)
        #se le asigna el volumen 3D fijo
        #imagen_estruct_movil = extract2.SetComponents(0)
        #extract2.Update() #IMPORTANTE: necesario para guardar los cambios
        vol_estructural_movil.SetName('estructural')  #se le asigna un nombre
        vol_estructural_movil.SetAndObserveImageData(
            imagenvtkestructural)  #se le asigna un volumen visible

        escena.AddNode(vol_estructural_movil)

        transformadaSalida = slicer.vtkMRMLLinearTransformNode(
        )  #se crea la transformacion lineal
        #transformadaSalida = slicer.vtkMRMLBSplineTransformNode()#se crea la transformacion lineal
        transformadaSalida.SetName('Transformada de registro estructual'
                                   )  #se nombra la transformada de registro(i)
        slicer.mrmlScene.AddNode(
            transformadaSalida)  #se anade la transformada a la escena

        #se asignan los parametros de la transformacion a una estructura parametros{}
        parameters = {}
        parameters['fixedVolume'] = volumenFijo.GetID()  #volumen fijo
        parameters['movingVolume'] = vol_estructural_movil.GetID(
        )  #volumen movil
        ##parameters['movingVolume'] = escena.GetNodeByID('vtkMRMLScalarVolumeNode1')#volumen movil
        parameters[
            'transformType'] = 'Affine'  #tipo de tranformacion: esta se hace en primer lugar para todas
        parameters['outputTransform'] = transformadaSalida.GetID(
        )  #transformacion de salida
        parameters['outputVolume'] = vol_estructural_movil.GetID()
        #volumen luego de la transformacion

        cliNode = slicer.cli.run(
            slicer.modules.brainsfit,
            None,
            parameters,
            wait_for_completion=True
        )  #aplica la transformacion segun los parametros ingresados

        parameters1 = {}  #parametros del filtro
        parameters1['inputVolume'] = volumenFijo.GetID()
        parameters1['outputVolume'] = volumenFijo.GetID()
        parameters1['sigma'] = self.inputSelector3.currentText
        cliNode = slicer.cli.run(slicer.modules.gaussianblurimagefilter,
                                 None,
                                 parameters1,
                                 wait_for_completion=True)
        #se agrega el nuevo volumen a la escena
        slicer.util.saveNode(
            volumenFijo, 'volumenfijo.nrrd'
        )  #se guarda el volumen fijo en mis documentos; .nrrd es la extension para nodos
        slicer.util.saveNode(
            vol_estructural_movil, 'volumenestructural.nrrd'
        )  #se guarda el volumen fijo en mis documentos; .nrrd es la extension para nodos
        escena.RemoveNode(vol_estructural_movil)
        escena.RemoveNode(
            volumenFijo)  #al finalizar el for se remueve el volumen fijo

        slicer.util.openAddDataDialog(
        )  #se abre la ventana para cargar datos para que el usuario cargue los volumenes creados y guardados

        mensaje = 'Registro y Suavizado Completados'

        qt.QMessageBox.information(slicer.util.mainWindow(), 'Slicer Python',
                                   mensaje)  #se muestra en ventana
        print(mensaje)  # se muestra en el python interactor
Esempio n. 48
0
  def onApplyButton(self):
    mvNode = self.outputSelector.currentNode()
    inputVolume= self.inputSelector.currentNode()
    """
    Run the actual algorithm
    """
    #se obtiene la escena y se obtiene el volumen 4D a partir del Volumen 4D de
    #entrada de la ventana desplegable
    escena = slicer.mrmlScene
    imagenvtk4D = inputVolume.GetImageData()
    #Se obtiene el número de volúmenes que tiene el volumen 4D
    numero_imagenes = inputVolume.GetNumberOfFrames()
    print('imagenes: ' + str(numero_imagenes))
    #filtro vtk para descomponer un volumen 4D
    extract1 = vtk.vtkImageExtractComponents()
    extract1.SetInputData(imagenvtk4D)
    #matriz de transformación
    ras2ijk = vtk.vtkMatrix4x4()
    ijk2ras = vtk.vtkMatrix4x4()
    #le solicitamos al volumen original que nos devuelva sus matrices
    inputVolume.GetRASToIJKMatrix(ras2ijk)
    inputVolume.GetIJKToRASMatrix(ijk2ras)
    #creo un volumen nuevo
    volumenFijo = slicer.vtkMRMLScalarVolumeNode()
    volumenSalida = slicer.vtkMRMLMultiVolumeNode()
    
    #le asigno las transformaciones
    volumenFijo.SetRASToIJKMatrix(ras2ijk)
    volumenFijo.SetIJKToRASMatrix(ijk2ras)
    #le asigno el volumen 3D fijo
    imagen_fija = extract1.SetComponents(0)
    extract1.Update()
    volumenFijo.SetName('fijo')
    volumenFijo.SetAndObserveImageData(extract1.GetOutput())
    #anado el nuevo volumen a la escena
    escena.AddNode(volumenFijo)
    #se crea un vector para guardar el número del volumen que tenga un
    #desplazamiento de mas de 4mm en cualquier dirección
    v=[]

    #se hace un ciclo for para registrar todos los demás volúmenes del volumen 4D
    #con el primer volumen que se definió como fijo
    frameLabelsAttr=''
    frames = []
    volumeLabels = vtk.vtkDoubleArray()
    
    volumeLabels.SetNumberOfTuples(numero_imagenes)
    volumeLabels.SetNumberOfComponents(1)
    volumeLabels.Allocate(numero_imagenes)
    
    for i in range(numero_imagenes):
      # extraigo la imagen móvil en la posición i+1 ya que el primero es el fijo
      imagen_movil = extract1.SetComponents(i+1) #Seleccionar un volumen i+1
      extract1.Update()
      #Creo el volumen móvil, y realizo el mismo procedimiento que con el fijo
      volumenMovil = slicer.vtkMRMLScalarVolumeNode();
      volumenMovil.SetRASToIJKMatrix(ras2ijk)
      volumenMovil.SetIJKToRASMatrix(ijk2ras)
      volumenMovil.SetAndObserveImageData(extract1.GetOutput())
      volumenMovil.SetName('movil '+str(i+1))
      escena.AddNode(volumenMovil)
      
      #creamos la transformada para alinear los volúmenes
      transformadaSalida = slicer.vtkMRMLLinearTransformNode()
      transformadaSalida.SetName('Transformadaderegistro'+str(i+1))
      slicer.mrmlScene.AddNode(transformadaSalida)
      #parámetros para la operación de registro
      parameters = {}
      #parameters['InitialTransform'] = transI.GetID()
      parameters['fixedVolume'] = volumenFijo.GetID()
      parameters['movingVolume'] = volumenMovil.GetID()
      parameters['transformType'] = 'Rigid'
      parameters['outputTransform'] = transformadaSalida.GetID()
      frames.append(volumenMovil)
##      parameters['outputVolume']=volumenSalida.GetID()
      #Realizo el registro
      cliNode = slicer.cli.run( slicer.modules.brainsfit,None,parameters,wait_for_completion=True)
      #obtengo la transformada lineal que se usó en el registro
      transformada=escena.GetFirstNodeByName('Transformadaderegistro'+str(i+1))
      #Obtengo la matriz de la transformada, esta matriz es de dimensiones 4x4
      #en la cual estan todos los desplazamientos y rotaciones que se hicieron
      #en la transformada, a partir de ella se obtienen los volumenes que se
      #desplazaron mas de 4mm en cualquier direccion
      
      frameId = i;
      volumeLabels.SetComponent(i, 0, frameId)
      frameLabelsAttr += str(frameId)+','


      Matriz=transformada.GetMatrixTransformToParent()
      LR=Matriz.GetElement(0,3)#dirección izquierda o derecha en la fila 1, columna 4
      PA=Matriz.GetElement(1,3)#dirección anterior o posterior en la fila 2, columna 4
      IS=Matriz.GetElement(2,3)#dirección inferior o superior en la fila 3, columna 4
      #Se mira si el volumen "i" en alguna dirección tuvo un desplazamiento
      #mayor a 4mm, en caso de ser cierto se guarda en el vector "v"
      if abs(LR)>4:
        v.append(i+2)
      elif abs(PA)>4:
        v.append(i+2)
      elif abs(IS)>4:
        v.append(i+2)
    print("MovilExtent: "+str(volumenMovil.GetImageData().GetExtent()))
##    print("valor de f: "+ str(volumenMovil))
    frameLabelsAttr = frameLabelsAttr[:-1]


    mvImage = vtk.vtkImageData()
    mvImage.SetExtent(volumenMovil.GetImageData().GetExtent())##Se le asigna la dimensión del miltuvolumen   
    mvImage.AllocateScalars(volumenMovil.GetImageData().GetScalarType(), numero_imagenes)##Se le asigna el tipo y número de cortes al multivolumen
    mvImageArray = vtk.util.numpy_support.vtk_to_numpy(mvImage.GetPointData().GetScalars())## Se crea la matriz de datos donde va a ir la imagen

    mat = vtk.vtkMatrix4x4()

    ##Se hace la conversión y se obtiene la matriz de transformación del nodo
    volumenMovil.GetRASToIJKMatrix(mat)
    mvNode.SetRASToIJKMatrix(mat)
    volumenMovil.GetIJKToRASMatrix(mat)
    mvNode.SetIJKToRASMatrix(mat)

    print("frameId: "+str(frameId))
    print("# imag: "+str(numero_imagenes))
##    print("Long frame1: "+str(len(frame)))
    print("Long frames: "+str(len(frames)))

## 
    for frameId in range(numero_imagenes):
      # TODO: check consistent size and orientation!
      frame = frames[frameId]
      frameImage = frame.GetImageData()
      frameImageArray = vtk.util.numpy_support.vtk_to_numpy(frameImage.GetPointData().GetScalars())
      mvImageArray.T[frameId] = frameImageArray

##Se crea el nodo del multivolumen
    
    mvDisplayNode = slicer.mrmlScene.CreateNodeByClass('vtkMRMLMultiVolumeDisplayNode')
    mvDisplayNode.SetScene(slicer.mrmlScene)
    slicer.mrmlScene.AddNode(mvDisplayNode)
    mvDisplayNode.SetReferenceCount(mvDisplayNode.GetReferenceCount()-1)
    mvDisplayNode.SetDefaultColorMap()

    mvNode.SetAndObserveDisplayNodeID(mvDisplayNode.GetID())
    mvNode.SetAndObserveImageData(mvImage)
    mvNode.SetNumberOfFrames(numero_imagenes)

    mvNode.SetLabelArray(volumeLabels)
    mvNode.SetLabelName('na')
    mvNode.SetAttribute('MultiVolume.FrameLabels',frameLabelsAttr)
    mvNode.SetAttribute('MultiVolume.NumberOfFrames',str(numero_imagenes))
    mvNode.SetAttribute('MultiVolume.FrameIdentifyingDICOMTagName','NA')
    mvNode.SetAttribute('MultiVolume.FrameIdentifyingDICOMTagUnits','na')

    mvNode.SetName('MultiVolume Registrado')
    Helper.SetBgFgVolumes(mvNode.GetID(),None)
    

    
    print('Registro completo')
    #al terminar el ciclo for con todos los volúmenes registrados se genera una
    #ventana emergente con un mensaje("Registro completo!") y mostrando los
    #volúmenes que se desplazaron mas de 4mm
    qt.QMessageBox.information(slicer.util.mainWindow(),'Slicer Python','Registro completo!\nVolumenes con movimiento mayor a 4mm:\n'+str(v))
    return True
Esempio n. 49
0
    def registrarButton(self):

        #La función registrarButton permitirá recuperar información del multivolumen,
        #la creación de nodos tipo "ScalarVolumeNode" y "MultiVolumeNode" donde estarán asociados
        #las matrices de transformación del multivolumen importado. El primer volumen será nombrado
        #como 'Fijo' y los demás serán volumen tipo 'Móvil'. Se añaden los mismos a la escena creada previamente.
        #Se creará un multivolumen que sera el reconstruido a partir del registro y se empezará a extraer componente a
        #componente del multivolumen importado, esto se repite desde el frame 0 hasta el numero de frame totales.
        #Se añaden a la escena atributos que brindan información sobre la transformada.
        #Se podrá entonces implementar el modulo cli de registro "brainsfit", que tomará los parámetros de entrada y
        #aplicará el correspondiente tipo de registro al multivolumen seleccionado.
        #Finalmente, se recuperarán los datos de desplazamiento por medio de la matriz de transformación y el volumen de salida se usará
        #para hacer la reconstrucción del multivolumen añadiendo un nodo de visualización. Se mostrarán los volumenes con desplazamiento mayor de 1 mm.
        if str(self.inputSelector.currentNode()) == 'None':
            print('ERROR:Select Input Volume Node')
            qt.QMessageBox.information(slicer.util.mainWindow(),
                                       'Slicer Python',
                                       'ERROR:Select Input Volume Node')
            return True

        else:

            Tipo_registro = self.typeComboBox.currentText  #el tipo de registro seleccionado previamente en el layout de parameters
            mvNode = slicer.vtkMRMLMultiVolumeNode(
            )  #creación nodo multivolumen
            slicer.mrmlScene.AddNode(mvNode)  #añadir a la escena el nodo
            escena = slicer.mrmlScene
            volumen4D = self.inputSelector.currentNode()
            imagenvtk4D = volumen4D.GetImageData()
            numero_imagenes = volumen4D.GetNumberOfFrames(
            )  #numero de frames del MV
            print('imagenes: ' + str(numero_imagenes))
            #filtro vtk para descomponer un volumen 4D
            extract1 = vtk.vtkImageExtractComponents()
            extract1.SetInputData(imagenvtk4D)
            #matriz de transformacion
            ras2ijk = vtk.vtkMatrix4x4()
            ijk2ras = vtk.vtkMatrix4x4()
            #le solicitamos al volumen original que nos devuelva sus matrices
            volumen4D.GetRASToIJKMatrix(ras2ijk)
            volumen4D.GetIJKToRASMatrix(ijk2ras)
            #creo un volumen nuevo
            #volumenFijo = self.inputVolumeSelector.currentNode();
            #le asigno las transformaciones

            #le asigno el volumen 3D fijo
            extract1.SetComponents(0)
            extract1.Update()
            volumenFijo = slicer.vtkMRMLScalarVolumeNode()
            volumenFijo.SetName('Fijo')
            volumenFijo.SetAndObserveImageData(extract1.GetOutput())
            volumenFijo.SetRASToIJKMatrix(ras2ijk)
            volumenFijo.SetIJKToRASMatrix(ijk2ras)
            #anado el nuevo volumen a la escena
            escena.AddNode(volumenFijo)
            vol_desp = []
            volumenSalida = slicer.vtkMRMLScalarVolumeNode()
            #creacion de volumen de salida
            slicer.mrmlScene.AddNode(volumenSalida)
            j = 1
            bandera = 0

            frameLabelsAttr = ''
            volumeLabels = vtk.vtkDoubleArray()
            volumeLabels.SetNumberOfTuples(numero_imagenes)
            volumeLabels.SetNumberOfComponents(1)
            volumeLabels.Allocate(numero_imagenes)

            mvImage = vtk.vtkImageData()
            mvImage.SetExtent(volumenFijo.GetImageData().GetExtent()
                              )  ##Se le asigna la dimension del miltuvolumen
            mvImage.AllocateScalars(
                volumenFijo.GetImageData().GetScalarType(), numero_imagenes
            )  ##Se le asigna el tipo y numero de cortes al multivolumen
            mvImageArray = vtk.util.numpy_support.vtk_to_numpy(
                mvImage.GetPointData().GetScalars()
            )  ## Se crea la matriz de datos donde va a ir la imagen

            mat = vtk.vtkMatrix4x4()

            ##Se hace la conversion y se obtiene la matriz de transformacion del nodo
            volumenFijo.GetRASToIJKMatrix(mat)
            mvNode.SetRASToIJKMatrix(mat)
            volumenFijo.GetIJKToRASMatrix(mat)
            mvNode.SetIJKToRASMatrix(mat)
            ##
            for i in range(numero_imagenes):
                # extraigo la imagen movil
                extract1.SetComponents(i)  #Seleccionar un volumen lejano
                extract1.Update()
                #Creo un volumen movil, y realizamos el mismo procedimiento que con el fijo
                volumenMovil = slicer.vtkMRMLScalarVolumeNode()
                volumenMovil.SetRASToIJKMatrix(ras2ijk)
                volumenMovil.SetIJKToRASMatrix(ijk2ras)
                volumenMovil.SetAndObserveImageData(extract1.GetOutput())
                volumenMovil.SetName('movil')
                escena.AddNode(volumenMovil)

                #creamos la transformada para alinear los volumenes

                transformadaSalidaBSpline = slicer.vtkMRMLBSplineTransformNode(
                )
                transformadaSalidaBSpline.SetName(
                    'Transformada de registro BSpline' + str(i + 1))
                slicer.mrmlScene.AddNode(transformadaSalidaBSpline)

                transformadaSalidaLinear = slicer.vtkMRMLLinearTransformNode()
                transformadaSalidaLinear.SetName(
                    'Transformada de registro Lineal' + str(i + 1))
                slicer.mrmlScene.AddNode(transformadaSalidaLinear)

                #parametros para la operacion de registro que seran entregados al modulo cli "brainsfit" segun tipo de registro
                parameters = {}

                if Tipo_registro == 'Rigid-BSpline':
                    parameters['fixedVolume'] = volumenFijo.GetID()
                    parameters['movingVolume'] = volumenMovil.GetID()
                    parameters['transformType'] = 'Rigid'
                    parameters[
                        'outputTransform'] = transformadaSalidaLinear.GetID()
                    parameters['outputVolume'] = volumenSalida.GetID()

                    cliNode = slicer.cli.run(slicer.modules.brainsfit,
                                             None,
                                             parameters,
                                             wait_for_completion=True)
                    if bandera == 0:
                        bandera = 1
                        volumenFijo = volumenSalida

                    parameters['fixedVolume'] = volumenFijo.GetID()
                    parameters['movingVolume'] = volumenSalida.GetID()
                    parameters['transformType'] = 'BSpline'
                    parameters[
                        'outputTransform'] = transformadaSalidaBSpline.GetID()
                    parameters['outputVolume'] = volumenSalida.GetID()

                    cliNode = slicer.cli.run(slicer.modules.brainsfit,
                                             None,
                                             parameters,
                                             wait_for_completion=True)

                    frameImage = volumenSalida.GetImageData()
                    frameImageArray = vtk.util.numpy_support.vtk_to_numpy(
                        frameImage.GetPointData().GetScalars())
                    mvImageArray.T[i] = frameImageArray

                elif Tipo_registro == 'Rigid-Affine':

                    parameters['fixedVolume'] = volumenFijo.GetID()
                    parameters['movingVolume'] = volumenMovil.GetID()
                    parameters['transformType'] = 'Rigid'
                    parameters[
                        'outputTransform'] = transformadaSalidaLinear.GetID()
                    parameters['outputVolume'] = volumenSalida.GetID()

                    cliNode = slicer.cli.run(slicer.modules.brainsfit,
                                             None,
                                             parameters,
                                             wait_for_completion=True)

                    Matriz = transformadaSalidaLinear.GetMatrixTransformToParent(
                    )

                    if bandera == 0:
                        bandera = 1
                        volumenFijo = volumenSalida

                    parameters['fixedVolume'] = volumenFijo.GetID()
                    parameters['movingVolume'] = volumenSalida.GetID()
                    parameters['transformType'] = 'Affine'
                    parameters[
                        'outputTransform'] = transformadaSalidaLinear.GetID()
                    parameters['outputVolume'] = volumenSalida.GetID()

                    cliNode = slicer.cli.run(slicer.modules.brainsfit,
                                             None,
                                             parameters,
                                             wait_for_completion=True)

                    frameImage = volumenSalida.GetImageData()
                    frameImageArray = vtk.util.numpy_support.vtk_to_numpy(
                        frameImage.GetPointData().GetScalars())
                    mvImageArray.T[i] = frameImageArray

                elif (Tipo_registro
                      == 'Rigid') or (Tipo_registro
                                      == 'Bspline') or (Tipo_registro
                                                        == 'Affine'):

                    parameters['fixedVolume'] = volumenFijo.GetID()
                    parameters['movingVolume'] = volumenMovil.GetID()
                    parameters['transformType'] = Tipo_registro
                    if Tipo_registro == 'Bspline':
                        parameters[
                            'outputTransform'] = transformadaSalidaBSpline.GetID(
                            )
                    else:
                        parameters[
                            'outputTransform'] = transformadaSalidaLinear.GetID(
                            )
                    parameters['outputVolume'] = volumenSalida.GetID()

                    cliNode = slicer.cli.run(slicer.modules.brainsfit,
                                             None,
                                             parameters,
                                             wait_for_completion=True)
                    Parameters = {}
                    Parameters['Conductance'] = 1
                    Parameters['numberOfIterations'] = 5
                    Parameters['timeStep'] = 0.0625
                    Parameters['inputVolume'] = volumenSalida.GetID()
                    Parameters['outputVolume'] = volumenSalida.GetID()
                    cliNode = slicer.cli.run(
                        slicer.modules.gradientanisotropicdiffusion,
                        None,
                        Parameters,
                        wait_for_completion=True)

                    frameImage = volumenSalida.GetImageData()
                    frameImageArray = vtk.util.numpy_support.vtk_to_numpy(
                        frameImage.GetPointData().GetScalars())
                    mvImageArray.T[i] = frameImageArray
                if (i == 9):
                    self.VolumenReferencia = volumenSalida

                mvDisplayNode = slicer.mrmlScene.CreateNodeByClass(
                    'vtkMRMLMultiVolumeDisplayNode')
                mvDisplayNode.SetScene(slicer.mrmlScene)
                slicer.mrmlScene.AddNode(mvDisplayNode)
                mvDisplayNode.SetReferenceCount(
                    mvDisplayNode.GetReferenceCount() - 1)
                mvDisplayNode.SetDefaultColorMap()

                mvNode.SetAndObserveDisplayNodeID(mvDisplayNode.GetID())
                mvNode.SetAndObserveImageData(mvImage)
                mvNode.SetNumberOfFrames(numero_imagenes)

                mvNode.SetLabelArray(volumeLabels)
                mvNode.SetLabelName('na')
                mvNode.SetAttribute('MultiVolume.FrameLabels', frameLabelsAttr)
                mvNode.SetAttribute('MultiVolume.NumberOfFrames',
                                    str(numero_imagenes))
                mvNode.SetAttribute('MultiVolume.FrameIdentifyingDICOMTagName',
                                    'NA')
                mvNode.SetAttribute(
                    'MultiVolume.FrameIdentifyingDICOMTagUnits', 'na')

                mvNode.SetName('MultiVolume Registrado')
                Helper.SetBgFgVolumes(mvNode.GetID(), None)

                Matriz = transformadaSalidaLinear.GetMatrixTransformToParent()

                #imprime en la consola los volumenes que tienen desplazamientos mayores 1 mm

            print('Registro completo')

            #al terminar el ciclo for con todos los volumenes registrados se genera una
            #ventana emergente con un mensaje("Registro completo!") y mostrando los
            #volumenes que se desplazaron mas de 4mm
            qt.QMessageBox.information(slicer.util.mainWindow(),
                                       'Slicer Python', 'Registro completo')

            return True
Esempio n. 50
0
def main():
    fileName = get_program_parameters()
    colors = vtk.vtkNamedColors()

    # Read the CT data of the human head.
    reader = vtk.vtkMetaImageReader()
    reader.SetFileName(fileName)
    reader.Update()

    cast = vtk.vtkImageCast()
    cast.SetInputConnection(reader.GetOutputPort())
    cast.SetOutputScalarTypeToFloat()

    # Magnify the image.
    magnify = vtk.vtkImageMagnify()
    magnify.SetInputConnection(cast.GetOutputPort())
    magnify.SetMagnificationFactors(2, 2, 1)
    magnify.InterpolateOn()

    # Smooth the data.
    # Remove high frequency artifacts due to linear interpolation.
    smooth = vtk.vtkImageGaussianSmooth()
    smooth.SetInputConnection(magnify.GetOutputPort())
    smooth.SetDimensionality(2)
    smooth.SetStandardDeviations(1.5, 1.5, 0.0)
    smooth.SetRadiusFactors(2.01, 2.01, 0.0)

    # Compute the 2D gradient.
    gradient = vtk.vtkImageGradient()
    gradient.SetInputConnection(smooth.GetOutputPort())
    gradient.SetDimensionality(2)

    # Convert the data to polar coordinates.
    # The image magnitude is mapped into saturation value,
    # whilst the gradient direction is mapped into hue value.
    polar = vtk.vtkImageEuclideanToPolar()
    polar.SetInputConnection(gradient.GetOutputPort())
    polar.SetThetaMaximum(255.0)

    # Add a third component to the data.
    # This is needed since the gradient filter only generates two components,
    #  and we need three components to represent color.
    pad = vtk.vtkImageConstantPad()
    pad.SetInputConnection(polar.GetOutputPort())
    pad.SetOutputNumberOfScalarComponents(3)
    pad.SetConstant(200.0)

    # At this point we have Hue, Value, Saturation.
    # Permute components so saturation will be constant.
    # Re-arrange components into HSV order.
    permute = vtk.vtkImageExtractComponents()
    permute.SetInputConnection(pad.GetOutputPort())
    permute.SetComponents(0, 2, 1)

    # Convert back into RGB values.
    rgb = vtk.vtkImageHSVToRGB()
    rgb.SetInputConnection(permute.GetOutputPort())
    rgb.SetMaximum(255.0)

    # Set up a viewer for the image.
    # Note that vtkImageViewer and vtkImageViewer2 are convenience wrappers around
    # vtkActor2D, vtkImageMapper, vtkRenderer, and vtkRenderWindow.
    # So all that needs to be supplied is the interactor.
    viewer = vtk.vtkImageViewer()
    viewer.SetInputConnection(rgb.GetOutputPort())
    viewer.SetZSlice(22)
    viewer.SetColorWindow(255.0)
    viewer.SetColorLevel(127.0)
    viewer.GetRenderWindow().SetSize(512, 512)
    viewer.GetRenderer().SetBackground(colors.GetColor3d("Silver"))

    # Create the RenderWindowInteractor.
    iren = vtk.vtkRenderWindowInteractor()
    viewer.SetupInteractor(iren)
    viewer.Render()

    iren.Initialize()
    iren.Start()
# Create the RenderWindow, Renderer and both Actors
#
ren1 = vtk.vtkRenderer()
ren1.SetBackground(1, 1, 1)
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren1)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)

# Read the data. Note this creates a 3-component scalar.
red = vtk.vtkPNGReader()
red.SetFileName(VTK_DATA_ROOT + "/Data/RedCircle.png")
red.Update()

# Next filter can only handle RGB *(&&*@
extract = vtk.vtkImageExtractComponents()
extract.SetInputConnection(red.GetOutputPort())
extract.SetComponents(0, 1, 2)

# Quantize the image into an index
quantize = vtk.vtkImageQuantizeRGBToIndex()
quantize.SetInputConnection(extract.GetOutputPort())
quantize.SetNumberOfColors(3)

# Create the pipeline
discrete = vtk.vtkDiscreteFlyingEdges2D()
discrete.SetInputConnection(quantize.GetOutputPort())
discrete.SetValue(0, 0)

# Create polgons
polyLoops = vtk.vtkContourLoopExtraction()