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
Branches containing commit
No related tags found
Tags containing commit
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
#!/usr/bin/env python
#
#
#
dispfield.py - FNIRT displacement fields
#
nonlinear.py -
#
#
# Author: Paul McCarthy <pauldmccarthy@gmail.com>
# Author: Paul McCarthy <pauldmccarthy@gmail.com>
#
#
"""
FNIRT displacement field files may contain coordinates in one of two
formats:
"""
import
numpy
as
np
import
numpy
as
np
import
fsl.data.image
as
fslimage
import
fsl.data.image
as
fslimage
from
.
import
affine
from
.
import
affine
class
DisplacementField
(
fslimage
.
Image
):
"""
class
NonLinearTransform
(
fslimage
.
Image
):
"""
Class which represents a FNIRT non-linear transformation
"""
"""
def
__init__
(
self
,
*
args
,
**
kwargs
):
def
__init__
(
self
,
*
args
,
**
kwargs
):
"""
"""
"""
"""
source
=
kwargs
.
pop
(
'
source
'
,
None
)
src
=
kwargs
.
pop
(
'
src
'
,
None
)
reference
=
kwargs
.
pop
(
'
reference
'
,
None
)
ref
=
kwargs
.
pop
(
'
ref
'
,
None
)
dispType
=
kwargs
.
pop
(
'
dispType
'
,
None
)
srcSpace
=
kwargs
.
pop
(
'
srceSpace
'
,
'
fsl
'
)
sourceSpace
=
kwargs
.
pop
(
'
sourceSpace
'
,
'
fsl
'
)
refSpace
=
kwargs
.
pop
(
'
refSpace
'
,
'
fsl
'
)
referenceSpace
=
kwargs
.
pop
(
'
referenceSpace
'
,
'
fsl
'
)
fslimage
.
Image
.
__init__
(
self
,
*
args
,
**
kwargs
)
fslimage
.
Image
.
__init__
(
self
,
*
args
,
**
kwargs
)
if
s
ource
is
not
None
:
s
ource
=
source
.
header
.
copy
()
if
s
rc
is
not
None
:
s
rc
=
src
.
header
.
copy
()
if
ref
erence
is
not
None
:
ref
erence
=
reference
.
header
.
copy
()
if
ref
is
not
None
:
ref
=
ref
.
header
.
copy
()
else
:
reference
=
self
.
header
.
copy
()
else
:
ref
=
self
.
header
.
copy
()
self
.
__dispType
=
dispType
self
.
__src
=
src
self
.
__source
=
source
self
.
__ref
=
ref
self
.
__reference
=
reference
self
.
__srcSpace
=
srcSpace
self
.
__sourceSpace
=
sourceSpace
self
.
__refSpace
=
refSpace
self
.
__referenceSpace
=
referenceSpace
@property
@property
def
s
ou
rc
e
(
self
):
def
src
(
self
):
return
self
.
__s
ou
rc
e
return
self
.
__src
@property
@property
def
ref
erence
(
self
):
def
ref
(
self
):
return
self
.
__ref
erence
return
self
.
__ref
@property
@property
def
s
ou
rc
e
Space
(
self
):
def
srcSpace
(
self
):
return
self
.
__s
ou
rc
e
Space
return
self
.
__srcSpace
@property
@property
def
referenceSpace
(
self
):
def
refSpace
(
self
):
"""
irrelevant if absolute displacement
"""
return
self
.
__refSpace
return
self
.
__referenceSpace
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
@property
def
displacementType
(
self
):
def
displacementType
(
self
):
if
self
.
__dispType
is
None
:
if
self
.
__dispType
is
None
:
self
.
__dispType
=
detectType
(
self
)
self
.
__dispType
=
detect
Displacement
Type
(
self
)
return
self
.
__dispType
return
self
.
__dispType
...
@@ -83,7 +91,8 @@ class DisplacementField(fslimage.Image):
...
@@ -83,7 +91,8 @@ class DisplacementField(fslimage.Image):
return
self
.
displacementType
==
'
relative
'
return
self
.
displacementType
==
'
relative
'
def
detectType
(
field
):
def
detectDisplacementType
(
field
):
"""
Attempt to automatically determine whether a displacement field is
"""
Attempt to automatically determine whether a displacement field is
specified in absolute or relative coordinates.
specified in absolute or relative coordinates.
...
@@ -99,7 +108,7 @@ def detectType(field):
...
@@ -99,7 +108,7 @@ def detectType(field):
# standard deviation than one which
# standard deviation than one which
# contains relative coordinates.
# contains relative coordinates.
absdata
=
field
[:]
absdata
=
field
[:]
reldata
=
convertType
(
field
,
'
relative
'
)
reldata
=
convert
Displacement
Type
(
field
,
'
relative
'
)
stdabs
=
absdata
.
std
(
axis
=
(
0
,
1
,
2
)).
sum
()
stdabs
=
absdata
.
std
(
axis
=
(
0
,
1
,
2
)).
sum
()
stdrel
=
reldata
.
std
(
axis
=
(
0
,
1
,
2
)).
sum
()
stdrel
=
reldata
.
std
(
axis
=
(
0
,
1
,
2
)).
sum
()
...
@@ -107,7 +116,7 @@ def detectType(field):
...
@@ -107,7 +116,7 @@ def detectType(field):
else
:
return
'
relative
'
else
:
return
'
relative
'
def
convertType
(
field
,
dispType
=
None
):
def
convert
Displacement
Type
(
field
,
dispType
=
None
):
"""
Convert a displacement field between storing absolute and relative
"""
Convert a displacement field between storing absolute and relative
displacements.
displacements.
"""
"""
...
@@ -120,7 +129,7 @@ def convertType(field, dispType=None):
...
@@ -120,7 +129,7 @@ def convertType(field, dispType=None):
# we need the coordinates of every voxel
# we need the coordinates of every voxel
# in the reference FSL coordinate system.
# in the reference FSL coordinate system.
dx
,
dy
,
dz
=
field
.
shape
[:
3
]
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
),
coords
=
np
.
meshgrid
(
np
.
arange
(
dx
),
np
.
arange
(
dy
),
np
.
arange
(
dy
),
np
.
arange
(
dz
),
indexing
=
'
ij
'
)
np
.
arange
(
dz
),
indexing
=
'
ij
'
)
...
@@ -137,7 +146,7 @@ def convertType(field, dispType=None):
...
@@ -137,7 +146,7 @@ def convertType(field, dispType=None):
elif
dispType
==
'
relative
'
:
return
field
.
data
-
coords
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
"""
Adjust the source and/or reference spaces of the given displacement
field.
field.
"""
"""
...
@@ -148,14 +157,14 @@ def convertSpace(field, src, from_, to, ref=None, dispType=None):
...
@@ -148,14 +157,14 @@ def convertSpace(field, src, from_, to, ref=None, dispType=None):
# Get the field in absolute
# Get the field in absolute
# coordinates if necessary
# coordinates if necessary
fieldcoords
=
field
.
data
fieldcoords
=
field
.
data
if
field
.
relative
:
srccoords
=
convertType
(
field
)
if
field
.
relative
:
srccoords
=
convert
Displacement
Type
(
field
)
else
:
srccoords
=
fieldcoords
else
:
srccoords
=
fieldcoords
# Now transform those source
# Now transform those source
# coordinates from the original
# coordinates from the original
# source space to the source
# source space to the source
# space specified by "from_"
# 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
=
srccoords
.
reshape
((
-
1
,
3
))
srccoords
=
affine
.
transform
(
srccoords
,
srcmat
)
srccoords
=
affine
.
transform
(
srccoords
,
srcmat
)
...
@@ -175,7 +184,7 @@ def convertSpace(field, src, from_, to, ref=None, dispType=None):
...
@@ -175,7 +184,7 @@ def convertSpace(field, src, from_, to, ref=None, dispType=None):
# displacements from source "from_"
# displacements from source "from_"
# space into reference "to" space.
# space into reference "to" space.
else
:
else
:
refmat
=
ref
.
getAffine
(
field
.
ref
erence
Space
,
to
)
refmat
=
ref
.
getAffine
(
field
.
refSpace
,
to
)
refcoords
=
fieldcoords
.
reshape
((
-
1
,
3
))
refcoords
=
fieldcoords
.
reshape
((
-
1
,
3
))
refcoords
=
affine
.
transform
(
refcoords
,
refmat
)
refcoords
=
affine
.
transform
(
refcoords
,
refmat
)
fieldcoords
=
srccoords
-
refcoords
fieldcoords
=
srccoords
-
refcoords
...
@@ -183,8 +192,8 @@ def convertSpace(field, src, from_, to, ref=None, dispType=None):
...
@@ -183,8 +192,8 @@ def convertSpace(field, src, from_, to, ref=None, dispType=None):
return
DisplacementField
(
return
DisplacementField
(
fieldcoords
.
reshape
(
field
.
shape
),
fieldcoords
.
reshape
(
field
.
shape
),
header
=
field
.
header
,
header
=
field
.
header
,
s
ou
rc
e
=
src
,
src
=
src
,
ref
erence
=
ref
,
ref
=
ref
,
s
ou
rc
e
Space
=
from_
,
srcSpace
=
from_
,
ref
erence
Space
=
to
,
refSpace
=
to
,
dispType
=
dispType
)
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