Skip to content

Commit

Permalink
Merge 487db3e into d5945e1
Browse files Browse the repository at this point in the history
  • Loading branch information
alessiamarcolini committed Aug 3, 2020
2 parents d5945e1 + 487db3e commit 8b1f6d4
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 2 deletions.
11 changes: 11 additions & 0 deletions src/histolab/slide.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,17 @@ def name(self) -> str:
"""
return ntpath.basename(self._path).split(".")[0]

@lazyproperty
def processed_path(self) -> str:
"""Retrieve the path to store processed files generated from the slide.
Returns
-------
str
Path to store processed files generated from the slide
"""
return self._processed_path

def resampled_array(self, scale_factor: int = 32) -> np.array:
"""Retrieve the resampled array from the original slide
Expand Down
8 changes: 6 additions & 2 deletions src/histolab/tiler.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import os
from abc import abstractmethod
from typing import Tuple

Expand Down Expand Up @@ -178,7 +179,9 @@ def extract(self, slide: Slide):

for tiles_counter, (tile, tile_wsi_coords) in enumerate(grid_tiles):
tile_filename = self._tile_filename(tile_wsi_coords, tiles_counter)
tile.save(tile_filename)
root_folder = slide.processed_path
full_tile_path = os.path.join(root_folder, tile_filename)
tile.save(full_tile_path)
print(f"\t Tile {tiles_counter} saved: {tile_filename}")

print(f"{tiles_counter+1} Grid Tiles have been saved.")
Expand Down Expand Up @@ -410,7 +413,8 @@ def extract(self, slide: Slide):
tiles_counter = 0
for tiles_counter, (tile, tile_wsi_coords) in enumerate(random_tiles):
tile_filename = self._tile_filename(tile_wsi_coords, tiles_counter)
tile.save(tile_filename)
full_tile_path = os.path.join(slide.processed_path, tile_filename)
tile.save(full_tile_path)
print(f"\t Tile {tiles_counter} saved: {tile_filename}")
print(f"{tiles_counter+1} Random Tiles have been saved.")

Expand Down
62 changes: 62 additions & 0 deletions tests/unit/test_tiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,38 @@ def it_knows_its_box_mask_lvl(
box_mask_lvl.todense(), expected_box_mask_lvl.todense()
)

def it_can_extract_random_tiles(self, request, tmpdir):
tmp_path_ = tmpdir.mkdir("myslide")
image = PILImageMock.DIMS_500X500_RGBA_COLOR_155_249_240
image.save(os.path.join(tmp_path_, "mywsi.png"), "PNG")
slide_path = os.path.join(tmp_path_, "mywsi.png")
slide = Slide(slide_path, os.path.join(tmp_path_, "processed"))
_random_tiles_generator = method_mock(
request, RandomTiler, "_random_tiles_generator"
)
coords = CoordinatePair(0, 10, 0, 10)
tile = Tile(image, coords)
_random_tiles_generator.return_value = [(tile, coords), (tile, coords)]
_tile_filename = method_mock(request, RandomTiler, "_tile_filename")
_tile_filename.side_effect = [
os.path.join(tmp_path_, "processed", f"tile_{i}_level2_0-10-0-10.png")
for i in range(2)
]
random_tiler = RandomTiler((10, 10), n_tiles=2, level=2)

random_tiler.extract(slide)

assert _tile_filename.call_args_list == [
call(random_tiler, coords, 0),
call(random_tiler, coords, 1),
]
assert os.path.exists(
os.path.join(tmp_path_, "processed", "tile_0_level2_0-10-0-10.png")
)
assert os.path.exists(
os.path.join(tmp_path_, "processed", "tile_1_level2_0-10-0-10.png")
)

# fixtures -------------------------------------------------------

@pytest.fixture(
Expand Down Expand Up @@ -541,6 +573,36 @@ def and_doesnt_raise_error_with_wrong_coordinates(self, request, tmpdir):
assert len(generated_tiles) == 0
_grid_coordinates_generator.assert_called_once_with(grid_tiler, slide)

def it_can_extract_grid_tiles(self, request, tmpdir):
tmp_path_ = tmpdir.mkdir("myslide")
image = PILImageMock.DIMS_500X500_RGBA_COLOR_155_249_240
image.save(os.path.join(tmp_path_, "mywsi.png"), "PNG")
slide_path = os.path.join(tmp_path_, "mywsi.png")
slide = Slide(slide_path, os.path.join(tmp_path_, "processed"))
_grid_tiles_generator = method_mock(request, GridTiler, "_grid_tiles_generator")
coords = CoordinatePair(0, 10, 0, 10)
tile = Tile(image, coords)
_grid_tiles_generator.return_value = [(tile, coords), (tile, coords)]
_tile_filename = method_mock(request, GridTiler, "_tile_filename")
_tile_filename.side_effect = [
os.path.join(tmp_path_, "processed", f"tile_{i}_level2_0-10-0-10.png")
for i in range(2)
]
grid_tiler = GridTiler((10, 10), level=2)

grid_tiler.extract(slide)

assert _tile_filename.call_args_list == [
call(grid_tiler, coords, 0),
call(grid_tiler, coords, 1),
]
assert os.path.exists(
os.path.join(tmp_path_, "processed", "tile_0_level2_0-10-0-10.png")
)
assert os.path.exists(
os.path.join(tmp_path_, "processed", "tile_1_level2_0-10-0-10.png")
)

# fixtures -------------------------------------------------------

@pytest.fixture(
Expand Down

0 comments on commit 8b1f6d4

Please sign in to comment.