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

Multimédia Java Discussion :

Conversions de type d'images


Sujet :

Multimédia Java

  1. #1
    Membre régulier Avatar de zolotaya
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 93
    Points : 78
    Points
    78
    Par défaut Conversions de type d'images
    Bonjour,

    Voila, j'ai un petit soucis. J'ai une image couleur (type que je lis RGB) or elle n'est composée que de 2 teintes (vert et rouge). Mon but (dans un premier temps est de la passée en niveau de gris. Pour cela j'ai créé une petite fonction (cf ci dessous) mais le resultat est une image toute noir ou presque (la quasi totalités de mes pixels étant compris entre 0 et 15).
    Quelqu'un pourrait 'il me dire si il y a quelque chose qui ne vas pas?

    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
     
    public BufferedImage grayPict(BufferedImage image) {
    	BufferedImage gray = new BufferedImage(larg, haut, 10);
    	for (int x = 0; x < larg; x++) {
    		for (int y = 0; y < haut; y++) {
    			/**
                             * Lecture manuelle des composantes : On ne garde que le rouge
                             * et le vert car les images ne sont composées que de ces 2
                             * teintes
                             */
    			int rgb = image.getRGB(x,y);
    			int rouge = (rgb >>16 ) & 0xFF;
    			int vert = (rgb >> 8 ) & 0xFF;
    			int ndg = (int) Math.round((rouge * 0.5) + (vert * 0.5));
    			gray.setRGB(x,y,ndg);
    		}
    	}
    	return gray;
    }
    merci d'avance

  2. #2
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 62
    Points : 75
    Points
    75
    Par défaut
    Peut être que tu devrais utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (int) Math.round((rouge+vert+255)/3)
    Je ne suis pas sûre.
    Ou sinon tu peut utiliser ColorConvertOp.
    Une bonne adresse si tu veux pour le traitement d'image en java :
    http://perso.orange.fr/emmanuel.remy...entImages.html

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Lorsque tu ecris
    ngb doit être exprime sous la forme argb. La methode setRGB fait ensuite la conversion.

    En d'autres terme, il faut reconstituer ngb a partir de la valeur moyenne calculée.
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int mid = (rouge + vert)/2;
    int ngb = 0xFF000000 | (mid<<16) | (mid<<8) | mid;
    En supposant que tu calcules l'intensité avec juste les composantes rouge et verte.

  4. #4
    Membre régulier Avatar de zolotaya
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 93
    Points : 78
    Points
    78
    Par défaut
    Ok ca marche, je ne savais pas que setRGB faisait la conversion toute seule.
    par contre juste pour etre sur.
    Quand tu mets ca comme code :

    int mid = (rouge + vert)/2;
    int ngb = 0xFF000000 | (mid<<16) | (mid<<8) | mid;

    c'est bien ou tout blanc ou tout vert ou tout rouge ou la valeur calculée?

    dans ce cas " int ngb = mid; " ne pourrait'il pas suffir?

  5. #5
    Membre régulier Avatar de zolotaya
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 93
    Points : 78
    Points
    78
    Par défaut
    Reponse par pm de Sanguko

    En mode rgb, une couleur est codée sur 32 bits. 8 bits pour le rouge, 8 pour le vert, 8 pour le bleu (et 8 pour la transparence, mais on peut oublier pour le moment).
    8 bits, ca fait de valeurs de 0 à 255 pour chaque composant.
    Si toutes les composants sont à 0, ca fait du noir. Si toutes les composantes rouge,vert, bleu sont a 255 ca fait du blanc.
    Dans un int, les bits pour le rouge sont entre le 16eme et 24eme bits, pour le vert entre le 8 et le 16eme, et entre 0 et 8 pour le bleu
    Le rouge vif correspond donc à 0x00FF0000, le vert 0x0000FF00, et le bleu 0x000000FF.
    Apres on peut melanger du rouge et du vert => 0x00FFFF00
    Pour obtenir un gris, il suffit de mettre la meme valeur pour chaque composante.
    Un gris clair (presque blanc) : Ox00F0F0F0
    Un gris foncé : 0x00404040

    Dans le code que j'ai fourni, mid est la valeur que je recopie pour chaque composant.
    Quand j'ecris (mid<<16), je mets mid pour la composant rouge.

    Ecrire ngb=mid, c'est simplement mettre mid dans la composante bleue.
    maintenant une autre petite question :
    Sauf si je ne me trompe ma variable ndg contient des valeurs de 0 à 255 qui correspondent aux 256 niveaux de gris.
    Lorque je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int rgb = image.getRGB(x,y);
    int rouge = (rgb >>16 ) & 0xFF;
    int vert = (rgb >> 8 ) & 0xFF;
    int mid = (rouge + vert)/2;
    int ndg = 0xFF000000 | (mid<<16) | (mid<<8) | mid;
    gray.setRGB(x,y,ndg);
    pas de problème j'obtiens bien mon image en niveaux de gris comme je le désirais. Maintenant lorsque je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int rgb = pict.getRGB(x,y);
    int rouge = (rgb >>16 ) & 0xFF;
    int vert = (rgb >> 8 ) & 0xFF;
    int mid = (rouge + vert)/2;
    int ndg = 0xFF000000 | (mid<<16) | (mid<<8) | mid;
    gray[y][x] = ndg;
    (gray[x][y] étant un tableau d'entier) afin de pouvoir un histogramme (un autre tableau d'entier de 256 cases correspondant chacune à un niveau de gris ), il me met erreur ArrayIndexOutOfBoundsException mes premières valeurs étant : -16382458 -16448251 -16514044 ...
    Je crois que j'ai du louper quelque chose...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Sauf si je ne me trompe ma variable ndg contient des valeurs de 0 à 255 qui correspondent aux 256 niveaux de gris.
    Oui et non.
    Il y a effectivement 256 niveaux, mais voila comment sont representées ces 256 niveaux sur ngb et mid

    indice mid ngb
    0 => 0x00 0xFF000000
    1 => 0x01 0xFF010101
    2 => 0x02 0xFF020202
    ...

    254 => 0xFE 0xFFFEFEFE
    255 => 0xFF 0xFFFFFFFF

    Tu utilises ngb pour remplir ton tableau. Ces valeurs converties en decimal sont des entiers negatifs. D'ou l'exception, puisque tu pensais avoir des entiers entre 0 et 255.

    Tu peux mettre mid dans ton tableau, meme si ce n'est pas rigoureusement correct (il faudrait demander le resultat de la conversion, peut être par le colormodel associé à l'image, pour obtenir l'index du gris positionné via setRGB)

  7. #7
    Membre régulier Avatar de zolotaya
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 93
    Points : 78
    Points
    78
    Par défaut
    c'est bon problème résolu

    pour garder des valeurs comprisent entre 0 et 255 j'ai fait comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int rgb = pict.getRGB(x,y);
    int rouge = (rgb >>16 ) & 0xFF;
    int vert = (rgb >> 8 ) & 0xFF;
    int mid = (rouge + vert)/2;
    ndg = 0x000000FF & mid;
    gray[y][x] = ndg;
    Merci pour votre aide

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

Discussions similaires

  1. Flux d'images et conversion de type
    Par momo_oca dans le forum OpenCV
    Réponses: 0
    Dernier message: 05/03/2013, 18h44
  2. conversion de type d'une image avec openCv
    Par etn_esstt dans le forum C++
    Réponses: 0
    Dernier message: 18/06/2012, 19h07
  3. Erreur de conversion de type binary to image
    Par nabil1 dans le forum Windows Presentation Foundation
    Réponses: 9
    Dernier message: 21/10/2010, 23h19
  4. Conversion du type d'une image
    Par ToTo13 dans le forum Interfaces Graphiques en Java
    Réponses: 6
    Dernier message: 21/10/2009, 10h38
  5. Bibliothèque de conversion de types d'images?
    Par mamelouk dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 17/08/2007, 16h34

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