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"))
Returns an image (image2d): the outline of a mask as an (anti-aliased) closed polyline, with text at the centroid.
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.
• figure_annotation family guide
• dataset_conventions — Training-dataset conventions — COCO / YOLO / VOC and pitfalls in visual inspection
• 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.
• paper_figure — py -3.11 examples/paper_figure.py
• poc_rotation_invariance_audit — py -3.11 examples/poc_rotation_invariance_audit.py
image2d as input)text_box · arrow · leader_line · label_points · crosshair · legend_box · color_bar · scale_bar
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.