(self, im_type, angle, keep_size, mode, padding_mode, align_corners)
| 96 | class TestRotated3D(NumpyImageTestCase3D): |
| 97 | @parameterized.expand(TEST_CASES_3D) |
| 98 | def test_correct_results(self, im_type, angle, keep_size, mode, padding_mode, align_corners): |
| 99 | init_param = { |
| 100 | "keys": ("img", "seg"), |
| 101 | "angle": [0, angle, 0], |
| 102 | "keep_size": keep_size, |
| 103 | "mode": (mode, "nearest"), |
| 104 | "padding_mode": padding_mode, |
| 105 | "align_corners": align_corners, |
| 106 | "dtype": np.float64, |
| 107 | } |
| 108 | rotate_fn = Rotated(**init_param) |
| 109 | call_param = {"data": {"img": im_type(self.imt[0]), "seg": im_type(self.segn[0])}} |
| 110 | rotated = rotate_fn(**call_param) |
| 111 | # test lazy |
| 112 | lazy_init_param = init_param.copy() |
| 113 | for k, m in zip(init_param["keys"], init_param["mode"]): |
| 114 | lazy_init_param["keys"], lazy_init_param["mode"] = k, m |
| 115 | test_resampler_lazy( |
| 116 | rotate_fn, rotated, lazy_init_param, call_param, output_key=k, atol=1e-4 if USE_COMPILED else 1e-6 |
| 117 | ) |
| 118 | if keep_size: |
| 119 | np.testing.assert_allclose(self.imt[0].shape, rotated["img"].shape) |
| 120 | _order = 0 if mode == "nearest" else 1 |
| 121 | if padding_mode == "border": |
| 122 | _mode = "nearest" |
| 123 | elif padding_mode == "reflection": |
| 124 | _mode = "reflect" |
| 125 | else: |
| 126 | _mode = "constant" |
| 127 | expected = scipy.ndimage.rotate( |
| 128 | self.imt[0, 0], np.rad2deg(angle), (0, 2), not keep_size, order=_order, mode=_mode, prefilter=False |
| 129 | ) |
| 130 | for k, v in rotated.items(): |
| 131 | rotated[k] = v.cpu() if isinstance(v, torch.Tensor) else v |
| 132 | good = np.sum(np.isclose(expected.astype(np.float32), rotated["img"][0], atol=1e-3)) |
| 133 | self.assertLessEqual(np.abs(good - expected.size), 5, "diff at most 5 voxels.") |
| 134 | |
| 135 | expected = scipy.ndimage.rotate( |
| 136 | self.segn[0, 0], np.rad2deg(angle), (0, 2), not keep_size, order=0, mode=_mode, prefilter=False |
| 137 | ) |
| 138 | expected = np.stack(expected).astype(int) |
| 139 | if isinstance(rotated["seg"], MetaTensor): |
| 140 | rotated["seg"] = rotated["seg"].as_tensor() # pytorch 1.7 compatible |
| 141 | self.assertLessEqual(np.count_nonzero(expected != rotated["seg"][0]), 160) |
| 142 | |
| 143 | |
| 144 | @unittest.skipIf(USE_COMPILED, "unittests are not designed for both USE_COMPILED=True/False") |
nothing calls this directly
no test coverage detected