Skip to content

Commit db02ecb

Browse files
oestebaneffigies
andcommitted
enh: review comments
Co-authored-by: Chris Markiewicz <effigies@gmail.com>
1 parent 8683d67 commit db02ecb

File tree

3 files changed

+21
-21
lines changed

3 files changed

+21
-21
lines changed

Diff for: nitransforms/io/base.py

+7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
"""Read/write linear transforms."""
2+
from pathlib import Path
23
import numpy as np
34
from nibabel import load as loadimg
45
from scipy.io.matlab.miobase import get_matfile_version
@@ -174,3 +175,9 @@ def _read_mat(byte_stream):
174175
else:
175176
raise TransformFileError("Not a Matlab file.")
176177
return reader.get_variables()
178+
179+
180+
def _ensure_image(img):
181+
if isinstance(img, (str, Path)):
182+
return loadimg(img)
183+
return img

Diff for: nitransforms/io/fsl.py

+13-20
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,16 @@
22
import os
33
import warnings
44
import numpy as np
5+
from numpy.linalg import inv
56
from pathlib import Path
6-
from nibabel import load as _nbload
77
from nibabel.affines import voxel_sizes
88

9-
from .base import BaseLinearTransformList, LinearParameters, TransformFileError
9+
from .base import (
10+
BaseLinearTransformList,
11+
LinearParameters,
12+
TransformFileError,
13+
_ensure_image,
14+
)
1015

1116

1217
class FSLLinearTransform(LinearParameters):
@@ -41,14 +46,14 @@ def from_ras(cls, ras, moving=None, reference=None):
4146

4247
# Adjust for reference image offset and orientation
4348
refswp, refspc = _fsl_aff_adapt(reference)
44-
pre = reference.affine.dot(np.linalg.inv(refspc).dot(np.linalg.inv(refswp)))
49+
pre = reference.affine.dot(inv(refspc).dot(inv(refswp)))
4550

4651
# Adjust for moving image offset and orientation
4752
movswp, movspc = _fsl_aff_adapt(moving)
48-
post = np.linalg.inv(movswp).dot(movspc.dot(np.linalg.inv(moving.affine)))
53+
post = inv(movswp).dot(movspc.dot(inv(moving.affine)))
4954

5055
# Compose FSL transform
51-
mat = np.linalg.inv(np.swapaxes(post.dot(ras.dot(pre)), 0, 1))
56+
mat = inv(np.swapaxes(post.dot(ras.dot(pre)), 0, 1))
5257

5358
tf = cls()
5459
tf.structarr["parameters"] = mat.T
@@ -84,19 +89,13 @@ def to_ras(self, moving=None, reference=None):
8489
moving = _ensure_image(moving)
8590

8691
refswp, refspc = _fsl_aff_adapt(reference)
87-
pre = reference.affine.dot(np.linalg.inv(refspc).dot(np.linalg.inv(refswp)))
8892

93+
pre = refswp @ refspc @ inv(reference.affine)
8994
# Adjust for moving image offset and orientation
9095
movswp, movspc = _fsl_aff_adapt(moving)
91-
post = np.linalg.inv(movswp).dot(movspc.dot(np.linalg.inv(moving.affine)))
92-
96+
post = moving.affine @ inv(movspc) @ inv(movswp)
9397
mat = self.structarr["parameters"].T
94-
95-
return (
96-
np.linalg.inv(post)
97-
@ np.swapaxes(np.linalg.inv(mat), 0, 1)
98-
@ np.linalg.inv(pre)
99-
)
98+
return post @ np.swapaxes(inv(mat), 0, 1) @ pre
10099

101100

102101
class FSLLinearTransformArray(BaseLinearTransformList):
@@ -187,9 +186,3 @@ def _fsl_aff_adapt(space):
187186
swp[0, 0] = -1.0
188187
swp[0, 3] = (space.shape[0] - 1) * zooms[0]
189188
return swp, np.diag(zooms)
190-
191-
192-
def _ensure_image(img):
193-
if isinstance(img, (str, Path)):
194-
return _nbload(img)
195-
return img

Diff for: nitransforms/tests/test_linear.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def test_loadsave_itk(tmp_path, data_path, testdata_path):
7272
)
7373

7474

75-
@pytest.mark.xfail(reason="Not fully implemented")
75+
# @pytest.mark.xfail(reason="Not fully implemented")
7676
@pytest.mark.parametrize("fmt", ["itk", "fsl", "afni", "lta"])
7777
def test_loadsave(tmp_path, data_path, testdata_path, fmt):
7878
"""Test idempotency."""

0 commit comments

Comments
 (0)