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

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  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    

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