Souvent, nous devons ajuster des parties d'une image, et cet ajustement doit être fluide et interactif. L’outil Forward Warp du filtre Liquify de Photoshop est un tel outil et il est très utile. Un outil similaire a la fonction amincissante du visage de Meitu Xiuxiu. Cet article décrit les principes et les algorithmes derrière ces outils.
Tout d'abord, prenons Meitu Xiuxiu comme exemple pour décrire brièvement la fonction de transformation directe.
Tout d'abord, utilisez la souris pour contrôler une sélection circulaire.
Ensuite, cliquez sur le bouton gauche de la souris et faites glisser dans une certaine direction pour produire une image de déformation vers l'avant en douceur :
Avec cet outil, vous pouvez ajuster des parties de l'image. Le degré de liberté est relativement grand, donc plus pratique.
Ce qui suit explique les principes de ce type d'algorithme.
Dans l'image ci-dessus, l'anneau ombré représente une sélection circulaire avec un rayon de rmax. Parmi eux, le point C est le point où l'on clique avec la souris, qui est le centre de la sélection circulaire. Faites glisser la souris de C à M, transformant le point U de l'image en point X. Par conséquent, le problème clé est de trouver la transformation inverse de la transformation ci-dessus - lorsqu'un point, trouvez la valeur de pixel de U. De cette manière, chaque pixel de la sélection circulaire est évalué pour obtenir l'image transformée.
L'article Interactive Image Warping d'Andreas Gustafsson donne cette formule de transformation inverse :
Les caractéristiques de cet algorithme de warping sont :
1 Seul le l'image dans la sélection circulaire est déformée
2 Plus le centre du cercle est proche, plus la déformation est grande, plus le bord est proche, plus la déformation est petite, et il n'y a pas de déformation à la limite
3 La déformation est douce
Les étapes spécifiques de mise en œuvre sont les suivantes :
1 Pour chaque pixel de la sélection circulaire, retirez ses composants R, V et B et stockez-les dans 3 Buffs (rBuff, gBuff, bBuff) (C'est-à-dire que les trois Buffs stockent respectivement les valeurs des canaux R, V et B de l'image originale dans la sélection)
2 Pour chaque pixel X dans la sélection circulaire,
2.1 Selon la formule ci-dessus, calculez la valeur exacte de la coordonnée de position U
avant sa déformation 2.2 Utilisez la méthode d'interpolation pour calculer R à la position de U en fonction de. la position de U et les valeursdans rBuff, gBuff et bBuff et autres composants
2.3 Synthétiser R, G, B et d'autres composants en nouveaux pixels comme valeur de pixel à , il peut être facilement écrit sur la base du texte ci-dessus - pour résoudre ce genre de problème, ce qui est important n'est pas le code, mais les idées et les algorithmes.
Ce qui suit est ma démonstration de mise en œuvre :
Dans l'image ci-dessus, le coin supérieur gauche est l'image originale et le coin inférieur droit est l'image déformée. image. Le cercle rouge entoure la zone de déformation. Comme vous pouvez le constater, la déformation est très douce. J'ai introduit la force de déformation s(force) dans l'algorithme ci-dessus, force=20 dans l'image ci-dessus.
Présentant la force, la formule doit être modifiée. Voici ma version modifiée de la formule :
Regardez le résultat——
Photo originale :
Transformation, force=20 :
Transformation, force=120 :
Cette fonction dans Photoshop et Meitu Xiuxiu peut se transformer en continu. Je suppose que cette déformation continue est reliée en série par une série de déformations de base. Autrement dit, faire glisser la souris de la position M0 à Mn ne calcule pas seulement la transformation M0->Mn, mais introduit une série de déformations intermédiaires sur la trajectoire de la souris. . Points, M1, M2...Mn-1, puis effectuez une série de transformations sur l'image, telles que M0->M1, M1->M2,..., Mn-1->Mn.
Pour plus d'algorithmes de déformation d'image : implémentation de l'outil de déformation directe dans la boîte à outils de liquéfaction de Photoshop, veuillez faire attention au site Web PHP chinois pour les articles connexes !