annotate_outline — ANNOTATE paper op

• Data kinds: image2d × mask → image2d

• Call: import fullseye as fs; fs.ledger.annotate_outline(img, mask, label=None, color='emphasis', width=1.5, alpha=1.0, dash=None, font_size=12, label_offset=(0, 0), box_alpha=0.6, text_color=None, scheme='okabe_ito', font_path=None, layout=None) (to call the implementation directly, import annotate; annotate.annotate_outline(img, mask, label=None, color='emphasis', width=1.5, alpha=1.0, dash=None, font_size=12, label_offset=(0, 0), box_alpha=0.6, text_color=None, scheme='okabe_ito', font_path=None, layout=None); from the registry, opsannotate.get("annotate_outline"))

Usage

Returns an image (image2d): the outline of a mask as an (anti-aliased) closed polyline, with text at the centroid.

Raises

ValueError

The mask shape differs from the image, there are no true pixels, or alpha is outside [0,1].

Procedure: if layout is absent, annotate_outline_layout(mask) finds the boundary loops (closed (x, y) polygons along pixel edges, both outer border and holes, per component) and the centroid, and each loop is laid down as an anti-aliased polyline with distance coverage. If label is given, a text_box (anchor="cm", with a backing box) is placed at centroid + label_offset.

• img: (H, W) / (H, W, 1|3|4), float64 copy, [0, 1].

• mask: (H, W), same shape as the image ([row, col] indexing). Non-bool is binarised at > 0.5 (threshold); non-finite gives ValueError. No true pixels gives ValueError.

• width: line width [px], at least 0.5. dash=(on, off) [px] gives a dashed line (on > 0, off >= 0).

• alpha: [0, 1]. box_alpha is the opacity of the text backing box.

• label_offset: (dx, dy) [px]. For shapes whose centroid falls outside the contour (crescents etc.), shift it here.

• layout: passing the return value of annotate_outline_layout skips recomputation and reuses the same placement on another picture (it reads contours / centroid).

• Return value: float64 with the same shape as the input.

To show it as a fill use overlay_mask; to number several regions use annotate_markers.

Detailed usage guide

• figure_annotation family guide

Background guides (the physics and conventions behind this op)

• dataset_conventions — Training-dataset conventions — COCO / YOLO / VOC and pitfalls in visual inspection

References (sample data, literature)

• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).

• Operator provenance and references — the sources of the research/methods this op family came from.

• The canonical algorithm (author, year) and its uses are named in the family usage guide above.

Runnable examples (verified samples that actually call this op)

• paper_figure — py -3.11 examples/paper_figure.py

• poc_rotation_invariance_audit — py -3.11 examples/poc_rotation_invariance_audit.py

Ops the type connects to (they accept image2d as input)

text_box · arrow · leader_line · label_points · crosshair · legend_box · color_bar · scale_bar

Same category (paper)

annotate_leader_layout · annotate_leader · annotate_markers · annotate_legend · annotate_dimension_layout · annotate_dimension · annotate_angle_layout · annotate_angle


*Provenance: annotate.py — ANNOTATE operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.