Add RRIM, Multi-Hillshade RGB, and Local Dominance visualizations

Three new visualizations complementing existing SVF/openness/LRM/MSRM:

- RRIM (Red Relief Image Map): RGB composite combining positive openness
  (R), inverted slope (G), negative openness (B). Uses ray-tracing
  to compute both openness values in a single pass.

- Multi-Hillshade RGB: 3 azimuths (315°, 135°, 45°) mapped to R/G/B
  channels with slope blending. Color reveals structure orientation.

- Local Dominance: (dem - local_min) / (local_max - local_min) using
  min/max filters. Measures local height position — complements openness.

Also adds:
- _compute_openness_both() helper for shared ray-tracing (used by RRIM)
- xp_maximum_filter() in gpu.py (GPU/CPU abstraction)
- Entries in COLORMAPS, RGB_LEGENDS, VIZ_STEPS, and is_rgb detection
- All NaN handling follows existing patterns (nan_mask restoration)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jacquin Antoine
2026-05-14 01:03:47 +02:00
parent 1cf8e1752f
commit 7f6b816ed6
5 changed files with 281 additions and 4 deletions

View File

@ -61,7 +61,7 @@ from .visualizations import (
generate_lrm, generate_svf, generate_openness,
generate_mslrm, generate_tpi, generate_sailore,
generate_roughness, generate_anomalies, generate_wavelet,
generate_flow,
generate_flow, generate_rrim, generate_multi_hillshade, generate_local_dominance,
)
from .gpu import gpu_cleanup
from .ign import generate_ign_overlay
@ -87,6 +87,9 @@ VIZ_STEPS = [
('anomalies', generate_anomalies),
('wavelet', generate_wavelet),
('flow', generate_flow),
('rrim', lambda d, b, v, r: generate_rrim(d, b, v, r)),
('multi_hillshade', lambda d, b, v, r: generate_multi_hillshade(d, b, v, r)),
('local_dominance', generate_local_dominance),
('ortho', lambda d, b, v, r: generate_ign_overlay(
d, b, v, r,
layer='ORTHOIMAGERY.ORTHOPHOTOS',