The scope of the application of the IIIF in the context of published scientific images is specially for reusing purpose, quick inspection , for comparison across datasets, for previewing the images without the need of downloading the whole dataset, for integrating structured metadata of the datasets and the images as well as for nriching preserved images with structured annotations.
IIIF in this context is:
About access
About comparison
About FAIR exposure
About re-interpretation and reproducibility
Since deposit happens after research completion, IIIF: cannot influence experimental design, cannot support iterative image acquisition decisions, cannot integrate with lab instrumentation workflows. Thus , our use cases are not focused on real-time microscopy analysis, computational image segmentation pipelines, or AI model training during experimentation. Instead, we focus on post-deposition use cases that leverage IIIF for enhanced access, comparison, and reuse of published scientific images.
Demonstrate how metadata from multiple scientific image datasets (e.g., microscopy images) stored in 4TU.ResearchData can be:
This use case illustrates IIIF not merely as a visualization layer, but as an interoperability layer connecting distributed research datasets.
Source system: 4TU.ResearchData API Intermediate layer: Custom Bash processing / aggregation Output layer: IIIF Presentation 3.0 manifest
Workflow logic:
4TU API → Dataset UUIDs → Individual IIIF Manifests ↓ Metadata aggregation ↓ Annotation enrichment (CSV → IIIF) ↓ Aggregated IIIF Manifest
Datasets in 4TU.ResearchData are grouped under:
To retrieve all datasets in a collection:
curl "https://data.4tu.nl/v2/collections/de8ea9d4-f986-41fc-9412-6765985a0c9c/articles" | jqThis returns a JSON array containing:
Each dataset has a unique identifier (id or
uuid) which can be used to retrieve detailed metadata and
associated files.
From the JSON response, extract the dataset identifiers:
Example (conceptually):
curl "https://data.4tu.nl/v2/collections/<collection-uuid>/articles" \
| jq '.[].id'You now have a list of dataset UUIDs.
For each dataset UUID:
curl "https://data.4tu.nl/v2/articles/<dataset-uuid>" | jqThis returns:
If IIIF is enabled for the dataset, the manifest can be retrieved via:
curl -X GET "https://data.4tu.nl/iiif/v3/<dataset-uuid>/1/manifest" | jq > manifest_<dataset-uuid>.jsonThis manifest typically contains:
At this stage, you can extract selected metadata fields taken from
/v2/articles/<dataset-uuid> endpoint such as:
Then the agregated metadata can be injected into the manifest of each dataset :
./inject_metadata.sh <dataset_uuid> manifest_<dataset_uuid>.json manifest_enriched_<dataset_uuid>.jsonExample of an enriched manifest: https://leilaicruz.github.io/iiif_conference_2026/iiif/manifest_1_enriched2.json
In addition to metadata aggregation, annotations can be
programmatically added to a IIIF manifest using a structured CSV file.
The CSV file must follow this structure:
canvas_label,text,xywh,motivation,lang Where:
| Field | Description |
|---|---|
canvas_label |
Label of the canvas to which the annotation applies |
text |
Annotation body text |
xywh |
Region selector (pixel coordinates) formatted as
x,y,width,height |
motivation |
IIIF motivation (e.g., commenting,
describing, tagging) |
lang |
Language code (e.g., en, nl) |
Example:
canvas_label,text,xywh,motivation,lang
Image 1,Yeast nucleus marker detected,100,150,200,200,describing,en
Use the provided script:
./annotations/inject_inline_annotations.py manifest_<dataset_uuid>.json annotations_<dataset_uuid>.csv manifest_enriched_<dataset_uuid>.jsonThe aggregated manifest acts as:
By programmatically harvesting metadata and embedding it into IIIF manifests, we:
This use case shows a research-workflow for working with deposited image datasets exposed via IIIF Presentation API v3 (manifests served by 4TU.ResearchData) and the IIIF Image API (derivatives, regions, sizes).
Key ideas:
See this
notebook for a demonstration of this workflow using Python libraries
like requests and PIL to fetch and analyze
IIIF-served images on-the-fly.
python -m venv iiif-env
source iiif-env/bin/activate
pip install -r iiif/scripts/requirements.txt