diff --git a/model_server/base/accessors.py b/model_server/base/accessors.py index 7fc28bb3dac2113413124ef2ce25bcfbc66d3fd4..f7d076fa7653faf7fbf22d8a2ff7577228ab2420 100644 --- a/model_server/base/accessors.py +++ b/model_server/base/accessors.py @@ -51,6 +51,9 @@ class GenericImageDataAccessor(ABC): def get_zi(self, zi: int): + """ + Return a new accessor of a specific z-coordinate + """ return self._derived_accessor( self.data.take( indices=[zi], @@ -58,6 +61,12 @@ class GenericImageDataAccessor(ABC): ) ) + def get_mip(self): + """ + Return a new accessor of maximum intensity projection (MIP) along z-axis + """ + return self.apply(lambda x: x.max(axis=self._ga('Z'), keepdims=True)) + def get_mono(self, channel: int, mip: bool = False, squeeze=False): return self.get_channels([channel], mip=mip) diff --git a/tests/base/test_accessors.py b/tests/base/test_accessors.py index b42030707eb4ab1b336e62ff03f15d2e8dda2f59..d72e5ca198c6dd0fdfd3bc4e4d41821e02f01239 100644 --- a/tests/base/test_accessors.py +++ b/tests/base/test_accessors.py @@ -73,6 +73,17 @@ class TestCziImageFileAccess(unittest.TestCase): self.assertTrue(np.all(sz.data[:, :, :, 0] == cf.data[:, :, :, zi])) + def test_get_mip(self): + w = 256 + h = 512 + nc = 4 + nz = 11 + zi = 5 + cf = InMemoryDataAccessor(_random_int(h, w, nc, nz)) + sm = cf.get_mip() + self.assertEqual(sm.shape_dict['Z'], 1) + self.assertTrue(np.all(cf.data.max(axis=-1, keepdims=True) == sm.data)) + def test_crop_yx(self): w = 256 h = 512