11
votes

Y a-t-il une bibliothèque pour la déformation de l'image / de la morphing d'image pour Python avec des points contrôlés?

Vous allez prendre des images et marquer des points spécifiques (par exemple, marquez la région autour des yeux, du nez, de la bouche de la bouche), puis de les transformer en points marqués dans une autre image. Quelque chose comme: xxx

Je n'arrive pas à trouver un algorithme la décrivant, ni je ne peux trouver aucune bibliothèque avec elle. Je suis prêt à le faire moi-même aussi, tant que je peux trouver de bonnes / faciles à suivre du matériel dessus. Je sais que c'est possible car puisque j'ai vu des incomplètes (n'expliquez pas vraiment comment le faire) .pdfs sur Google avec elle.

Voici un exemple des points marqués et de la transformation, puisque vous demandé des éclaircissements. Bien que celui-ci n'utilise pas 2 personnes comme je l'ai dit plus tôt.


edit: j'ai réussi à obtenir le im.transform méthode fonctionnant, mais l'argument est une liste de ((box_x, box_y, box_width, box_height), (x0, y0, x1, y1, x2, y2, x3, y3)) , avec le premier Point étant NW, le deuxième SW, le troisième ne et le quatrième SE. (0, 0) est la partie supérieure la plus à gauche de l'écran autant que je puisse dire. Si j'ai tout fait tout de suite, cette méthode ne fait pas vraiment ce dont j'ai besoin.


1 commentaires

"Transform" est un mot vague. Pouvez-vous expliquer ce que vous voulez dire? Voulez-vous copier des parties d'une image et "coller" directement dans une autre? Quel genre de région?


4 Réponses :


5
votes

Yep, il y a. C'est un peu bas, mais PIL (la bibliothèque d'imagerie Python) a une fonction à faire ce type de transformation. Je n'ai jamais vraiment eu de travail pour moi (comme mon problème était un peu plus simple), mais vous pouvez jouer avec cela.

Voici une bonne ressource pour les transformations de PIL (vous voudrez regarder maillage ): http://effbot.org/tag/pil.image.Image .Transform .


de la documentation:

Semblable à Quad, mais Data est une liste des rectangles cibles et des quadrilatères source correspondantes. xxx

Les données sont un tuple de rectangles: xxx

Il transforme le premier rectangle en la seconde.


2 commentaires

J'ai lu cette documentation avant mais je ne comprends pas ce qui se passe dans cette fonction. Pourriez-vous expliquer ses paramètres? Si je le lis correctement, tout ce que je dois faire est de créer une carte avec les coordonnées d'origine -> Nouvelles coordonnées et transmettez-la comme maillage et cela fonctionne?


Plus ou moins. Le mesh est composé de paires de rectangles, mais vous pouvez faire des rectangles dégénérés 1x1 . Plus la taille est grande, plus elle va plus vite.



8
votes

Sur une note similaire, vous pouvez utiliser l'API Python de ImageMagick pour faire distorsion de Shepards .

oreilles de koala oreilles de koala tirez


4 commentaires

Cela semble semblable à ce que j'essaie de faire. Je vais essayer d'essayer de faire rapport si je parviens à le faire fonctionner.


ImageMagick travaille, mais les résultats que je me trouvais n'étaient pas aussi bons que j'avais espéré.


Cela fonctionne assez bien pour créer des gifs d'animation. J'ai appliqué les distorsions de Shepard progressives avec la modification d'alpha pour deux images et le résultat ressemble à ceci: i.imgur.com/ 1LH4I.GIF Merci pour la pointe!


@Georgeprofenza En fait, voici le produit final :) Muratayfer.com/morphin Tout grâce à ce fil.



13
votes

Un exemple de code donné par Blender ne fonctionne pas pour moi. En outre, la documentation PIL pour im.transform est ambiguë. Donc, je creuse dans le code source PIL et précise enfin comment utiliser l'interface. Voici mon utilisation complète: xxx

avant: Entrez la description de l'image ici Après: Entrez la description de l'image ici

Je suggère d'exécuter au-dessus du code ci-dessus dans ipython puis imprimer maillage pour comprendre quel type d'entrée est nécessaire pour im. transformer . Pour moi, la sortie est la suivante: xxx


1 commentaires

Comment spécifiez-vous les parties de l'image à déformer cependant?



4
votes

J'ai une solution à l'aide d'OPENCV en triangulant les points de transformation:
Transformation

Il n'a pas l'air parfait, mais avec plus de points sur l'image source / cible, les résultats s'améliorent.

Code

Voici Le code que j'ai utilisé pour la transformation, en bas, vous pouvez voir comment appeler votre fonction transformer . xxx

src_points et dst_points dans la fonction principale était codé en dur et correspond aux points de repère, qui sont marqués de vert dans les images ci-dessus. Le code a été partiellement inspiré par Cet article en ligne , mais le code était un peu propre. Après avoir répondu à cette question, j'ai aussi créé ma propre FACECHANGER GITUB REPO , avec une application Python interactive, Utilisation des mêmes fonctionnalités que décrites dans cette réponse.

Exigences
  • NUMPY : PIP3 Install Numpy
  • OpenCV : Pip3 Install OpenCV-Python < / code>

    comment ça marche

    triangulation

    Au début, nous devons trianguler l'image, qui transformera les points des deux images en haut des triangles en bas. . Nous avons besoin de triangles au lieu des points car cela nous permet de transformer les triangles individuels séparément, ce qui facilitera notre vie plus facile sur la route. La triangulation est faite avec Delaunay Triangluation avec OpenCV. Les points de la première et de la deuxième image ne doivent pas nécessairement entraîner la même triangulation. Par conséquent, le get_triangulation_indices renvoie les indices de tous les coins pour chaque triangle. En utilisant ces indices, nous pouvons mapper chaque triangle source sur un triangle de destination

    Triangles de chaîne

    Les triangles sont déformés à l'aide de Warpaffine d'OpenCV -Method. Le problème avec cette méthode est qu'il défaut une image entière et pas seulement un triangle, nous devons donc faire de plus de travail là-bas pour seulement se déformer triangles.

    Triangle

    Premier Nous ne coupons que la partie de l'image source et cible contenant la source ou le triangle cible. Cela n'était théoriquement pas nécessaire, mais c'est beaucoup plus rapide, car alors nous n'avons pas à faire la chaîne sur toute l'image à chaque fois. Ceci est fait en utilisant le culture_to_triangle -method.

    Transform image

    Nous voyons comment nous devons déformer l'image pour obtenir du triangle source à la Triangle cible, avec cv2.getaffinetransform . Cela nous donnera une matrice de transformation que nous pouvons utiliser avec cv2.warpaffine pour visualiser notre image sur les proportions de destination.

    masque au triangle

    Nous Avoir le problème que la transformation de chaîne ne transformait pas seulement nos triangles, mais notre totalité src_img_cropped . Alors maintenant, nous devons seulement dépasser les pixels appartenant à notre triangle à l'image cible. Nous pouvons utiliser cv2.fillonvexpoly pour créer un masque de notre triangle cible et l'utiliser pour supprimer tous les pixels de l'image de destination située dans le triangle que nous voulons coller, afin d'ajouter le triangle déformé. à cet endroit que nous venons de vider. Ceci est fait à l'aide de manipulations numpues de matrice.

    Conclusion

    Il s'agit d'une méthode assez simple pour atteindre la tâche. Cela entraîne cependant des bords droits anormaux d'aspect non naturel, et pourrait donc ne pas être parfait pour toutes les utilisations. La qualité du résultat est toutefois accrue si vous ajoutez plus de points à votre source et à vos images cibles. Vous devez également ajouter les coins des images source et cible à vos points si vous souhaitez que toute l'image soit copiée, sinon l'image de destination sera simplement écrasée avec des parties de l'image source, que je vois comme une fonctionnalité. Cela peut également être combiné à la détection de visage pour créer un effet de swap face, pour lequel j'utilise personnellement DLIB , qui donne d'excellents résultats.


1 commentaires

Cela devrait descendre de l'histoire comme l'une des plus grandes réponses StackoverFlow de tous les temps! Je travaille actuellement sur un projet personnel super important et je suis à la recherche de quelque chose comme celui-ci pour Âges . Si je voulais apprendre plus en profondeur à propos de cette méthodologie, avez-vous des recommandations pour des cours / des ressources en ligne où je pouvais rechercher plus d'informations? Je connais l'homographie et d'autres ops mondiaux de gauchissement de l'image mondiale, mais je suis tout neuf pour la morphing locale.