Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
F
fslpy
Manage
Activity
Members
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Environments
Terraform modules
Analyze
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Evan Edmond
fslpy
Commits
172a6490
Commit
172a6490
authored
5 years ago
by
Paul McCarthy
Browse files
Options
Downloads
Patches
Plain Diff
RF: Rename dispfield to nonlinear - best kept all together i think
parent
1cd1392f
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
fsl/utils/transform/nonlinear.py
+56
-47
56 additions, 47 deletions
fsl/utils/transform/nonlinear.py
tests/test_transform_nonlinear.py
+0
-0
0 additions, 0 deletions
tests/test_transform_nonlinear.py
with
56 additions
and
47 deletions
fsl/utils/transform/
dispfield
.py
→
fsl/utils/transform/
nonlinear
.py
+
56
−
47
View file @
172a6490
#!/usr/bin/env python
#
#
dispfield.py - FNIRT displacement fields
#
nonlinear.py -
#
# Author: Paul McCarthy <pauldmccarthy@gmail.com>
#
"""
FNIRT displacement field files may contain coordinates in one of two
formats:
"""
import
numpy
as
np
import
fsl.data.image
as
fslimage
from
.
import
affine
import
fsl.data.image
as
fslimage
from
.
import
affine
class
DisplacementField
(
fslimage
.
Image
):
"""
class
NonLinearTransform
(
fslimage
.
Image
):
"""
Class which represents a FNIRT non-linear transformation
"""
def
__init__
(
self
,
*
args
,
**
kwargs
):
"""
"""
source
=
kwargs
.
pop
(
'
source
'
,
None
)
reference
=
kwargs
.
pop
(
'
reference
'
,
None
)
dispType
=
kwargs
.
pop
(
'
dispType
'
,
None
)
sourceSpace
=
kwargs
.
pop
(
'
sourceSpace
'
,
'
fsl
'
)
referenceSpace
=
kwargs
.
pop
(
'
referenceSpace
'
,
'
fsl
'
)
src
=
kwargs
.
pop
(
'
src
'
,
None
)
ref
=
kwargs
.
pop
(
'
ref
'
,
None
)
srcSpace
=
kwargs
.
pop
(
'
srceSpace
'
,
'
fsl
'
)
refSpace
=
kwargs
.
pop
(
'
refSpace
'
,
'
fsl
'
)
fslimage
.
Image
.
__init__
(
self
,
*
args
,
**
kwargs
)
if
s
ource
is
not
None
:
s
ource
=
source
.
header
.
copy
()
if
ref
erence
is
not
None
:
ref
erence
=
reference
.
header
.
copy
()
else
:
reference
=
self
.
header
.
copy
()
if
s
rc
is
not
None
:
s
rc
=
src
.
header
.
copy
()
if
ref
is
not
None
:
ref
=
ref
.
header
.
copy
()
else
:
ref
=
self
.
header
.
copy
()
self
.
__dispType
=
dispType
self
.
__source
=
source
self
.
__reference
=
reference
self
.
__sourceSpace
=
sourceSpace
self
.
__referenceSpace
=
referenceSpace
self
.
__src
=
src
self
.
__ref
=
ref
self
.
__srcSpace
=
srcSpace
self
.
__refSpace
=
refSpace
@property
def
s
ou
rc
e
(
self
):
return
self
.
__s
ou
rc
e
def
src
(
self
):
return
self
.
__src
@property
def
ref
erence
(
self
):
return
self
.
__ref
erence
def
ref
(
self
):
return
self
.
__ref
@property
def
s
ou
rc
e
Space
(
self
):
return
self
.
__s
ou
rc
e
Space
def
srcSpace
(
self
):
return
self
.
__srcSpace
@property
def
referenceSpace
(
self
):
"""
irrelevant if absolute displacement
"""
return
self
.
__referenceSpace
def
refSpace
(
self
):
return
self
.
__refSpace
class
DisplacementField
(
NonLinearTransform
):
"""
Class which represents a FNIRT displacement field which, at each voxel,
contains an absolute or relative displacement from a source space to a
reference space.
"""
def
__init__
(
self
,
*
args
,
**
kwargs
):
"""
"""
dispType
=
kwargs
.
pop
(
'
dispType
'
,
None
)
NonLinearTransform
.
__init__
(
self
,
*
args
,
**
kwargs
)
self
.
__dispType
=
dispType
@property
def
displacementType
(
self
):
if
self
.
__dispType
is
None
:
self
.
__dispType
=
detectType
(
self
)
self
.
__dispType
=
detect
Displacement
Type
(
self
)
return
self
.
__dispType
...
...
@@ -83,7 +91,8 @@ class DisplacementField(fslimage.Image):
return
self
.
displacementType
==
'
relative
'
def
detectType
(
field
):
def
detectDisplacementType
(
field
):
"""
Attempt to automatically determine whether a displacement field is
specified in absolute or relative coordinates.
...
...
@@ -99,7 +108,7 @@ def detectType(field):
# standard deviation than one which
# contains relative coordinates.
absdata
=
field
[:]
reldata
=
convertType
(
field
,
'
relative
'
)
reldata
=
convert
Displacement
Type
(
field
,
'
relative
'
)
stdabs
=
absdata
.
std
(
axis
=
(
0
,
1
,
2
)).
sum
()
stdrel
=
reldata
.
std
(
axis
=
(
0
,
1
,
2
)).
sum
()
...
...
@@ -107,7 +116,7 @@ def detectType(field):
else
:
return
'
relative
'
def
convertType
(
field
,
dispType
=
None
):
def
convert
Displacement
Type
(
field
,
dispType
=
None
):
"""
Convert a displacement field between storing absolute and relative
displacements.
"""
...
...
@@ -120,7 +129,7 @@ def convertType(field, dispType=None):
# we need the coordinates of every voxel
# in the reference FSL coordinate system.
dx
,
dy
,
dz
=
field
.
shape
[:
3
]
v2fsl
=
field
.
getAffine
(
'
voxel
'
,
field
.
s
ou
rc
e
Space
)
v2fsl
=
field
.
getAffine
(
'
voxel
'
,
field
.
srcSpace
)
coords
=
np
.
meshgrid
(
np
.
arange
(
dx
),
np
.
arange
(
dy
),
np
.
arange
(
dz
),
indexing
=
'
ij
'
)
...
...
@@ -137,7 +146,7 @@ def convertType(field, dispType=None):
elif
dispType
==
'
relative
'
:
return
field
.
data
-
coords
def
convertSpace
(
field
,
src
,
from_
,
to
,
ref
=
None
,
dispType
=
None
):
def
convert
Displacement
Space
(
field
,
src
,
from_
,
to
,
ref
=
None
,
dispType
=
None
):
"""
Adjust the source and/or reference spaces of the given displacement
field.
"""
...
...
@@ -148,14 +157,14 @@ def convertSpace(field, src, from_, to, ref=None, dispType=None):
# Get the field in absolute
# coordinates if necessary
fieldcoords
=
field
.
data
if
field
.
relative
:
srccoords
=
convertType
(
field
)
if
field
.
relative
:
srccoords
=
convert
Displacement
Type
(
field
)
else
:
srccoords
=
fieldcoords
# Now transform those source
# coordinates from the original
# source space to the source
# space specified by "from_"
srcmat
=
src
.
getAffine
(
field
.
s
ou
rc
e
Space
,
from_
)
srcmat
=
src
.
getAffine
(
field
.
srcSpace
,
from_
)
srccoords
=
srccoords
.
reshape
((
-
1
,
3
))
srccoords
=
affine
.
transform
(
srccoords
,
srcmat
)
...
...
@@ -175,7 +184,7 @@ def convertSpace(field, src, from_, to, ref=None, dispType=None):
# displacements from source "from_"
# space into reference "to" space.
else
:
refmat
=
ref
.
getAffine
(
field
.
ref
erence
Space
,
to
)
refmat
=
ref
.
getAffine
(
field
.
refSpace
,
to
)
refcoords
=
fieldcoords
.
reshape
((
-
1
,
3
))
refcoords
=
affine
.
transform
(
refcoords
,
refmat
)
fieldcoords
=
srccoords
-
refcoords
...
...
@@ -183,8 +192,8 @@ def convertSpace(field, src, from_, to, ref=None, dispType=None):
return
DisplacementField
(
fieldcoords
.
reshape
(
field
.
shape
),
header
=
field
.
header
,
s
ou
rc
e
=
src
,
ref
erence
=
ref
,
s
ou
rc
e
Space
=
from_
,
ref
erence
Space
=
to
,
src
=
src
,
ref
=
ref
,
srcSpace
=
from_
,
refSpace
=
to
,
dispType
=
dispType
)
This diff is collapsed.
Click to expand it.
tests/test_transform_
dispfield
.py
→
tests/test_transform_
nonlinear
.py
+
0
−
0
View file @
172a6490
File moved
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment