示例#1
0
    def SetImageTransform(self, transform):
        self._ImageTransform = transform
        if not transform:
            self._ImageReslice1.SetResliceTransform(None)
            self._ImageReslice2.SetResliceTransform(None)
            self._RayCastReslice.SetResliceTransform(None)
        elif transform.IsA('vtkLinearTransform'):
            self._ImageReslice1.SetResliceTransform(
                transform.GetLinearInverse())
            self._ImageReslice2.SetResliceTransform(
                transform.GetLinearInverse())
            self._RayCastReslice.SetResliceTransform(
                transform.GetLinearInverse())
        elif transform.IsA('vtkHomogeneousTransform'):
            self._ImageReslice1.SetResliceTransform(
                transform.GetHomogeneousInverse())
            self._ImageReslice2.SetResliceTransform(
                transform.GetHomogeneousInverse())
            self._RayCastReslice.SetResliceTransform(
                transform.GetHomogeneousInverse())
        else:
            tgrid = self._TransformToGrid
            tgrid.SetInput(transform.GetInverse())
            gridt = vtk.vtkGridTransform()
            gridt.SetInterpolationModeToCubic()
            gridt.SetDisplacementGrid(tgrid.GetOutput())
            self._ImageReslice1.SetResliceTransform(transform.GetInverse())
            self._ImageReslice2.SetResliceTransform(transform.GetInverse())
            self._RayCastReslice.SetResliceTransform(transform.GetInverse())

        self._ImplicitVolume.SetTransform(
            self._ImageReslice1.GetResliceTransform())
示例#2
0
    def onExportGrid(self):
        """Converts the current thin plate transform to a grid"""
        state = self.registrationState()

        # since the transform is ras-to-ras, we find the extreme points
        # in ras space of the fixed (target) volume and fix the unoriented
        # box around it.  Sample the grid transform at the resolution of
        # the fixed volume, which may be a bit overkill but it should aways
        # work without too much loss.
        rasBounds = [
            0,
        ] * 6
        state.fixed.GetRASBounds(rasBounds)
        from math import floor, ceil
        origin = map(int, map(floor, rasBounds[::2]))
        maxes = map(int, map(ceil, rasBounds[1::2]))
        boundSize = [m - o for m, o in zip(maxes, origin)]
        spacing = state.fixed.GetSpacing()
        samples = [ceil(b / s) for b, s in zip(boundSize, spacing)]
        extent = [
            0,
        ] * 6
        extent[::2] = [
            0,
        ] * 3
        extent[1::2] = samples
        extent = map(int, extent)

        toGrid = vtk.vtkTransformToGrid()
        toGrid.SetGridOrigin(origin)
        toGrid.SetGridSpacing(state.fixed.GetSpacing())
        toGrid.SetGridExtent(extent)
        toGrid.SetInput(
            state.transform.GetTransformFromParent())  # same in VTKv 5 & 6
        toGrid.Update()

        gridTransform = vtk.vtkGridTransform()
        if vtk.VTK_MAJOR_VERSION < 6:
            gridTransform.SetDisplacementGrid(
                toGrid.GetOutput())  # different in VTKv 5 & 6
        else:
            gridTransform.SetDisplacementGridData(toGrid.GetOutput())
        gridNode = slicer.vtkMRMLGridTransformNode()
        gridNode.SetAndObserveTransformFromParent(gridTransform)
        gridNode.SetName(state.transform.GetName() + "-grid")
        slicer.mrmlScene.AddNode(gridNode)
示例#3
0
  def onExportGrid(self):
    """Converts the current thin plate transform to a grid"""
    state = self.registationState()

    # since the transform is ras-to-ras, we find the extreme points
    # in ras space of the fixed (target) volume and fix the unoriented
    # box around it.  Sample the grid transform at the resolution of
    # the fixed volume, which may be a bit overkill but it should aways
    # work without too much loss.
    rasBounds = [0,]*6
    state.fixed.GetRASBounds(rasBounds)
    from math import floor, ceil
    origin = map(int,map(floor,rasBounds[::2]))
    maxes = map(int,map(ceil,rasBounds[1::2]))
    boundSize = [m - o for m,o in zip(maxes,origin) ]
    spacing = state.fixed.GetSpacing()
    samples = [ceil(b / s) for b,s in zip(boundSize,spacing)]
    extent = [0,]*6
    extent[::2] = [0,]*3
    extent[1::2] = samples
    extent = map(int,extent)

    toGrid = vtk.vtkTransformToGrid()
    toGrid.SetGridOrigin(origin)
    toGrid.SetGridSpacing(state.fixed.GetSpacing())
    toGrid.SetGridExtent(extent)
    toGrid.SetInput(state.transform.GetTransformFromParent()) # same in VTKv 5 & 6
    toGrid.Update()

    gridTransform = vtk.vtkGridTransform()
    if vtk.VTK_MAJOR_VERSION < 6:
      gridTransform.SetDisplacementGrid(toGrid.GetOutput()) # different in VTKv 5 & 6
    else:
      gridTransform.SetDisplacementGridData(toGrid.GetOutput())
    gridNode = slicer.vtkMRMLGridTransformNode()
    gridNode.SetAndObserveTransformFromParent(gridTransform)
    gridNode.SetName(state.transform.GetName()+"-grid")
    slicer.mrmlScene.AddNode(gridNode)
示例#4
0
p2.SetPoint(4, 96, 159, 0)
p2.SetPoint(5, 159, 159, 0)
p2.SetPoint(6, 159, 96, 0)
p2.SetPoint(7, 96, 96, 0)
thinPlate = vtk.vtkThinPlateSplineTransform()
thinPlate.SetSourceLandmarks(p2)
thinPlate.SetTargetLandmarks(p1)
thinPlate.SetBasisToR2LogR()
# convert the thin plate spline into a grid
transformToGrid = vtk.vtkTransformToGrid()
transformToGrid.SetInput(thinPlate)
transformToGrid.SetGridSpacing(16, 16, 1)
transformToGrid.SetGridOrigin(-0.5, -0.5, 0)
transformToGrid.SetGridExtent(0, 16, 0, 16, 0, 0)
transformToGrid.Update()
transform = vtk.vtkGridTransform()
transform.SetDisplacementGridConnection(transformToGrid.GetOutputPort())
transform.SetInterpolationModeToCubic()
# you must invert the transform before passing it to vtkImageReslice
transform.Inverse()
# apply the grid warp to the image
reslice = vtk.vtkImageReslice()
reslice.SetInputConnection(blend.GetOutputPort())
reslice.SetResliceTransform(transform)
reslice.SetInterpolationModeToLinear()
# set the window/level to 255.0/127.5 to view full range
viewer = vtk.vtkImageViewer()
viewer.SetInputConnection(reslice.GetOutputPort())
viewer.SetColorWindow(255.0)
viewer.SetColorLevel(127.5)
viewer.SetZSlice(0)
p1.InsertNextPoint(100,100,-50)
p2.InsertNextPoint(100,100,-50)
p1.InsertNextPoint(100,100,50)
p2.InsertNextPoint(100,100,50)
transform = vtk.vtkThinPlateSplineTransform()
transform.SetSourceLandmarks(p1)
transform.SetTargetLandmarks(p2)
transform.SetBasisToR()
gridThinPlate = vtk.vtkTransformToGrid()
gridThinPlate.SetInput(transform)
gridThinPlate.SetGridExtent(0,64,0,64,0,50)
gridThinPlate.SetGridSpacing(3.2,3.2,3.0)
gridThinPlate.SetGridOrigin(-102.4,-102.4,-75)
gridThinPlate.SetGridScalarTypeToUnsignedChar()
gridThinPlate.Update()
gridTransform = vtk.vtkGridTransform()
gridTransform.SetDisplacementGridData(gridThinPlate.GetOutput())
gridTransform.SetDisplacementShift(gridThinPlate.GetDisplacementShift())
gridTransform.SetDisplacementScale(gridThinPlate.GetDisplacementScale())
reslice = vtk.vtkImageReslice()
reslice.SetInputConnection(reader.GetOutputPort())
reslice.SetResliceTransform(gridTransform)
reslice.SetInterpolationModeToLinear()
reslice.SetOutputSpacing(1,1,1)
viewer = vtk.vtkImageViewer()
viewer.SetInputConnection(reslice.GetOutputPort())
viewer.SetZSlice(70)
viewer.SetColorWindow(2000)
viewer.SetColorLevel(1000)
viewer.SetSize(200,200)
viewer.Render()
示例#6
0
a12.RotateY(90)
a12.GetProperty().SetColor(0.9,0.9,0)
#[a12 GetProperty] SetRepresentationToWireframe
ren12 = vtk.vtkRenderer()
ren12.SetViewport(0.0,0.0,0.25,0.5)
ren12.ResetCamera(-0.5,0.5,-0.5,0.5,-1,1)
ren12.AddActor(a12)
renWin.AddRenderer(ren12)
#--------------------------
# grid transform, cubic interpolation
gridTrans = vtk.vtkTransformToGrid()
gridTrans.SetInput(t1)
gridTrans.SetGridOrigin(-1.5,-1.5,-1.5)
gridTrans.SetGridExtent(0,60,0,60,0,60)
gridTrans.SetGridSpacing(0.05,0.05,0.05)
t2 = vtk.vtkGridTransform()
t2.SetDisplacementGridConnection(gridTrans.GetOutputPort())
t2.SetInterpolationModeToCubic()
f21 = vtk.vtkTransformPolyDataFilter()
f21.SetInputConnection(ap.GetOutputPort())
f21.SetTransform(t2)
m21 = vtk.vtkDataSetMapper()
m21.SetInputConnection(f21.GetOutputPort())
a21 = vtk.vtkActor()
a21.SetMapper(m21)
a21.RotateY(90)
a21.GetProperty().SetColor(1,0,0)
#[a21 GetProperty] SetRepresentationToWireframe
ren21 = vtk.vtkRenderer()
ren21.SetViewport(0.25,0.5,0.50,1.0)
ren21.ResetCamera(-0.5,0.5,-0.5,0.5,-1,1)
示例#7
0
def VTKImageTransform(x,dx,dy,numret=False,reverse=False,origsize=None,
      cubic=False,interp=True,scalex=1,scaley=1,constant=0,wrap=False,
      mirror=False):

      maxdx = max([int(max(abs(dx.ravel()))+1),(dx.shape[1]-x.shape[1])])
      maxdy = max([int(max(abs(dy.ravel()))+1),(dx.shape[0]-x.shape[0])])
      dx = dx.astype(np.float32)
      dy = dy.astype(np.float32)
      if scalex > 1:
         xx = np.arange(x.shape[1])
         dx = (xx[np.newaxis,::]+dx).astype(np.float32)
         dy = VTKGrowN(dy,scalex,1,numret=True)
         dx = VTKGrowN(dx,scalex,1,numret=True)
         dx = (dx-np.arange(scalex*x.shape[1])[np.newaxis,::]).\
               astype(np.float32)
      if scaley > 1:
         yy = np.arange(x.shape[0])
         dy = (yy[::,np.newaxis]+dy).astype(np.float32)
         dy = VTKGrowN(dy,1,scaley,numret=True)
         dx = VTKGrowN(dx,1,scaley,numret=True)
         dy = (dy-np.arange(scaley*x.shape[0])[::,np.newaxis]).\
               astype(np.float32)
      if type(x) == np.ndarray: i = NumToVTKImage(x)
      else: i = x
      if type(dx) == np.ndarray: tx = NumToVTKImage(dx)
      else: tx = dx
      if type(dy) == np.ndarray: ty = NumToVTKImage(dy)
      else: ty = dy
      dm = ty.GetDimensions()
      dz = np.zeros(dy.shape,dy.dtype)
      tz = NumToVTKImage(dz)
      a = vtk.vtkImageAppendComponents()
      a.AddInputData(tx)
      a.AddInputData(ty)
      a.AddInputData(tz)
      a.Update()
      t = a.GetOutput()
      r = vtk.vtkGridTransform()
      r.SetDisplacementGridData(t)
      r.Update()
      s = vtk.vtkImageReslice()
      s.WrapOff()
      s.MirrorOn()
      if interp:
         s.InterpolateOn()
         if cubic: s.SetInterpolationModeToCubic()
         else: s.SetInterpolationModeToLinear()
      s.SetOutputDimensionality(2)
      if reverse:
         r.SetInterpolationModeToLinear()
         r.SetInverseTolerance(0.001)
         r.SetInverseIterations(1000)
         r.DebugOff()
         ir = r.GetInverse()
         ir.SetInterpolationModeToLinear()
         ir.SetInverseTolerance(0.001)
         ir.SetInverseIterations(1000)
         ir.GlobalWarningDisplayOff()
         s.SetResliceTransform(ir)
         s.AutoCropOutputOff()
         if origsize: s.SetOutputExtent(0,origsize[1]-1,0,origsize[0]-1,0,0)
         else: s.SetOutputExtent(0,scalex*dm[0]-1,0,scaley*dm[1]-1,0,0)
      else:
         r.SetInterpolationModeToCubic()
         r.SetInverseTolerance(0.001)
         r.SetInverseIterations(1000)
         r.GlobalWarningDisplayOff()
         s.SetOutputExtent(0,scalex*dm[0]-1,0,scaley*dm[1]-1,0,0)
         s.AutoCropOutputOff()
         s.SetResliceTransform(r)
      if mirror: ip = vtk.vtkImageMirrorPad()
      elif wrap: ip = vtk.vtkImageWrapPad()
      else: ip = vtk.vtkImageConstantPad(); ip.SetConstant(constant)
      ip.SetOutputWholeExtent(0-maxdx,dm[0]-1+maxdx,0-maxdy,dm[1]-1+maxdy,0,0)
      ip.SetInputData(i)
      ip.Update()
      s.SetInputData(ip.GetOutput())
      o=s.GetOutput()
      s.Update()
      if numret: ri = VTKImageToNum(o)
      else: ri = o
      return ri