Recaler les lignes de balayage des passes et accélérer le rendu

Troisième passe du calage vertical : chaque ligne de balayage (décalage et
inclinaison due au roulis) est recalée contre le consensus des autres
faisceaux, à toutes les échelles, avec un profil d'étalonnage par faisceau
et par degré d'angle qui retire les écarts non linéaires en travers de la
fauchée. Les lignes sans recouvrement sont corrigées contre leur propre
faisceau. Efface les lignes en creux et la marche au bord de fauchée
mesurées sur LHD_FXX_0999_6882 (validé sur des blocs jamais vus). Calcul
vectorisé, CuPy si GPU ; la gigue par fenêtres de temps devient inutile
quand scan_angle existe.

Rendu plus rapide : encodage AVIF speed 9 (0,6 s au lieu de 4 s par dalle),
classification IGN par extraction directe laspy au lieu de PDAL (4,9 s au
lieu de 13,5 s), comblement des trous et gradients sur GPU, cache numba
persistant dans l'image.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Antoine Jacquin
2026-09-27 01:57:04 +02:00
parent 31645a42e8
commit d32502b74e
9 changed files with 712 additions and 13 deletions

View File

@ -170,6 +170,12 @@ RGB_LEGENDS = {
}
RGB_KEYWORDS = tuple(RGB_LEGENDS)
# Vitesse d'encodage AVIF (libavif, 0 = lent/compact … 10 = rapide). Mesuré
# sur une dalle 5000 × 5000 px (q60) : défaut 4,1 s ; speed 9 0,6 s pour +3 %
# de taille et −0,3 dB de PSNR, invisible. L'encodage était l'étape la plus
# longue du rendu d'une couche.
AVIF_SPEED = 9
# Fusion des textes de légende (titre / lecture du rendu / méthode de calcul)
# depuis la source unique VIZ_LEGENDS (index.py, sans dépendance lourde).
from .index import VIZ_LEGENDS, parse_basename_coords
@ -804,7 +810,8 @@ def tif_to_png(tif_file, vis_dir, resolution, keep_tif=False, source_info=None,
if quality >= 100:
img.save(str(output_file), format=pil_format, lossless=True)
else:
img.save(str(output_file), format=pil_format, quality=quality)
img.save(str(output_file), format=pil_format, quality=quality,
**({'speed': AVIF_SPEED} if pil_format == 'AVIF' else {}))
# Delete source TIFF (unless --keep-tif)
if not keep_tif:
@ -888,7 +895,8 @@ def tif_to_crop(tif_file, vis_dir, resolution, keep_tif=False, quality=60, outpu
if quality >= 100:
img.save(str(output_file), format=pil_format, lossless=True)
else:
img.save(str(output_file), format=pil_format, quality=quality)
img.save(str(output_file), format=pil_format, quality=quality,
**({'speed': AVIF_SPEED} if pil_format == 'AVIF' else {}))
# Delete source TIFF (unless --keep-tif)
if not keep_tif: