Didacticiel | Vectoriser du pixel art
Avant que nous ayons accès à des logiciels d'édition vectorielle aussi puissants…
Avant même que nous ayons des moniteurs en 640×480…
Jouer à des jeux vidéo réalisés avec des pixels savamment assemblés sur des écrans à basse résolution était pratique courante.
Ce type d'art imaginé à cette époque est ce que nous appelons « pixel art ».
Inkscape s'appuie sur la bibliothèque libdepixelize, ce qui lui permet de vectoriser automatiquement ces images pixel art un peu spéciales. Vous pouvez utiliser cette fonctionnalité avec d'autres types d'images, mais gardez à l'esprit que le résultat ne sera sans doute pas aussi bon qu'avec l'autre outil de vectorisation d'Inkscape, potrace.
Commençons avec un exemple montrant les possibilités du moteur de vectorisation. Nous avons à gauche une image matricielle (extraite du concours Liberated Pixel Cup) et à droite sa version vectorisée.
libdepixelize s'appuie sur l'algorithme Kopf-Lischinski pour vectoriser les images. Cet algorithme emploie les idées de plusieurs techniques informatiques et concepts mathématiques pour produire un résultat satisfaisant avec les images pixel art. Détail d'importance, le canal alpha est complètement ignoré par l'algorithme, et il n'existe pas pour l'instant d'extensions permettant ce traitement. Cependant, la vectorisation des images pixel art contenant un canal alpha donne un résultat similaire à celle des images reconnues par Kopf-Lischinski.
L'image ci-dessus contient un canal alpha et sa vectorisation est convenable. Si malgré tout vous trouvez ce résultat insatisfaisant et vous pensez que la cause en est le canal alpha, contactez le gestionnaire de la bibliothèque libdepixelize (en saisissant un rapport de défaut sur la page du projet) qui se fera un plaisir d'améliorer son algorithme (ce qu'il ne peut pas faire en l'absence de retour sur d'éventuelles images donnant un mauvais résultat).
L'image ci-dessous est une capture d'écran de la boîte de dialogue Pixel art que vous pouvez ouvrir avec le menu Chemin⇒Vectoriser un objet matriciel…⇒Pixel art ou en cliquant avec le bouton droit de la souris sur une image puis en sélectionnant l'entrée Vectoriser un objet matriciel….
La boîte de dialogue propose deux sections : Heuristique et Résultat. Heuristique cible les usages avancés, mais comme les paramètres par défaut sont bien choisis vous ne devriez pas avoir besoin d'y toucher. Nous y reviendrons plus tard après avoir abordé la section Résultat.
L'algorithme Kopf-Lischinski fonctionne (en nous plaçant à un haut niveau) comme un compilateur convertissant les données parmi plusieurs types de représentations. À chaque étape, l'algorithme a le choix d'explorer les opérations que cette représentation propose. Certaines de ces représentations intermédiaires ont un aspect visuel correct (comme une cellule remodelée dans un graphe de Voronoï), d'autres pas (comme un graphe de similitude). Pendant le développement de libdepixelize, les utilisateurs n'ont eu de cesse de demander à ce qu'il soit possible d'exporter ces étapes intermédiaires à partir de la bibliothèque, et l'auteur original a exaucé leurs vœux.
Le paramétrage par défaut devrait donner le résultat le plus lisse possible, ce qui est probablement l'effet désiré. Vous avez déjà vu ce type de résultat dans le premier exemple de ce didacticiel. Pour l'expérimenter vous-même, ouvrez la boîte de dialogue Vectoriser un objet matriciel…, activez l'onglet Pixel art et cliquez sur Valider après avoir sélectionné une image.
Le résultat de type Voronoï ci-dessous est une image de pixels remodelée, dans laquelle les cellules (précédemment des pixels) ont été remodelées pour connecter les pixels faisant partie d'une même fonction. Aucune courbe n'est créée et l'image est toujours composée de lignes droites. La différence peut être observée en agrandissant l'image. Précédemment, les pixels ne pouvaient pas partager de bord avec un voisin en diagonale, même si ce voisin faisait partie de la même fonction. Mais maintenant (grâce à un graphe de similitude de couleur et l'heuristique que vous pouvez ajuster pour obtenir un meilleur résultat), il est possible de faire en sorte que deux cellules diagonales partagent un bord (auparavant seul un sommet pouvait être partagé entre deux voisins de ce type).
La conversion B-spline standard apporte un résultat plus doux car l'image obtenue précédemment avec Voronoï est convertie en courbes de Bézier quadratiques. La conversion n'est cependant pas en 1:1 car elle nécessite un travail heuristique plus conséquent pour décider des courbes qui seront fusionnées lorsque l'algorithme atteint une jonction en T dans les couleurs visibles. Sachez qu'à cette étape, vous ne pouvez pas adapter l'heuristique.
L'étape finale de libdepixelize (actuellement non exportable dans l'interface d'Inkscape du fait de son statut expérimental et incomplet) est l'optimisation des courbes, pour supprimer l'effet d'escalier des courbes B-spline. Cette étape effectue également une détection de bord pour empêcher certaines fonctions d'être lissées ainsi qu'une triangulation pour ajuster la position des nœuds après l'optimisation. Il devrait être possible de désactiver chacune de ces fonctionnalités une fois qu'elles auront quitté leur statut expérimental dans la bibliothèque (bientôt, avec un peu de chance).
La section Heuristique de l'interface vous permet d'ajuster l'heuristique utilisée par libdepixelize pour décider, lorsqu'elle rencontre un bloc de 2×2 pixels ayant deux diagonales de couleurs similaires, de la connexion à conserver. L'algorithme essaie d'appliquer l'heuristique aux diagonales en conflit puis conserve la connexion du vainqueur. En cas d'égalité, les deux connexions sont supprimées.
Si vous souhaitez analyser l'effet de chaque heuristique et jouer avec le paramétrage, le meilleur résultat est obtenu avec un diagramme de Voronoï, qui vous permettra de visualiser facilement le rendu engendré par les valeurs choisies. Une fois satisfait(e) de vos paramètres, vous pouvez modifier le type de résultat à votre convenance.
L'exemple ci-dessous montre une image et sa sortie B-spline avec seulement une des heuristiques activée à chaque essai. Les différences apportées par chaque heuristique sont mises en valeur par un cercle violet.
Au premier essai (image du haut), nous avons seulement activé l'heuristique Courbes. Cette heuristique tente de conserver les longues courbes connectées. Notez qu'un résultat identique est obtenu avec la dernière image, qui utilise pour sa part l'heuristique Pixels clairsemés. Une différence vient du fait que sa « force » est plus modérée et qu'elle ne donne de une valeur élevée à son vote que si la conservation des connexions est vraiment importante. La définition de « modérée » s'appuie ici sur l'intuition humaine, à partir de la base de pixels analysée. Une autre différence est que cette heuristique ne peut pas prendre de décision lorsque les connexions assemblent de grands blocs plutôt que des longues courbes (imaginez un jeu d'échecs).
Le deuxième essai (image du milieu) active seulement l'heuristique Îles. Sa seule action consiste à tenter de conserver la connexion entre plusieurs pixels autrement isolés (îles) avec un vote de poids constant. Ce type de situation n'est pas aussi courant que ceux traités par les autres heuristiques, mais cette heuristique amène tout de même une amélioration.
Pour le troisième essai (image du bas), nous avons activé l'heuristique Pixels clairsemés. Cette heuristique tente de converser les courbes avec une couleur de premier plan connectées. Pour déterminer cette couleur, l'heuristique analyse une fenêtre contenant les pixels voisins de la courbe conflictuelle. Vous pouvez ainsi non seulement ajuster sa force, mais également la taille de la fenêtre de pixels à analyser. Gardez à l'esprit que l'augmentation de cette fenêtre augmente aussi la force du vote, et qu'il sera peut-être nécessaire de rééquilibrer en modifiant le multiplicateur. L'auteur original de libdepixelize estime cette heuristique trop gourmande et conseille une valeur de 0,25 pour le multiplicateur.
Même si les heuristiques Courbes et Pixels clairsemés donnent des résultats similaires, il peut être judicieux de les conserver toutes les deux actives pour s'assurer que des pixels nécessaires aux courbes de contour ne seront pas supprimés. Par ailleurs, l'heuristique Pixels clairsemés est dans certains cas la seule solution possible.
Astuce : vous pouvez désactiver l'heuristique en positionnant ses valeurs de multiplicateur et de poids à zéro. Vous pouvez faire en sorte que l'heuristique fonctionne à l'encontre de ses principes en utilisant des valeurs négatives pour ces mêmes paramètres. Mais pourquoi donc dégrader la qualité de l'image avec un tel choix ? Et bien, parce que c'est possible, ou parce que vous pourriez vouloir un résultat « artistique ». Quoi qu'il en soit, vous le pouvez, c'est tout.
Et voilà ! Nous avons fait le tour de toutes les options disponibles avec la version initiale de libdepixelize. Mais si les recherches de l'auteur de cette bibliothèque et de son mentor réussissent, vous pourriez bien recevoir dans le futur de nouvelles options pour élargir le champ des images pour lesquelles le résultat est satisfaisant. Souhaitons-leur bonne chance !
Les images utilisées dans ce didacticiel sont issues du concours Liberated Pixel Cup (pour éviter tout problème de droit). Les liens sont les suivants :
http://opengameart.org/content/memento
http://opengameart.org/content/rpg-enemies-bathroom-tiles
Vinícius dos Santos Oliveira; Nicolas Dufour; Kris De Gussem; Gellért Gyuris
jazzynico — 2014; Frigory — 2016; gadic — 2020
Esteban Capella — 2019