Archives de catégorie : Traitement d’image

Programmer ImageMagick avec Powershell

ImageMagick permet le traitement d’image en ligne de commande. Il supporte notamment la création de calques auxquels on peut ajouter des masques. J’en ai profité pour programmer un optimiseur de tonalité photo en associant à ImageMagick Powershell.  

Role du  script

Optimiser les tons d’une photo en contrôlant ses hautes lumières, tons moyens et ombres. Le script pourra servir de canevas à la création de nouveaux traitements grâce à une procédure de test.

Description

Schématiquement le script effectue les actions suivantes : 

  1. Affectation des préférences utilisateur et initialisation de 3 masques de luminances. 
  2. Placer une première image comme arrière-plan.
  3. Dupliquer l’ arrière-plan et placer cette copie au-dessus en tant que calque.   
  4. Modifier l’aspect du calque (repeindre le calque en rouge en mode test, modifier luminosité, contraste et saturation en mode optimisation)   
  5. Définir la transparence du calque à partir du premier masque de luminance. Tout ce qui est noir dans le masque rendra le calque totalement transparent et blanc totalement opaque.  
  6. Répéter les étapes 3 à 5 en utilisant 2 autres calques qui seront associés aux 2 autres masques.
  7. En mode optimisation : fusionner l’arrière-plan et les 3 calques pour créér une image optimisée. En mode test : créer 3 images qui montreront l’action des 3 calques) .  

Le code

# optimiseur_photo.ps1
# Traitement d'image : Optimiseur de la tonalité
# Testé sous Windows 8.1 et 10 avec ImageMagick 7.0.10 

# Pour créer des png qui montrent l'action des masques
# Traite la première image puis quitte. 
$test_mode = 0

# Indique le répertoire contenant les images a optimiser 
$dossier_source = "C:\votre\dossier\images\a optimiser"
# Particule ajoutée au nom  des images résultantes pour les différencier
$distinctif ="_optim_out"

# Options pour la création des masques 
$canal = "-colorspace Lab -channel r -separate -delete '1,2'"
$flou = "-blur 0x5"

# Créations des masques. Si modification faire 
# attention aux `` qui permettent d'échapper les parenthèses 
# et d'écrire les chaines sur plusieurs lignes 
 
$hautes_lumieres = " ``( -clone 0 $canal -level '50%,100%' ``
+channel $flou -depth 8 -write mpr:masque.png  -delete 0 ``) " 

$tons_moyens = " ``( -clone 0 ``( -clone 0 $canal  ``
-level '50%,100%' +channel ``) ``( -clone 0 $canal  -negate  ``
-level '50%,100%'  +channel ``) -delete 0  ``
-compose blend -composite -negate $flou -depth 8 ``
-write mpr:masque.png  -delete 0 ``) " 

$ombres = " ``( -clone 0 $canal  -negate -level '50%,100%'  ``
+channel $flou -depth 8 -write mpr:masque.png  -delete 0 ``) " 

# Options pour les calques 
if ($test_mode)
{$action_hl= $action_tm = $action_o  = "-fill red -colorize '100%'" }  
else { $action_hl = "-brightness-contrast '-23,23'"  
       $action_tm = "" 
       $action_o = "-sigmoidal-contrast '5,0%' " }

# Création des calques 
$calque_hl = "``( -clone 0 $action_hl  mpr:masque.png ``
-compose copy_opacity   -composite  ``)"
$calque_tm= "``( -clone 0 $action_tm  mpr:masque.png ``
-compose copy_opacity   -composite ``)"
$calque_o= "``(  -clone 0 $action_o  mpr:masque.png  ``
-compose copy_opacity   -composite ``)"

# Traitement des images 
$listes_image = Get-ChildItem $dossier_source -File |
where { $_.name -notmatch ".*$distinctif.*" }

foreach ($srcitem in $listes_image )
  { $srcfullname = $srcitem.fullname    
    $dstbasename = $dossier_source +"\"+$srcitem.basename+"$distinctif"
    write-host "Traitement de l'image $srcitem ..."

    #assemblage de la commande et exécution
    if($test_mode) {
    $cmd = "magick convert '$srcfullname' $hautes_lumieres $calque_hl ``
    $tons_moyens $calque_tm $ombres $calque_o -delete 0 '$dstbasename%01d.png' "
    invoke-expression  -command $cmd
    exit
    }
    else  {    
    $cmd = "magick convert '$srcfullname' $hautes_lumieres $calque_hl ``
     $ombres $calque_o $tons_moyens $calque_tm -compose over ``
    -flatten '$dstbasename.jpg' " 
    invoke-expression  -command $cmd
    }
  }

Les images à traiter :

Le carrousel ci-dessous montre les 4 images jpg que j’ai placées dans un dossier spécifique. Elles présentent des écarts  de luminosité importants . L’ optimiseur sera chargé de corriger cet écart.

Utilisation

ImageMagick est installé sur ma machine Windows : https://imagemagick.org/script/download.php

J’ouvre le script (l’extension .ps1 est importante) par un clic droit puis je choisi Modifier. L’ ISE  (Integrated Scripting Environment ) s’ouvre et affiche le script en haut (sinon vérifier Afficher -> Afficher le volet de script) . Je renseigne la variable $dossier_source avec le chemin du dossier qui contient mes images.

En mode test

Ce mode va créer une image distincte pour chaque calque. Une seule image source est traitée dans ce mode.

Pour exécuter le script dans ce mode, j’ai placé la variable $test_mode à 1. Puis j’exécute le script (icone lecture ou touche F5). Dans mon dossier apparaissent 3 nouvelles images png représentant les 3 calques. Les zones qui restent contrôlées par le calque après application du masque sont en rouge. L’intensité de la couleur nous donne une indication sur la prépondérance du calque sur l’arrière plan. Dans l’ordre le carrousel ci-dessous montre le calque hautes lumières, puis tons moyens, et enfin ombres.

En mode Optimisation

J’ai replacer $test_mode à 0. Le script peux maintenant traiter toutes les images placées dans le dossier $dossier_source (un filtre exclut les images qu’il a lui-même générées) . Le carrousel montre le résultat au terme de l’exécution du script. L’image d’origine suivi de sa version optimisée.

Pour aller plus loin

On pourra modifier les variables Powershell qui définissent les options de création des masques et des calques. Cela implique de connaitre un minimum la syntaxe d’imageMagick. Voici quelques liens pour bien débuter.