|
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