Skip to content
Snippets Groups Projects

New extrapolation test for applywarp

Merged Paul McCarthy requested to merge applywarp into master
4 files
+ 53
29
Compare changes
  • Side-by-side
  • Inline
Files
4
@@ -3,26 +3,32 @@
import os
import shlex
import sys
import os.path as op
import subprocess as sp
import numpy as np
import nibabel as nib
from fsl.data.image import Image
from pathlib import Path
from fsl.data.image import Image, addExt
import fsl.transform.affine as affine
from fsl.wrappers import applywarp, LOAD
from pyfeeds import evalImage
def applywarp(src, ref):
cmd = f'applywarp --in={src} --ref={ref} --usesqform --out=out'
sp.run(shlex.split(cmd), check=True)
return Image('out')
SCRIPT_DIR = Path(op.abspath(op.dirname(__file__)))
def make_image(fname, data, sform, sform_code, qform, qform_code):
hdr = nib.Nifti1Header()
hdr.set_sform(sform, sform_code)
hdr.set_qform(qform, qform_code)
img = Image(data, header=hdr)
img.save(fname)
return img
#! fsl/warpfns!8 (commit 65329a37d0830d4453381579408c3bbfa5a3bed6)
#
# Make sure that regions outside of the FOV
# in the input image are extrapolated correctly
def test_applywarp_normal_usage():
src = Path(os.environ['FSLDIR']) / 'data' / 'standard' / 'MNI152_T1_2mm'
ref = SCRIPT_DIR / 'roi_ref'
warp = SCRIPT_DIR / 'roi_warp'
expect = addExt(SCRIPT_DIR / 'roi_out')
applywarp(src, ref, 'roi_got', warp=warp)
assert np.isclose(evalImage(expect, addExt('roi_got')), 0)
# fsl/fugue!6
#
@@ -37,6 +43,14 @@ def make_image(fname, data, sform, sform_code, qform, qform_code):
# diagonal
def test_applywarp_uses_sqform_correctly():
def make_image(fname, data, sform, sform_code, qform, qform_code):
hdr = nib.Nifti1Header()
hdr.set_sform(sform, sform_code)
hdr.set_qform(qform, qform_code)
img = Image(data, header=hdr)
img.save(fname)
return img
srcdata = np.zeros((20, 20, 20))
refdata = np.zeros((20, 20, 20))
@@ -52,32 +66,33 @@ def test_applywarp_uses_sqform_correctly():
refaff = affine.scaleOffsetXform(1, [-5, -5, -5])
# aligned via sform
src = make_image('src', srcdata, srcaff, 2, eye, 1)
ref = make_image('ref', refdata, refaff, 2, eye, 1)
result = applywarp('src', 'ref')
assert np.all(np.isclose(result.data, ref.data))
src = make_image('src', srcdata, srcaff, 2, eye, 1)
ref = make_image('ref', refdata, refaff, 2, eye, 1)
applywarp('src', 'ref', 'out', usesqform=True)
assert np.isclose(evalImage(addExt('out'), addExt('ref')), 0)
# aligned via sform again
src = make_image('src', srcdata, srcaff, 2, eye, 0)
ref = make_image('ref', refdata, refaff, 2, eye, 0)
result = applywarp('src', 'ref')
assert np.all(np.isclose(result.data, ref.data))
src = make_image('src', srcdata, srcaff, 2, eye, 0)
ref = make_image('ref', refdata, refaff, 2, eye, 0)
applywarp('src', 'ref', 'out', usesqform=True)
assert np.isclose(evalImage(addExt('out'), addExt('ref')), 0)
# aligned via qform
src = make_image('src', srcdata, eye, 0, srcaff, 2)
ref = make_image('ref', refdata, eye, 0, refaff, 2)
result = applywarp('src', 'ref')
assert np.all(np.isclose(result.data, ref.data))
src = make_image('src', srcdata, eye, 0, srcaff, 2)
ref = make_image('ref', refdata, eye, 0, refaff, 2)
applywarp('src', 'ref', 'out', usesqform=True)
assert np.isclose(evalImage(addExt('out'), addExt('ref')), 0)
# not aligned - should result in a scaling
# matrix being used (an identify matrix here)
src = make_image('src', srcdata, eye, 0, srcaff, 0)
ref = make_image('ref', refdata, eye, 0, refaff, 0)
result = applywarp('src', 'ref')
assert not np.all(np.isclose(result.data, ref.data))
assert np.all(np.isclose(result.data, src.data))
src = make_image('src', srcdata, eye, 0, srcaff, 0)
ref = make_image('ref', refdata, eye, 0, refaff, 0)
applywarp('src', 'ref', 'out', usesqform=True)
assert not np.isclose(evalImage(addExt('out'), addExt('ref')), 0)
assert np.isclose(evalImage(addExt('out'), addExt('src')), 0)
if __name__ == '__main__':
os.chdir(sys.argv[1])
test_applywarp_normal_usage()
test_applywarp_uses_sqform_correctly()
Loading