Fin officielle

Et voilà, le summer of code est terminé, du moins officiellement.
J’ai finalement moins mis à jour le blog que je voulais. Il faut avouer qu’au bout de 2 mois à se taper la tête contre le code, la motivation faiblit un peu. Enfin, voilà les news:
Comme annoncé dans le dernier billet, j’ai travaillé sur une méthode pour inverser le calcul de la transformation (c’est à dire savoir d’où viennent les pixels, plutôt que où ils vont), ce qui permet d’avoir une bonne qualité d’image, en évitant surtout l’aliasing. Le principe est le suivant:
  • on positionne sur l’image une grille de la surface de la cage avant déformation.
  • on applique la déformation aux points de cette grille.
  • on divise chaque case de cette grille en deux triangles
  • on parcourt chacun de ces triangles, on trouve les pixels à l’intérieur, et on en déduit les coordonnées du pixel source, par interpolation.
  • on obtient donc, pour chaque pixel de l’image, à quelle coordonnée de l’image il faut piocher des pixels pour trouver l’image transformée (sampling).
Ma première approche pour le problème de l’interpolation dans les triangles a été de retrouver un sens (trouver le point le plus haut, les points droite et gauche), puis de le parcourir avec des équations de droites. Et bien c’est pas une grande idée. Il y a un tas de cas particulier, c’est compliqué et inefficace. Finalement, un ami m’a suggéré de procéder de manière récursive, c’est à dire de découper les triangles en 4, jusqu’à qu’il ne contienne plus qu’un pixel. Ensuite on interpole ses coordonnées source grâce à un système de barycentre. Et là, ça marche tout le temps, et c’est même efficace ! Merci Théophile (oui, tu as donc contribué au logiciel libre avec plus qu’un patch pour la libcaca =) ).
En fait c’est tellement efficace que ça va probablement remplacer la méthode « directe » qui sert pour l’instant de prévisualisation interactive (qui en plus est assez moche).
Voici donc à quoi ressemble le coeur de l’outil. Chaque cercle est une opération Gegl.
  • Cage_coef_calc sert à calculer, pour chaque pixel à transformer, la série de coefficient qui sert à la transformation.
  • Cage_transform calcule et inverse la transformation.
  • Render_mapping recompose l’image finale.
L’intérêt de cette architecture et de Gegl en général, c’est qu’on peux facilement réutiliser les éléments. Typiquement, le code de mon outil pourra être réutilisé assez facilement pour créer un outil dans le style du plugin iWarp.
Pour en revenir à l’essentiel, voici l’état des lieux. L’outil est globalement terminé. Par globalement, je veux dire que le coeur fonctionne correctement, et qu’il est utilisable dans une utilisation « classique ». Il reste quelque défaut de jeunesse à corriger (par exemple, il ne marche pas sur les masques de calques), peaufiner l’interface, et il sera près pour une relecture de code et l’inclusion dans la branche principale de Gimp.
Voici quelques exemples de déformation;

3 réponses à to “Fin officielle”