Ejemplo n.º 1
0
 def getNIFTIHeader(self, volumeNode):
     reader = vtk.vtkNIFTIImageReader()
     filepath = self.getNodeFilepath(volumeNode)
     reader.SetFileName(filepath)
     reader.Update()
     header = reader.GetNIFTIHeader()
     return header
Ejemplo n.º 2
0
    def load_image(self, ImgFileName):
        # Load an image using the vtk image reader

        imgReader = vtk.vtkNIFTIImageReader()
        imgReader.SetFileName(ImgFileName)
        imgReader.Update()

        # This is needed for working on the Mac
        # Perhaps the imgReader don't finish running in time?
        # VTK uses 'lazy functions'
        from vtk.util.numpy_support import vtk_to_numpy
        array = vtk_to_numpy(imgReader.GetOutput().GetPointData().GetScalars())

        return imgReader
Ejemplo n.º 3
0
    def loadDevelopmentalAtlas(self):

        # get the header - this reader doesn't support 4D
        # but can query the header.
        reader = vtk.vtkNIFTIImageReader()
        reader.SetFileName(self.developmentalPath)
        reader.Update()
        niftiHeader = reader.GetNIFTIHeader()

        print(self.developmentalPath)
        if niftiHeader.GetDataType() != 16:
            print(niftiHeader.GetDataType())
            raise Exception('Can only load float data')

        # create the correct size and shape vtkImageData
        columns = niftiHeader.GetDim(1)
        rows = niftiHeader.GetDim(2)
        slices = niftiHeader.GetDim(3)
        frames = niftiHeader.GetDim(4)

        fp = open(self.developmentalPath, 'rb')
        headerThrowaway = fp.read(niftiHeader.GetVoxOffset())
        niiArray = numpy.fromfile(fp, numpy.dtype('float32'))

        niiShape = (frames, slices, rows, columns)
        niiArray = niiArray.reshape(niiShape)

        image = vtk.vtkImageData()
        image.SetDimensions(columns, rows, slices)
        image.AllocateScalars(vtk.VTK_FLOAT, frames)
        from vtk.util.numpy_support import vtk_to_numpy
        imageShape = (slices, rows, columns, frames)
        imageArray = vtk_to_numpy(
            image.GetPointData().GetScalars()).reshape(imageShape)

        # copy the data from numpy to vtk (need to shuffle frames to components)
        for frame in range(frames):
            imageArray[:, :, :, frame] = niiArray[frame]

        # create the multivolume node and display it
        multiVolumeNode = slicer.vtkMRMLMultiVolumeNode()

        volumeLabels = vtk.vtkDoubleArray()
        volumeLabels.SetNumberOfTuples(frames)
        volumeLabels.SetNumberOfComponents(1)
        volumeLabels.Allocate(frames)
        for frame in xrange(frames):
            volumeLabels.SetComponent(frame, 0, self.agesInYears[frame])

        multiVolumeNode.SetScene(slicer.mrmlScene)

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

        multiVolumeNode.SetAndObserveDisplayNodeID(
            multiVolumeDisplayNode.GetID())
        multiVolumeNode.SetAndObserveImageData(image)
        multiVolumeNode.SetNumberOfFrames(frames)
        multiVolumeNode.SetName("DevelopmentalAtlas")
        multiVolumeNode.SetLabelArray(volumeLabels)
        multiVolumeNode.SetLabelName("Years")
        multiVolumeNode.SetAttribute("MultiVolume.FrameLabels",
                                     str(self.agesInYears)[1:-1])
        multiVolumeNode.SetAttribute("MultiVolume.NumberOfFrames", str(frames))
        multiVolumeNode.SetAttribute(
            "MultiVolume.FrameIdentifyingDICOMTagName", "Age")
        multiVolumeNode.SetAttribute(
            "MultiVolume.FrameIdentifyingDICOMTagUnits", "(Years)")
        slicer.mrmlScene.AddNode(multiVolumeNode)

        return multiVolumeNode
    def read4DNIfTI(self, mvNode, fileName):
        """Try to read a 4D nifti file as a multivolume"""
        print('trying to read %s' % fileName)

        # use the vtk reader which seems to handle most nifti variants well
        reader = vtk.vtkNIFTIImageReader()
        reader.SetFileName(fileName)
        reader.SetTimeAsVector(True)
        reader.Update()
        header = reader.GetNIFTIHeader()
        qFormMatrix = reader.GetQFormMatrix()
        if not qFormMatrix:
            print('Warning: %s does not have a QFormMatrix - using Identity')
            qFormMatrix = vtk.vtkMatrix4x4()
        spacing = reader.GetOutputDataObject(0).GetSpacing()
        timeSpacing = reader.GetTimeSpacing()
        nFrames = reader.GetTimeDimension()
        if header.GetIntentCode() != header.IntentTimeSeries:
            intentName = header.GetIntentName()
            if not intentName:
                intentName = 'Nothing'
            print(
                f'Warning: {fileName} does not have TimeSeries intent, instead it has \"{intentName}\"'
            )
            print('Trying to read as TimeSeries anyway')
        units = header.GetXYZTUnits()

        # try to account for some of the unit options
        # (Note: no test data available but we hope these are right)
        if units & header.UnitsMSec == header.UnitsMSec:
            timeSpacing /= 1000.
        if units & header.UnitsUSec == header.UnitsUSec:
            timeSpacing /= 1000. / 1000.
        spaceScaling = 1.
        if units & header.UnitsMeter == header.UnitsMeter:
            spaceScaling *= 1000.
        if units & header.UnitsMicron == header.UnitsMicron:
            spaceScaling /= 1000.
        spacing = [e * spaceScaling for e in spacing]

        # create frame labels using the timing info from the file
        # but use the advanced info so user can specify offset and scale
        volumeLabels = vtk.vtkDoubleArray()
        volumeLabels.SetNumberOfTuples(nFrames)
        frameLabelsAttr = ''
        for i in range(nFrames):
            frameId = self.__veInitial.value + timeSpacing * self.__veStep.value * i
            volumeLabels.SetComponent(i, 0, frameId)
            frameLabelsAttr += str(frameId) + ','
        frameLabelsAttr = frameLabelsAttr[:-1]

        # create the display node
        mvDisplayNode = slicer.mrmlScene.CreateNodeByClass(
            'vtkMRMLMultiVolumeDisplayNode')
        mvDisplayNode.SetScene(slicer.mrmlScene)
        slicer.mrmlScene.AddNode(mvDisplayNode)
        mvDisplayNode.SetReferenceCount(mvDisplayNode.GetReferenceCount() - 1)
        mvDisplayNode.SetDefaultColorMap()

        # spacing and origin are in the ijkToRAS, so clear them from image data
        imageChangeInformation = vtk.vtkImageChangeInformation()
        imageChangeInformation.SetInputConnection(reader.GetOutputPort())
        imageChangeInformation.SetOutputSpacing(1, 1, 1)
        imageChangeInformation.SetOutputOrigin(0, 0, 0)
        imageChangeInformation.Update()

        # QForm includes directions and origin, but not spacing so add that
        # here by multiplying by a diagonal matrix with the spacing
        scaleMatrix = vtk.vtkMatrix4x4()
        for diag in range(3):
            scaleMatrix.SetElement(diag, diag, spacing[diag])
        ijkToRAS = vtk.vtkMatrix4x4()
        ijkToRAS.DeepCopy(qFormMatrix)
        vtk.vtkMatrix4x4.Multiply4x4(ijkToRAS, scaleMatrix, ijkToRAS)
        mvNode.SetIJKToRASMatrix(ijkToRAS)
        mvNode.SetAndObserveDisplayNodeID(mvDisplayNode.GetID())
        mvNode.SetAndObserveImageData(
            imageChangeInformation.GetOutputDataObject(0))
        mvNode.SetNumberOfFrames(nFrames)

        # set the labels and other attributes, then display the volume
        mvNode.SetLabelArray(volumeLabels)
        mvNode.SetLabelName(self.__veLabel.text)

        mvNode.SetAttribute('MultiVolume.FrameLabels', frameLabelsAttr)
        mvNode.SetAttribute('MultiVolume.NumberOfFrames', str(nFrames))
        mvNode.SetAttribute('MultiVolume.FrameIdentifyingDICOMTagName', '')
        mvNode.SetAttribute('MultiVolume.FrameIdentifyingDICOMTagUnits', '')

        mvNode.SetName(str(nFrames) + ' frames NIfTI MultiVolume')
        Helper.SetBgFgVolumes(mvNode.GetID(), None)
  def read4DNIfTI(self, mvNode, fileName):
    """Try to read a 4D nifti file as a multivolume"""
    print('trying to read %s' % fileName)

    # use the vtk reader which seems to handle most nifti variants well
    reader = vtk.vtkNIFTIImageReader()
    reader.SetFileName(fileName)
    reader.SetTimeAsVector(True)
    reader.Update()
    header = reader.GetNIFTIHeader()
    qFormMatrix = reader.GetQFormMatrix()
    if not qFormMatrix:
      print('Warning: %s does not have a QFormMatrix - using Identity')
      qFormMatrix = vtk.vtkMatrix4x4()
    spacing = reader.GetOutputDataObject(0).GetSpacing()
    timeSpacing = reader.GetTimeSpacing()
    nFrames = reader.GetTimeDimension()
    if header.GetIntentCode() != header.IntentTimeSeries:
      intentName = header.GetIntentName()
      if not intentName:
        intentName = 'Nothing'
      print('Warning: %s does not have TimeSeries intent, instead it has \"%s\"' % (fileName,intentName))
      print('Trying to read as TimeSeries anyway')
    units = header.GetXYZTUnits()

    # try to account for some of the unit options
    # (Note: no test data available but we hope these are right)
    if units & header.UnitsMSec:
      timeSpacing /= 1000.
    if units & header.UnitsUSec:
      timeSpacing /= 1000. / 1000.
    spaceScaling = 1.
    if units & header.UnitsMeter:
      spaceScaling *= 1000.
    if units & header.UnitsMicron:
      spaceScaling /= 1000.
    spacing = map(lambda e: e * spaceScaling, spacing)

    # create frame labels using the timing info from the file
    # but use the advanced info so user can specify offset and scale
    volumeLabels = vtk.vtkDoubleArray()
    volumeLabels.SetNumberOfTuples(nFrames)
    frameLabelsAttr = ''
    for i in range(nFrames):
      frameId = self.__veInitial.value + timeSpacing * self.__veStep.value * i
      volumeLabels.SetComponent(i, 0, frameId)
      frameLabelsAttr += str(frameId)+','
    frameLabelsAttr = frameLabelsAttr[:-1]

    # create the display node
    mvDisplayNode = slicer.mrmlScene.CreateNodeByClass('vtkMRMLMultiVolumeDisplayNode')
    mvDisplayNode.SetScene(slicer.mrmlScene)
    slicer.mrmlScene.AddNode(mvDisplayNode)
    mvDisplayNode.SetReferenceCount(mvDisplayNode.GetReferenceCount()-1)
    mvDisplayNode.SetDefaultColorMap()

    # spacing and origin are in the ijkToRAS, so clear them from image data
    imageChangeInformation = vtk.vtkImageChangeInformation()
    imageChangeInformation.SetInputConnection(reader.GetOutputPort())
    imageChangeInformation.SetOutputSpacing( 1, 1, 1 )
    imageChangeInformation.SetOutputOrigin( 0, 0, 0 )
    imageChangeInformation.Update()

    # QForm includes directions and origin, but not spacing so add that
    # here by multiplying by a diagonal matrix with the spacing
    scaleMatrix = vtk.vtkMatrix4x4()
    for diag in range(3):
      scaleMatrix.SetElement(diag, diag, spacing[diag])
    ijkToRAS = vtk.vtkMatrix4x4()
    ijkToRAS.DeepCopy(qFormMatrix)
    vtk.vtkMatrix4x4.Multiply4x4(ijkToRAS, scaleMatrix, ijkToRAS)
    mvNode.SetIJKToRASMatrix(ijkToRAS)
    mvNode.SetAndObserveDisplayNodeID(mvDisplayNode.GetID())
    mvNode.SetAndObserveImageData(imageChangeInformation.GetOutputDataObject(0))
    mvNode.SetNumberOfFrames(nFrames)

    # set the labels and other attributes, then display the volume
    mvNode.SetLabelArray(volumeLabels)
    mvNode.SetLabelName(self.__veLabel.text)

    mvNode.SetAttribute('MultiVolume.FrameLabels',frameLabelsAttr)
    mvNode.SetAttribute('MultiVolume.NumberOfFrames',str(nFrames))
    mvNode.SetAttribute('MultiVolume.FrameIdentifyingDICOMTagName','')
    mvNode.SetAttribute('MultiVolume.FrameIdentifyingDICOMTagUnits','')

    mvNode.SetName(str(nFrames)+' frames NIfTI MultiVolume')
    Helper.SetBgFgVolumes(mvNode.GetID(),None)
Ejemplo n.º 6
0
  def loadDevelopmentalAtlas(self):

    # get the header - this reader doesn't support 4D
    # but can query the header.
    reader = vtk.vtkNIFTIImageReader()
    reader.SetFileName(self.developmentalPath)
    reader.Update()
    niftiHeader = reader.GetNIFTIHeader()

    print(self.developmentalPath)
    if niftiHeader.GetDataType() != 16:
      print (niftiHeader.GetDataType())
      raise Exception('Can only load float data')

    # create the correct size and shape vtkImageData
    columns = niftiHeader.GetDim(1)
    rows = niftiHeader.GetDim(2)
    slices = niftiHeader.GetDim(3)
    frames = niftiHeader.GetDim(4)

    fp = open(self.developmentalPath, 'rb')
    headerThrowaway = fp.read(niftiHeader.GetVoxOffset())
    niiArray = numpy.fromfile(fp, numpy.dtype('float32'))

    niiShape = (frames, slices, rows, columns)
    niiArray = niiArray.reshape(niiShape)

    image = vtk.vtkImageData()
    image.SetDimensions(columns, rows, slices)
    image.AllocateScalars(vtk.VTK_FLOAT, frames)
    from vtk.util.numpy_support import vtk_to_numpy
    imageShape = (slices, rows, columns, frames)
    imageArray = vtk_to_numpy(image.GetPointData().GetScalars()).reshape(imageShape)

    # copy the data from numpy to vtk (need to shuffle frames to components)
    for frame in range(frames):
      imageArray[:,:,:,frame] = niiArray[frame]

    # create the multivolume node and display it
    multiVolumeNode = slicer.vtkMRMLMultiVolumeNode()

    volumeLabels = vtk.vtkDoubleArray()
    volumeLabels.SetNumberOfTuples(frames)
    volumeLabels.SetNumberOfComponents(1)
    volumeLabels.Allocate(frames)
    for frame in xrange(frames):
      volumeLabels.SetComponent(frame,0,self.agesInYears[frame])

    multiVolumeNode.SetScene(slicer.mrmlScene)

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

    multiVolumeNode.SetAndObserveDisplayNodeID(multiVolumeDisplayNode.GetID())
    multiVolumeNode.SetAndObserveImageData(image)
    multiVolumeNode.SetNumberOfFrames(frames)
    multiVolumeNode.SetName("DevelopmentalAtlas")
    multiVolumeNode.SetLabelArray(volumeLabels)
    multiVolumeNode.SetLabelName("Years")
    multiVolumeNode.SetAttribute("MultiVolume.FrameLabels", str(self.agesInYears)[1:-1])
    multiVolumeNode.SetAttribute("MultiVolume.NumberOfFrames", str(frames))
    multiVolumeNode.SetAttribute("MultiVolume.FrameIdentifyingDICOMTagName", "Age")
    multiVolumeNode.SetAttribute("MultiVolume.FrameIdentifyingDICOMTagUnits", "(Years)")
    slicer.mrmlScene.AddNode(multiVolumeNode)

    return multiVolumeNode