sun op• Data kinds: image2d → table
• Call: import fullseye as fs; fs.ledger.sun_bloom_fit(image, threshold=0.97, ignore_top_rows=0, min_area=30, max_area_frac=0.15, min_rim_fraction=0.3) (to call the implementation directly, import geocam; geocam.sun_bloom_fit(image, threshold=0.97, ignore_top_rows=0, min_area=30, max_area_frac=0.15, min_rim_fraction=0.3); from the registry, opsgeocam.get("sun_bloom_fit"))
The sun in real footage = a bloom that saturates the sensor (larger than the disk, its size changes with exposure, and it gets cut off by the image edge or by text bands). Fits a circle to the edge of the largest saturated blob and returns the center → table. The centroid is biased away from the cut side when the blob is cut off (measured 15 px), so the cut edges (pixels touching the image border or the ignore_top_rows band) are discarded and a circle is fitted to the remaining arc by algebraic least squares (Kåsa 1976).
sun_pixel_position is a gate for synthetic data that presupposes "a compact small disc"; on real road cameras it reads the white lettering of the station name, road signs and white cars as the sun (24/24 false detections on Fintraffic weather cameras, 2026-09-21). This op does not decide that it is the sun:
it returns the circle centre and radius, the residual and whether it is clipped, and whether it is the sun is decided by whether it moves on schedule (camera_orientation_from_sun_candidates).
Args:
image: (H, W) float, 0 to 1.
threshold: absolute value regarded as saturation.
ignore_top_rows: how many rows at the top edge to ignore (a band of text such as the station name).
min_area: minimum pixel count of a blob.
max_area_frac: maximum area of a blob (as a ratio to the image) -- rejects photos where the whole sky is blown out.
min_rim_fraction: what fraction of the circumference must be unclipped rim (below this, "too clipped", ValueError).
Returns:
table: u / v (circle centre) / r (radius px) / rms_px (radius residual of the rim) / area (pixel count of the blob) /
clipped (1 = the rim is clipped somewhere) / rim_fraction / centroid_u / centroid_v (centroid, for comparison).
• 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.
• (none yet)
table as input)render_skyline_view · camera_orientation_from_skyline
sun)sun_position · sun_pixel_position · camera_orientation_from_sun · camera_orientation_from_sun_candidates
*Provenance: geocam.py — GEOCAM 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.