Diff of /utils/slide.py [000000] .. [4df946]

Switch to side-by-side view

--- a
+++ b/utils/slide.py
@@ -0,0 +1,54 @@
+"""
+This class provides a unified interface decoding various slide formats.
+Cancheng Liu
+Email: liucancheng@thorough.ai
+"""
+import os.path
+from openslide import OpenSlide
+from utils import config
+
+
+class Slide(object):
+    def __init__(self, image_path):
+        super(Slide, self).__init__()
+        self.image_path = image_path.strip()
+        self.image_file = os.path.basename(image_path)
+        self.image_name, self.suffix = self.image_file.split('.')
+        if not self.suffix in config.format_mapping.keys():
+            raise Exception('Error: File format ' + self.suffix + ' is supported yet.')
+        self._slide = OpenSlide(image_path)
+        self._level_downsamples = self._slide.level_downsamples
+        self._level_dimensions = self._slide.level_dimensions
+        self.width, self.height = self._level_dimensions[0]
+
+    @property
+    def dimensions(self):
+        return self._level_dimensions[0]
+
+    @property
+    def level_dimensions(self):
+        return self._level_dimensions
+
+    @property
+    def level_downsamples(self):
+        return self._level_downsamples
+
+    def read_region(self, level, location, size):
+        (x, y), (w, h) = location, size
+        try:
+            _ds = self._level_downsamples[level]
+            patch = self._slide.read_region(
+                level=level, location=(int(x * _ds), int(y * _ds)), size=size)
+        except Exception:
+            raise
+        else:
+            return patch
+
+    def get_thumbnail(self):
+        try:
+            image = self._slide.read_region(
+                location=(0, 0), level=0, size=(1000, 1000))
+        except Exception:
+            raise
+        else:
+            return image