tacscalib op• Data kinds: matrix × matrix → table
• Call: import fullseye as fs; fs.ledger.gradient_lut_build(rgb_rows, normal_rows, bins: 'int' = 125, positions=None, image_shape=None, flat_rgb=None, flat_positions=None, min_rows_poly: 'int' = 30, ridge: 'float' = 0.001, pool: 'bool' = True) -> 'dict' (to call the implementation directly, import tacscalib; tacscalib.gradient_lut_build(rgb_rows, normal_rows, bins: 'int' = 125, positions=None, image_shape=None, flat_rgb=None, flat_positions=None, min_rows_poly: 'int' = 30, ridge: 'float' = 0.001, pool: 'bool' = True) -> 'dict'; from the registry, opsdrive.get("gradient_lut_build"))
Example-based gradient LUT: divides the normal's (tilt θ, azimuth φ) into bins × bins and stores in each bin the mean RGB of the pixels that fall into it (np.add.at also sums duplicate indices). rgb_rows (P, 3), normal_rows (P, 3).
Given positions ((P, 2) = (row, col)) and image_shape, the position-dependent version: for bins with at least min_rows_poly rows, fit RGB = 6 coefficients · [x², y², xy, x, y, 1] (x, y scaled to −1..1 by the image size; a small ridge on everything except the constant term). With pool=True, bins with few rows borrow the position terms (5 coefficients) of the polynomial bin nearest in angle and only adjust the constant term to the mean of their own rows —— if you look up only in bins with fitted position terms, all bins with small slopes drop out and 0–15° becomes a dead zone (a trap hit in the prototype). flat_rgb ((F, 3), plus flat_positions (F, 2) for the position version) are rows added as "flat examples" = normal (0, 0, 1) (e.g. rings far from the contact; weak ground truth).
Returns: bins, mean_rgb (bins, bins, 3) (empty bins are nan), count (bins, bins), centre_normals (bins, bins, 3), n_rows, n_flat, coef ((bins, bins, 6, 3) or None), basis ("unit"), image_shape, poly_bins / pooled_bins (number of bins with fitted / borrowed position terms). Raises ValueError: shape mismatch / bins < 4 / min_rows_poly < 6 / 0 rows / non-finite / only one of positions and image_shape / only flat_positions.
• 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.
• poc_tacscalib_sphere_lut — py -3.11 examples/poc_tacscalib_sphere_lut.py
table as input)course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same
tacscalib)calib_pack_load · sphere_normals_known · lights_fit_from_sphere · membrane_predict_rgb · gradient_lut_invert · normal_error_map · sphere_cap_height · field_position_sweep
*Provenance: tacscalib.py — DRIVE 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.