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

2D Java Discussion :

Coordonnées des pixels de type double


Sujet :

2D Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Coordonnées des pixels de type double
    bonjours à tous
    comment faire pour représenter des images avec des coordonnées de pixel de type double?
    c'est à dire une image construite à partir des points comme
    java.awt.geom.Point2D a = new Point2D.Double(13.1258,85.36985);
    en effet j'ai deux tableaux de données
    le premier tableau de type int, et contient les valeurs de pixels RGB
    j'ai un autre tableau de type double et contient les coordonnées des pixels de l'image originale après l'application d'une interpolation
    maintenant je dois construire et afficher une image resultat de l'interpolation
    merciiii

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Citation Envoyé par sigga Voir le message
    comment faire pour représenter des images avec des coordonnées de pixel de type double?
    Un pixel sur l'écran est un pixel, il se calcul en entier, et non en double ou autres.
    Pour faire simple, Il faut donc arrondir, ou tronquer tes coordonnées ou interpoler tout les points se trouvant dans le pixel de destination.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    je vous remercie wax78 pour votre réponse..
    mais en effet j'ai deux tableaux de données
    le premier tableau de type int, et contient les valeurs de pixels RGB

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int[] pixels = image.getRGB(0,0, image.getWidth(), image.getHeight(), null, 0, image.getWidth());
    j'ai un autre tableau de type double et contient les coordonnées des pixels de l'image originale après l'application d'une interpolation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    gridValues = new Double[(xNumCells) * (yNumCells)];
     
            for (int i = 0; i < yNumCells; i++) {
                for (int j = 0; j < xNumCells; j++) {
    // les points dp sont les points de l'image originale avec des coordonnées de type int (j,i)
    // getValue() est la fonction d'interpolation
                	Point dp = new Point(j,i);
                	int index = (i * xNumCells) + j;
                	double value =  getValue(dp);
                    gridValues[index] = value;
                }
            }
    maintenant je dois construire et afficher une image resultat de l'interpolation, avec les coordonnées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.awt.geom.Point2D a = new Point2D.Double(j+gridValues[j],i+gridValues[j])
    et le cast peut provoquer une perte de précision
    tableau des pixels: 255 189 200 120
    tab des coordonnées après interpolation: 25.6236 25.856 23.658 21.548

    avec un cast on obtient les valeurs suivants

    tableau des pixels: 255 189 200 120
    tab des coordonnées après interpolation: 25 25 23 21

    la position 25 dans le tab des coordonnées peut avoir deux valeurs 255 et 189
    comment faire pour résoudre ce problème??

  4. #4
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Salut

    Citation Envoyé par sigga Voir le message
    comment faire pour résoudre ce problème??
    Prendre le problème à l'envers!

    Là, tu as interpolé les pixels de l'image de départ pour tenter de les positionner sur l'image d'arrivée. Pourquoi ne pas plutôt faire l'inverse? Tu prends les pixels de l'image d'arrivée, et tu vas chercher à quel pixel de l'image de départ ça correspond. Et si ça tombe entre deux pixels, tu interpoles... mais sur l'image de départ!
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Pour ta valeur en double 25.6236, tu prends 62% (valeur après virgule) de la case 26 et 38% (1 - valeur_apres_virgule) de la case 25 sur toutes tes composantes RGB.

    Il faut voir la valeur double comme une valeur intermédiaire entre deux cases. Pour 0.5, se sera la moyenne entre les deux cases (la moitié de la première et la moitié de la seconde).
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par plegat Voir le message
    Salut



    Prendre le problème à l'envers!

    Là, tu as interpolé les pixels de l'image de départ pour tenter de les positionner sur l'image d'arrivée. Pourquoi ne pas plutôt faire l'inverse? Tu prends les pixels de l'image d'arrivée, et tu vas chercher à quel pixel de l'image de départ ça correspond. Et si ça tombe entre deux pixels, tu interpoles... mais sur l'image de départ!
    je vous remercie plegat pour votre réponse mais je n'ai pas bien compris ce que vous vouliez dire, comment inverser le problème?
    peut être mon problème n'été pas bien expliqué au debut
    Voici mon problème complet
    j'ai une image I0, et je doit la déformer avec la méthode d'interpolation thin plate spline (spline plaque mince)
    thin plate spline permet de déformer l'image en définissant un ensemble des points de contrôle et leurs positions de destination, puis les points de contrôle sont déplacés vers les positions souhaitées.
    X = x+dx
    Y = y+dy
    (x,y): les coordonnées de l'image source(I0)
    (X,Y): les coordonnées de l'image resultat(I1) après déformation



    Le gros avantage de cet algorithme est que l'image après transformation semble très naturel, une explication simple sur la méthode thin plate spline peut être vu icithin plate spline

    maintenant le problème
    le résultat de l'interpolation est un tableau de double, il contient les valeurs dx dans le cas d'une interpolation selon l'axe des x ou bien les valeurs dy dans le cas d'une interpolation selon l'axe des y
    alors, les coordonnées de l'image résultat I1(X,Y) seront aussi de type double :
    X = x+dx (int + double = double)
    Y = y+dy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    gridValues = new Double[(xNumCells) * (yNumCells)];
     
            for (int i = 0; i < yNumCells; i++) {
                for (int j = 0; j < xNumCells; j++) {
    // les points dp sont les points de l'image originale avec des coordonnées de type int (j,i)
     
                	Point dp = new Point(j,i);
                	int index = (i * (1 + xNumCells)) + j;
    // getValue() est la fonction d'interpolation
                	double value =  getValue(dp);
    // gridValuesX est le tableau qui contient le résultat de l'interpolation selon l'axe des X
                    gridValuesX[index] = value;
                }
            }
    les coordonnées de l'image résultat sont comme suite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.awt.geom.Point2D a = new Point2D.Double(j+gridValuesX[j],i+gridValuesY[j])
    comment faire pour afficher cette image?
    wax78 me propose de faire un cast de double à int, dans ce cas nous seront confronté à un autre problème,
    dans une image chaque pixel(x,y) doit avoir une seule valeurs RGB comme suite


    mais avec le cast un pixel(x,y) peut avoir plus q'une seule valeur RGB comme le pixel 25 ici



    comment résoudre ce problème?
    j'espère que le problème est bien expliqué maintenant

  7. #7
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Une sorte warping que tu voulais faire, maintenant je comprends mieux, oublie ce que j'ai dit
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    As-tu testé ma technique ?
    Ce n'est pas un "simple" déplacement de pixel. Chaque couleur doit être entièrement recalculée.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    As-tu testé ma technique ?
    Ce n'est pas un "simple" déplacement de pixel. Chaque couleur doit être entièrement recalculée.
    je vous remercie dinobogan pour votre réponse, mais j'ai pas compris ce que vous voulez dire par on prends 62% (valeur après virgule) de la case 26 et 38% (1 - valeur_apres_virgule) de la case 25 sur toutes tes composantes RGB. et
    Chaque couleur doit être entièrement recalculée

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    D'abord, tu ne dois pas regarder à quel pixel de l'image d'arrivée correspond un pixel de l'image de départ, mais l'inverse. Sinon, dans ton calcul, tu aura inévitablement des trous.

    Imagine que 4;4 au départ corresponde à 3.2;4 à l'arrivée et que 5;4 corresponde 6.5;4, que mettre en 4;4 et 5;4 sur l'image d'arrivée? Ces points ne sont jamais calculés.
    Donc ton algorithme doit être l'inverse, puisque le but est de construire chaque pixel de l'image d'arrivée.

    pour chaque pixel de l'image d'arrivée
    • calculer la paire de double qui correspond à l'image de départ:
    • calculer la valeur de la couleur de cette position en interpolant à partir des pixels entourant ce point (il est à une certaine distance des 4 pixels l'entourant, pondérer en fonction des distance)
    • appliquer cette couleur à l'image d'arrivée.

  11. #11
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Donc ton algorithme doit être l'inverse, puisque le but est de construire chaque pixel de l'image d'arrivée.

    pour chaque pixel de l'image d'arrivée
    • calculer la paire de double qui correspond à l'image de départ:
    • calculer la valeur de la couleur de cette position en interpolant à partir des pixels entourant ce point (il est à une certaine distance des 4 pixels l'entourant, pondérer en fonction des distance)
    • appliquer cette couleur à l'image d'arrivée.
    Voila, c'est ça que je voulais dire... mais _tchize l'a dit mieux que moi!
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  12. #12
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    D'abord, tu ne dois pas regarder à quel pixel de l'image d'arrivée correspond un pixel de l'image de départ, mais l'inverse. Sinon, dans ton calcul, tu aura inévitablement des trous.

    Imagine que 4;4 au départ corresponde à 3.2;4 à l'arrivée et que 5;4 corresponde 6.5;4, que mettre en 4;4 et 5;4 sur l'image d'arrivée? Ces points ne sont jamais calculés.
    Donc ton algorithme doit être l'inverse, puisque le but est de construire chaque pixel de l'image d'arrivée.

    pour chaque pixel de l'image d'arrivée
    • calculer la paire de double qui correspond à l'image de départ:
    • calculer la valeur de la couleur de cette position en interpolant à partir des pixels entourant ce point (il est à une certaine distance des 4 pixels l'entourant, pondérer en fonction des distance)
    • appliquer cette couleur à l'image d'arrivée.
    Je vous remercie tchize pour votre réponse; mais si vous me donnez un petit exemple illustratif pour bien comprendre je vous serais très reconnaissante

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    prenons un exemple simple, un zoom x3.


    4;4 sur l'image d'arrivée correspond à 1.333;1.333 (4/3;4/3) sur l'image de départ.

    Ce qui donne ça à peu près

    Reste à calculer la couleur de X, qui sera une valeur pondérée de A,B,C et D.
    Pour l'interpolation, tu as une chiée d'algorithmes, à toi de prendre celui qui te convient.

    Le plus naif, le "nearest point", X = A
    Après tu as les interpolations Bilinéaire
    X = (A*2/3+B*1/3) *2/3 + (C*2/3+D*1/3)*1/3
    les bicubiques, etc

Discussions similaires

  1. Réponses: 10
    Dernier message: 01/02/2011, 09h02
  2. [Débutant] coordonnées spatiales des pixels de l'image
    Par imagiste dans le forum Images
    Réponses: 4
    Dernier message: 23/01/2010, 12h43
  3. Sortie des valeurs de type double
    Par otspot dans le forum C++
    Réponses: 2
    Dernier message: 29/06/2008, 20h26
  4. Réponses: 14
    Dernier message: 30/05/2008, 17h04
  5. Réponses: 3
    Dernier message: 26/12/2007, 19h43

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