ImageMagick

ImageMagick est un outil en ligne de commande qui permet d'appliquer des transformations et des opérations sur des images composées de pixels ou sur des vidéos (dans ce cas le traitement de la commande va prendre du temps car les fichiers sont plus lourds). Sous Linux, on peut l'installer via le terminal avec les commandes suivantes.

Sous Ubuntu/Debian :

sudo apt-get install imagemagick

Sous ArchLinux/Manjaro :

sudo pacman -S imagemagick

Sous Mac, on peut l'installer avec brew :

brew install imagemagick

Pour toutes les autres distributions Linux et Windows, voir la page Download d'ImageMagick : https://imagemagick.org/script/download.php

Retouche d'images

Pour inverser les couleurs d'une image (les passer en négatif), on utilise la commande :

convert -negate image.jpg output.jpg

Sur des vidéos, le résultat de la transformation est quelque peu incertain. Voici une vidéo originale et sa transformation avec la commande ci-dessus :

Pour redimensionner une image (ici au format 800x600px), ce sera la commande :

convert -resize 800x600 photo.jpg photo_resized.jpg

Si on veut ajouter un bord blanc à une image, on utilise la commande suivante :

convert mon_image.jpg -bordercolor white -border 10 mon_image_avec_bord.jpg

On peut appliquer une telle transformation à un dossier entier d'images. Si on a un dossier d'images de base images_sans_bords et qu'on veut enregistrer les images avec bords dans un dossier images_bords, la commande sera :

convert images_sans_bords/*.* -bordercolor white -border 10 images_bords/%d_image.jpg

Modifier les couleurs des pixels

Voici notre image de base pour cette section :

On peut modifier l'espace colorimétrique d'une image, ainsi que sa luminosité, sa saturation et sa teinte. Voici une commande qui va faire passer les couleurs de notre image en mode LCH :

convert mon_image.jpg -define modulate:colorspace=LCHuv -modulate 100,100,25 %d_mon_image.jpg 

Si on relance le même script mais en modifiant les valeurs suivant le paramètre -modulate à respectivement 25,25,50 et 50,50,75, on obtient d'autres résultats :

Séparer les couches RVB d'une image

Pour séparer automatiquement les couches rouge, vert et bleu d'une image, on peut utiliser la commande suivante :

convert -separate -channel RGB mon_image.jpg channels.png

Voici les trois images produites :

Appliquer des trames sur une image

Algorithmes de dithering

ImageMagick possède des fonctions de base pour tramer une image, comme le dithering (remplacer certaines couleurs de l'image par des trames). Voici notre image de base :

Essayons une première commande de dithering pour tramer l'image et voyons le résultat :

convert base.jpeg -dither None -colors 64 base_tramee.jpeg

Ici on n'a pas permis à l'algorithme d'avoir de marge d'erreur pour la diffusion des couleurs (-dither None), d'où l'aspect très tranché des plages de couleur. Si on réessaye en modifiant la commande :

convert base.jpeg -dither Riemersma -colors 64 base_tramee02.jpeg

On voit que les couleurs se diffusent un peu plus. Mais on peut tester encore une autre version de la commande pour obtenir un grain plus subtil :

convert base.jpeg -dither FloydSteinberg -colors 64 base_tramee03.jpeg

Faire ses propres trames

Dans ImageMagick, on peut se servir d'une image comme motif pour en tramer une autre. Voici à gauche notre image de base pour cette section et à droite l'image avec laquelle nous allons créer des trames :

Comme les commandes servant à générer des trames sont un peu longues, nous allons les enregistrer comme des scripts. Voici le premier script, trame01.sh :

magick convert $1 \
\( +clone -gravity center -tile $2 -draw "color 0,0 reset" -wave 50x100 \) \
-compose MinusSrc -composite -fill White +opaque Black $3

Quand on lancera le script, on devra fournir des informations qui viendront remplacer $1, $2 et $3 dans le script. $1 correspond à l'image d'entrée, $2 à l'image servant de motif pour la trame et $3 sera le nom de l'image générée avec la trame. Il faut donner au script ces trois paramètres dans l'ordre. Quand on lance le script, on doit avoir quelque chose comme ceci :

bash trame01.sh image_de_base.jpg image_de_trame.jpg image_de_sortie.png  

Et le résultat du script :

Si on modifie le script avec d'autres paramètres, on obtient un résultat tout à fait différent. Voici deux versions modifiées du script suivies de l'image qu'elles produisent :

magick convert $1 \
\( +clone -rotate -15 -scale 142% -tile $2 -draw "color 0,0 reset" \
-rotate 15 \) \
-gravity Center \
-compose MinusSrc -composite \
-fill White +opaque Black \
$3

magick convert \
$1 \
\( +clone \
+noise Random \
\) \
-compose Mathematics \
-define compose:args=0,0.4,1,-0.2 \
-composite \
\( +clone \
-gravity center -border 10x10 \
-tile $2 -draw "color 0,0 reset" \
-wave 20x100 \
\) \
-compose MinusSrc -composite \
-fill White +opaque Black \
$3

Générer un GIF à partir d'une séquence d'images fixes

ImageMagick permet de créer très facilement des GIF à partir d'une séquence d'images donnée. On ve placer toutes les images que l'on veut animer dans un dossier cuts. Puis pour générer la commande, il faut entrer cette commande :

convert cuts/*.* animation_cuts.gif

Ressources pour apprendre

La documentation officielle d'ImageMagick :

Tutoriels pour débuter :