2016-05-26 3 views
0

I possède deux matrice:rotation/translation de l'image VTK 3D avec interpolation (python)

#for example 
rotation = matrix([[ 0.61782155, 0.78631834, 0.  ], 
      [ 0.78631834, -0.61782155, 0.  ], 
      [ 0.  , 0.  , -1.  ]]) 
translation = matrix([[-0.33657291], 
      [ 1.04497454], 
      [ 0.  ]]) 
vtkinputpath = "/hello/world/vtkfile.vtk" 
vtkoutputpath = "/hello/world/vtkrotatedfile.vtk" 
interpolation = "linear" 

I ont un fichier de VTK qui contient l'image 3D et je souhaite créer une fonction en python pour faire tourner/traduire avec interpolation il.

import vtk 

def rotate(vtkinputpath, vtkoutputpath, rotation, translation, interpolation): 
    ... 

Je suis en train de se inspirer the transformJ plugin sources (voir here to understand how it works)

Je voulais utiliser vtk.vtkTransform mais je ne comprends pas vraiment comment cela fonctionne: ces examples sont pas assez près de ce Je veux faire. Voilà ce que je l'ai fait avec que:

reader = vtk.vtkXMLImageDataReader() 
reader.SetFileName(vtkinputpath) 
reader.Update() 
transform = reader.vtkTransform() 
transform.RotateX(rotation[0]) 
transform.RotateY(rotation[1]) 
transform.RotateZ(rotation[2]) 
transform.Translate(translation[0], translation[1], translation[2]) 
#and I don't know how I can choose the parameter of the interpolation 

Mais cela ne peut pas travailler ... j'ai vu here que la fonction RotateWXYZ() existe:

# create a transform that rotates the cone 
transform = vtk.vtkTransform() 
transform.RotateWXYZ(45,0,1,0) 
transformFilter=vtk.vtkTransformPolyDataFilter() 
transformFilter.SetTransform(transform) 
transformFilter.SetInputConnection(source.GetOutputPort()) 
transformFilter.Update() 

Mais je ne comprends pas ce que les lignes faire. Mon principal problème est que je ne trouve pas la documentation vtk pour Python ...

Pouvez-vous me conseiller un site de documentation pour vtk en Python? Ou pouvez-vous m'expliquer au moins comment vtktransform (rotateWXYZ()) fonctionne? S'il vous plaît, je suis totalement perdu, rien ne fonctionne.

Répondre

1

Je ne suis pas sûr qu'il ya une documentation Python spécifique, mais cela peut être utile de comprendre comment fonctionne RotateWXYZ: http://www.vtk.org/doc/nightly/html/classvtkTransform.html#a9a6bcc6b824fb0a9ee3a9048aa6b262c

Pour créer la transformez vous voulez, vous pouvez combiner des matrices de rotation et de translation dans une matrice 4x4, à Pour ce faire, nous mettons la matrice de rotation dans les colonnes et les lignes 0,1 et 2, nous mettons le vecteur de traduction dans la colonne de droite, la ligne du bas est 0,0,0,1. . Par exemple:

0.61782155 0.78631834 0  -0.33657291 
0.78631834 -0.61782155 0  1.04497454 
0   0   -1  0 
0   0   0  1 

vous pouvez ensuite définir directement la matrice à l'aide vtkTransform SetMatrix:

matrix = [0.61782155,0.78631834,0,-0.33657291,0.78631834,-0.61782155,0,1.04497454,0,0,-1,0,0,0,0,1] 
transform.SetMatrix(matrix) 

EDIT: Edité pour compléter les valeurs de la variable de la matrice.

+0

J'ai lu la description de votre lien, merci. Mais je ne suis pas sûr d'avoir bien compris la fonction SetMatrix ... J'essaye de convertir ma matrice de rotation en un angle et en un vecteur (<=> l'axe de la rotation). J'ai essayé de comprendre les sources de vtkTransform (http://www.vtk.org/doc/nightly/html/vtkTransform_8h_source.html) mais je ne suis pas sûr de comprendre ce que ça fait ... Donc merci beaucoup, je mettra à jour ma question si ma tentative ne fonctionne pas aussi. – EaudeRoche

+0

J'ai édité la réponse pour montrer les valeurs correctes dans la matrice. Si vous définissez cette matrice sur la transformation à l'aide de [SetMatrix] (http://www.vtk.org/doc/nightly/html/classvtkTransform.html#ad58b847446d791391e32441b98eff151), vous obtenez une transformation qui applique la rotation et la traduction données dans votre exemple. Après cela, vous pouvez utiliser vtkImageReslice pour appliquer la transformation à une image. J'espère que cela vous aide un peu plus. –