skyline_extract — GEOCAM 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)

Usage

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

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)

• poc_public_camera_heading — py -3.11 examples/poc_public_camera_heading.py

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

sun_position · camera_orientation_from_sun · camera_orientation_from_sun_candidates · camera_orientation_from_skyline

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