paper op• Data kinds: image2d × text → image2d
• Call: import fullseye as fs; fs.ledger.annotate_table(img, text, xy, anchor='lt', font_size=13, color='neutral', text_color=None, box_color=None, box_alpha=0.72, pad=6, col_gap=None, row_gap=0, align='auto', header=False, grid=False, border=0, border_color=None, font_path=None, scheme='okabe_ito', min_contrast=2.0, bold=False, italic=False, line_spacing=1.15, style=None, layout=None) (to call the implementation directly, import annotate; annotate.annotate_table(img, text, xy, anchor='lt', font_size=13, color='neutral', text_color=None, box_color=None, box_alpha=0.72, pad=6, col_gap=None, row_gap=0, align='auto', header=False, grid=False, border=0, border_color=None, font_path=None, scheme='okabe_ito', min_contrast=2.0, bold=False, italic=False, line_spacing=1.15, style=None, layout=None); from the registry, opsannotate.get("annotate_table"))
Returns an image (image2d): draws a tab-separated string as a table (with a semi-transparent backing panel).
Column widths are determined by annotate_table_layout, measuring with the real font. The default column gap is 0.6 times the row height, so changing font_size moves the spacing along with it. The backing panel is translucent by default (box_alpha=0.72; 0 means no panel).
box_alpha : float
Opacity of the panel [0,1]. 0 draws no panel. When translucent, the picture beneath
shows through, so the text colour is checked against "the colour actually underneath".
grid : bool
If true, faint rules are drawn at column and row boundaries. The default draws none (a table without rules
is often easier to read; add them only when needed).
header : bool
If true, the 1st row is made bold and 1 rule is drawn below it.
align : str or sequence
TABLE_ALIGNS. The default "auto" right-aligns only numeric columns.
layout : dict or None
Passing the return value of annotate_table_layout skips recomputation.
If passed, anchor and the like are ignored (do not pass both).
(H,W[,C]) float64
A copy with the table drawn. The input is not modified.
ValueError
Same as annotate_table_layout + the table extends beyond the image +
text falls below min_contrast against its background (never silently clipped).
>>> import numpy as np, annotate
>>> img = np.zeros((120, 260, 3))
>>> out = annotate.annotate_table(img, "Item\tValue\nArea\t12.5\nPerimeter\t9.75",
... (10, 10), header=True)
>>> out.shape
(120, 260, 3)
>>> float(np.abs(out - img).max()) > 0.1
True
• 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.
• annotate_paper_tour — py -3.11 examples/annotate_paper_tour.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.