halcon_ext op• Data kinds: image → feature
• Call: fullseye.apply(img, "hx_estimate_tilt_lr", a=0.5, b=0.5) (the 2-D model is one image plus two scalar knobs a,b∈[0,1])
• HALCON equivalent: estimate_tilt_lr (the HALCON reference is a useful guide to its meaning and parameters)

*The figure is the actual output on a synthetic 128×128 input. Left: input, right: output. Point clouds are drawn as a top-down scatter (brightness = z), 1-D series as a line plot, volumes as the maximum-intensity projection along z, videos as the middle frame, complex images as magnitude; return values that are not pictures are shown as the values themselves.*
*Knob a does not change the output (measured: identical at 0.1 / 0.5 / 0.9).*
*Knob b does not change the output (measured: identical at 0.1 / 0.5 / 0.9).*
Lee-Rosenfeld: the light-source azimuth tilt = atan2(<Ey>, <Ex>) (the mean gradient direction). Normalised to [0,1].
Averages the Sobel gradients Ex (column direction) and Ey (row direction) over the whole image and returns tilt = arctan2(<Ey>, <Ex>) mapped to [0,1) by (tilt / 2π) mod 1 as np.float64. This is the Lee-Rosenfeld estimate, in which the light source azimuth (tilt) of a Lambertian surface appears in the direction of the mean gradient.
• a, b are unused.
• 0 is the +column direction, 0.25 the +row direction (downward in the image), and so on in that sense. If the mean gradient is almost 0, arctan2(0, 0) = 0 gives
0.
Because it uses the raw mean of the gradient, it is pulled toward the direction of high-contrast parts. It assumes that surface reflectance and shape are random and that only the illumination tilt creates the overall bias of the gradient. The version that suppresses the effect of local contrast is hx_estimate_tilt_zc. The angle value is periodic, so values near 0 and 1 are the same direction (take care when taking differences).
• gallery2d_halcon_ext family guide
• 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.
The program below has been verified to run (same input as the figure). In Studio's help this block becomes buttons that load and run it on the spot.
hx_estimate_tilt_lr 0.50 0.50
▸ Load this pipeline · Load & run
• gallery2d_halcon_ext — py -3.11 examples/gallery2d_halcon_ext.py
feature as input)halcon_ext)hx_gen_circle · hx_gen_ellipse · hx_gen_rectangle2 · hx_gen_checker_region · hx_gen_grid_region · hx_gabor · hx_fit_surface1 · hx_fit_surface2
*Provenance: ops.py — 2D 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.