def test_get_borders(): slc = Slice5D.zero(x=slice(100, 200), y=slice(300, 400), c=slice(0, 4)) thickness = Shape5D.zero(x=1, y=1) expected_borders = { slc.with_coord(x=slice(100, 101)), slc.with_coord(y=slice(300, 301)), slc.with_coord(x=slice(199, 200)), slc.with_coord(y=slice(399, 400)), } for border_slc in slc.get_borders(thickness): expected_borders.remove(border_slc) assert len(expected_borders) == 0 thickness = Shape5D.zero(x=10, y=20) expected_thick_borders = { slc.with_coord(x=slice(100, 110)), slc.with_coord(x=slice(190, 200)), slc.with_coord(y=slice(300, 320)), slc.with_coord(y=slice(380, 400)), } for border_slc in slc.get_borders(thickness=thickness): expected_thick_borders.remove(border_slc) assert len(expected_thick_borders) == 0 z2_slc = Slice5D.zero(x=slice(100, 200), y=slice(300, 400), z=slice(8, 10)) thickness = Shape5D.zero(x=10, z=2) expected_z2_borders = { z2_slc.with_coord(x=slice(100, 110)), z2_slc.with_coord(x=slice(190, 200)), z2_slc.with_coord(z=slice(8, 10)), } for border_slc in z2_slc.get_borders(thickness=thickness): expected_z2_borders.remove(border_slc) assert len(expected_z2_borders) == 0
def test_get_borders(): slc = Slice5D.zero(x=slice(100, 200), y=slice(300, 400), c=slice(0, 4)) thickness = Shape5D.zero(x=1, y=1) expected_borders = { slc.with_coord(x=slice(100, 101)), slc.with_coord(y=slice(300, 301)), slc.with_coord(x=slice(199, 200)), slc.with_coord(y=slice(399, 400)), } assert expected_borders == set(slc.get_borders(thickness)) assert len(list(slc.get_borders(thickness))) == 4 thickness = Shape5D.zero(x=10, y=20) expected_thick_borders = { slc.with_coord(x=slice(100, 110)), slc.with_coord(x=slice(190, 200)), slc.with_coord(y=slice(300, 320)), slc.with_coord(y=slice(380, 400)), } assert expected_thick_borders == set(slc.get_borders(thickness=thickness)) assert len(list(slc.get_borders(thickness=thickness))) == 4 z2_slc = Slice5D.zero(x=slice(100, 200), y=slice(300, 400), z=slice(8, 10)) thickness = Shape5D.zero(x=10, z=2) expected_z2_borders = { z2_slc.with_coord(x=slice(100, 110)), z2_slc.with_coord(x=slice(190, 200)), z2_slc.with_coord(z=slice(8, 10)), } assert expected_z2_borders == set(z2_slc.get_borders(thickness=thickness)) assert len(list(z2_slc.get_borders(thickness=thickness))) == 4
def test_allocation(): arr = Array5D.allocate(Slice5D.zero(x=slice(100, 200), y=slice(200, 300)), numpy.uint8) assert arr.shape == Shape5D(x=100, y=100) assert arr.location == Point5D.zero(x=100, y=200) arr = Array5D.allocate(Slice5D.zero(x=slice(-100, 200), y=slice(200, 300)), numpy.uint8) assert arr.shape == Shape5D(x=300, y=100) assert arr.location == Point5D.zero(x=-100, y=200)
def test_get_tiles_when_slice_is_multiple_of_tile(): slc = Slice5D.zero(x=slice(100, 200), y=slice(200, 300)) tiles = list(slc.get_tiles(Shape5D(x=50, y=50))) assert Slice5D.zero(x=slice(100, 150), y=slice(200, 250)) in tiles assert Slice5D.zero(x=slice(100, 150), y=slice(250, 300)) in tiles assert Slice5D.zero(x=slice(150, 200), y=slice(200, 250)) in tiles assert Slice5D.zero(x=slice(150, 200), y=slice(250, 300)) in tiles assert len(tiles) == 4
def test_split_when_slice_is_multiple_of_block_shape(): slc = Slice5D.zero(x=slice(100, 200), y=slice(200, 300)) pieces = list(slc.split(Shape5D(x=50, y=50))) assert Slice5D.zero(x=slice(100, 150), y=slice(200, 250)) in pieces assert Slice5D.zero(x=slice(100, 150), y=slice(250, 300)) in pieces assert Slice5D.zero(x=slice(150, 200), y=slice(200, 250)) in pieces assert Slice5D.zero(x=slice(150, 200), y=slice(250, 300)) in pieces assert len(pieces) == 4
def test_slice_defined_with(): slc = Slice5D(x=slice(10, 20)) assert slc.defined_with(Shape5D(x=100, y=15, z=17)) == Slice5D.zero(x=slice(10, 20), y=slice(0, 15), z=slice(0, 17)) assert slc.defined_with(Slice5D.zero(x=slice(1, 3), y=slice(10, 20))) == Slice5D.zero( x=slice(10, 20), y=slice(10, 20) )
def get_roi(self) -> Slice5D: input_axiskeys = self.Input.meta.getAxisKeys() roi_start, roi_stop = self.get_new_roi() roi_slices = tuple( slice(start, stop) for start, stop in zip(roi_start, roi_stop)) return Slice5D.zero( **{axis: slc for axis, slc in zip(input_axiskeys, roi_slices)})
def reshape_datablock_and_slicing_for_output( self, block: numpy.ndarray, slicing: List[slice], slot: OutputSlot) -> Tuple[numpy.ndarray, List[slice]]: """Reshapes a block of data and its corresponding slicing into the slot's original shape, so as to be compatible with versions of ilastik that saved and loaded block slots in their original shape Always save using original shape to be backwards compatible with 1.3.2 """ original_axiskeys = self.get_input_image_original_axiskeys(slot) current_axiskeys = self.get_input_image_current_axiskeys(slot) fixed_block = Array5D(block, current_axiskeys).raw(original_axiskeys) fixed_slicing = Slice5D.zero(**dict(zip( current_axiskeys, slicing))).to_slices(original_axiskeys) return fixed_block, fixed_slicing
def reshape_datablock_and_slicing_for_input( self, block: numpy.ndarray, slicing: List[slice], slot: OutputSlot, project: Project) -> Tuple[numpy.ndarray, List[slice]]: """Reshapes a block of data and its corresponding slicing into the slot's current shape, so as to be compatible with versions of ilastik that saved and loaded block slots in their original shape Checks for version 1.3.3 and 1.3.3post1 because those were the versions that saved labels in 5D """ current_axiskeys = self.get_input_image_current_axiskeys(slot) saved_data_axiskeys = self.get_saved_data_axiskeys(slot, project) fixed_slicing = Slice5D.zero(**dict(zip( saved_data_axiskeys, slicing))).to_slices(current_axiskeys) fixed_block = Array5D(block, saved_data_axiskeys).raw(current_axiskeys) return fixed_block, fixed_slicing
def reshape_datablock_and_slicing_for_input( self, block: numpy.ndarray, slicing: List[slice], slot: OutputSlot, project: Project) -> Tuple[numpy.ndarray, List[slice]]: """Reshapes a block of data and its corresponding slicing into the slot's current shape""" current_axiskeys = self.get_input_image_current_axiskeys(slot) saved_data_axiskeys = self.get_saved_data_axiskeys(slot, project) fixed_slicing = Slice5D.zero(**dict(zip( saved_data_axiskeys, slicing))).to_slices(current_axiskeys) fixed_block = Array5D(block, saved_data_axiskeys).raw(current_axiskeys) if current_axiskeys != saved_data_axiskeys: self.ignoreDirty = False self.dirty = True return fixed_block, fixed_slicing
def test_skimage_datasource_tiles(png_image: Path): bs = DataSourceSlice(SkimageDataSource(png_image, filesystem=OSFS("/"))) num_checked_tiles = 0 for tile in bs.split(Shape5D(x=2, y=2)): if tile == Slice5D.zero(x=slice(0, 2), y=slice(0, 2)): expected_raw = raw_0_2x0_2y elif tile == Slice5D.zero(x=slice(0, 2), y=slice(2, 4)): expected_raw = raw_0_2x2_4y elif tile == Slice5D.zero(x=slice(2, 4), y=slice(0, 2)): expected_raw = raw_2_4x0_2y elif tile == Slice5D.zero(x=slice(2, 4), y=slice(2, 4)): expected_raw = raw_2_4x2_4y elif tile == Slice5D.zero(x=slice(4, 5), y=slice(0, 2)): expected_raw = raw_4_5x0_2y elif tile == Slice5D.zero(x=slice(4, 5), y=slice(2, 4)): expected_raw = raw_4_5x2_4y else: raise Exception(f"Unexpected tile {tile}") assert (tile.retrieve().raw("yx") == expected_raw).all() num_checked_tiles += 1 assert num_checked_tiles == 6
def test_get_tiles_when_slice_is_NOT_multiple_of_tile(): slc = Slice5D.zero(x=slice(90, 210), y=slice(200, 320), z=slice(10, 20)) pieces = list(slc.get_tiles(Shape5D(x=50, y=50, z=10))) assert Slice5D.zero(x=slice(50, 100), y=slice(200, 250), z=slice(10, 20)) in pieces assert Slice5D.zero(x=slice(50, 100), y=slice(250, 300), z=slice(10, 20)) in pieces assert Slice5D.zero(x=slice(50, 100), y=slice(300, 350), z=slice(10, 20)) in pieces assert Slice5D.zero(x=slice(100, 150), y=slice(200, 250), z=slice(10, 20)) in pieces assert Slice5D.zero(x=slice(100, 150), y=slice(250, 300), z=slice(10, 20)) in pieces assert Slice5D.zero(x=slice(100, 150), y=slice(300, 350), z=slice(10, 20)) in pieces assert Slice5D.zero(x=slice(150, 200), y=slice(200, 250), z=slice(10, 20)) in pieces assert Slice5D.zero(x=slice(150, 200), y=slice(250, 300), z=slice(10, 20)) in pieces assert Slice5D.zero(x=slice(150, 200), y=slice(300, 350), z=slice(10, 20)) in pieces assert Slice5D.zero(x=slice(200, 250), y=slice(200, 250), z=slice(10, 20)) in pieces assert Slice5D.zero(x=slice(200, 250), y=slice(250, 300), z=slice(10, 20)) in pieces assert Slice5D.zero(x=slice(200, 250), y=slice(300, 350), z=slice(10, 20)) in pieces assert len(pieces) == 12