import vtk.util.colors points = vtk.vtkPoints() points.InsertNextPoint(0, 0, 0) points.InsertNextPoint(0, 1, 0) points.InsertNextPoint(1, 0, 0) points.InsertNextPoint(0, 0, 1) pointsPolyData = vtk.vtkPolyData() pointsPolyData.SetPoints(points) pointsImageData = vtk.vtkImageData() pointsImageData.GetPointData().ShallowCopy(pointsPolyData.GetPointData()) pointsImageData.GetCellData().ShallowCopy(pointsPolyData.GetCellData()) bsplineCoeff = vtk.vtkImageBSplineCoefficients() bsplineCoeff.SetInputData(pointsImageData) bsplineCoeff.SetSplineDegree(3) bsplineCoeff.SetBorderModeToClamp() bsplineCoeff.Update() bsplineInter = vtk.vtkImageBSplineInterpolator() bsplineInter.SetSplineDegree(3) bsplineInter.SetBorderModeToClamp() bsplineInter.Initialize(bsplineCoeff.GetOutput()) bsplineInter.Update() #TO FINISH vertexFilter = vtk.vtkVertexGlyphFilter() vertexFilter.SetInputData(pointsPolyData)
reader.ReleaseDataFlagOff() reader.SetDataByteOrderToLittleEndian() reader.SetDataExtent(0,63,0,63,1,93) reader.SetDataSpacing(3.2,3.2,1.5) reader.SetFilePrefix("" + str(VTK_DATA_ROOT) + "/Data/headsq/quarter") reader.SetDataMask(0x7fff) transform = vtk.vtkTransform() # rotate about the center of the image transform.Translate(+100.8,+100.8,+69.0) transform.RotateWXYZ(10,1,1,0) transform.Translate(-100.8,-100.8,-69.0) bspline3 = vtk.vtkImageBSplineInterpolator() bspline3.SetSplineDegree(3) bspline9 = vtk.vtkImageBSplineInterpolator() bspline9.SetSplineDegree(9) coeffs1 = vtk.vtkImageBSplineCoefficients() coeffs1.SetInputConnection(reader.GetOutputPort()) coeffs1.SetSplineDegree(3) coeffs2 = vtk.vtkImageBSplineCoefficients() coeffs2.SetInputConnection(reader.GetOutputPort()) coeffs2.SetSplineDegree(9) reslice1 = vtk.vtkImageReslice() reslice1.SetInputConnection(coeffs1.GetOutputPort()) reslice1.SetResliceTransform(transform) reslice1.SetInterpolator(bspline3) reslice1.SetOutputSpacing(2.0,2.0,1.5) reslice1.SetOutputOrigin(-32,-32,40) reslice1.SetOutputExtent(0,127,0,127,0,0) reslice2 = vtk.vtkImageReslice() reslice2.SetInputConnection(coeffs1.GetOutputPort()) reslice2.SetInterpolator(bspline3)
reader.ReleaseDataFlagOff() reader.SetDataByteOrderToLittleEndian() reader.SetDataExtent(0, 63, 0, 63, 1, 93) reader.SetDataSpacing(3.2, 3.2, 1.5) reader.SetFilePrefix("" + str(VTK_DATA_ROOT) + "/Data/headsq/quarter") reader.SetDataMask(0x7fff) transform = vtk.vtkTransform() # rotate about the center of the image transform.Translate(+100.8, +100.8, +69.0) transform.RotateWXYZ(10, 1, 1, 0) transform.Translate(-100.8, -100.8, -69.0) bspline3 = vtk.vtkImageBSplineInterpolator() bspline3.SetSplineDegree(3) bspline9 = vtk.vtkImageBSplineInterpolator() bspline9.SetSplineDegree(9) coeffs1 = vtk.vtkImageBSplineCoefficients() coeffs1.SetInputConnection(reader.GetOutputPort()) coeffs1.SetSplineDegree(3) coeffs2 = vtk.vtkImageBSplineCoefficients() coeffs2.SetInputConnection(reader.GetOutputPort()) coeffs2.SetSplineDegree(9) reslice1 = vtk.vtkImageReslice() reslice1.SetInputConnection(coeffs1.GetOutputPort()) reslice1.SetResliceTransform(transform) reslice1.SetInterpolator(bspline3) reslice1.SetOutputSpacing(2.0, 2.0, 1.5) reslice1.SetOutputOrigin(-32, -32, 40) reslice1.SetOutputExtent(0, 127, 0, 127, 0, 0) reslice2 = vtk.vtkImageReslice() reslice2.SetInputConnection(coeffs1.GetOutputPort()) reslice2.SetInterpolator(bspline3)
def convert_transform_to_vtk(transform): """Produce an output vtkBSplineTransform corresponding to the registration results. Input is a numpy array corresponding to the displacement field. """ displacement_field_vtk = vtk.util.numpy_support.numpy_to_vtk( num_array=transform, deep=True, array_type=vtk.VTK_FLOAT) displacement_field_vtk.SetNumberOfComponents(3) displacement_field_vtk.SetName('DisplacementField') grid_image = vtk.vtkImageData() if (vtk.vtkVersion().GetVTKMajorVersion() >= 6.0): grid_image.AllocateScalars(vtk.VTK_FLOAT, 3) grid_image.GetPointData().SetScalars(displacement_field_vtk) else: grid_image.SetScalarTypeToFloat() grid_image.SetNumberOfScalarComponents(3) grid_image.GetPointData().SetScalars(displacement_field_vtk) grid_image.Update() #print "CONVERT TXFORM 1:", grid_image.GetExtent(), displacement_field_vtk.GetSize() # this is a hard-coded assumption about where the polydata is located in space. # other code should check that it is centered. # This code uses a grid of 240mm x 240mm x 240mm #spacing origin extent num_vectors = len(transform) / 3 dims = round(numpy.power(num_vectors, 1.0 / 3.0)) # This MUST correspond to the size used in congeal_multisubject update_nonrigid_grid #size_mm = 240.0 size_mm = 200.0 origin = -size_mm / 2.0 # assume 240mm x 240mm x 240mm grid spacing = size_mm / (dims - 1) grid_image.SetOrigin(origin, origin, origin) grid_image.SetSpacing(spacing, spacing, spacing) #grid_image.SetExtent(0, dims-1.0, 0, dims-1.0, 0, dims-1.0) grid_image.SetDimensions(int(dims), int(dims), int(dims)) #print "CONVERT TXFORM:", num_vectors, dims, int(dims), dims-1.0, grid_image.GetExtent(), #print "GRID:", grid_image coeff = vtk.vtkImageBSplineCoefficients() if (vtk.vtkVersion().GetVTKMajorVersion() >= 6.0): coeff.SetInputData(grid_image) else: coeff.SetInput(grid_image) coeff.Update() # this was in the test code. coeff.UpdateWholeExtent() #print "TX:", transform.shape, transform, displacement_field_vtk, grid_image.GetExtent(), coeff.GetOutput().GetExtent() vtktrans = vtk.vtkBSplineTransform() if (vtk.vtkVersion().GetVTKMajorVersion() >= 6.0): vtktrans.SetCoefficientData(coeff.GetOutput()) else: vtktrans.SetCoefficients(coeff.GetOutput()) vtktrans.SetBorderModeToZero() ## print "~~~~~~~~~~~~~~~~~~~~~~~~" ## print "COEFF:", coeff.GetOutput() ## print "*********" ## print "COEFF2:", vtktrans.GetCoefficients() ## print "=======" return vtktrans
def convert_transform_to_vtk(transform): """Produce an output vtkBSplineTransform corresponding to the registration results. Input is a numpy array corresponding to the displacement field. """ displacement_field_vtk = vtk.util.numpy_support.numpy_to_vtk(num_array=transform, deep=True, array_type=vtk.VTK_FLOAT) displacement_field_vtk.SetNumberOfComponents(3) displacement_field_vtk.SetName('DisplacementField') grid_image = vtk.vtkImageData() if (vtk.vtkVersion().GetVTKMajorVersion() >= 6.0): grid_image.AllocateScalars(vtk.VTK_FLOAT, 3) grid_image.GetPointData().SetScalars(displacement_field_vtk) else: grid_image.SetScalarTypeToFloat() grid_image.SetNumberOfScalarComponents(3) grid_image.GetPointData().SetScalars(displacement_field_vtk) grid_image.Update() #print "CONVERT TXFORM 1:", grid_image.GetExtent(), displacement_field_vtk.GetSize() # this is a hard-coded assumption about where the polydata is located in space. # other code should check that it is centered. # This code uses a grid of 240mm x 240mm x 240mm #spacing origin extent num_vectors = len(transform) / 3 dims = round(numpy.power(num_vectors, 1.0/3.0)) # This MUST correspond to the size used in congeal_multisubject update_nonrigid_grid #size_mm = 240.0 size_mm = 200.0 origin = -size_mm / 2.0 # assume 240mm x 240mm x 240mm grid spacing = size_mm / (dims - 1) grid_image.SetOrigin(origin, origin, origin) grid_image.SetSpacing(spacing, spacing, spacing) #grid_image.SetExtent(0, dims-1.0, 0, dims-1.0, 0, dims-1.0) grid_image.SetDimensions(int(dims), int(dims), int(dims)) #print "CONVERT TXFORM:", num_vectors, dims, int(dims), dims-1.0, grid_image.GetExtent(), #print "GRID:", grid_image coeff = vtk.vtkImageBSplineCoefficients() if (vtk.vtkVersion().GetVTKMajorVersion() >= 6.0): coeff.SetInputData(grid_image) else: coeff.SetInput(grid_image) coeff.Update() # this was in the test code. coeff.UpdateWholeExtent() #print "TX:", transform.shape, transform, displacement_field_vtk, grid_image.GetExtent(), coeff.GetOutput().GetExtent() vtktrans = vtk.vtkBSplineTransform() if (vtk.vtkVersion().GetVTKMajorVersion() >= 6.0): vtktrans.SetCoefficientData(coeff.GetOutput()) else: vtktrans.SetCoefficients(coeff.GetOutput()) vtktrans.SetBorderModeToZero() ## print "~~~~~~~~~~~~~~~~~~~~~~~~" ## print "COEFF:", coeff.GetOutput() ## print "*********" ## print "COEFF2:", vtktrans.GetCoefficients() ## print "=======" return vtktrans