Alex Schuster
2011-07-07 14:48:31 UTC
Hallo!
Ich komme bei einem Problem nicht so recht weiter. Es geht um tomografische
Aufnahmen, beispielsweise die Kernspinaufnahme eines Kopfes, die gedreht
sind, und die ich wieder zurückdrehen möchte. Die X-Achse zeigt hierbei aus
Sicht des Patienten nach links, die Y-Achse nach hinten, die Z-Achse in
Kopfrichtung. Eine Aufnahme setzt sich aus einem Stapel von Schichten
zusammen, und die Orientierung einer Schicht kann recht beliebig sein
(untereinander sind sie natürlich gleich orientiert). Ohne Rotation würden
X- und Y-Achse der Schicht dem Patientenkoordinatensystem entsprechen, und
der Normalenvektor ginge in Richtung Fuß->Kopf.
Die Lage der Schichten ist oft aber anders gewählt, um eine höhere
Bildqualität zu erreichen - idR ist die Auflösung innerhalb einer Schicht
höher als der Abstand der Schichten voneinander.
Die Software, mit der ich die Bilder anzeige, kann sie beliebig drehen und
verschieben. Die Drehungen werden dabei durch Winkel rx, ry und rz um die
X-, Y- und Z-Achse bestimmt, in dieser Reihenfolge. Die Achsen sind dabei
nicht ortsfest, sondern drehen sich dabei mit.
Die Datensätze liegen im DICOM-Format vor. Die Rotation wird dabei nicht in
Winkeln oder als Drehmatrix angegeben, sondern in Form von zwei mal drei
Werten, die den Kosinus des Winkels zwischen der X-/Y-Achse des Bildes und
den X-, Y- und Z-Achsen des Koordinatensystems angeben.
Beispiel: bei einer Orientierung von (1,0,0) / (0,1,0) wäre nichts zu tun.
Die X-Achse des Bildes liegt entlang der X-Achse des Patienten, der Kosinus
ist 1, und die beiden anderen Achsen sind zu ihr orthogonal, der Kosinus ist
0. Entsprechend bei der Y-Achse des Bildes.
Anderes Beispiel: (0,1,0) / (0,0,-1) ist sagittale Orientierung, eine
Schicht zeigt einen Schnitt bei dem die X-Richtung von vorne nach hinten
geht und die Y-Richtung von oben nach unten. Die X-Achse des Bildes liegt
auf der Y-Achse im Patientenkoordinatensystem, d.h. Richtung Hinterkopf. Die
Y-Achse des Bildes liegt auf der Z-Achse im Patientenkoordinatensystem, aber
entgegengesetzt. In meiner Applikation entspricht das einer Drehung von
jeweils -90 Grad um die X- und die Y-Achse.
Aber an einer allgemeinen Lösung bin ich bislang gescheitert. Ich habe es so
versucht:
/ oxX oyX oxY*oyZ-oxZ*oyY \
R = | oxY oyY oxZ*oyX-oxX*oyZ |
\ oxZ oyZ oxX*oyY-oxY*oyX /
oij ist dabei der Richtungskosinus der i-Achse des Bildes und der
Patientenachse j. Die ersten beiden Spalten sind einfach meine beiden
Vektoren der Richtungskosinusse. Die dritte Spalte ist ihr Vektorprodukt.
Das sollte also die Drehung des Bildes beschreiben. Die invertierte (bzw.
transponierte) Drehmatrix beschreibt dann die Drehung, die ich letztlich
ausführen möchte.
Nun will ich die Winkel aus der Drehmatrix zurückrechnen. Auf [*] habe ich
dazu folgende Formeln gefunden:
ry = atan2( -R31, sqrt( R11^2+R21^2 ) )
rx = atan2( R21/cos(ry), R11/cos(ry) )
rz = atan2( R32/cos(ry), R33/cos(ry) )
So klappt's aber nicht. Ich glaube, der Fehler liegt einfach nur darin,
dass hier von einer raumfesten Orthogonalbasis ausgegangen wird, d.h. die
Achsen drehen sich nicht mit. Ich finde aber keine Formel für den Fall,
dass sie sich mitdrehen. Hat die vielleicht hier jemand parat? Oder denke
ich eh zu kompliziert? Über Hinweise würde ich mich sehr freuen.
Wonko
[*] http://de.wikipedia.org/wiki/Roll-Nick-Gier-Winkel#Berechnung_aus_Rotationsmatrix
Ich komme bei einem Problem nicht so recht weiter. Es geht um tomografische
Aufnahmen, beispielsweise die Kernspinaufnahme eines Kopfes, die gedreht
sind, und die ich wieder zurückdrehen möchte. Die X-Achse zeigt hierbei aus
Sicht des Patienten nach links, die Y-Achse nach hinten, die Z-Achse in
Kopfrichtung. Eine Aufnahme setzt sich aus einem Stapel von Schichten
zusammen, und die Orientierung einer Schicht kann recht beliebig sein
(untereinander sind sie natürlich gleich orientiert). Ohne Rotation würden
X- und Y-Achse der Schicht dem Patientenkoordinatensystem entsprechen, und
der Normalenvektor ginge in Richtung Fuß->Kopf.
Die Lage der Schichten ist oft aber anders gewählt, um eine höhere
Bildqualität zu erreichen - idR ist die Auflösung innerhalb einer Schicht
höher als der Abstand der Schichten voneinander.
Die Software, mit der ich die Bilder anzeige, kann sie beliebig drehen und
verschieben. Die Drehungen werden dabei durch Winkel rx, ry und rz um die
X-, Y- und Z-Achse bestimmt, in dieser Reihenfolge. Die Achsen sind dabei
nicht ortsfest, sondern drehen sich dabei mit.
Die Datensätze liegen im DICOM-Format vor. Die Rotation wird dabei nicht in
Winkeln oder als Drehmatrix angegeben, sondern in Form von zwei mal drei
Werten, die den Kosinus des Winkels zwischen der X-/Y-Achse des Bildes und
den X-, Y- und Z-Achsen des Koordinatensystems angeben.
Beispiel: bei einer Orientierung von (1,0,0) / (0,1,0) wäre nichts zu tun.
Die X-Achse des Bildes liegt entlang der X-Achse des Patienten, der Kosinus
ist 1, und die beiden anderen Achsen sind zu ihr orthogonal, der Kosinus ist
0. Entsprechend bei der Y-Achse des Bildes.
Anderes Beispiel: (0,1,0) / (0,0,-1) ist sagittale Orientierung, eine
Schicht zeigt einen Schnitt bei dem die X-Richtung von vorne nach hinten
geht und die Y-Richtung von oben nach unten. Die X-Achse des Bildes liegt
auf der Y-Achse im Patientenkoordinatensystem, d.h. Richtung Hinterkopf. Die
Y-Achse des Bildes liegt auf der Z-Achse im Patientenkoordinatensystem, aber
entgegengesetzt. In meiner Applikation entspricht das einer Drehung von
jeweils -90 Grad um die X- und die Y-Achse.
Aber an einer allgemeinen Lösung bin ich bislang gescheitert. Ich habe es so
versucht:
/ oxX oyX oxY*oyZ-oxZ*oyY \
R = | oxY oyY oxZ*oyX-oxX*oyZ |
\ oxZ oyZ oxX*oyY-oxY*oyX /
oij ist dabei der Richtungskosinus der i-Achse des Bildes und der
Patientenachse j. Die ersten beiden Spalten sind einfach meine beiden
Vektoren der Richtungskosinusse. Die dritte Spalte ist ihr Vektorprodukt.
Das sollte also die Drehung des Bildes beschreiben. Die invertierte (bzw.
transponierte) Drehmatrix beschreibt dann die Drehung, die ich letztlich
ausführen möchte.
Nun will ich die Winkel aus der Drehmatrix zurückrechnen. Auf [*] habe ich
dazu folgende Formeln gefunden:
ry = atan2( -R31, sqrt( R11^2+R21^2 ) )
rx = atan2( R21/cos(ry), R11/cos(ry) )
rz = atan2( R32/cos(ry), R33/cos(ry) )
So klappt's aber nicht. Ich glaube, der Fehler liegt einfach nur darin,
dass hier von einer raumfesten Orthogonalbasis ausgegangen wird, d.h. die
Achsen drehen sich nicht mit. Ich finde aber keine Formel für den Fall,
dass sie sich mitdrehen. Hat die vielleicht hier jemand parat? Oder denke
ich eh zu kompliziert? Über Hinweise würde ich mich sehr freuen.
Wonko
[*] http://de.wikipedia.org/wiki/Roll-Nick-Gier-Winkel#Berechnung_aus_Rotationsmatrix