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

Graphisme Java Discussion :

Bufferedimage et autostéréogramme


Sujet :

Graphisme Java

  1. #1
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Par défaut Bufferedimage et autostéréogramme
    Bonjour à tous,

    J'ai un petit souci avec des BufferedImage.
    J'essaye d'implémenter un générateur d'autostéréogrammes, mais le résultat est disons étrange.

    Mes images sont dédoublées.
    On peut bien sûr remettre en cause l'algorithme mais il est assez simple et je ne vois pas trop où est mon problème.
    Du coup, comme je ne sais pas manipuler les BufferedImage, j'aurais plutôt tendance à incriminer mon utilisation des Bufferedimage.

    En pièces-jointes j'ai mis :
    MainPanel.java : le code
    motif.jpg : le motif (cf autostéréogramme)
    dephmap.jpg : la map de profondeur, c'est à dire une image plate qui donne une idée de ce qu'on verra en 3D : le noir derrière, le blanc devant.
    resultat_anormal.jpg : c'est une image de ce que je vois en 3D, qui ne correspond pas à ce que je devrais avoir. A savoir qu'au lieu d'avoir un carré au centre en avant, j'ai un demi carré à gauche enfoncé dans le fond, et un demi carré à droite en avant.

    Quelqu'un aurait-il le début d'une idée de pourquoi ?

    Merci d'avance pour votre aide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.JFileChooser;
     
    public class MainPanel {
        private static final String MSG_ERR_MOTIF_TROP_ETROIT = "Le motif n'est pas assez large";
     
        final static int MOTIF_LARGEUR_MIN = 10;
     
        public static void main(String[] args)
        {
            // On charge la depthmap (carte de profondeur : "qui est loin, qui est proche ?")
            BufferedImage depthmap = loadDepthMap();
     
            // On charge le motif
            BufferedImage motif = loadMotif(depthmap);
     
            BufferedImage autostereogramme = makeItStereo(depthmap, motif);
     
            saveAutostereogram(autostereogramme);
        }
     
        private static void saveAutostereogram(BufferedImage image)
        {
            JFileChooser fileChooser = new JFileChooser();
            fileChooser.setSelectedFile(new File("stereo.jpg"));
     
            if (JFileChooser.APPROVE_OPTION==fileChooser.showSaveDialog(null)) 
            {
                File selectedFile = fileChooser.getSelectedFile();
     
                try {
                    ImageIO.write(image, "jpg", selectedFile);
                }
                catch (IOException e) {
                    System.out.printf("Erreur à l'enregistrement du fichier ["+e+"]");
                }
            }
        }
        private static BufferedImage makeItStereo(BufferedImage depthmap, BufferedImage motif) {
            int largeurDepthMap = depthmap.getWidth();
            int hauteurDepthMap = depthmap.getHeight();
            int largeurMotif = motif.getWidth();
            int hauteurMotif = motif.getHeight();
     
            System.out.printf("\nlargeurDepthMap : "+largeurDepthMap);
            System.out.printf("\nhauteurDepthMap : "+hauteurDepthMap);
            System.out.printf("\nlargeurMotif    : "+largeurMotif);
            System.out.printf("\nhauteurMotif    : "+hauteurMotif);
     
            BufferedImage autostereogramme = new BufferedImage(largeurDepthMap, hauteurDepthMap, motif.getType());
     
            // L'amplitude conseillée est de 25% de la largeur du motif
            double amplitudeDefault = largeurMotif*.25;
     
            System.out.printf("\n\n amplitudeDefault : ["+amplitudeDefault+"]");
     
            for(int y = 0; y<hauteurDepthMap; y++)
            {
                for(int x=0; x<largeurDepthMap; x++)
                {
                    // D = L - ( P / 256 ) * A
                    int currentPixel = 0xFF & (depthmap.getRGB(x, y)); //depthMapPixels[(x+y*largeurDepthMap];
                    int deplacement = (int) (largeurMotif - ((amplitudeDefault*currentPixel)/256))/2;
     
                    int motifPixel = motif.getRGB(x%largeurMotif, y%hauteurMotif);
     
                    if((x-deplacement >= 0) && (x+deplacement < largeurDepthMap))
                    {
                        autostereogramme.setRGB(x-deplacement, y, motifPixel);
                        autostereogramme.setRGB(x+deplacement, y, motifPixel);
                    }
                }
            }
     
            return autostereogramme;
        }
     
        private static BufferedImage loadDepthMap()
        {
            BufferedImage image = null; // Image que l'on va charger
            JFileChooser fileChooser = new JFileChooser();
     
            boolean ok = false; // booleen pour gerer la sortie de la boucle d'ouverture du fichier
     
            while(!ok)
            {
                // Si l'utilisateur valide son fichier, on regarde si il est compatible
                if(JFileChooser.APPROVE_OPTION == fileChooser.showOpenDialog(null))
                {
                    File fichierImage = fileChooser.getSelectedFile();
     
                    if(null != (image=getImage(fichierImage)))
                    {
                        ok = true;
                    }
                }
                // Si l'utilisateur annule ou qu'on rencontre un problème on n'insiste pas
                else
                {
                    ok = true;
                }
            }
     
            return image;
        }
     
        // Et oue, j'ai pas mis loadPattern, je fais ce que je veux
        private static BufferedImage loadMotif(BufferedImage depthmap)
        {
            BufferedImage image = null; // Image que l'on va charger
            JFileChooser fileChooser = new JFileChooser();
     
            boolean ok = false; // booleen pour gerer la sortie de la boucle d'ouverture du fichier
     
            while(!ok)
            {
                // Si l'utilisateur valide son fichier, on regarde si il est compatible
                if(JFileChooser.APPROVE_OPTION == fileChooser.showOpenDialog(null))
                {
                    File fichierImage = fileChooser.getSelectedFile();
     
                    if(null != (image=getImage(fichierImage)))
                    {
                        // Remarque : Pour un confort de visualisation la largeur ne devrait pas être supérieure à 5 cm.
                        //              Pour disposer d'un espace suffisant de codage, une largeur de 1 cm est un minimum.
                        // On décide arbitrairement d'une largeur minimale
                        if(MOTIF_LARGEUR_MIN > depthmap.getWidth())
                        {
                            System.out.printf("\n["+fichierImage+"] "+MSG_ERR_MOTIF_TROP_ETROIT);
                            image = null;
                        }
     
                        ok = true;
                    }
                }
                // Si l'utilisateur annule ou qu'on rencontre un problème on n'insiste pas
                else
                {
                    ok = true;
                }
            }
     
            return image;
        }
     
        private static BufferedImage getImage(File fichierImage)
        {
            String fileName = fichierImage.getName();
            BufferedImage image = null;
     
            try
            {
                image = ImageIO.read(fichierImage);
            }
            catch (IOException e1)
            {
                System.out.printf("\nIOException : ["+e1+"]");
                return null;
            }
     
            System.out.printf("\n["+fileName+"] Type : "+image.getType());
     
            return image;
        }
    }
     
    /*
    Je pars de l'hypothèse que l'on dispose d'une image de base où le relief est codé sous la forme d'une image en dégradés de gris pour laquelle :
     
    la couleur la plus éloignée est la plus sombre (couleur 0, en général le fond de l'image)
    la couleur la plus proche est le blanc (dont le code de couleur est 255)
    En premier lieu, il vous faut déterminer, pour l'ensemble de l'image à coder, les paramètres suivants :
     
    Largeur du motif à répéter en pixel : L
    Amplitude de séparation maximum : A, avec A inférieur à L
    L'image à coder est traitée ligne par ligne. Chaque pixel de l'image de départ doit être codé deux fois dans l'image codée, le tout en utilisant un motif de codage.
     
    Il vous faut donc ensuite disposer d'un motif à répéter. Ce motif est une ligne de pixels qui peut être en noir et blanc ou en couleurs. Le motif peut être aléatoire ou extrait d'une texture.
     
    Supposons que pour une ligne 'n', le motif à répéter soit stocké dans un tableau du type Motif:array[1..L] of bytes (notation pascal).
     
    Les paramètres à implémenter sont les suivants :
     
    Pour chaque point à coder, déterminer la valeur de profondeur à coder : P
    Pour chaque point à coder la valeur de déplacement sera :
     
        D = L - ( P / 256 ) * A
    Le point correspondant du motif de codage sera peint sur l'écran à l'endroit courant et à l'endroit courant + D.
     
    Et ainsi de suite pour tous les autres points.
     
    Il faut choisir des valeurs raisonnables pour L, c'est à dire pour la largeur du motif à répéter. En effet, vos yeux vont devoir fusionner ce motif. Pour un confort de visualisation la largeur ne devrait pas être supérieure à 5 cm. Pour disposer d'un espace suffisant de codage, une largeur de 1 cm est un minimum.
     
    L'amplitude de séparation A est normalement de 25 % de la largeur. Une valeur au-dessus risquerait d'aboutir à des recouvrements.
     
    Plus l'amplitude est grande, plus la résolution du relief est fine.
    */
    Images attachées Images attachées    

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Avec ton algorithme, sur les zones noires t'aura correspondance pixel = motif à la même place, car D=0. Je ne comprends donc pas comment tu obtiens une zone complètement grise.

    Pourrais-tu, dans ton code, afficher les trois images chargées dans une Frame pour être certain de ce avec quoi tu travailles et que la lecture est correcte ?

  3. #3
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Par défaut
    Tout d'abord, merci tchize_ de te pencher sur le problème !

    Je me suis mal exprimé, je n'obtiens pas de zone grise, j'obtiens l'image que je donne ici en pièce attachée(stereo.jpg).
    Ca c'est l'autostéréogramme en lui-même : si l'on regarde en vision parallèle, on voit en 3D ce que j'ai dessiné en 2D dans resultat_anormal.jpg. La zone noire en enfoncée, la zone grise médiane, et la zone blanche est devant, vers l'observateur.
    Or le résultat que je devrais obtenir c'est un fond vers le fond(par définition), et un carré central vers l'observateur.

    Vois-tu un peux plus ce que je veux dire ? Arrive tu à voir l'autostéréogramme en 3D ? Ca peut aider à la compréhension du bazar =)

    Par avance merci !

    Reikiki.
    Images attachées Images attachées  

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je t'avoue que les autostéréogramme je n'arrive jamais à les voir. J'ai cru que c'était ton motif le bazar plein de couleur et que t'arrivais à ton trucs a trois carré

    Tu pourrais prendre un motif formé d'un arc-en-ciel qu'on voie clairement ce qui se passe?

  5. #5
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Par défaut
    Alors pour le motif, je ne suis pas sur de bien comprendre le coup de l'arc en ciel.
    Un motif pour un autostereogramme, c'est une bande d'une bonne centaine de pixels de large, et au moins aussi haute que la dephmap (map de profondeur en noir&blanc).
    Donc je peux te faire un arc en ciel ou un dégradé sur un bande, qui sera répétée X fois.
    Je vais essayer de trouver quelques motifs différents et de générer les autostéréogrammes correspondants, en espérant que tu trouves ton bonheur !

    Reikiki.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    oui je parlais d'un dégradé, ça permet de vite voir ce que fait ton algorithme puisqu'on peux facilement détermine d'ou viens quel point avec ça

  7. #7
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Par défaut
    Au hasard, une première tentative : voir les fichiers attachés motif_carres et stereo_carres.
    Images attachées Images attachées   

  8. #8
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Par défaut
    La même dans l'autre sens.
    Je sais pas si c'est ça que tu attends, perso je vois pas où ça mène =)
    Images attachées Images attachées   

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    et bien on y vois que l'algorithme décale le carré central d'un valeur constante vers la droite, ce qui est bien l'effet voulu avec une carte de profondeur représentant un champ constant.

    Par contre, tu désire probablement que ce décalage soit plus prononcé, donc je serais toi je vérifierais les facteur dans ta formule, car avec un motif de 64 pixels, par exemple, on a au plus fort de la map
    deplacement = 64 - (int) (64 - ((16*255)/256))/2 ~=64 - (64 - 16/2) = 8;

  10. #10
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Par défaut
    Bon, donc l'algo est bon. Par contre au final ça n'est pas un carré que décalé que j'obtiens, mais 2 demi-carrés... c'est ça mon problème.
    Et je suis comme une poule devant un couteau, j'ai essayé diverses manips mais j'ai plus d'idées là, quoi que je fasse j'obtiens toujours 2 demi-carrés au lieu d'un seul au centre.

    Alors sinon l'amplitude, normalement c'est 0.25, j'avais fait un essai à 0.025 et ça ne change que l'amplitude de la 3D, ça ne change pas la position des demis-carrés. Mon motif actuel faisant 140 pixels de large, ça nous fait du beau décalage. Donc à priori la vérité est ailleurs... je pédale dans la semoule...

  11. #11
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Par défaut
    Pour info, j'ai tenté avec un nouvel algo que j'ai trouvé sur le net, que j'ai pas compris par ailleurs, et le résultat et le même qu'avec l'autre algo(pourtant la façon de faire me semble très différente).
    J'obtiens du "bruit" à droite de l'image, donc là on voit bien que ça change quelque chose, mais par contre j'obtiens toujours 2 demi-carrés au lieu d'un carré... c'est à sa taper la tête dans le mur.
    Suis-je le seul au monde à utiliser des Bufferedimage en voulant triturer les pixels ?
    Fichiers attachés Fichiers attachés

  12. #12
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 818
    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 818
    Par défaut
    Salut

    Citation Envoyé par Reikiki Voir le message
    Au hasard, une première tentative : voir les fichiers attachés motif_carres et stereo_carres.
    raté... le principe de l'autostéréogramme est de jouer sur un décalage droite/gauche pour créer la 3d, donc si tu mets les rayures horizontalement, ça ne sert à rien...

    Citation Envoyé par Reikiki Voir le message
    La même dans l'autre sens.
    Je sais pas si c'est ça que tu attends, perso je vois pas où ça mène =)
    tchize_ cherche à avoir une image "simple" où on voit (sans la 3d) dans quel sens et de quelle valeur sont décalés les pixels.

    Citation Envoyé par tchize_ Voir le message
    et bien on y vois que l'algorithme décale le carré central d'un valeur constante vers la droite, ce qui est bien l'effet voulu avec une carte de profondeur représentant un champ constant.
    Là, j'ai un doute... je ne connais pas exactement l'algorithme, mais je verrai plutôt un décalage symétrique par rapport à l'axe vertical du milieu de l'image. Donc >0 dans la moitié gauche, et <0 dans la moitié droite (ou l'inverse).


    Citation Envoyé par Reikiki Voir le message
    Bon, donc l'algo est bon. Par contre au final ça n'est pas un carré que décalé que j'obtiens, mais 2 demi-carrés... c'est ça mon problème.
    Donc si l'algo est bon, c'est l'implémentation qui ne l'est pas.

    Perso, je ne sais pas quel algo tu as utilisé (ou alors j'ai lu trop vite si tu as mis un lien quelque part...). J'ai croisé une formule dans les commentaires de ton code, qui fait intervenir un & dans ton code, et donc je ne vois pas explicitement la logique entre les deux (apparemment tu fais le calcul du décalage sur les deux derniers octets de ton int correspondant au pixel? bon, entre du noir et du blanc, ça doit passer, mais à voir pour les tons de gris ensuite)

    En tout état de cause, je reste sur mon idée visuelle que le décalage devrait être symétrique entre les moitiés droite et gauche de l'image (dans ce cas particulier du carré blanc centré). Donc revois ta formule, fais attention aux divisions entières si il y en a...

    Au passage, sur l'axe milieu vertical, il y a un décalage à droite sur ta dernière image (avec le motif simple), alors qu'il n'y en a pas sur la première (avec le motif décoré... enfin, il ne semble pas y en avoir...). Regarde aussi si il n'y a pas un soucis sur le pixel que tu récupères dans le motif.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par plegat Voir le message
    (apparemment tu fais le calcul du décalage sur les deux derniers octets de ton int correspondant au pixel? bon, entre du noir et du blanc, ça doit passer, mais à voir pour les tons de gris ensuite)
    Son image de départ est en niveau de gris, donc il prend la composante rouge, qui va de 0 à 255 comme niveau de gris, ce qui est correct. L'algo utilisé est basique et mis en commentaire. Je partirais plutot d'un exemple concret qu'on trouve sur le net plutot que d'un carré blanc qui, en 3D ne correspond de toutes façons à rien. Aussi, afficher dans une fichier les valeurs de décage prises en compte pourrait aider

  14. #14
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 818
    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 818
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Son image de départ est en niveau de gris, donc il prend la composante rouge, qui va de 0 à 255 comme niveau de gris, ce qui est correct.
    rouge ou bleu? Question perso, ça ne change rien à la technique pour le niveau de gris (que je m'étais parfumée), c'est juste pour ma culture...

    Citation Envoyé par tchize_ Voir le message
    L'algo utilisé est basique et mis en commentaire.
    Tout à la fin... parfumé aussi!

    Citation Envoyé par tchize_ Voir le message
    Je partirais plutot d'un exemple concret qu'on trouve sur le net plutot que d'un carré blanc qui, en 3D ne correspond de toutes façons à rien.
    Ben... ça correspond à un carré en relief... moi je n'ai rien contre, c'est un exemple simple. Et disons que c'est sans doute plus simple pour débugguer que d'utiliser une image relief plus élaborée.

    Citation Envoyé par tchize_ Voir le message
    Aussi, afficher dans une fichier les valeurs de décage prises en compte pourrait aider
    +1
    Faire ça sur une ligne devrait être suffisamment parlant... avec le carré!

    Petite remarque.
    Dans les commentaires, dans les explication de l'algo, tu mets:

    Le point correspondant du motif de codage sera peint sur l'écran à l'endroit courant et à l'endroit courant + D.
    Or, dans ton code, tu peints à x-D et x+D:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    autostereogramme.setRGB(x-deplacement, y, motifPixel);
    autostereogramme.setRGB(x+deplacement, y, motifPixel);
    c'est lequel le bon?

    Ca ne pose pas un soucis d'aller peindre à x+D, sachant qu'on va repasser dessus ensuite dans la boucle?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  15. #15
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Par défaut
    Citation Envoyé par plegat Voir le message
    Salut



    raté... le principe de l'autostéréogramme est de jouer sur un décalage droite/gauche pour créer la 3d, donc si tu mets les rayures horizontalement, ça ne sert à rien...
    Je connais le principe de l'autostéréogramme, là c'est tchize_ qui voulait de l'arc en ciel, donc je tente de le contenter. Le but de mon post n'est pas de générer un autostéréogramme, ça c'est fait. Le but c'est de générer le stéréogramme qui correspond à la dephmap que je donne à manger au programme.


    Citation Envoyé par plegat Voir le message
    tchize_ cherche à avoir une image "simple" où on voit (sans la 3d) dans quel sens et de quelle valeur sont décalés les pixels.
    Avec les motifs d'autostéréogramme c'est pas évident de voir le décalage, je peux fournir les valeurs de décalage dans des traces par contre. De mémoire ça oscillait entre 90 et 120 dans mes premiers tests.

    Citation Envoyé par plegat Voir le message
    Là, j'ai un doute... je ne connais pas exactement l'algorithme, mais je verrai plutôt un décalage symétrique par rapport à l'axe vertical du milieu de l'image. Donc >0 dans la moitié gauche, et <0 dans la moitié droite (ou l'inverse).

    Donc si l'algo est bon, c'est l'implémentation qui ne l'est pas.
    On peut remettre en doute l'algo, car je l'ai peut-être mal compris, il est peut-être incomplet, voir faux. Et même tarif pour l'implémentation. Le truc justement c'est que je ne sais pas dire où ça pêche, et comme j'ai codé les Bufferedimage(que je découvre) à l'arrache, j'ai commencé par les incriminer. Quand je dis à l'arrache, par exemple je fais un getRGB sans me soucis de la façon dont les pixels sont encodés derrière(grayscale, indexé, etc) et je refais un setRGB de la valeur que me retourne le getRGB.

    Citation Envoyé par plegat Voir le message
    Perso, je ne sais pas quel algo tu as utilisé (ou alors j'ai lu trop vite si tu as mis un lien quelque part...). J'ai croisé une formule dans les commentaires de ton code, qui fait intervenir un & dans ton code, et donc je ne vois pas explicitement la logique entre les deux (apparemment tu fais le calcul du décalage sur les deux derniers octets de ton int correspondant au pixel? bon, entre du noir et du blanc, ça doit passer, mais à voir pour les tons de gris ensuite)
    Effectivement j'ai pas donner le lien vers le site où j'ai pêcho l'algo. Je viens de faire une petite recherche mais je ne le retrouve pas. Ça ne saurait tarder, je fais une édition de mon post dès que je le retrouve.
    Pour l'histoire du & : avant je fais un image.getRaster().getSample(x,y), ça me donnait le même résultat. J'avais vu qu'en utilisant getSample() toutes les valeurs était entre 0 et 255 quand je chargeais un grayscale, ça m'avait paru bon.
    Et puis comme ça ne marchait pas(c'est à dire que j'obtenais ce que j'obtiens maintenant : 2 demi-carrés décalés au lieu d'un seul au centre), j'ai tenté getRGB(). D'après mes lectures en diagonales, getRGB renvoie un int avec chaque couleur(R, G et B) respectivement codés sur 1 octet. Comme j'ai besoin d'une valeur sur entre 0 et 255 et que R = G = B puisque je lit un grayscale, alors je fais getRGB()&0xFF pour n'extraire qu'une composante(n'importe laquelle puisqu'elle sont égales entre elles).
    J'obtiens la même valeur qu'avec getRaster.getSample().

    Citation Envoyé par plegat Voir le message
    En tout état de cause, je reste sur mon idée visuelle que le décalage devrait être symétrique entre les moitiés droite et gauche de l'image (dans ce cas particulier du carré blanc centré). Donc revois ta formule, fais attention aux divisions entières si il y en a...
    Je ne comprends pas ce que tu veux dire, qu'est-ce qui doit être symétrique ? Le point gauche et le point droit doivent être à égale distance du centre, un à gauche et un à droite ?
    Il ne me semble pas avoir merdé avec les divisions, disons que j'ai manié et remanié le code avec des floats, des arrondis, etc, et que le résultat et toujours strictement identique.

    Citation Envoyé par plegat Voir le message
    Au passage, sur l'axe milieu vertical, il y a un décalage à droite sur ta dernière image (avec le motif simple), alors qu'il n'y en a pas sur la première (avec le motif décoré... enfin, il ne semble pas y en avoir...). Regarde aussi si il n'y a pas un soucis sur le pixel que tu récupères dans le motif.
    Je vais essayer de voir ce que tu veux dire avec motif simple et l'histoire du décalage(en même temps pour l'autostéréogramme ce ne sont que des décalages, c'est pour ça que bon... je comprends pas à quoi tu fais référence). Pour le pixel que je récupère sur le motif, précisément, je ne sais pas vérifier s'il y a un soucis, le dépend du "type" de l'image au sens Bufferedimage(grayscale, indexé, 24bits, 32 bits, etc), et pour ce que me retourne le getRGB() j'ai cherché sur le net mais je n'arrive pas à trouvé précisément ce que je ça retourne.
    J'image pour un JPG sur 24bits que si je fais int pixel = getRGB(x,y) alors j'aurais :
    - rouge = pixel&0xFF
    - vert = pixel&0xFF00
    - bleu = pixel&0xFF0000

    Mais je n'ai pas trouvé ça noir sur blanc dans une doc, et ce pour chaque type d'image.
    Donc entre l'algo qui est potentiellement foireux, interprétable ou incomplet, et ma non-maitrise des Bufferedimage, ça me laisse une bonne marge pour merder et surtout ne pas réussir à trouver la source de mon problème.

    En tous cas merci de m'aider !

  16. #16
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 818
    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 818
    Par défaut
    Citation Envoyé par Reikiki Voir le message
    Je connais le principe de l'autostéréogramme, là c'est tchize_ qui voulait de l'arc en ciel, donc je tente de le contenter.
    Je sais, mais balancer des rayures horizontales pour faire apparaitre un décalage horizontal... c'est un peu comme peindre en blanc sur un mur blanc pour faire voir ce que ça donne en blanc!

    Citation Envoyé par Reikiki Voir le message
    Je ne comprends pas ce que tu veux dire, qu'est-ce qui doit être symétrique ? Le point gauche et le point droit doivent être à égale distance du centre, un à gauche et un à droite ?
    Non, le décalage doit être symétrique. C'est à dire que si tu bouges un pixel côté gauche de 2px vers la doite, son symétrique côté droit doit bouger de 2px vers la gauche.
    Mais juste pour ta depthMap avec le carré blanc. Tout est symétrique dans ta depthMap, donc je me dis que sur l'autostéréogramme, ça devrait l'être aussi...

    Citation Envoyé par Reikiki Voir le message
    Il ne me semble pas avoir merdé avec les divisions, disons que j'ai manié et remanié le code avec des floats, des arrondis, etc, et que le résultat et toujours strictement identique.
    C'était à prendre au sens large... je ne pensais pas qu'aux divisions entières, il y a potentiellement d'autres opérations qui peuvent faire rentrer des déviations.

    Citation Envoyé par Reikiki Voir le message
    Je vais essayer de voir ce que tu veux dire avec motif simple
    Vu que toi-même tu parles de "motif", ne va pas chercher midi à 14h, je parle de la même chose que toi. Tu en as présenté un à rayures, et un abstrait, je pense que tu trouveras lequel est le "simple".

    Citation Envoyé par Reikiki Voir le message
    et l'histoire du décalage(en même temps pour l'autostéréogramme ce ne sont que des décalages, c'est pour ça que bon... je comprends pas à quoi tu fais référence).
    J'ai l'impression que tu cherches à interpréter ce que je dis... quand je parle de motif et de décalage, ce sont les mêmes que toi...

    Citation Envoyé par Reikiki Voir le message
    En tous cas merci de m'aider !
    On est là pour ça!
    En plus on tient un sujet intéressant là, donc on va essayer de ne pas lacher...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  17. #17
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Son image de départ est en niveau de gris, donc il prend la composante rouge, qui va de 0 à 255 comme niveau de gris, ce qui est correct. L'algo utilisé est basique et mis en commentaire. Je partirais plutot d'un exemple concret qu'on trouve sur le net plutot que d'un carré blanc qui, en 3D ne correspond de toutes façons à rien. Aussi, afficher dans une fichier les valeurs de décage prises en compte pourrait aider
    Ben si, le carré blanc en 3D c'est l'avant-plan, et le fond noir l'arrière plan. Quand tu regardes l'autostéréogramme tu vois en 3D un carré qui flotte devant un fond noir.
    Après ce qu'on peut faire effecetivement c'est essayer avec d'autres depthmap, c'est ce que j'ai fait hier en mettant un carré en bas à droite au lieu de le mettre au milieu, et de la même façon j'obtiens 2 demi-carrés en bas à droite. Je vais générer d'autres depthmap pour voir si ça nous donne une piste.

    Citation Envoyé par plegat Voir le message
    Je sais, mais balancer des rayures horizontales pour faire apparaitre un décalage horizontal... c'est un peu comme peindre en blanc sur un mur blanc pour faire voir ce que ça donne en blanc!
    Dans le doute j'ai fait de l'horizontal et du vertical. Comme je ne voyais pas ce que tchize_ avait derrière la tête... qui peut le plus peut le moins =)


    Citation Envoyé par plegat Voir le message
    Non, le décalage doit être symétrique. C'est à dire que si tu bouges un pixel côté gauche de 2px vers la doite, son symétrique côté droit doit bouger de 2px vers la gauche.
    Mais juste pour ta depthMap avec le carré blanc. Tout est symétrique dans ta depthMap, donc je me dis que sur l'autostéréogramme, ça devrait l'être aussi...
    C'est symétrique là je pense :
    autostereogramme.setRGB(x-deplacement, y, motifPixel);
    autostereogramme.setRGB(x+deplacement, y, motifPixel);
    Je vais vraiment présenter une autre depthmap, celle-là effectivement est symétrique et ça nuit à la compréhension du phénomène je trouve, je vais mettre une ou 2 autres formes, et décalées par rapport au centre.

    Citation Envoyé par plegat Voir le message
    C'était à prendre au sens large... je ne pensais pas qu'aux divisions entières, il y a potentiellement d'autres opérations qui peuvent faire rentrer des déviations.
    Oui oui, nous sommes d'accord. J'essaye généralement de faire gaffe à ce genre de choses, je me suis trop fait niquer avec les arrondis.

    Citation Envoyé par plegat Voir le message
    Vu que toi-même tu parles de "motif", ne va pas chercher midi à 14h, je parle de la même chose que toi. Tu en as présenté un à rayures, et un abstrait, je pense que tu trouveras lequel est le "simple".
    Alors justement, pour motif on est bien d'accord. C'est le "simple" qui est pour moi subjectif. Des rayures c'est simple, des points de couleur aléatoire c'est simple. A lire ton message je comprends que ce sont les rayures qui sont simples. Moi ce qui me gène avec les rayures c'est que j'ai l'impression que ça masque plus de choses que ça n'en révèle. Maintenant je suis ouvert à tout, parce que là... je nage .

    Citation Envoyé par plegat Voir le message
    J'ai l'impression que tu cherches à interpréter ce que je dis... quand je parle de motif et de décalage, ce sont les mêmes que toi...
    Comme je dis juste au-dessus, un motif c'est un motif, une depthmap c'est une depthmap.
    Je ne gardais pas la bonne image en fait, tu veux dire que le bandes sont décalées, en fait à l'emplacement du carré sur la depthmap, on voit un décalage sur l'autostéréogramme(d'ailleurs avec le motif à la con vertical perso je vois rien en 3D ).

    Citation Envoyé par plegat Voir le message
    On est là pour ça!
    En plus on tient un sujet intéressant là, donc on va essayer de ne pas lacher...
    Amen

  18. #18
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Par défaut
    Donc, pour la science, vers l'infini et au-delà, en pièces-jointes :

    - depthmap2.jpg : la dephmap source : 1 carré en premier plan et 1 cercle en second plan
    - motif.jpg : c'est le motif ça... en fait... un motif abstrait
    - stereo2.jpg : l'autostéréogramme résultant
    - image3Destimee2.jpg : une estimation par l'artiste() de l'autostéréogramme, une projection en 2D en quelque sorte. Les 2 motifs sont séparés en 2, on retrouve 2 demi-carrés, et on note pour le cercle que ce ne sont pas 2 demi-cercles mais 2 croissants. Miam.

    Y-a-t'il un exorciste dans la salle ?
    Images attachées Images attachées     

  19. #19
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 818
    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 818
    Par défaut
    Citation Envoyé par Reikiki Voir le message
    Y-a-t'il un exorciste dans la salle ?
    Ou un debugger...

    Je suis tombé sur ça en faisant 3 recherches, ça me semble un peu plus complexe niveau algo que ce que tu utilises...

    Le soucis de ton algo, c'est qu'il redessine les pixels sur lesquels il est déjà passé (le fameux pixel à x-deplacement).
    Dans le lien que j'ai mis ci-dessus, d'après ce que je comprends, il y a un pixel "oeil gauche" (piloté par le motif) et un pixel "oeil droit" (piloté par le décalage). Il fait une première passe pour déterminer sur quel pixel de l'oeil gauche doit pointer l'oeil droit pour recréer le relief. Ensuite, il s'en sert pour aller chercher la couleur du pixel, non pas directement sur le motif (sauf pour les premières colonnes de pixels), mais sur le stéréogramme.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    prend une vraie depthmap, pas un truc artificiel. Les autostéréogramem sont déjà pas facile à voir, si en plus tu prend des depth map qui ne correpondent a aucune réalité ton oeil va te faire voir n'importe quoi

    Et je plussoie, l'algorithme parle bien exclusivement d'un décalage à droite.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/01/2006, 21h32
  2. [Image] BufferedImage : Déplacement image
    Par cyber_jad dans le forum AWT/Swing
    Réponses: 15
    Dernier message: 08/11/2004, 16h40
  3. [JEditorPane] Transformation en BufferedImage
    Par gwendo dans le forum Composants
    Réponses: 11
    Dernier message: 05/11/2004, 19h30
  4. Réponses: 6
    Dernier message: 30/09/2004, 12h21
  5. [jar] BufferedImage issue d'un .jpeg dans un jar
    Par tit_henry dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 13/05/2004, 10h09

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