IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Deformation d'une image


Sujet :

Algorithmes et structures de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Par défaut 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

  2. #2
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    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

  3. #3
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut
    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+

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Par défaut
    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 ?

  5. #5
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut
    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+

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Par défaut
    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

  7. #7
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    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ï

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    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.

  9. #9
    Membre chevronné Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut
    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.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Par défaut
    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

    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

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Par défaut
    bonjour, un petit up puisque mon problème rest toujours valable

  12. #12
    Membre Expert
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Une fois que tu auras trouvé l'algo, avec quel langage comptes-tu réaliser cette fonction ?

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Par défaut
    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.
    ++

Discussions similaires

  1. redimensionner une image sans la deformer en C++
    Par geforce dans le forum Débuter
    Réponses: 1
    Dernier message: 30/06/2010, 01h02
  2. redimensionner une image sans la deformer
    Par lonyc dans le forum ASP
    Réponses: 1
    Dernier message: 19/01/2009, 12h43
  3. Resize d'une image
    Par Anonymous dans le forum C
    Réponses: 6
    Dernier message: 13/07/2008, 22h23
  4. lire une image au format RAW
    Par Anonymous dans le forum OpenGL
    Réponses: 5
    Dernier message: 20/05/2002, 00h11
  5. faire un selection dans une image aves les APIs
    Par merahyazid dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/04/2002, 10h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo