Conférence : mille et une façons de détourer une image avec GIMP

Mille et une façon de détourer une image avec GIMP

Début juillet avaient lieu les rencontres mondiales du logiciel libre à Saint-Étienne. Et comme annoncé, j’y animais une conférence sobrement intitulée « mille et une façons de détourer une image avec GIMP ». C’est peut-être un poil exagéré, mais j’ai tout de même réussit à en montrer sept.

Pour moi le détourage est une activité incontournable d’un logiciel de retouche d’images comme GIMP. En tout cas, je le pratique abondamment pour les affiches et autres œuvres imprimées que je réalise. Autant le dire tout de suite, il n’y a pas d’outil miracle pour détourer : tout au plus, des outils qui vont vous mâcher le travail. En général je finis le travail avec un masque de calque.

Dans cette conférence, je montre, assez rapidement certes, les deux outils de base que j’utilise : les ciseaux intelligents et l’extraction de premier plan. Beaucoup d’utilisateurs de PhotoShop ne jurent que par la plume (outil Chemin dans GIMP), mais je ne suis pas à l’aise avec cette technique (peut-être l’outil Chemin est-il moins évolué dans GIMP). Rapidement je passe au masque pour fignoler le détourage au pinceau (je peins en noir ou blanc directement sur le masque).

Les autres techniques montrées reposent sur une dégradation de l’image afin d’augmenter le contraste entre l’élément à détourer et le reste, soit pour en faire une sélection, soit un masque, ce qui revient au même (techniquement le masque comme la sélection sont des images en niveaux de gris, mais j’y reviendrai plus tard). Parmi les techniques originales, j’utilise la désaturation, la décomposition en RVB ou en TSV, tout cela suivie d’une augmentation de contraste avec l’outil Niveaux (utilisez les Courbes si vous voulez plus de précision encore). Pour l’une des photos j’utilise un filtre de détection des contours : en effet, les sujets à détourer sont nets sur un fond en dégradé de couleurs (donc parfaitement flou).

Parfois le détourage est facile, parfois moins. Mais l’objectif des techniques montrées est d’éviter le plus possible le travail de précision. À vous d’estimer l’enjeu de votre détourage, du temps dont vous disposez et de la qualité que vous voulez atteindre. Pour ma part, je suis très pointilleux, mais je n’y passerai pas des heures.

En prime, le palmier détouré (que j’utilise beaucoup dans mes formations)

Palmier parfaitement détouré

Scribus – table des matières avec un script

Scribus est un fabuleux logiciel libre de mise en page (oui, fabuleux, j’assume !) même s’il souffre encore de manques (en passe de disparaître, la prochaine version est encore plus fabuleuse). Par exemple, la création d’une table des matières est lourde et peu pratique. Voir l’article Réaliser une table des matières que j’avais écrit il y a presque quatre ans (et que je remets sur ce blog) et qui n’a, malheureusement, pas pris une ride.

Ayant quelques compétences en programmation et connaissant un peu le format SLA (Scribus Layout), le format de travail de Scribus, je me suis dit qu’on pouvait automatiser la recherche de titres. J’ai donc écrit un script Perl qui extrait tous les titres ayant un style clairement identifié.

Pourquoi Perl et pas Python, le langage de prédilection des extensions de Scribus ? Déjà, je connais mieux Perl que Python et j’avais une contrainte de temps. D’autre part, le format SLA est amené à évoluer d’ici la sortie de Scribus 1.6 de même que le moteur interne de scripts. Enfin, le script que je vous présente là est indépendant de Scribus, vu qu’il lit directement le SLA (qui n’est autre que du XML). Ce script est donc une solution intermédiaire, temporaire. À la sortie quelqu’un (moi peut-être) sera toujours à temps de s’atteler à la tâche (si le mécanisme de table des matières n’a pas été amélioré d’ici-là).

Conditions de base

Lorsque vous réalisez votre maquette, vous devez insérer vos titres dans des cadres de textes séparés du reste et surtout, non liés. Vous devez appliquer un style de paragraphe directement sur le cadre de texte.

Vous pouvez insérer des retours à la ligne (Maj + Entrée), c’est-à-dire, sans changement de paragraphe. Cela peut servir à mieux présenter un titre sur plusieurs lignes. Le script concatène les différentes lignes.

Enfin, vous pouvez utiliser plusieurs styles différents pourvu qu’ils aient une partie du nom commune (c’est le cas dans l’exemple ci-dessous).

Enfin, pour la bonne exécution du script, vous devez avoir installé l’interpréteur Perl (c’est le cas par défaut sous Linux), ainsi que le module XML::DOM.

Le script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
use utf8;
 
# Chargement du module XML::DOM pour parser du XML
use XML::DOM;
 
# Création de l'objet parser et chargement du fichier XML passé en paramètre
my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile(shift);
 
# Sélection des éléments de type PAGEOBJECT et calcul de leur nombre
my $frameobject = $doc->getElementsByTagName("PAGEOBJECT");
my $n = $frameobject->getLength;
 
# Une table de hachage pour accueillir la table des matières
my %tdm = ();
 
# Tri des PAGEOBJECT
for (my $i = 0; $i < $n; $i++) { # Sélection du nœud my $node = $frameobject-&gt;item ($i);
 
	# Récupération du style de parapgraphe (PSTYLE)
	my $style = $node->getAttribute ("PSTYLE");
 
	# S'il ne contient pas -TF- on passe au suivant
	next unless ($style =~ m/-TF-/);
 
	# Sinon on récupère le numéro de la page (OwnPage)
	my $pageNum = $node->getAttribute ("OwnPage") + 1; # Attention OwnPage commence à 0
 
	# Ainsi que les sous-éléments de type ITEXT.
	# S'il y a des retours à la ligne (Maj + Entrée) il y a plusieurs ITEXT
	# qu'il nous faut concaténer
	my $itext = $node->getElementsByTagName("ITEXT");
	my $nt = $itext->getLength;
	my $title = "";
	for (my $j = 0; $j < $nt; $j++) { my $t = $itext->item($j);
 
		# Pour une obscure raison, le texte est stocké dans un paramètre CH
		$title .= $t->getAttribute("CH")." ";
	}
 
	# Encodage du texte en UTF-8
	utf8::encode($title);
 
	# Les titres seront automatiquement classés par leur numéro de page
	# Pour cela il faut que ces numéros soient classés dans le bon ordre.
	# On rajoute un zéro pour les numéros inférieurs à 10.
	$pageNum = sprintf("%.2u", $pageNum);
 
	# L'affectation du titre dans la table de hachage trie automatiquement
	# par numéro de page
	$tdm{$pageNum} = $title;
}
 
# Réécriture propre de la table des matières
foreach my $k (sort(keys(%tdm)))
{
	printf("%s\t%u\n", $tdm{$k}, $k);
}

Quelques explications de codage :

  • lignes 1 à 7, en-tête assez classique d’un script Perl : à noter le chargement du module Data::Dumper, indispensable au débug et XML::DOM, indispensable pour la suite ;
  • ligne 11 : la fonction shift récupère automatiquement le premier argument passé en ligne de commande et le supprime, de sorte qu’un nouvel appel à shift donnera le suivant ;
  • ligne 14 : dans le format SLA, les cadres sont des nœuds PAGEOBJECT, c’est donc ceux-là uniquement qu’il faut rechercher ;
  • ligne 27 : on récupère le style de paragraphe (PSTYLE) du cadre ;
  • ligne 30 : si le nom du style ne contient pas la chaîne de caractères recherchée (je veux ici récupérer les styles nommés 1-TF-creer, 2-TF-info-comm, 3-TF-programmer, etc.) on force la fin du tour de boucle (on passe au cadre suivant) ;
  • ligne 33 : sinon, on extrait le numéro de page (attribut OwnPage) en ajoutant 1, la première page ayant le numéro 0 (ah, ces informaticiens 😉 ) ;
  • lignes 38 à 47 : le contenu du cadre de texte se trouve dans des nœuds de type ITEXT : la boucle permet de les mettre bout à bout (ne pas oublier l’ajout d’une espace pour éviter que les mots des différentes lignes ne se touchent (ligne 46)) ;
  • ligne 50 : encodez le titre ainsi généré en UTF-8 pour une bonne gestion des caractères accentués (entre-autres) ;
  • ligne 59 : on copie le titre trouvé dans la table de hachage avec comme clé le numéro de page (ce qui interdit d’avoir deux titres sur la même page, il faudrait pour cela créer un tableau) ;
  • lignes 62 à 66 : la table de hachage est trié suivant ses clés (donc, les numéros de page) et, pour chacune, on affiche le titre suivi du numéro de page séparés par une tabulation.

Créer la table des matières

Passons à l’action. Enregistrez ce script dans un fichier nommé, par exemple, tdm-sla.pl. Ajoutez-lui les droits d’exécution :

chmod +x tdm-sla.pl

Puis exécutez-le en passant en argument votre document Scribus. L’affichage de la table des matières se fait sur la sortie standard, donc, redirigez-la vers un fichier texte.

./tdm-sla.pl document.sla > tdm.txt

Dans Scribus il ne vous reste plus qu’à créer un cadre de texte et insérer ce texte.

Un style pour les entrées de la table

Dernière étape : créer un style de paragraphe pour les entrées de la table des matières. Dans Scribus allez dans le gestionnaire de styles (Édition → Styles) et créez un style nommé TDM (par exemple).

Il faut gérer la tabulation que le script insère entre le titre et le numéro de page. Cliquez sur la ligne graduée en bas pour créer une tabulation. Vous pouvez en saisir une valeur précise dans le champ prévu à cet effet (dans le rectangle vert sur la capture ci-dessous). Vous pouvez également choisir l’alignement du numéro de page (liste déroulante à gauche de la position de la tabulation). Ici, les numéros de page seront centrés.

Gestionnaire de styles Scribus

En personnalisant un peu le script ci-dessus j’ai donc pu extraire plusieurs niveaux de titres et générer automatiquement la table des matières donc voici un extrait ci-dessous. Il s’agit du catalogue de formations d’Artefacts, encore en cours d’élaboration (mais la sortie est imminente).

Table des matières dans le catalogue de formations d'Artefacts

Astuce : si vous souhaitez extraire plusieurs niveaux de titre (donc à partir de cadres de textes de styles différents) il faut d’abord les gérer dans le script. Vous pouvez ajouter un symbole en début de ligne pour distinguer ces différents niveaux. Par exemple, vous ajoutez un dièse devant les titres de rubrique.

Ensuite, dans Scribus, vous pouvez importer votre table des matières comme texte avec filtrage (plutôt que texte simple). Définissez ensuite des filtres comme ceci.

Importer un texte avec filtrage

GIMP – Les ciseaux intelligents pour un détourage facile

GIMP - détourage avec les ciseaux intelligents

Le détourage consiste à créer une sélection suivant parfaitement le contour d’un élément d’une photo. Le jeu consiste à se faciliter la tâche. Dans cette vidéo nous utilisons l’outil Ciseaux intelligents. Récemment vous avez pu voir une autre méthode, utilisant l’outil Extraction de premier plan.

Pourquoi utiliser tel outil plutôt que tel autre ? Tout dépend de la nature de l’élément que vous souhaitez détourer et de l’arrière-plan. Voyez la photo suivante représentant un rose jaune.

Rose jaune - détourage avec les ciseaux intelligents

Faites l’essai avec Extraction de premier plan. Vous constaterez que le fond contient beaucoup de jaune et que l’outil peine à isoler la rose. En revanche, le contour est très simple, bien net et facile à suivre. L’outil Ciseaux intelligents est tout à fait adapté.

En effet pour utiliser ce dernier, vous posez des nœuds le long du contour à détourer (plus vous êtes précis, plus le contour tracé le sera, n’hésitez donc pas à zoomer/dézoomer avec la molette de la souris conjointement à la touche Ctrl). Voici comment faire en vidéo et comment éviter les quelques pièges.

Voici les étapes décrites dans la vidéo :

  • choisissez l’outil Ciseaux intelligents dans la boîte à outils ;
  • placez des nœuds le long de la rose : il se relient automatiquement en suivant le contour ;
  • lorsque le tracé suit mal le contour, ajoutez un nœud entre les deux derniers posés et déplacez-le ;
  • Attention, vous ne pouvez déplacer ni le premier, ni le dernier nœud : en cas d’erreur, posez un nouveau nœud, ainsi le dernier ne l’est plus ;
  • effectuez la jonction avec le premier nœud et faites les derniers ajustements ;
  • transformez le tracé en sélection (lire la zone d’informations dans le bas de la fenêtre d’image).

Extraire le contenu d’un document PDF

Si le document PDF a été bien conçu (le texte est bien du texte et non vectoriel ou pire, une image), alors il peut éventuellement être récupéré dans un fichier texte avec pdftotext.

  pdftotext document.pdf

Cette commande produit un fichier nommé document.txt.

Vous pouvez également extraire toutes les images avec pdfimages.

  pdfimages document.pdf prefixe

Cette commande va produire autant de fichier préfixés par prefixe au format PPM, un format très basique destiné à faciliter l’inter-opérabilité.