gradient_lut_build — DRIVE 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"))

Usage

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.

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)

• poc_tacscalib_sphere_lut — py -3.11 examples/poc_tacscalib_sphere_lut.py

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

course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same

Same category (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.