-
Deformation d'une image
bonjour,
Je me penche dernièrement sur la déformation d'images. Un traitement assez simple à première vue me pose un soucis et j'aimerai avoir vos conseils.
Lorsque l'on veut deformer une image, en deplacant un de ses bords (en imaginant que l'on puisse les deplacer), comment faire pour garder le côté proportionnel à l'image? De manière plus précise, comment organiser les pixels lorsque l'on étire ou compresse un des coins de l'image.
Je pensais à faire garder aux pixels une distance proportionnelle aux 4 bords de l'image. Mais je pense que cette technique, meme si elle doit etre réalisable et fonctionelle, restera tres limitée.
Que pouvez vous me conseiller?
Merci d'avance :)
Kiroukou
-
En fait tu parles d'un zoom, ou je me trompe ?
Il te faut utiliser un filtre de zoom, car si tu gardes le même nombre de pixels après redimensionnement, tu vas avoir des zones vides, ou des pixels superposés.
Il y a des algorithmes performants pour ce genre de redimensionnement, par exemple les algorithmes Bicubic, Lanczos ou Bilinear. Mais peut-être que je suis à coté de la plaque :)
-
Moi j'ai rien compris à ce que tu demandes...
Pour ce qui est de la proportionalité, il suffit d'imposer une taille de l'image dont les dimensions en x et y sont mutipliées par le même coeff...
Tu peux donner un exemple complet de ce que tu veux ??
A+
-
Bonjour,
Je me doutais qu'en écrivant vite mon message je n'allais pas être très clair.
Alors comme un exemple vaut mieux que du texte voila en flash ce que j'aimerai à faire : http://www.foxaweb.com/mapbitmap/
Bien sur là c'est juste pour donner une idée de ce que j'aimerai à faire. Presque tous les logiciels de traitements d'image que je connais (c'est tres limité) permettent de déformer les images ainsi.
Est ce que cela est plus clair maintenant :D ?
-
Oui beaucoup plus clair !
Je suppose que la technique utilisée est de faire des interpolations sur chaque élément du maillage... Ensuite tu as le choix dans les interpolations (on va dire bicubique pour avoir qqch de précis)...
Pour chaque élément du maillage, on se construit un repère (posé sur 2 côtés adjacents du triangle) ce qui constitue un repère non orthonormé... Il suffit de faire l'interpolation dans ce nouveau repère...
En formalisant un peu (on raisonne en niveaux de gris mais avec la couleur c'est la même chose pour chaque composante RGB): (X,Y) est le repère non orthonormé lié au triangle; (x, y) est le repère orthonormé classique que l'on connaît (cad quand l'image est 'droite')...
Pour tout pixel de (X,Y), on cherche l'intensité (en niveaux de gris) à lui affecter en fonction des pixels de (x,y)...
En gros, il faut connaître la transformation qui permet de passer de (x,y) à (X,Y) ce qui donne la transformation inverse (de (X,Y) à (x,y) )...
Pour chaque élément de (X,Y), on applique la transformation inverse, ce qui donne des coordonnées dans (x,y), et on fait une interpolation pour connaître l'intensité à donner...
Si tu ne sais pas bien ce qu'est l'interpolation demande...
A+
-
Merci de ta réponse :)
en fait l'exemple montré au dessus possède un problème, c'est qu'il n'est qu'un hack de ce que j'aimerai faire (flash ne permettant pas jusqu'a maintenant l'acces au pixel,nous sommes obligés de faire ces techniques de triangularisation).
en gros cette technique de découper en triangles n'est utiles que pour le cas de l'exemple. Je ne pense pas que cela soit une bonne solution dès lors que nous avons accès aux pixels de notre image non?
Sinon je ne comprend pas très bien ton explication mathieu (mais il est tard aussi :)). Le principe de l'interpolation, je pense le connaitre, ensuite cela du bicubique là je ne vois pas (bien que google m'en apprendra surement pas mal).
Il n'y aurai pas une solution plus élégante et précise (surtout!!) que celle de la triangularisation ci dessus?
bien à vous
kiroukou
-
Je ne comprend pas trop, mais pourquoi ne peut-on pas simplement quand on modifie la position d'un des coins prendre la transformation affine correspondante à la transformation de l'ancien coin en le nouveau coin (coin désignant ici le repère formé par le point du coin et les deux vecteurs/côtés partant de ce coin) et appliquer cette transformation à tous les points (le problème étant de gérer les coordonnées à virgule de façon esthétique).
--
Jedaï
-
kiroukou > c'est une méthode d'interpolation plus précise que la linéaire
Jedai > c'est ce quie st fait sauf qu'il faut interpoler les points résultats pour obtenir à nouveau des coordonnées entières.
D'ailleurs, on part plutôt de l'image d'arrivée et pour chaque point, on cherche son origine dans l'image de départ.
-
Salut,
- tu fais un maillage de ton image : quadrillage de l'image par des lignes horizontales et verticales
- chaque noeud de ton maillage est déplaçable ...
- la déformation de tes lignes est représentable par un modèle splines bi-cubique. Les lignes se déforment localement au noeud bougé de façon à ce que le noeud appartiennent toujours aux lignes. C'est ce qu'on appelle une surface bicubique interpolée.
Plus précisément il faut recalculer les courbes interpolées, c'est à dire déduire de la nouvelle position du ou des noeuds, les satellites (points de contrôle) associées.
Il te faut connaître les courbes de bézier et un peu plus ... mais c'est largement accessible.
L'idéal serait d'avoir le maillage le plus fin, de sorte que chaque ligne de pixels horizontale et verticale soit déformable. Je pense que cela est impossible pour des images importantes. D'où la nécessité d'interpoler la position des pixels qui ne se trouvent pas sur tes splines (sur tes lignes déformables).
Je suppose qu'on doit utiliser soit interpolation lineaire à partir de la position des 4 noeuds les plus proches (le plus simple) ... Peut-être utilisé une interpolation bicubique ... encore .... je sais pas. Je crois que pour commencer je resterais sur une interpolation linéaire.
Je sais pas ... j'ai jamais essayé ... Mais j'aimerais essayé :) ...
Si tu veux pour les courbes de bézier et splines, j'ai fait une petite appli ... sur cpp builder 5 ... Si tu veux les sources, envoie-moi un message privé.
A+
Flo.
-
Merci pour vos réponses.
Je commence à mieux voir comment faire en effet. Au début je préfère retenir les solutions les plus simples pour ensuite avancer, afin de ne pas me retrouver décourager tout de suite :P
Par contre pour le changement de repère quand un noeud est déplacé, cela va sembler con mais je ne suis pas sur de bien voir comment le coder.
Auriez vous un exemple de code ou algorithmique à me proposer?
Merci encore
Kiroukou
-
bonjour, un petit up puisque mon problème rest toujours valable :)
-
Une fois que tu auras trouvé l'algo, avec quel langage comptes-tu réaliser cette fonction ?
-
Salut
J'ai besoin de cet effet pour un moteur 3d sous Flash. Je vais donc devoir coder cela en Actionscript.
En gros j'aimerai arriver au même résultat que l'exemple ci dessus, mais de façon plus performante vu que la derniere version de Flash autorise l'accès au pixels d'une image.
++