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

Traitement d'images Discussion :

Convertir une image en tableau d'entier contenant les valeurs de ses pixels


Sujet :

Traitement d'images

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Points : 13
    Points
    13
    Par défaut Convertir une image en tableau d'entier contenant les valeurs de ses pixels
    Bonjour,

    Je cherche, à partir d'une image en noir et blanc, à obtenir un tableau d'entier à 2 dimensions contenant les valeurs des pixels de l'image en niveau de gris.

    Pour cela, j'ai tenté d'utiliser ce code :

    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
     
    int[][] input; // tableau 2D [x][y] contenant l'image en niveau de gris (0-255)
    int width; // largeur de l'image
    int height; // hauteur de l'image
     
    Image image = Toolkit.getDefaultToolkit().getImage(inFile);
     
            try {
     
                PixelGrabber grabber = 
                        new PixelGrabber(image, 0, 0, -1, -1, false);
     
                if (grabber.grabPixels()) {
                    int width = grabber.getWidth();
                    int height = grabber.getHeight();
     
                    if (isGreyscaleImage(grabber)) {
                        byte[] data = (byte[]) grabber.getPixels();
     
                input = new int[width][height];
     
                for (int x=0; x < width; x++)
        		{
        			for (int y=0; y < height; y++)
        			{
        				int offset = x*height + y;
        				byte val = data[offset];
        				if (val == -1){
        					input[x][y] = (int)255;
        				}else{
        					input[x][y] = (int) val;
        				}
        			}
        		}
     
                    }
                    else {
                        int[] data = (int[]) grabber.getPixels();
     
                       for (int x=0; x < width; x++)
        		{
        			for (int y=0; y < height; y++)
        			{
        				int offset = x*height + y;
        				int val = data[offset];
        				if (val == -1){
        					input[x][y] = (int)255;
        				}else{
        					input[x][y] = (int) val;
        				}
        			}
        		}
     
                    }
                }
            }
            catch (InterruptedException e1) {
                e1.printStackTrace();
            }
    Mon problème, c'est que j'ai beau lui passer des images en noir et blanc (même des images toutes noires avec juste des formes blanches dessinées sous paint), le test de isgreyscaleimage(grabber) renvoie toujours false... et donc je me retrouve avec des valeurs qui ne correspondent pas dans mon tableau. (d'ailleur si j'essaye de le convertir en image derrière, ca modifie bien mon image : si elle affichait deux droites sur fond noir par exemple, je me retrouve avec chacune des droites dédoublée plusieurs fois, comme si un enfant avait essayer de crayonner par dessus).

    Sauriez-vous comment je peux régler ce problème ? Si vous avez une solution basée sur une autre méthode sinon, je suis preneuse.

    Merci


    Edit :

    le code de la fonction isgreyscaleimage est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     public static final boolean isGreyscaleImage(PixelGrabber pg) {
            return pg.getPixels() instanceof byte[];
        }

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Une image en niveaux de gris, c'est un format particulier, et non pas juste une image RVB 24/32 bits ne contenant que des pixels gris...

    En général, c'est déjà une image "palette" (8 bits de profondeur de couleur), et savoir si c'est une "vraie" palette ou bien des niveaux de gris dépend du format de fichier utilisé.

    Si c'est une image greyscale codée en RVB, cela veut dire que chaque valeur de gris est dupliquée à l'identique pour chaque composante de couleur (R, V et B). Je te rappelle aussi que l'écran, lui, est toujours en RVB et non pas en niveaux de gris...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Ce sont des images codées sur 8 bits que j'utilise, je les converti exprés avec imagej pour cela (type -> 8 bits depuis l'api) , et elles sont enregistrées au format jpg.

    Le problème viendrait donc du format d'enregistrement ? Tu n'as rien vu de mauvais dans le code en lui même ?

    Parce que sinon pour obtenir les niveaux de gris avec mon code actuellement vu qu'il pense que c'est du rvb, comment je pourrais faire ? Etant donné qu'il me renvoie un tableau d'int avec des valeurs très élevée (au dela de 1000) je ne sais pas trop comment l'exploiter... Enfin, je pense que ça serait quand meme plus simple d'arriver à lui soutirer les niveaux de gris dés le début.

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par godhiva Voir le message
    Ce sont des images codées sur 8 bits que j'utilise, je les converti exprés avec imagej pour cela (type -> 8 bits depuis l'api) , et elles sont enregistrées au format jpg.
    JPEG est un format... 24 bits. Sauf si tu as sauvé en "greyscale JPG", ce qui n'est pas toujours accepté ni par les fonctions d'enregistrement JPG, ni par les fonctions de lecture qui renvoient habituellement une image 24 bits.

    Citation Envoyé par godhiva Voir le message
    Le problème viendrait donc du format d'enregistrement ? Tu n'as rien vu de mauvais dans le code en lui même ?
    Je ne connais pas cette API, donc te dire s'il y a une erreur... Par contre, je sais que pendant mes études en imagerie informatique, c'était la cause la plus fréquente d'erreur lors du travail sur images greyscale.

    Citation Envoyé par godhiva Voir le message
    Parce que sinon pour obtenir les niveaux de gris avec mon code actuellement vu qu'il pense que c'est du rvb, comment je pourrais faire ?
    Habituellement, on travaille sur un buffer interne issu du fichier image : soit en le chargeant directement (si c'est bien un format greyscale, voir du côté des formats sans perte comme BMP, TGA, PNG, ...), soit en convertissant l'image RVB en niveau de gris.

    Citation Envoyé par godhiva Voir le message
    Etant donné qu'il me renvoie un tableau d'int avec des valeurs très élevée (au dela de 1000) je ne sais pas trop comment l'exploiter...
    Il faut un tableau d'octets, pas d'entiers.

    Citation Envoyé par godhiva Voir le message
    Enfin, je pense que ça serait quand meme plus simple d'arriver à lui soutirer les niveaux de gris dés le début.
    En effet, et le plus simple pour ça, c'est de vérifier le format d'enregistrement : cela doit être "greyscale" ou "8 bpp", sinon c'est une "fausse" image greyscale. Dans tous les cas, préfère un format sans perte (= pas de JPG, donc).

    Un logiciel comme IrfanView peut t'aider sur les conversions de format de fichier.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Alors, tout d'abord, j'ai essayé une conversion de l'image dans le code à l'aide d'un des cours du site. Sauf que meme aprés lui avoir spécifié de la passer en noir et blanc ça allait toujours dans la condition du RGB...

    Donc j'ai installé irfanview, et j'ai entrepris la conversion de mes images en bmp greyscale.
    Sauf que le code n'a plus fonctionné... le grabber.grabPixels renvoyant false :/

    Bref, je me suis orientée vers autre chose et j'ai fini par trouver une autre méthode qui marche.

    Je prend mon image, je la converti en buffered image, je récupere la valeur rgb de chaque pixel avec le getRGB(). A cette valeur j'applique un masque de couleur rouge puis vert puis bleu. Je fais la somme des trois, je divise par 3 et j'ai enfin mon niveau de gris !

    Fastidieux... mais j'ai ce qu'il me faut !

    En tout cas merci Mac Lak

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par godhiva Voir le message
    Je fais la somme des trois, je divise par 3 et j'ai enfin mon niveau de gris !

    Fastidieux... mais j'ai ce qu'il me faut !
    Ce ne sera pas le "vrai" niveau de gris par contre : la formule exacte, tu l'auras sur le lien que je t'ai linké précédemment...

    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertir une image à un tableau Binaire
    Par keepit dans le forum SAP
    Réponses: 0
    Dernier message: 28/03/2014, 11h59
  2. Convertir une image à un tableau Binaire
    Par keepit dans le forum Développement Web avec .NET
    Réponses: 0
    Dernier message: 28/03/2014, 11h54
  3. convertir une image en un tableau de byte
    Par isoman dans le forum Graphisme
    Réponses: 7
    Dernier message: 30/03/2009, 10h17
  4. convertir une image en tableau
    Par samplaid dans le forum Débuter
    Réponses: 2
    Dernier message: 01/10/2008, 23h16

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