Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 13 sur 13
  1. #1
    Invité de passage
    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 : 3
    Points
    3

    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 Renaud Warnotte
    Développeur informatique
    Inscrit en
    août 2006
    Messages
    2 526
    Détails du profil
    Informations personnelles :
    Nom : Homme Renaud Warnotte
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : août 2006
    Messages : 2 526
    Points : 4 788
    Points
    4 788

    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.

  3. #3
    Invité de passage
    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 : 3
    Points
    3

    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 :
    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 :
    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 :
    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 Confirmé Sénior

    Profil pro Jean-Michel BORLOT
    Fabricant et casseur d'avions
    Inscrit en
    avril 2004
    Messages
    3 404
    Détails du profil
    Informations personnelles :
    Nom : Jean-Michel BORLOT
    Localisation : France, Haute Garonne (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 404
    Points : 6 091
    Points
    6 091

    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 Dinobogan Shelashyn
    ingénieur
    Inscrit en
    juin 2007
    Messages
    3 586
    Détails du profil
    Informations personnelles :
    Nom : Homme Dinobogan Shelashyn
    Âge : 32
    Localisation : France

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

    Informations forums :
    Inscription : juin 2007
    Messages : 3 586
    Points : 5 971
    Points
    5 971

    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).
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Invité de passage
    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 : 3
    Points
    3

    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 :
    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 :
    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 Renaud Warnotte
    Développeur informatique
    Inscrit en
    août 2006
    Messages
    2 526
    Détails du profil
    Informations personnelles :
    Nom : Homme Renaud Warnotte
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : août 2006
    Messages : 2 526
    Points : 4 788
    Points
    4 788

    Par défaut

    Une sorte warping que tu voulais faire, maintenant je comprends mieux, oublie ce que j'ai dit

  8. #8
    Modérateur
    Avatar de dinobogan
    Homme Profil pro Dinobogan Shelashyn
    ingénieur
    Inscrit en
    juin 2007
    Messages
    3 586
    Détails du profil
    Informations personnelles :
    Nom : Homme Dinobogan Shelashyn
    Âge : 32
    Localisation : France

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

    Informations forums :
    Inscription : juin 2007
    Messages : 3 586
    Points : 5 971
    Points
    5 971

    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.
    Que la force de la puissance soit avec le courage de ta sagesse.

  9. #9
    Invité de passage
    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 : 3
    Points
    3

    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 Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    avril 2007
    Messages
    20 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : avril 2007
    Messages : 20 637
    Points : 37 960
    Points
    37 960

    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.
    Tchize (Чиз) faq java, cours java, javadoc. Pensez à et
    Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.

  11. #11
    Expert Confirmé Sénior

    Profil pro Jean-Michel BORLOT
    Fabricant et casseur d'avions
    Inscrit en
    avril 2004
    Messages
    3 404
    Détails du profil
    Informations personnelles :
    Nom : Jean-Michel BORLOT
    Localisation : France, Haute Garonne (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 404
    Points : 6 091
    Points
    6 091

    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
    Invité de passage
    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 : 3
    Points
    3

    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 Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    avril 2007
    Messages
    20 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : avril 2007
    Messages : 20 637
    Points : 37 960
    Points
    37 960

    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
    Tchize (Чиз) faq java, cours java, javadoc. Pensez à et
    Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •