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

Images Discussion :

Sauvegarde d'image en fausse couleurs [Débutant]


Sujet :

Images

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 89
    Points : 85
    Points
    85
    Par défaut Sauvegarde d'image en fausse couleurs
    Bonjour,

    Je suis devant un problème qui je pense est assez basique, mais auquel je n'ai pas trouvé de réponse..

    J'ai un programme qui me crée une image de taille modeste (145x145) en double et qui prend des valeurs entre 0 et 16. Je l'affiche en fausse couleurs plutôt qu'en niveaux de gris (question de visibilité)
    J'aimerai pouvoir sauvegarder cette image en conservant l'affichage de ces fausses couleurs

    J'ai donc essayé plusieurs trucs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    saveas(figure(1),'classification map.png');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >> imwrite(classif_map,'classification map.jpeg','jpeg');
    J'ai essayé plusieurs formats pour le "imwrite" (.bmp, gif,png, jpeg)

    Mais le problème, c'est que le résultat est toujours en noir et blanc (binaire)... (ça c'est pour "imwrite")
    Avec "saveas", ça me sauve l'image en couleur, mais je suis obligé d'ouvrir une fenêtre et en plus je ne peux pas réutiliser cette image directement dans Matlab car du coup, je récupère une image ou il y a des axes, des zones de blancs, enfin c'est le bordel quoi..

    Donc voilà, j'ai essayé de farfouiller l'aide de "saveas" et "imwrite", j'ai un peu regardé dans les forums, mais j'ai pas trouvé.

    Si quelqu'un peut m'aider (me dire ou je me plante ou m'indiquer un lien vers un post traitant du topic que j'ai loupé..), ça serait vraiment cool!!

    Merci d'avance,
    Kévin

  2. #2
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Est ce que tu as essayé avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >> doc getimage
    >> doc print
    >> doc hgsave

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 316
    Points : 52 951
    Points
    52 951
    Par défaut
    L'idée est de passer d'un image en niveaux de gris (grayscale) à une image indexée (indexed)

    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    X = rand(145)*16;
     
    numColors = 256; % Valeur maximale à ne pas dépasser
     
    X = X-min(X(:));
    X = X./max(X(:));
     
    X = uint8(X*(numColors-1));
    Ensuite au choix :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    imwrite(X,jet(numColors),'test.bmp','bmp')
     
    imwrite(X,jet(numColors),'test.gif','gif')
     
    imwrite(X,jet(numColors),'test.tiff','tiff')
    On peut remplacer JET par n'importe quelle palette de couleur (voir COLORMAP)

    Le problème de cette méthode est que les valeurs des pixels enregistrées sont différentes de celles de départ. Ceci est dû à la conversion classe Double => classe uint8. Il y a donc perte d'information

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 89
    Points : 85
    Points
    85
    Par défaut
    Salut,
    Merci pour vos réponses.

    kmaniche, j'ai regardé tes propositions, mais le "getimage" me permet juste de mettre dans une variable ce qu'il ya dans la figure pointée, or moi, j'ai deja la matrice stockée qqpart (et il faut aussi ouvrir une fenêtre exprès pour pouvoir sauver l'image). Le print, j'avoue que j'ai pas tout capté...
    et le "hgsave", j'ai du mal m'en servir car ça ne me sauvegardait rien...
    Mais merci quand même!

    Dut, j'ai essayé tes trucs, ça marche! Mais j'ai quand même une petite question (voire plus..) :

    Tout d'abord, pourquoi la conversion en "uint8"? Je l'ai fait en conservant le format "double" et ça marche aussi.

    Ensuite, pour le paramètre "Numcolor" que tu utilise dans ton exemple, si mes images ne prennent que des valeurs entières entre 0 et 16, est-il judicieux de mettre la valeur max à 255 et pas à 16? Je dis ça parce que j'ai essayé à 255 et là pour le coup, vu que mes pixels ont tous des valeurs proches de 0, toute l'image se retrouve en nuances de bleu, donc on voit pas grand chose..

    Et enfin, j'ai essayé de sauvegarder en '.gif', et quelque soit la valeur de 'Numcolor' que je mette (10, 16,255), j'ai toujours le message d'avertissement
    Warning: Image data contains values that are out of range. Out of range values will be given the
    nearest valid value.
    > In imagesci\private\writegif at 339
    In imwrite at 406
    (j'ai ce message si je suis en 'uint8' ou 'double')

    A part ce message, l'image que j'obtiens est correcte.. Est-ce que tu as une idée du pourquoi de ce message? (c'est pas une question très urgente, donc si t'as pas le temps de répondre de suite, c'est pas grave)


    Encore merci de vos réponses!!
    Kévin

  5. #5
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 316
    Points : 52 951
    Points
    52 951
    Par défaut
    Alors... on va prendre 5 minutes pour essayer d'expliquer calmement les choses
    Citation Envoyé par kevin07 Voir le message
    Tout d'abord, pourquoi la conversion en "uint8"? Je l'ai fait en conservant le format "double" et ça marche aussi.
    On peut lire dans la documentation de la fonction IMWRITE :

    imwrite(X,map,filename,fmt) writes the indexed image in X and its associated colormap map to filename in the format specified by fmt. [...] If X is of class double, imwrite offsets the values in the array before writing, using uint8(X–1).
    Donc soit on le fait soit même avec MIN/MAX/UINT8, soit on sait que IMWRITE le fait tout seul.

    Citation Envoyé par kevin07 Voir le message
    Ensuite, pour le paramètre "Numcolor" que tu utilise dans ton exemple, si mes images ne prennent que des valeurs entières entre 0 et 16, est-il judicieux de mettre la valeur max à 255 et pas à 16? Je dis ça parce que j'ai essayé à 255 et là pour le coup, vu que mes pixels ont tous des valeurs proches de 0, toute l'image se retrouve en nuances de bleu, donc on voit pas grand chose..
    Si les valeurs sont entières en comprise dans l'intervalle [0 16], il y a 17 valeurs... il faut donc mettre numColors à 17

    Mais dans ce cas, il n'y a pas besoin d'utiliser MIN et MAX pour normaliser les valeurs. Le code que j'ai donné sert à étaler les valeurs si celles-ci ne sont justement pas entières. Il suffit alors simplement de modifier la classe Double en classe uint8 avec la fonction UINT8

    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
    >> X = 0:16
     
    X =
     
         0     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16
     
    >> class(X)
     
    ans =
     
    double
     
    >> X = uint8(X)
     
    X =
     
        0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16
     
    >> class(X)
     
    ans =
     
    uint8
    Citation Envoyé par kevin07 Voir le message
    Et enfin, j'ai essayé de sauvegarder en '.gif', et quelque soit la valeur de 'Numcolor' que je mette (10, 16,255), j'ai toujours le message d'avertissement
    (j'ai ce message si je suis en 'uint8' ou 'double')
    Warning: Image data contains values that are out of range. Out of range values will be given the
    nearest valid value.
    > In imagesci\private\writegif at 339
    In imwrite at 406
    Le message dit juste que la valeur maximale contenue dans la matrice moins 1 => max(X)-1 est supérieur au nombre de couleur de la palette. ET que MATLAB tronque donc ces valeurs

    Par exemple pour une palette avec 16 couleurs avec des valeurs de pixel codées sur 8bits (uint8) :
    • La 1ère couleur de la palette correspond à la valeur 0 de la matrice
    • La 2ème couleur de la palette correspond à la valeur 1 de la matrice
    • La 3ème couleur de la palette correspond à la valeur 2 de la matrice
    • ...
    • La 15ème couleur de la palette correspond à la valeur 14 de la matrice
    • La 16ème couleur de la palette correspond à la valeur 15 de la matrice


    Donc toutes les pixels de la matrice qui auraient une valeur supérieur à 15 se verrait attribuer la 16ème couleur de la palette. Il n'y a pas d'autre alternative.

    Ma tentative d'explications est-elle assez claire ?

    De toute façon, tout est écrit dans les documentations des fonctions IMWRITE/IMREAD/IMAGE/IMAGESC (mais en anglais )

  6. #6
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Pourtant ce n'était pas assez difficile
    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
     
        img = imread('rice.png') ;    
        imshow(img) ;
        colormap(hsv)
     
     
        f = getframe;              
        [im,map] = frame2im(f);
        if isempty(map)           
          rgb = im;
        else                       
          rgb = ind2rgb(im,map); 
        end
     
        imwrite(rgb, 'tst.png')
     
        figure
        imshow('tst.png')
    Le seul défaut, c'est que après la sauvegarde tu as la taille de l'image avec un pixel de plus sur chaque dimension ...

  7. #7
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 316
    Points : 52 951
    Points
    52 951
    Par défaut
    Citation Envoyé par kevin07 Voir le message
    Avec "saveas", ça me sauve l'image en couleur, mais je suis obligé d'ouvrir une fenêtre et en plus je ne peux pas réutiliser cette image directement dans Matlab car du coup, je récupère une image ou il y a des axes, des zones de blancs, enfin c'est le bordel quoi..
    Citation Envoyé par kmaniche Voir le message
    Pourtant ce n'était pas assez difficile
    kevin07 semble vouloir une solution qui ne nécessite pas l'ouverture d'une fenêtre et l'affichage de l'image.

    Il n'y a aucun intérêt à afficher une image avant de l'enregistrer dans un fichier. Ce ne sont que des données numériques.

    Prenez le temps de bien comprendre comment sont codées et stockées les images numériques... Ce n'est pas très sorcier. Le seul problème, c'est qu'il y a pas mal de cas et de formats possibles. On est donc souvent amené à lire et relire la documentation

  8. #8
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Citation Envoyé par Dut Voir le message
    kevin07 semble vouloir une solution qui ne nécessite pas l'ouverture d'une fenêtre et l'affichage de l'image.

    Il n'y a aucun intérêt à afficher une image avant de l'enregistrer dans un fichier. Ce ne sont que des données numériques.
    Exactement, j'ai suivi sa réflexion, tu moment qu'il utilise saveas ...

  9. #9
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Il reste comme même une solution, à tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    img = imread('rice.png') ;
     
    imwrite(img, colormap(jet(256)), 'tst.png')
     
    imshow('tst.png')

  10. #10
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 89
    Points : 85
    Points
    85
    Par défaut
    Merci beaucoup à tous les deux pour le temps que vous avez pris pour me répondre.
    Problème résolu et compris!

    Merci encore pour les explications détaillées Dut!

    Kévin

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

Discussions similaires

  1. afficher une image fausse couleur
    Par ayachimi dans le forum Images
    Réponses: 1
    Dernier message: 24/05/2012, 21h14
  2. sauvegarde d'une image : probleme de couleurs
    Par kevin07 dans le forum Images
    Réponses: 4
    Dernier message: 06/05/2010, 12h05
  3. Traitement d'images en fausses couleurs
    Par rom31 dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 19/11/2008, 11h55
  4. Réponses: 1
    Dernier message: 30/11/2005, 17h12
  5. [image] trouver les couleurs les plus présentes
    Par giminik dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 25/01/2005, 03h35

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