Jpegmask: Outil pour masquer, flouter ou ajouter un nadir sur les photos

J’ai commencé à me faire quelques scripts pour gérer mes images Panoramax. Bien sûr ils sont sous license libre et disponibles en ligne :

https://gitlab.com/fgouget/panotools

Pour l’instant j’ai principalement jpegmask qui, comme son nom l’indique, permet de masquer certaines zones d’une série d’images JPEG.

Contrairement aux scripts que j’ai déjà vus on peut masquer un ou plusieurs trapèzes ce qui permet de sortir du simple nadir circulaire. Et bien sûr cela se fait sans recompression de l’image de base : le trapèze est découpé en bandes horizontales suivant les limites des blocs de compression JPEG et chaque bande est masquée individuellement via jpegtran. Malheureusement jpegtran ne supporte qu’une option -drop à la fois ce qui rend ce traitement très inefficace (quelque chose à améliorer un jour ?). Mais jpegmask peut traiter plusieurs images en parallèle pour un peu rattraper le coup.

Chaque zone peut être masquée par une couleur uniforme (gain de place maximum), un logo (le script peut gérer sa préparation pour le nadir), ou un floutage (algorithme Panoramax remanié).

jpegmask peut aussi ajouter une grille sur l’image pour aider à déterminer les coordonnées des zones à masquer. Une fois les bons paramètres déterminés pour la couverture et l’esthétique, on peut créer un profil dans ~/.jpegmask.toml pour simplifier le traitement des captures faites ultérieurement avec le même kit voiture / piéton.

En pratique je compte utiliser une configuration de ce type :

[profile."car"."13888"]
masks = [
      # Roof: front
      "white@2722-4206x4880,1528-5400x5471",
      "1528-5400x5471,1440-5504x5487",
      ",1248-5680x5551",
      ",864-6064x5631",
      # Roof: back
      "9568-11440x4815,9440-11568x4943",
      ",9328-11680x5023",
      ",9200-11808x5119",
      ",9040-11968x5215",
      ",8880-12128x5311",
      ",8672-12336x5407",
      ",8416-12592x5503",
      ",8080-12928x5599",
      ",7920-13088x5631",
      # Roof: nadir
      "-x5632",
]
[profile."foot"."13888"]
masks = [
      # Head (middle 3800)
      "silver@3800x4900,3400-4200x5200",
      ",3100-4500x5500",
      # Shoulders
      ",1800-5700x5800",
      ",1200-6400x6400",
      # Nadir
      "-x6400",
]

Notez que l’on peut dupliquer le même profil pour chaque résolution / modèle de caméra. Cela permet de garder la même commande pour les prises en mode photo et en mode vidéo.

J’applique ensuite ces profils sur mes séquences comme suit :

./jpegmask --car 20260508-route/*.jpg 20260508-route.nadir/
./jpegmask --foot 20260525-parc/*.jpg 20260525-parc.nadir/

Ce qui me donne :


Pour tester la commande vous-même :

wget -Opanoramax.svg https://upload.wikimedia.org/wikipedia/commons/a/a9/Panoramax.svg
wget -Osource.jpg https://panoramax.openstreetmap.fr/images/a1/3a/08/ea/bcc6-45c4-a702-d9571b27c40d.jpg
wget -Ojpegmask https://gitlab.com/fgouget/panotools/-/raw/main/jpegmask

python3 jpegmask --mask nadir:180:panoramax.svg@x2280 source.jpg nadired.jpg

Explication de la commande :

  • nadir: Préparer le logo panoramax.svg pour qu’il ait une tête correcte une fois appliqué au nadir de l’image 360.
  • 180: Il faut tourner le logo de 180 degrés. À ajuster selon l’orientation de la photo par rapport au sens de déplacement.
  • @x2280: Où placer le logo. Ici, de la ligne 2280 jusqu’en bas de l’image.

Note : Si le logo Panoramax apparaît en noir & blanc on va dire que c’est fait exprès pour être assorti à la voiture. En fait c’est parce que ImageMagick gère mal la transparence dans les SVG. Mais vous n’aurez pas ce problème en partant d’un logo PNG ou JPEG.

Voilà.
J’espère que ce premier outil pourra être utile à d’autres et je suis ouvert à vos suggestions.

1 Like