Archive for October, 2010

Initiation au langage G’mic

0-Introduction dispensable

Avant d’être un populaire greffon pour Gimp, G’mic est un logiciel en ligne de commande dédié au traitement d’images. Ce tutoriel suppose que les lignes de commande sont tapées dans un terminal Unix. Les utilisateurs de Windows devront s’adapter et voudront peut-être installer MinGW. Il est aussi possible de tester les notions développées ici dans un filtre prévu pour le greffon.

Toutes les lignes de commande G’mic ressemblent formellement à : 

gmic -instruction1 arguments -instruction2 arguments etc...

Tout est déjà expliqué dans la page de référence officielle, mais ça vous semblera surement trop aride là-bas, pour un peu de luxuriance, voyez ci-dessous.

1-Exemple de base

Avant d’appliquer un traitement à une image, G’mic doit la charger avec l’instruction -input. Après le traitement, vous voudrez probablement décharger le résultat final sur votre disque dur en utilisant l’instruction -output.

Prenons un exemple de base. Pour faire tourner de 90° une image appelée image.jpg et sauver le résultat en tant que fichier au format PNG, vous utiliserez la commande:

gmic -input image.jpg -rotate 90 -output image.png

Vous remarquerez que G’mic retourne le détail des opérations dans le terminal. Pour la ligne de commande précédente, vous devriez avoir quelque chose comme ça:

[gmic]-0./ Start G'MIC instance.
[gmic]-0./ Input file 'image.jpg' at position [0] (1 image 512x384x1x3).
[gmic]-1./ Rotate image [0] of 90 deg., black borders and linear interpolation.
[gmic]-1./ Output image [0] as file 'image.png'.
[gmic]-1./ End G'MIC instance.

Comme ça, vous ne pourrez pas dire que vous ne savez pas ce qu’il se passe.

 

De Rantz, CC-by-nc-sa

2-Les alias

Pour faciliter les choses, les instructions les plus courantes ont des alias. Par exemple, -input peut être remplacé par -i et -output par -o. Ainsi, notre exemple de base peut être réécrit:

gmic -i image.jpg -rotate 90 -o image.png

En fait, l’instruction -input est tellement courante qu’une façon encore plus rapide de l’invoquer est implémentée dans G’mic: il suffit de taper directement le nom de l’image sans aucune instruction. La ligne de commande suivante est donc l’exacte équivalente de la précédente:

gmic image.jpg -rotate 90 -o image.png

N’en espérez pas plus, ça n’ira pas plus vite.

3-Détails à propos de -output

3.1-Formats

vous pouvez sauver l’image que vous traitez n’importe où dans la ligne de commande (avant ou après une opération) et le nom du fichier de sortie détermine le format. Ainsi, avec la ligne de commande suivante, vous obtenez 3 images dans 3 différents formats, la BMP n’a pas subi de rotation alors que les autres, si.

gmic image.jpg -o image.bmp -rotate 90 -o image.png -o image.tga

A propos, par défaut, G’mic sauvegarde les fichiers JPEG avec la qualité 100, ce qui est probablement plus que ce que vous souhaiteriez. Pour sauvegardez en qualité 95, utilisez -o image.jpg,95

3.2-Affichage

Si vous ne spécifiez aucune instruction -output (ou -o) ou si vous donnez explicitement l’instruction -display, alors G’mic affichera votre image sur l’écran. Les 2 prochaines lignes de commandes font la même chose: elles affichent l’image après avoir fait une rotation de 45°.

gmic image.jpg -rotate 45
gmic image.jpg -rotate 45 -display

Tapez ‘q’ pour quitter l’écran d’affichage.

Il y a encore beaucoup à dire sur l’écran d’affichage, mais ce ne sera pas pour maintenant.

4-Les arguments de l’instruction

Depuis le début, l’image effectue des rotations, uniquement des rotations. Mais comme la plupart des instructions G’mic, l’instruction -rotate possède de nombreux arguments afin de spécifier la façon dont doit se passer cette la rotation. Si vous regardez, la page de documentation officielle, vous trouverez la ligne expliquant comment -rotate fonctionne. Ça commence par:

-rotate angle,_borders,_interpolation,_cx[%],_cy[%],_zoom

Cela signifie que -rotate peut avoir jusqu’à 6 arguments. Le premier (angle) doit être spécifié. Les autres commencent par un soulignement ( _ ), cela veut dire qu’ils sont optionnels. Quelques tests devraient suffire à vous faire comprendre le fonctionnement. Essayez ces lignes par exemple:

gmic image.jpg -rotate 30,1
gmic image.jpg -rotate 30,0,0,50%,50%
gmic image.jpg -rotate 30,0,0,0%,0%,0.5

Vous pouvez aussi obtenir la documentation officielle hors connexion avec man gmic ou gmic -h.

5-Gestion de plusieurs images

5.1-Toutes comme une

Vous pouvez gérer plusieurs images à la fois, il suffit de toutes les charger. Par exemple, les lignes suivantes chargent les images et les affichent:

gmic image1.jpg image2.jpg image3.jpg
gmic image*.jpg

Si vous écrivez votre ligne de commande comme dans le chapitre précédent, les instructions G’mic seront alors appliquées à toutes les images chargées. En lançant la ligne suivante:

gmic image*.jpg -rotate 90 -o image.png

Vous ordonnez à G’mic d’appliquer une rotation à tous les fichiers image*.jpg et de les sauver en tant que PNG. Mais il ne sauvera pas plusieurs images dans un seul fichier appelé image.png, il les nommera image_000001.png, image_000002.png, image_000003.png, etc.

5.2-Restreindre l’instruction à seulement quelques images

Vous pouvez spécifier les images sur lesquelles vous voulez appliquer une instruction en ajoutant le numéro de l’image, en commençant par 0, entre crochets:

gmic image*.jpg -rotate[0] 90

n’effectue la rotation que sur la première image chargée.

gmic image*.jpg -o[1] image.png

sauvegarde seulement la deuxième en tant que image.png.

Si vous utilisez des nombres négatifs, vous commencez par la dernière image:

gmic image*.jpg -rotate[-1] 90

n’effectue la rotation que sur la dernière image chargée.

gmic image*.jpg -rotate[-2] 90

n’effectue la rotation que sur l’avant-dernière.

Vous pouvez aussi sélectionner un jeu d’image à manipuler:

gmic image*.jpg -rotate[0,2,-1] 90 tourne la première, la troisième et la dernière.
gmic image*.jpg -rotate[0-9] 90 tourne les 10 premières images.
gmic image*.jpg -rotate[0-10:3] 90 tourne une image sur 3 en commençant par la première et finissant par la onzième, i.e. la première, la quatrième, la septième et la dixième.
gmic image*.jpg -rotate[0,-4--1] 90 tourne la première et les 4 dernières.
gmic image*.jpg -rotate[50%-100%] 90 tourne la seconde moitié de la liste d’images.
gmic image*.jpg -rotate[0,50%--1] 90 tourne la première image et la seconde moitié de la liste d’images.

Modifié de Rantz, CC-by-nc-sa

5.3-Conserver l’original

Par défaut, une instruction remplace l’image originale by celle manipulée. il y a une façon de conserver l’originale: utiliser le double tiret (- -). Ex:

gmic image.jpg --rotate 90

produit 2 images: image.jpg et image.jpg tournée de 90°. Plus de détails sont disponibles ici.

5.4-Manipuler la liste d’images

Comme vous l’avez vu dans le chapitre précédent, l’ordre des images est important. Vous pouvez modifier cet ordre quand bon vous semble en utilisant -move or -reverse:

gmic image*.jpg -move[50%-100%] 0

déplace la deuxième moitié des images au début.

gmic image*.jpg -reverse

inverse l’ordre de toutes les images.
Vous pouvez aussi ne conserver qu’une partie des images de votre liste avec -keep ou vous débarrasser de certaines avec -remove. Si vous vous sentez perdu parfois, regardez ce que G’mic retourne dans le terminal, il devrait signaler combien d’images il reste.

6-Les commandes personnalisées

Quand vous commencez à jouer sérieusement avec G’mic, les lignes de commandes peuvent devenir bien longue. Une solution élégante consiste en l’écriture d’une commande personnalisée. De nombreuses commandes personnalisées existent déjà, vous pouvez les étudier et beaucoup apprendre à travers elles.

Ça vous aiderait probablement d’avoir un peu plus d’explications sur l’art d’écrire des commandes personnalisées, mais vous n’en trouverez pas ici. Tout ce qui sera dit est qu’il vous faut charger votre commande personnalisée avant de pouvoir l’utiliser.

Cela se fait en utilisant l’instruction -command ou -m ou encore sans instruction du tout si votre fichier finit par .gmic. Ainsi, les 3 prochaines lignes de commandes font la même chose:

gmic -command mon_fichier_de_commande_personnalisee.gmic image.jpg -my_command
gmic -m mon_fichier_de_commande_personnalisee.gmic image.jpg -my_command
gmic mon_fichier_de_commande_personnalisee.gmic image.jpg -my_command

7-Aller plus loin

Pour aller plus loin, il peut sembler logique de consulter cet article. Puis, pour augmenter votre culture G’mic, vous devriez sans doute cliquer sur les images de la galerie et pour maitriser la technique, n’oubliez pas le fichier de commandes personnalisées.
Vous êtes aussi invités à partager vos problèmes et vos solutions au forum(en).

De Rantz, CC-by-nc-sa

G’mic: Image and format

0-Irrelevant introduction

A raster image is a pixel matrix, that follows its format rules, with up to 4 channels setting the color according to the colorspace (RGB, CMYK, …) and with integers from 0 to 255 or to 65535, it depends on the number of bits.

But once an image enter G’mic, it becomes a 4D floating-point number matrix with no real limitation. It means that during the G’mic process, you can have negative numbers, extremely high or low values, dozens of channels… feel the freedom.

And then you might feel lost, because you might have difficulties to have your picture reenter the constrained world of image formats, unless you are aware of what is said below.

1-Channels

1.1-Three channels in the viewer

The G’mic viewer isn’t meant to show the picture, it is meant to show information about this 4D matrix. It only shows the 3 first channels and considers them as RGB. So, if you play with a CMYK picture, the K value will be ignored and the rest will look weird. If you had loaded an image with transparency, you would not see it. You can visualize the fourth channel using, for example, the -channels command:

gmic my_image.jpg -channels 3

You can also specifically ask the viewer to mimic transparency for the fourth channel by adding some checker board:

gmic my_image.jpg -display_rgba

1.2-How many channels in that format?

The way all your channels fits in the file you intend to create depends on the format used. G’mic tries to fit as many channels as the format accepts and discard the others and what means the channels that fit depends on the format. For example, 4 channels into a JPEG are understood as a CMYK file whereas 4 inside a PNG are understood as RGBA. To be sure of what you finally get, use a « conventional » viewer or use ImageMagick:

identify -verbose my_image.jpg |grep Colorspace

alternate

get Tux back with gmic tux_rgb.png -split x,3 -+, LGPL

2-Numbers

2.1-Show any number

Since virtually any number can be contained in the matrix, the G’mic viewer is dealing with that by considering the highest value as the brightest and the lowest one as the darkest and by stretching linearly all the rest in between. So be careful when you use algorithms that return unconventional values. For instance:

gmic my_image.jpg -luminance -threshold 120

will display a black and white picture, but since the -threshold command returns only 1 or 0, if you output that in any conventional image format, you’ll get a pretty dark image. The usual way to circumvent this is to stretch values from 0 to 255 with -normalize:

gmic my_image.jpg -luminance -threshold 120 -normalize 0,255

Some other processing might introduce localized extreme values. If you do:

gmic my_image.jpg -unsharp_octave 2,2

You’ll get values such as -250 or 450 in very few pixels, your image will thus appear quite gray in the G’mic viewer. Shave this with -cut:

gmic my_image.jpg -unsharp_octave 2,2 -cut 0,255

Last comment on this, there is a way to avoid G’mic viewer stretching: -display0.

2.2-What it becomes in the file

If everything belongs to the [0,255] interval, then G’mic will just round all that to get integers and produce an 8 bit image. But if any number exits these limits, it will produce a 16 bit image if the format allows it and/or transform wrong numbers in garbage to fit into the limits. ImageMagick can tell you what happened:

identify -verbose my_image.jpg |grep bit

From Troy Holden, CC-by-nc-nd

3-A few other things about formats

3.1-About Tiff

The TIFF format is supposed to accept floating point numbers, so G’mic doesn’t hesitate to stuff them in it. But in practice, it is difficult to find a viewer that can read such TIFF. To avoid issues about it, you should add -type uchar before outputing. The previous example would become:

gmic my_image.jpg -unsharp_octave 2,2 -type uchar -o my_image.tiff

3.2-About Raw

G’mic is able to deal with raw format, but you should take care of type and image dimensions yourself. For example, to load an 8 bit with dimensions 1000x1000x200, you would do:

gmic -type uchar my_image.raw,1000,1000,200

3.3-Native formats: CIMG and CIMGZ

The native G’mic format is CIMG and its analogous compressed CIMGZ. So, if you need to store your image in a middle of a process, it is advised to store it in one of these formats to avoid loosing information via usual formats constraints. Ex:

gmic my_image.jpg -unsharp_octave 2,2 -o my_image.cimg
gmic my_image.jpg -unsharp_octave 2,2 -o my_image.cimgz

3.4-Text formats

Another way to keep all informations is to use a text format (TXT or DLM). This way, you will even be able to use text editor to modify your picture:

gmic my_image.jpg -unsharp_octave 2,2 -o my_image.txt
gmic my_image.jpg -unsharp_octave 2,2 -o my_image.dlm

3.5-Standard input/output

You can also read from the standard input or write to the standard output. Both commands below are identical. They tell G’mic to read from the standard input in text format:

echo -e "1 2 3\n4 5 6" | gmic -.txt
echo -e "1 2 3\n4 5 6" | gmic txt:-

To tell G’mic to write an image to the standard output in text format, it would one of those:

gmic image.jpg -o -.txt
gmic image.jpg -o txt:-