QuPath annotations#
goatpy can transform QuPath GeoJSON annotation exports into the registered coordinate system so they overlay correctly on the H&E canvas.
During registration#
Pass geojson_path directly to load_and_align:
sdata = gp.load_and_align(
imzml_path="sample.imzML",
he_path="sample.svs",
geojson_path="annotations.geojson",
geojson_shapes_key="annotations", # key in sdata.shapes
geojson_classification_key="classification", # column in the GeoDataFrame
)
After registration#
If sdata was already built without annotations, add them afterwards:
sdata = gp.add_qupath_annotations(
sdata,
geojson_path="annotations.geojson",
shapes_key="annotations",
)
This reads the affine matrix stored in sdata["maldi_adata"].uns["he_transform"]
to reproduce the exact same transform used during registration.
Exporting from QuPath#
In QuPath, export annotations via:
File → Export annotations → GeoJSON
Make sure to export with “Include default excluded objects” unchecked, and leave coordinates in the default native pixel space (do not apply any scaling).
Accessing annotation labels#
The classification column is stored as a categorical in the shapes GeoDataFrame:
ann = sdata.shapes["annotations"]
print(ann["classification"].unique())
# Filter to a specific class
tumor = ann[ann["classification"] == "Tumor"]
Visualising with spatialdata-plot#
sdata.pl.render_images("he_image").pl.render_shapes(
"annotations",
color="classification",
fill_alpha=0.3,
outline_alpha=0.9,
).pl.show(coordinate_systems="global")