sun_bloom_fit — GEOCAM 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"))

Usage

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).

Detailed usage guide

• geocam family guide

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)

• (none yet)

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

render_skyline_view · camera_orientation_from_skyline

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