Skip to content

Labels

A label is a segmentation mask: one integer per pixel, where each integer is an object ID. Labels live alongside your image and render as a coloured overlay so you can see what was detected by your segmentation tool (CellProfiler, Cellpose, StarDist, InstanSeg, and anything else that writes OME-Zarr or bare Zarr masks).

This guide covers the foundational workflow: load labels, control how they look, organise them, attach metadata. For per-object coloring by measurement CSVs (heatmap, category, phenotypes), see the Analytics & Phenotyping guide.

The Labels tab open with several embedded labels and one external label marked EXT, and a coloured segmentation overlay on the image

Loading labels

Top of the Labels tab on a plate, showing the Discover, Add Local, Add URL and Refresh buttons, with the list still empty because nothing has been scanned yet

The buttons at the top of the Labels tab:

ButtonWhat it does
Add LocalPick a folder on your disk that contains a Zarr label array. Chrome / Edge only.
Add URLPaste a URL pointing at a Zarr label array. Works in any browser.
DiscoverScan an HCS plate's fields for labels. Only appears on plates, and only runs when you click it. See below.
RefreshRe-scan the current image's OME-Zarr for embedded labels. Useful if a segmentation job has just written a new label and you don't want to reload the whole image.

Embedded labels

Labels written inside your OME-Zarr (under the /labels/ group, per the OME-NGFF spec) are discovered automatically on image load. No clicking required. They appear in the Embedded group in the list.

Plates: press Discover

On an HCS plate, labels are not discovered automatically. You get a Discover button instead, and nothing is scanned until you press it.

This is deliberate. The scan asks every well whether it has a labels/ group, so a 384-well plate is 384 requests before a single pixel is drawn. Ten run in parallel, and only field 0 of each well is checked, but the count still scales with the plate. Against a local disk that is merely slow. Against S3 it is 384 billed requests every time anyone opens the plate, whether or not they wanted labels at all. So the scan is something you ask for, not something that happens to you.

Because it visits every well, the result knows which wells actually carry each label, rather than assuming the whole plate matches the first one.

Press Discover once and the labels stay attached for the session. If a segmentation job writes new masks while you have the plate open, press it again.

Local folders (Add Local)

Click Add Local, pick any folder containing a Zarr label. The folder stays on your disk. The viewer reads it directly via the File System Access API. Use this when you've run a segmentation tool that wrote a Zarr mask next to (but not inside) your image.

Remote URLs (Add URL)

Click Add URL and paste the URL of a Zarr label array. Works from any storage that serves HTTP range requests and the right CORS headers: S3, Cloudflare R2, GCS, Azure Blob, an on-premise nginx, a data server running locally. See the Data Server guide for hosting your own.

External labels (not embedded in the image's OME-Zarr) show an EXT badge in the list so you can tell them apart from the embedded ones.

Try it on a public dataset

Open IDR image 6001240 with its segmentation showing. Nothing is downloaded to a server, and nothing is installed. The viewer reads the OME-Zarr straight from the Image Data Resource's public bucket, which serves range requests and CORS. Credit and licence for that image are at the bottom of this page.

Label rows

Every label renders as a row with the essentials on a single line:

  • visibility toggle visibility
  • Color swatch: click to open the style popover
  • Label name: double-click to rename
  • Filter count badge: appears when analytics is loaded, showing how many filters are active
  • EXT badge: only on external labels

Click the row to expand its detail panel below. There you'll find Metadata (Source / Notes / Tags / Key-values), plus the Analytics section if analytics is loaded.

A label row expanded, showing the Metadata section (Source, Notes textarea, Tags chips, Key-values mini-table)

Style: solid, random, or per-object

Click the color swatch on a label row to open the style popover. It holds the display controls for that label:

The style popover open showing the Solid / Random tabs (Heatmap / Category are grayed out when no CSV is loaded), Opacity slider, Render (FILL / CONTOUR) toggles, Presets color grid

ControlEffect
SolidEvery object in the label shares a single colour (the one you pick below). Default for newly loaded labels.
RandomEach object gets a colour hashed from its ID. Different objects look different; the same object gets the same colour across reloads. Useful for visually distinguishing neighbouring cells without a segmentation-quality judgement.
HeatmapColour by a numeric column. Requires an analytics CSV. See the Analytics guide.
CategoryColour by a string column. Requires an analytics CSV.
Opacity sliderBlends the label layer with the image underneath. 0 hides the label; 1 makes it fully opaque.
FILL / CONTOURTwo independent toggles for polygon labels. Fill paints the interior; contour draws a 1-px outline. Turn fill off for "outlines-only" view. Useful when you want to see the image through your segmentation.
Presets grid16 curated colours: RGB primaries on top, muted variants on the bottom row. One click applies.
Hex / RGB inputsType #FF00AA or type the three RGB values directly. Synced bidirectionally.
More colors…Opens the OS-native picker for any colour + eyedropper (Chrome / Edge).

Grouping

The Labels list groups by Source by default. Embedded labels sit under "Embedded", and each external label gets its own group header. You can switch to Group By key-value using the toolbar:

The Group By control reading Group by: segmenter, with its menu open listing Clear grouping and the available keys, compartment and segmenter

A key-value describes the whole mask, not the objects inside it, so useful keys are properties of the segmentation run: segmenter: stardist, model: nuclei_v2, version: 2026-03-11. Tag a dozen masks with segmenter and the list reorganises into a StarDist group and a Cellpose group, which is what you want when you are comparing runs on the same image.

Things that vary per object, like a cell's tissue class, do not belong here. Those live in an analytics table, one row per object. See Analytics & Phenotyping.

Drag the grip handle on the left of each group header to reorder groups. The group order also controls rendering z-order on the canvas. Later groups draw on top.

Search and filter

The toolbar row has a Filter dropdown and a Search input:

  • Filter: show All / only Visible / only Hidden labels.
  • Search: type part of a label name, tag, or metadata value. The list narrows to matches live.

Search input active, list narrowed to labels whose name contains 'nuclei'

Metadata: Source, Notes, Tags, Key-values

Expand a label's row and open the METADATA section. Four fields live here:

  • Source: read-only, shows where the label came from (embedded path, local folder, URL).
  • Notes: free-form text. "Run 2 from Cellpose, threshold 0.65."
  • Tags: short chips you can add / remove. "validated", "needs-review".
  • Key-values: structured key: value rows describing the mask as a whole. segmenter: cellpose, model: cyto3, version: 2026-03-11. Add one, then switch to Group By on the toolbar and the list reorganises by that key.

Expanded METADATA section showing the read-only Source path, a Notes field, Tags, and the Key-values editor

Metadata persists to IndexedDB per-label and survives reloads.

HCS plates

When you open a high-content-screening plate, labels work the same way but apply at the plate level. A label named nuclei is discovered on every populated well and renders consistently across all fields. See the HCS Plates guide for plate-specific controls (well navigation, field grid, plate overview).

Persistence

Everything you do in the Labels tab persists to your browser's IndexedDB, keyed by the image's URL or local folder handle:

  • Visibility, colour mode, opacity, fill/contour state
  • Notes, tags, key-values
  • Which labels you've added external / URL-based
  • Current group-by mode

Reload the page, reopen the image. Your label configuration is still there. The URL query string captures viewport state (zoom, center, active channels) but not label configuration; that lives in the browser locally.

Mobile

On phone viewports the Labels tab shows the row list and basic visibility toggles, but heatmap / category / phenotype coloring tabs are disabled. Per-object coloring needs an analytics CSV, and the File System Access API required to pick one doesn't exist on phones. Tablets show the full desktop UI.

Image credits

The screenshots on this page use a public whole-slide H&E section, a high-content screen and a fluorescence image from IDR. See Sample Data and Credits.

Next steps

Free. Private. Browser-based.