|
a |
|
b/utils/slide.py |
|
|
1 |
""" |
|
|
2 |
This class provides a unified interface decoding various slide formats. |
|
|
3 |
Cancheng Liu |
|
|
4 |
Email: liucancheng@thorough.ai |
|
|
5 |
""" |
|
|
6 |
import os.path |
|
|
7 |
from openslide import OpenSlide |
|
|
8 |
from utils import config |
|
|
9 |
|
|
|
10 |
|
|
|
11 |
class Slide(object): |
|
|
12 |
def __init__(self, image_path): |
|
|
13 |
super(Slide, self).__init__() |
|
|
14 |
self.image_path = image_path.strip() |
|
|
15 |
self.image_file = os.path.basename(image_path) |
|
|
16 |
self.image_name, self.suffix = self.image_file.split('.') |
|
|
17 |
if not self.suffix in config.format_mapping.keys(): |
|
|
18 |
raise Exception('Error: File format ' + self.suffix + ' is supported yet.') |
|
|
19 |
self._slide = OpenSlide(image_path) |
|
|
20 |
self._level_downsamples = self._slide.level_downsamples |
|
|
21 |
self._level_dimensions = self._slide.level_dimensions |
|
|
22 |
self.width, self.height = self._level_dimensions[0] |
|
|
23 |
|
|
|
24 |
@property |
|
|
25 |
def dimensions(self): |
|
|
26 |
return self._level_dimensions[0] |
|
|
27 |
|
|
|
28 |
@property |
|
|
29 |
def level_dimensions(self): |
|
|
30 |
return self._level_dimensions |
|
|
31 |
|
|
|
32 |
@property |
|
|
33 |
def level_downsamples(self): |
|
|
34 |
return self._level_downsamples |
|
|
35 |
|
|
|
36 |
def read_region(self, level, location, size): |
|
|
37 |
(x, y), (w, h) = location, size |
|
|
38 |
try: |
|
|
39 |
_ds = self._level_downsamples[level] |
|
|
40 |
patch = self._slide.read_region( |
|
|
41 |
level=level, location=(int(x * _ds), int(y * _ds)), size=size) |
|
|
42 |
except Exception: |
|
|
43 |
raise |
|
|
44 |
else: |
|
|
45 |
return patch |
|
|
46 |
|
|
|
47 |
def get_thumbnail(self): |
|
|
48 |
try: |
|
|
49 |
image = self._slide.read_region( |
|
|
50 |
location=(0, 0), level=0, size=(1000, 1000)) |
|
|
51 |
except Exception: |
|
|
52 |
raise |
|
|
53 |
else: |
|
|
54 |
return image |