From efdf79044844f3725ea724465b3deeea408388f8 Mon Sep 17 00:00:00 2001 From: measty <20169086+measty@users.noreply.github.com> Date: Wed, 31 Jul 2024 13:58:25 +0100 Subject: [PATCH 1/2] address review comments --- tiatoolbox/annotation/storage.py | 14 +++++++++ tiatoolbox/utils/visualization.py | 36 ++++++++++++++++++++-- tiatoolbox/visualization/bokeh_app/main.py | 12 +++++--- tiatoolbox/visualization/tileserver.py | 2 +- 4 files changed, 56 insertions(+), 8 deletions(-) diff --git a/tiatoolbox/annotation/storage.py b/tiatoolbox/annotation/storage.py index 3936efe60..eac20333d 100644 --- a/tiatoolbox/annotation/storage.py +++ b/tiatoolbox/annotation/storage.py @@ -1990,6 +1990,20 @@ def transform_geometry(geom: Geometry) -> Geometry: ) for feature in geojson["features"] ] + # check for presence of 'nucleusGeometry' key in features + # if present, add them (qupath export format) + annotations += [ + transform( + Annotation( + transform_geometry( + feature2geometry(feature["nucleusGeometry"]), + ), + {}, + ), + ) + for feature in geojson["features"] + if "nucleusGeometry" in feature + ] logger.info("Adding %d annotations.", len(annotations)) self.append_many(annotations) diff --git a/tiatoolbox/utils/visualization.py b/tiatoolbox/utils/visualization.py index 142b6e061..007093809 100644 --- a/tiatoolbox/utils/visualization.py +++ b/tiatoolbox/utils/visualization.py @@ -843,11 +843,41 @@ def render_pt( top_left, scale, )[0][0], - np.maximum(self.edge_thickness, 1), + np.maximum(int(16 / scale**0.5), 1), col, - thickness=self.thickness, + thickness=-1, ) + def render_pts( + self: AnnotationRenderer, + tile: np.ndarray, + annotation: Annotation, + top_left: tuple[float, float], + scale: float, + ) -> None: + """Render a multipoint annotation onto a tile using cv2. + + Args: + tile (ndarray): + The rgb(a) tile image to render onto. + annotation (Annotation): + The annotation to render. + top_left (tuple): + The top left corner of the tile in wsi. + scale (float): + The zoom scale at which we are rendering. + + """ + col = self.get_color(annotation, edge=False) + for pt in annotation.coords: + cv2.circle( + tile, + self.to_tile_coords([pt], top_left, scale)[0][0], + np.maximum(int(16 / scale**0.5), 1), + col, + thickness=-1, + ) + def render_line( self: AnnotationRenderer, tile: np.ndarray, @@ -1052,5 +1082,7 @@ def render_by_type( self.render_poly(tile, annotation, top_left, scale) elif geom_type == GeometryType.LINE_STRING: self.render_line(tile, annotation, top_left, scale) + elif geom_type == GeometryType.MULTI_POINT: + self.render_pts(tile, annotation, top_left, scale) else: logger.warning("Unknown geometry: %s", geom_type, stacklevel=3) diff --git a/tiatoolbox/visualization/bokeh_app/main.py b/tiatoolbox/visualization/bokeh_app/main.py index e86168506..a033844ef 100644 --- a/tiatoolbox/visualization/bokeh_app/main.py +++ b/tiatoolbox/visualization/bokeh_app/main.py @@ -14,6 +14,10 @@ import numpy as np import requests import torch +from matplotlib import colormaps +from PIL import Image +from requests.adapters import HTTPAdapter, Retry + from bokeh.events import ButtonClick, DoubleTap, MenuItemClick from bokeh.io import curdoc from bokeh.layouts import column, row @@ -58,9 +62,6 @@ from bokeh.models.tiles import WMTSTileSource from bokeh.plotting import figure from bokeh.util import token -from matplotlib import colormaps -from PIL import Image -from requests.adapters import HTTPAdapter, Retry # GitHub actions seems unable to find TIAToolbox unless this is here sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent)) @@ -511,7 +512,6 @@ def add_layer(lname: str) -> None: end=1, value=0.75, step=0.01, - title=lname, height=40, width=100, max_width=90, @@ -1053,7 +1053,9 @@ def layer_slider_cb( UI["vstate"].layer_dict[obj.name.split("_")[0]] ].glyph.line_alpha = new else: - UI["p"].renderers[UI["vstate"].layer_dict[obj.name.split("_")[0]]].alpha = new + UI["p"].renderers[ + UI["vstate"].layer_dict["_".join(obj.name.split("_")[0:-1])] + ].alpha = new def color_input_cb( diff --git a/tiatoolbox/visualization/tileserver.py b/tiatoolbox/visualization/tileserver.py index b0a427502..5e2d5ad06 100644 --- a/tiatoolbox/visualization/tileserver.py +++ b/tiatoolbox/visualization/tileserver.py @@ -511,7 +511,7 @@ def change_overlay(self: TileServer) -> str: overlay_path = self.decode_safe_name(overlay_path) if overlay_path.suffix in [".jpg", ".png", ".tiff", ".svs", ".ndpi", ".mrxs"]: - layer = f"layer{len(self.pyramids[session_id])}" + layer = overlay_path.stem if overlay_path.suffix == ".tiff": self.layers[session_id][layer] = OpenSlideWSIReader( overlay_path, From 3e7938b91df77850751d70b59263d02895b165fc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 31 Jul 2024 13:08:55 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tiatoolbox/visualization/bokeh_app/main.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tiatoolbox/visualization/bokeh_app/main.py b/tiatoolbox/visualization/bokeh_app/main.py index a033844ef..0b40dd3bb 100644 --- a/tiatoolbox/visualization/bokeh_app/main.py +++ b/tiatoolbox/visualization/bokeh_app/main.py @@ -14,10 +14,6 @@ import numpy as np import requests import torch -from matplotlib import colormaps -from PIL import Image -from requests.adapters import HTTPAdapter, Retry - from bokeh.events import ButtonClick, DoubleTap, MenuItemClick from bokeh.io import curdoc from bokeh.layouts import column, row @@ -62,6 +58,9 @@ from bokeh.models.tiles import WMTSTileSource from bokeh.plotting import figure from bokeh.util import token +from matplotlib import colormaps +from PIL import Image +from requests.adapters import HTTPAdapter, Retry # GitHub actions seems unable to find TIAToolbox unless this is here sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent))