Skip to content

Commit 37f045e

Browse files
authored
Merge pull request #51 from smoia/enh/fsl-displacementfield
ENH: I/O of FSL displacements fields
2 parents dd2fe1f + adf63d5 commit 37f045e

File tree

4 files changed

+38
-9
lines changed

4 files changed

+38
-9
lines changed

nitransforms/io/fsl.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from .base import (
1010
BaseLinearTransformList,
1111
LinearParameters,
12+
DisplacementsField,
1213
TransformFileError,
1314
_ensure_image,
1415
)
@@ -171,6 +172,26 @@ def from_filename(cls, filename):
171172
return _self
172173

173174

175+
class FSLDisplacementsField(DisplacementsField):
176+
"""A data structure representing displacements fields."""
177+
178+
@classmethod
179+
def from_image(cls, imgobj):
180+
"""Import a displacements field from a NIfTI file."""
181+
hdr = imgobj.header.copy()
182+
shape = hdr.get_data_shape()
183+
184+
if len(shape) != 4 or not shape[-1] in (2, 3):
185+
raise TransformFileError(
186+
'Displacements field "%s" does not come from FSL.' %
187+
imgobj.file_map['image'].filename)
188+
189+
field = np.squeeze(np.asanyarray(imgobj.dataobj))
190+
field[..., 0] *= -1.0
191+
192+
return imgobj.__class__(field, imgobj.affine, hdr)
193+
194+
174195
def _fsl_aff_adapt(space):
175196
"""
176197
Adapt FSL affines.

nitransforms/nonlinear.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,15 @@ def map(self, x, inverse=False):
7777

7878
@classmethod
7979
def from_filename(cls, filename, fmt="X5"):
80-
if fmt == "afni":
81-
_factory = io.afni.AFNIDisplacementsField
82-
elif fmt == "itk":
83-
_factory = io.itk.ITKDisplacementsField
84-
else:
85-
raise NotImplementedError
86-
87-
return cls(_factory.from_filename(filename))
80+
_factory = {
81+
"afni": io.afni.AFNIDisplacementsField,
82+
"itk": io.itk.ITKDisplacementsField,
83+
"fsl": io.fsl.FSLDisplacementsField,
84+
}
85+
if fmt not in _factory:
86+
raise NotImplementedError(f"Unsupported format <{fmt}>")
87+
88+
return cls(_factory[fmt].from_filename(filename))
8889

8990

9091
load = DisplacementsFieldTransform.from_filename
Binary file not shown.

nitransforms/tests/test_nonlinear.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from ..nonlinear import DisplacementsFieldTransform, load as nlload
1313
from ..io.itk import ITKDisplacementsField
1414

15+
1516
TESTS_BORDER_TOLERANCE = 0.05
1617
APPLY_NONLINEAR_CMD = {
1718
"itk": """\
@@ -22,6 +23,9 @@
2223
3dNwarpApply -nwarp {transform} -source {moving} \
2324
-master {reference} -interp NN -prefix resampled.nii.gz
2425
""".format,
26+
'fsl': """\
27+
applywarp -i {moving} -r {reference} -o resampled.nii.gz \
28+
-w {transform} --interp=nn""".format,
2529
}
2630

2731

@@ -59,7 +63,10 @@ def test_displacements_field1(tmp_path, get_testdata, image_orientation, sw_tool
5963
os.chdir(str(tmp_path))
6064
nii = get_testdata[image_orientation]
6165
nii.to_filename("reference.nii.gz")
62-
fieldmap = np.zeros((*nii.shape[:3], 1, 3), dtype="float32")
66+
fieldmap = np.zeros(
67+
(*nii.shape[:3], 1, 3) if sw_tool != "fsl" else (*nii.shape[:3], 3),
68+
dtype="float32",
69+
)
6370
fieldmap[..., axis] = -10.0
6471

6572
_hdr = nii.header.copy()

0 commit comments

Comments
 (0)