skyline op• Data kinds: image2d → signal
• Call: import fullseye as fs; fs.ledger.skyline_extract(image, sky_is_bright=True, smooth=1.5, max_jump=3, jump_penalty=0.5) (to call the implementation directly, import geocam; geocam.skyline_extract(image, sky_is_bright=True, smooth=1.5, max_jump=3, jump_penalty=0.5); from the registry, opsgeocam.get("skyline_extract"))
• GPU: none (CPU reference implementation only)
Extracts from a photo, by dynamic programming, 1 line giving the row of the sky–terrain boundary for each column → signal (W,).
Same idea as Lie, Lin, and Hsu 2005 (*Pattern Recognition*: Robust Skyline Extraction for Navigation):
Changes in brightness in the vertical direction (if the sky is bright above, I[v−1] − I[v+1] is positive) are considered boundary-likeness'', Choose the path with the lowest cost among consecutive paths that do not jump more than max_jump rows from the next column (jump_penalty × line jump). Even if there is a locally strong response at the vertical edges of clouds or buildings, the path Continuity leaves real ridgelines.
Args:
image: (H, W) float. For RGB, make it gray first.
sky_is_bright: The sky is brighter than the terrain (daytime). False if it is reversed in night view/backlight.
smooth: Vertical Gaussian σ [pixels] (noise). 0 disables.
max_jump: Allowed row jump in adjacent columns [pixels].
jump_penalty: Cost per jump pixel (boundary likelihood is normalized from 0 to 1).
Returns:
signal (W,) float: Boundary row for each column (0 is the top row). Only the sky/topography is shown
In images that are not shown, the average boundary response is close to 0, so ValueError
Stop at (silence and do not return the noise line).
• 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_public_camera_heading — py -3.11 examples/poc_public_camera_heading.py
signal as input)sun_position · camera_orientation_from_sun · camera_orientation_from_sun_candidates · camera_orientation_from_skyline
skyline)dem_skyline · render_skyline_view
*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.