|
21 | 21 | SpatialReference,
|
22 | 22 | _as_homogeneous,
|
23 | 23 | )
|
| 24 | +from scipy.ndimage import map_coordinates |
24 | 25 |
|
25 | 26 |
|
26 | 27 | class DenseFieldTransform(TransformBase):
|
@@ -132,23 +133,48 @@ def map(self, x, inverse=False):
|
132 | 133 | >>> xfm.map([[-6.5, -36., -19.5], [-1., -41.5, -11.25]]).tolist()
|
133 | 134 | [[0.0, -0.47516798973083496, 0.0], [0.0, -0.538356602191925, 0.0]]
|
134 | 135 |
|
| 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 | +
|
135 | 143 | >>> xfm = DenseFieldTransform(
|
136 | 144 | ... test_dir / "someones_displacement_field.nii.gz",
|
137 | 145 | ... is_deltas=True,
|
138 | 146 | ... )
|
139 | 147 | >>> xfm.map([[-6.5, -36., -19.5], [-1., -41.5, -11.25]]).tolist()
|
140 | 148 | [[-6.5, -36.47516632080078, -19.5], [-1.0, -42.03835678100586, -11.25]]
|
141 | 149 |
|
| 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 | +
|
142 | 157 | """
|
143 | 158 |
|
144 | 159 | if inverse is True:
|
145 | 160 | raise NotImplementedError
|
146 | 161 | ijk = self.reference.index(x)
|
147 | 162 | 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 |
152 | 178 |
|
153 | 179 | def __matmul__(self, b):
|
154 | 180 | """
|
|
0 commit comments