FLASH INFORMATIQUE FI



ImageMagick


Le couteau suisse de manipulation des images



The swiss army knife of image processing


Predrag VICEIC


Fiche descriptive

Il est rare de nos jours, à l’époque des smartphones et tablettes, de trouver une application disponible uniquement en ligne de commande, et malgré cela absolument irremplaçable pour tout un éventail de cas d’utilisation. ImageMagick, vous l’aurez deviné, est une telle application.
ImageMagick ne s’adresse de loin pas à tout le monde. Pourtant, les questions auxquelles cette application répond sont universelles : pourquoi charger mon cadre photo avec les photos de 3456x2304 pixels (soit 3 Mo), alors qu’il supporte une résolution de 1024x768 (qui tient dans 300 ko) ? Comment publier sur le Web ma centaine de photos de l’été passé, sauvegardées en format RAW de mon reflex ? Comment corriger la sous-exposition de 300 photos d’une soirée sans y passer 2 jours ? Comment re-compresser ma collection de 6000 photos (18 Go) afin de l’avoir toujours dans mon smartphone (8 Go) ? Ou plus difficile : comment supprimer l’excès de blanc autour de la centaine de graphiques Octave ou Matlab que l’on voudrait insérer dans un article en ligne ? Comment extraire le canal alpha de 1’500 rendus 3D afin de les compositer dans une vidéo ?
Afin de résoudre les problèmes énumérés à l’instant, vous pourrez certainement utiliser les grandes suites professionnelles de traitement d’image bitmap. Après tout, on n’a qu’à charger la photo, exécuter l’opération, sauvegarder... et recommencer ainsi 6000 fois. Je vous l’accorde, vous pouvez scripter les opérations, il suffit d’avoir les bases en AppleScript, Javascript, Visual Basic ou VBScript et de connaître l’API de l’application en question.
Vous avez ces compétences, je n’en doute pas. Malgré cela, ImageMagick, sous son apparence über-geek, pourrait peut-être vous intéresser...

convert

convert photo.jpg photo.png

La commande convert fait partie de l’installation ImageMagick. Elle convertit l’image JPEG contenue dans le fichier photo.jpg, en image en format PNG enregistrée dans photo.png. Si, en plus du changement de format, nous voulions modifier la taille de l’image, nous exécuterions la commande ci-dessous :

convert -resize 1024x768 photo.jpg photo.png

L’image sera redimensionnée afin de remplir le rectangle de taille 1024x768 pixels et enregistrée en format PNG. Si nous n’avions voulu contraindre qu’une dimension, nous aurions utilisé, au choix :

convert -resize 1024x photo.jpg photo.png

ou

convert -resize x768 photo.jpg photo.png

Dans le cas de la spécification des deux dimensions de redimensionnement, convert inscrit l’image résultante dans le rectangle spécifié par les dimensions données, en préservant le rapport largeur/hauteur. La commande suivante fait fi de ce rapport et tord l’image afin de remplir le rectangle en entier :

convert -resize 1024x200\! -quality 80% photo.jpg photo-redim.jpg

Vous remarquerez que l’option  ! doit être échappée afin de ne pas être interprétée par la console. L’option -quality permet de spécifier le niveau de compression pour les formats qui supportent cette variable. Si nous voulons uniquement réduire une image à une taille donnée, sans forcément l’agrandir si l’image est plus petite que cette taille, nous utiliserions l’option>. La commande suivante réduit à la largeur 1024 pixels les images plus larges que cette dimension, et ne modifie pas les images plus petites :

convert -resize 1024x\> photo.jpg photo-redim.png

Vous devinerez aisément à quoi sert l’option <. Si nous voulons avoir un jeu d’images occupant plus ou moins la même place sur le disque, nous utiliserions l’option @ :

convert -resize 30000\@ photo.jpg photo-redimensionnée.png

La commande qui précède redimensionne l’image afin que celle-ci ait le nombre de pixels s’approchant de 30’000, tout en gardant le rapport largeur/hauteur. Ainsi une image de 2048x1536 sera redimensionnée par la commande ci-dessus en une image de 200x150 (=30’000) pixels.
Je vous épargne la dizaine d’autres options de redimensionnement, car vous l’aurez compris, ImageMagick permet de tailler vos images selon toutes sortes de critères. Mais qu’en est-il du cas d’utilisation où nous voulons traiter un ensemble d’images d’un coup ? Sans rentrer tout de suite dans les scripts console, je vous présente la commande mogrify.

mogrify

À la différence de la commande convert, qui demande le nom du fichier de sortie, la commande mogrify permet de convertir une liste de fichiers :

mogrify -format png *.jpg

<p align="justify">
Cette ligne convertira tous les fichiers JPEG présents dans le dossier courant en fichiers en format PNG. Les fichiers d'origine seront préservés. Attention, la conversion de format reste une exception, toute autre opération effectuée à l'aide de mogrify remplacera les fichiers d'origine!
La commande suivante augmente le contraste de toutes les photos présentes dans le dossier courant:</p><code>


mogrify * -sigmoidal-contrast 5,0%

Magick, non ? Vous l’aurez compris, il faudrait un article de plusieurs centaines de pages pour décrire toutes les fonctions proposées par cette application. Nous avons vu les opérations de changement de format, sachez que ImageMagick supporte plus de cent formats d’image différents. Nous avons vu également les options de redimensionnement et je vous laisse découvrir dans la documentation bien fournie les autres options de transformations telles que le rognage (crop), rotation (rotate), basculement (flip) ou suppression du cadre blanc (trim).

Et ce n’est pas tout !

ImageMagick permet également d’incruster les formes géométriques dans une image à l’aide des fonctions de dessin ; les formes simples, mais également les courbes de Béziers, les arcs elliptiques, les chemins SVG ainsi que du texte. Nous pouvons sans autre utiliser cet outil pour décorer les images à l’aide des divers cadres (au look un peu 1990, certes...), mais aussi effectuer les distorsions classiques telles que le flou (blur) ou le renforcement de la netteté (sharpen). Les options de compositage d’ImageMagick vous permettent en quelques coups de clavier de combiner deux images pour en créer une troisième. Ainsi, la commande composite vient s’ajouter aux convert et mogrify. Composite permet de combiner plusieurs images en utilisant une foule d’opérateurs tels que add, multiply ou substract. Si, par exemple, nous voulions sommer une série d’images prises lors de notre séance de photographie astronomique afin d’obtenir une image plus lumineuse, nous utiliserions la commande suivante :

composite -compose lighten *.JPG result.png

Ainsi une suite de photos prises avec un temps d’exposition raisonnable (5’), devient équivalente à une photo prise avec une durée d’exposition beaucoup plus longue. Si nous avions pris la peine de prendre une photo avec une exposition équivalente, mais avec l’objectif obturé, nous aurions pu utiliser ImageMagick pour supprimer les défauts du capteur de l’appareil photo, ainsi que les artefacts obtenus suite à la chauffe de ce dernier :

composite -compose subtract result.png black.jpg result2.png

La commande ci-dessus soustrait les pixels parasites contenus dans l’image black.jpg de l’image result.png. Bien étendu, cette technique ne fonctionnera que avec une monture équatoriale et une mise en station irréprochable de votre télescope. Si tel n’est pas le cas, vous aurez avantage à utiliser les excellents plugins astronomiques pour Gimp, qui tiendront compte de la rotation du champs céleste dans vos photos consécutives.

Scriptage

En lecteurs perspicaces, vous avez remarqué que lorsque j’ai abordé la commande mogrify et la possibilité de traiter les images par lots, j’ai parlé des fichiers contenus dans le dossier courant, et non d’une arborescence. En effet, mogrify, comme son compère convert, ne sait pas comment lire un dossier ou comment descendre dans une arborescence. Ce n’est pas vraiment un problème pour ceux qui maîtrisent la commande find. Les utilisateurs sous Windows devront malheureusement renoncer à cette approche, à moins d’installer unxutils ou un autre portage des outils unix pour leur plate-forme :

find . -type f -name '*.jpg' -exec mogrify -format png {} \;

L’incantation ci-dessous libère toute une arborescence des fichiers au format JPEG.

identify

Une librairie du gabarit d’ImageMagick serait incomplète sans les fonctionnalités d’identification de fichiers d’images. La commande identify tombe à pic lorsque nous voulons connaître les attributs d’une photo :

identify photo.png
photo.png PNG 2048x1536 2048x1536+0+0 8-bit DirectClass 5.196MBB 0.000u 0:00.000

Les aficionados de la commande date sous *nix, ne seront pas déçus par les possibilités de définition de format de sortie de identify :

identify -format "%[fx:w] par %[fx:h] pixels  avec %k couleurs uniques, compressée avec %C" photo.png
2048 par 1536 pixels avec 219175 couleurs uniques, compressée avec Zip.

PHP

En plus de son utilisation en ligne de commande, ImageMagick est également très utilisé par la communauté PHP pour ses fonctionnalités de traitement d’image et de conversion de format. Il est ainsi incontournable pour la création de vignettes et autres redimensionnements, notamment lors de la dépose d’images en ligne. La librairie Imagick propose toutes les fonctionnalités d’ImageMagick et fait partie des extensions natives de ce framework.

Possibilités sans fin

Le temps passe, et je me rends compte que je ne vous ai absolument pas parlé des fonctionnalités avancées d’ImageMagick, telles que traitement d’images HDR, l’animation, la transformée de Fourier, le cryptage d’images, la correction d’aberrations sphériques et autres défauts des lentilles, les fonctions d’identification, de détection de formes et de morphologie mathématique. Je n’ai évidemment ni la place, ni vraiment l’expérience dans l’utilisation de ces incantations. Je vous laisse donc, en lecteur avisé, parcourir la documentation d’ImageMagick afin de vous rendre compte par vous même de la puissance de cet outil.


Article du FI-EPFL 2011 sous licence CC BY-SA 3.0 /P. Viceic


Les images originales sont distribuées sous la licence Creative Commons BY-NC-SA, et leurs auteurs sont, dans l’ordre : chozo-mj, manuoceane et santang. Les images résultantes ont été modifiés par l’auteur de l’article et sont distribuées sous la même licence.



Cherchez ...

- dans tous les Flash informatique
(entre 1986 et 2001: seulement sur les titres et auteurs)
- par mot-clé

Avertissement

Cette page est un article d'une publication de l'EPFL.
Le contenu et certains liens ne sont peut-être plus d'actualité.

Responsabilité

Les articles n'engagent que leurs auteurs, sauf ceux qui concernent de façon évidente des prestations officielles (sous la responsabilité du DIT ou d'autres entités). Toute reproduction, même partielle, n'est autorisée qu'avec l'accord de la rédaction et des auteurs.


Archives sur clé USB

Le Flash informatique ne paraîtra plus. Le dernier numéro est daté de décembre 2013.

Taguage des articles

Depuis 2010, pour aider le lecteur, les articles sont taggués:
  •   tout public
    que vous soyiez utilisateur occasionnel du PC familial, ou bien simplement propriétaire d'un iPhone, lisez l'article marqué tout public, vous y apprendrez plein de choses qui vous permettront de mieux appréhender ces technologies qui envahissent votre quotidien
  •   public averti
    l'article parle de concepts techniques, mais à la portée de toute personne intéressée par les dessous des nouvelles technologies
  •   expert
    le sujet abordé n'intéresse que peu de lecteurs, mais ceux-là seront ravis d'approfondir un thème, d'en savoir plus sur un nouveau langage.