Skip to content

Commit 50dd27c

Browse files
authored
Merge pull request #168 from nipy/enh/155-off-grid-fields
ENH: "Densify" voxel-wise nonlinear mappings with interpolation
2 parents ef5a28f + 5a0d0cd commit 50dd27c

File tree

1 file changed

+30
-4
lines changed

1 file changed

+30
-4
lines changed

nitransforms/nonlinear.py

+30-4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
SpatialReference,
2222
_as_homogeneous,
2323
)
24+
from scipy.ndimage import map_coordinates
2425

2526

2627
class DenseFieldTransform(TransformBase):
@@ -132,23 +133,48 @@ def map(self, x, inverse=False):
132133
>>> xfm.map([[-6.5, -36., -19.5], [-1., -41.5, -11.25]]).tolist()
133134
[[0.0, -0.47516798973083496, 0.0], [0.0, -0.538356602191925, 0.0]]
134135
136+
>>> np.array_str(
137+
... xfm.map([[-6.7, -36.3, -19.2], [-1., -41.5, -11.25]]),
138+
... precision=3,
139+
... suppress_small=True,
140+
... )
141+
'[[ 0. -0.482 0. ]\n [ 0. -0.538 0. ]]'
142+
135143
>>> xfm = DenseFieldTransform(
136144
... test_dir / "someones_displacement_field.nii.gz",
137145
... is_deltas=True,
138146
... )
139147
>>> xfm.map([[-6.5, -36., -19.5], [-1., -41.5, -11.25]]).tolist()
140148
[[-6.5, -36.47516632080078, -19.5], [-1.0, -42.03835678100586, -11.25]]
141149
150+
>>> np.array_str(
151+
... xfm.map([[-6.7, -36.3, -19.2], [-1., -41.5, -11.25]]),
152+
... precision=3,
153+
... suppress_small=True,
154+
... )
155+
'[[ -6.7 -36.782 -19.2 ]\n [ -1. -42.038 -11.25 ]]'
156+
142157
"""
143158

144159
if inverse is True:
145160
raise NotImplementedError
146161
ijk = self.reference.index(x)
147162
indexes = np.round(ijk).astype("int")
148-
if np.any(np.abs(ijk - indexes) > 0.05):
149-
warnings.warn("Some coordinates are off-grid of the field.")
150-
indexes = tuple(tuple(i) for i in indexes.T)
151-
return self._field[indexes]
163+
164+
if np.all(np.abs(ijk - indexes) < 1e-3):
165+
indexes = tuple(tuple(i) for i in indexes.T)
166+
return self._field[indexes]
167+
168+
return np.vstack((
169+
map_coordinates(
170+
self._field[..., i],
171+
ijk.T,
172+
order=3,
173+
mode="constant",
174+
cval=0,
175+
prefilter=True,
176+
) for i in range(self.reference.ndim)
177+
)).T
152178

153179
def __matmul__(self, b):
154180
"""

0 commit comments

Comments
 (0)