\(\newcommand{L}[1]{\| #1 \|}\newcommand{VL}[1]{\L{ \vec{#1} }}\newcommand{R}[1]{\operatorname{Re}\,(#1)}\newcommand{I}[1]{\operatorname{Im}\, (#1)}\)
Extra transform exercise¶
- For code template see:
what_extra_transform_code.py
; - For solution see: Extra transform exercise.
>>> #: standard imports
>>> import numpy as np
>>> import numpy.linalg as npl
>>> import matplotlib.pyplot as plt
>>> # print arrays to 4 decimal places
>>> np.set_printoptions(precision=4, suppress=True)
>>> import nibabel as nib
>>> #: gray colormap and nearest neighbor interpolation by default
>>> plt.rcParams['image.cmap'] = 'gray'
>>> plt.rcParams['image.interpolation'] = 'nearest'
What transforms did I add?¶
I took this image
and I made a new copy, in img, hdr
format (see
The image header and affine):
I then modified the affine in ds114_sub009_highres_moved.hdr
to add an
extra rotation and translation.
What extra translation and rotation did I add?
Hint: remember the rotation formulae from Rotations and rotation matrices:
\[\begin{split}\begin{alignat}{1}
R_x(\theta) &= \begin{bmatrix}
1 & 0 & 0 \\
0 & \cos \theta & -\sin \theta \\[3pt]
0 & \sin \theta & \cos \theta \\[3pt]
\end{bmatrix} \\[6pt]
R_y(\theta) &= \begin{bmatrix}
\cos \theta & 0 & \sin \theta \\[3pt]
0 & 1 & 0 \\[3pt]
-\sin \theta & 0 & \cos \theta \\
\end{bmatrix} \\[6pt]
R_z(\theta) &= \begin{bmatrix}
\cos \theta & -\sin \theta & 0 \\[3pt]
\sin \theta & \cos \theta & 0\\[3pt]
0 & 0 & 1\\
\end{bmatrix}
\end{alignat}\end{split}\]
You might also want to compare against results from the
rotations.py
module:
>>> #: functions to make rotation matrices
>>> from rotations import x_rotmat, y_rotmat, z_rotmat
Final hint:
- inverse sine, cosine are
np.arcsin, np.arccos
.
>>> #: Get the original image affine
>>> import nibabel as nib
>>> orig_img = nib.load('ds114_sub009_highres.nii')
>>> print(orig_img.affine)
[[ 0.9989 -0.0605 0.0109 -129.8257]
[ 0.0427 1.263 0.2336 -119.0906]
[ -0.0215 -0.3028 0.9723 -143.4178]
[ 0. 0. 0. 1. ]]
>>> #: Get the new image affine
>>> moved_img = nib.load('ds114_sub009_highres_moved.img')
>>> moved_img.affine
array([[ 0.9416, -0.4311, -0.0586, -98.8336],
[ 0.336 , 1.1887, 0.2264, -164.1377],
[ -0.0215, -0.3028, 0.9723, -158.4178],
[ 0. , 0. , 0. , 1. ]])
>>> #- Work out what transform has been added in the new affine
>>> #- What rotation and translation has been applied?