Skip to main content

Physics-based preprocessing (fog, etc.) for RGB+depth datasets

Project description

euler-preprocess

Physics-based preprocessing transforms for multi-modal RGB+depth datasets. Built on top of euler-loading and ds-crawler.

Available transforms:

Command Description
euler-preprocess fog Synthetic fog via the Koschmieder atmospheric scattering model
euler-preprocess sky-depth Override depth values in sky regions with a constant
euler-preprocess radial Convert planar (z-buffer) depth to radial (Euclidean) depth

Installation

uv pip install "euler-preprocess[gpu,progress] @ git+https://github.com/d-rothen/euler-fog"

Usage

euler-preprocess fog       -c configs/example_dataset_config.json
euler-preprocess sky-depth -c configs/sky_depth_dataset_config.json
euler-preprocess radial    -c configs/radial_dataset_config.json

Configuration

Every subcommand takes a dataset config JSON that points to the input data and a transform config. Each modality path must be a directory indexed by ds-crawler with an euler_loading property that specifies the loader and function. This allows euler-loading to auto-select the correct dataset-specific loader.

Dataset Config

{
  "transform_config_path": "configs/run1.json",
  "output_path": "/path/to/output",
  "modalities": {
    "rgb": "/path/to/rgb",
    "depth": "/path/to/depth",
    "semantic_segmentation": "/path/to/classSegmentation"
  },
  "hierarchical_modalities": {
    "intrinsics": "/path/to/intrinsics"
  }
}
Field Description
transform_config_path Path to the transform-specific config (see below). fog_config_path is also accepted for backward compatibility.
output_path Directory where outputs are written.
modalities Regular modalities that participate in sample-ID intersection. Which modalities are required depends on the transform (see table below).
hierarchical_modalities Per-scene data (e.g. intrinsics). Loaded once per scene and cached.

Required modalities per transform:

Transform modalities hierarchical_modalities
fog rgb, depth, semantic_segmentation — (intrinsics optional)
sky-depth depth, semantic_segmentation
radial depth intrinsics

Fog Transform

Fog Config

Controls the fog simulation.

{
  "airlight": "from_sky",
  "seed": 1337,
  "depth_scale": 1.0,
  "resize_depth": true,
  "contrast_threshold": 0.05,
  "device": "cpu",
  "gpu_batch_size": 4,
  "selection": { ... },
  "models": { ... }
}
Field Description
airlight Required. Airlight estimation method: "from_sky" (mean sky colour), "dcp" (dark channel prior), or "dcp_heuristic" (DCP with median heuristic).
seed Random seed for reproducibility. null for non-deterministic.
depth_scale Multiplier applied to depth values after loading.
resize_depth Resize the depth map to match the RGB resolution (bilinear).
contrast_threshold Threshold C_t used in the visibility-to-attenuation conversion (default 0.05).
device "cpu", "cuda", "mps", or "gpu" (alias for cuda).
gpu_batch_size Batch size when running on GPU. Uniform-model samples are batched; heterogeneous samples are processed individually.

Fog Model

The core equation is the Koschmieder model (atmospheric scattering):

I_fog(x) = I(x) * t(x)  +  L_s * (1 - t(x))

where:

  • I(x) is the original RGB colour at pixel x
  • t(x) = exp(-k * d(x)) is the transmittance, which falls exponentially with depth d and attenuation coefficient k
  • L_s is the atmospheric light (airlight), i.e. the colour of the fog/sky light scattered towards the camera
  • k is derived from a meteorological visibility distance V: k = -ln(C_t) / V

Distant objects are attenuated more (t approaches 0) and replaced by airlight, just as in real fog.

How Each Modality is Used

RGB — The clean scene image. Normalised to float32 in [0, 1]. This is the I(x) term in the fog equation -- it gets blended with the airlight according to transmittance.

Depth — A per-pixel depth map in metres. Provides the d(x) term in the transmittance calculation t(x) = exp(-k * d(x)). Pixels with greater depth receive more fog. Invalid values (NaN, inf, negative) are clamped to zero (treated as infinitely close, receiving no fog).

Semantic Segmentation — A per-pixel semantic segmentation map from which a boolean sky mask is derived, loaded via euler-loading's dataset-specific semantic_segmentation loader. The sky mask is used for airlight estimation when the airlight method is "from_sky": the mean RGB of all sky pixels in the clean image is used as the airlight colour L_s.

Intrinsics (optional) — When present, planar (z-buffer) depth is converted to radial (Euclidean) depth before fog is applied.

Airlight Estimation

The airlight config key selects how the atmospheric light L_s is estimated:

Method Description
from_sky Mean RGB of sky pixels in the clean image. Falls back to white [1, 1, 1] when no sky pixels exist.
dcp Dark Channel Prior — selects the brightest pixel (by channel sum) among the top 0.1% darkest-channel pixels.
dcp_heuristic DCP with median heuristic — selects the pixel closest to the median intensity (BT.601 grayscale) among the top 0.1% darkest-channel pixels.

GPU-native implementations (DCPAirlightTorch, DCPHeuristicAirlightTorch) are used automatically when running on GPU.

Model Selection

Each image is assigned a fog model via the selection block:

"selection": {
  "mode": "weighted",
  "weights": {
    "uniform": 1.0,
    "heterogeneous_k": 0.0,
    "heterogeneous_ls": 0.0,
    "heterogeneous_k_ls": 0.0
  }
}
  • fixed mode: always use a single named model.
  • weighted mode: randomly select a model per image according to normalised weights.

Four models are available:

Model Description
uniform Constant k and L_s. Standard homogeneous fog.
heterogeneous_k Spatially-varying k, constant L_s. Simulates patchy fog / fog banks.
heterogeneous_ls Constant k, spatially-varying L_s. Simulates scattered-light colour variation.
heterogeneous_k_ls Both k and L_s vary spatially. Most expressive model.

Visibility Distribution

Each model specifies a visibility_m distribution from which a visibility distance (in metres) is sampled per image:

dist Parameters Description
constant value Fixed value.
uniform min, max Uniform random in range.
normal mean, std, optional min/max Gaussian, optionally clamped.
lognormal mean, sigma, optional min/max Log-normal.
choice values, optional weights Discrete weighted choice.

The sampled visibility V is converted to the attenuation coefficient: k = -ln(C_t) / V.

Heterogeneous Noise Fields

Both k_hetero and ls_hetero use Perlin FBM (fractional Brownian motion) to generate spatially-varying factor fields:

"k_hetero": {
  "scales": "auto",
  "min_scale": 2,
  "max_scale": null,
  "min_factor": 0.0,
  "max_factor": 1.0,
  "normalize_to_mean": true
}

The noise field (values in [0, 1]) is mapped to a factor field: factor(x) = min_factor + (max_factor - min_factor) * noise(x). When normalize_to_mean is true, the factor field is rescaled so its spatial mean equals 1.0, preserving the overall fog density while introducing spatial variation.

Parameter Effect
min_factor / max_factor Range of the multiplicative factor.
normalize_to_mean Rescale factors so the image-wide mean equals the base value. Recommended for k_hetero.
scales / min_scale / max_scale Control spatial frequency content.

Fog Output

Foggy images are saved as PNG files organised by model name:

<output_path>/
  uniform/
    beta_0.0374_airlight_0.353_0.784_1_rgb_00000.png
    config.json
  heterogeneous_k/
    ...

Sky-Depth Transform

Overrides depth values in sky regions with a configurable constant. Useful for datasets where sky depth is encoded as zero or infinity and needs to be normalised to a large finite value.

Sky-Depth Config

{
  "sky_depth_value": 1000.0
}
Field Description
sky_depth_value Depth value assigned to all sky pixels. Defaults to 1000.0.

Sky-Depth Output

Depth maps are saved as .npy float32 files preserving the original directory hierarchy.


Radial Transform

Converts planar (z-buffer) depth to radial (Euclidean) depth using camera intrinsics. For each pixel (u, v):

d_radial(u, v) = d_planar(u, v) * sqrt(((u - cx)/fx)^2 + ((v - cy)/fy)^2 + 1)

Radial Config

{}

No special parameters are required. The transform reads intrinsics from the intrinsics hierarchical modality.

Radial Output

Depth maps are saved as .npy float32 files preserving the original directory hierarchy.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

euler_preprocess-1.0.1.tar.gz (34.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

euler_preprocess-1.0.1-py3-none-any.whl (35.9 kB view details)

Uploaded Python 3

File details

Details for the file euler_preprocess-1.0.1.tar.gz.

File metadata

  • Download URL: euler_preprocess-1.0.1.tar.gz
  • Upload date:
  • Size: 34.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for euler_preprocess-1.0.1.tar.gz
Algorithm Hash digest
SHA256 a17a3eaffbb58f7e2c11384e93bc9f909193e0990fa5a3e57f07d4ea988d6d08
MD5 44d3651bc89b218ab6d77fccef3771ea
BLAKE2b-256 71e69873cf337cd4e4a0758bbe5a60961dae3831e9af29ae99eb1ff4f96e6e35

See more details on using hashes here.

File details

Details for the file euler_preprocess-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: euler_preprocess-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 35.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for euler_preprocess-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 890c108353fb95b8d5fa5d833c7776ed3bf536efcb7e98b5df641b6eafd38d55
MD5 95327e7ff699249f62f041d0cd4132eb
BLAKE2b-256 d10abf0a9cb5ac80172844b6acda6f8ed0fcb61fce7323657f82492581f7d7e4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page