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 :

Problème pour faire l'histogramme d'une image type png


Sujet :

Images

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par défaut Problème pour faire l'histogramme d'une image type png
    Bonjour à tous,

    Je travaille sur une image png et je souhaiterais pouvoir en faire l'histogramme. Je travaille sous Matlab 7.5.0 (R2007b) et je ne dispose pas de la ToolBox MatLab.

    Voilà ce que je fais :
    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
    img = 'monimage.png';
     
    mat = double(imread(img));
    [nl,nc,osf] = size(mat);
     
    for i = 1:nl
        for j = 1:nc
            mat2(i,j) = mat(i,j);
        end
    end
     
    % Affichage de l'image
    figure(1); imagesc(mat2); colormap(gray);
     
    % Histogramme
    figure(2); hist(mat2); colormap(gray); grid on;
    Je passe par une boucle for car imread me rend une matrice à 3 dimensions (incompatible avec la fonction hist) :
    nl = 360 (OK), nc = 360 (OK) et osf = 3... c'est quoi, ce 3 ?

    De plus, l'histogramme ne me semble pas bon car il ne comporte visiblement aucun pixel de valeur nulle. Or, mon image possède une zone d'ombre noire de valeur nulle !

    Pourtant, ça ne m'a pas l'air sorcier, ce que je veux faire...
    Quelqu'un pourrait m'aider, s'il vous plait ?

  2. #2
    Membre éprouvé
    Avatar de mihaispr
    Inscrit en
    Décembre 2008
    Messages
    1 025
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 025
    Par défaut
    Salut!

    Donc premierement il te faut Image Processing Toolbox pour faire ton projet.

    Puis verifie si tu as installe ce Toolbox (Image Processing Toolbox une version)en matlab.

    Dans command window du matlab tappes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    >>ver %>> c'est le symbole du curseur en matlab
    Si tu l'as c'est ok.

    Mais si c'est comme tu dis qu'il n'existe pas fais comme ca:

    Si tu ne rencontres pas le toolbox il faut que tu decharges une version trial de ce toolbox et l'installer dans le dossier toolbox du logiciel matlab.

    Ici le lien pour le télécharger:
    http://www.mathworks.com/applications/imageprocessing/ (en bas 'Trials Available c'est un version trial de 15 jours si je ne me trompe pas).

    J'espere de t'avoir aide!

    Qu'apparait dans le command window quand tu lances ton script?

    Quelles sont donc tes messages d'erreurs?

    Bonne chance,

    Michel

  3. #3
    Membre éprouvé
    Avatar de mihaispr
    Inscrit en
    Décembre 2008
    Messages
    1 025
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 025
    Par défaut
    et osf = 3... c'est quoi, ce 3 ?
    En command window tappes whos:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    >>whos osf %whos nom_variable
    Je crois que 3 vient du fait que tu as une image 3D et tu dois le convertir dans une image 2D (gray level ou binaire) je te conseille graylevel.

    Pour ca tu as la fonction rgb2gray.

    Lis la documentation avec l'example fourni :

    Et mets ici ce qu'il te donne!

  4. #4
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Je passe par une boucle for car imread me rend une matrice à 3 dimensions (incompatible avec la fonction hist) :
    nl = 360 (OK), nc = 360 (OK) et osf = 3... c'est quoi, ce 3 ?
    Une image posséde 03 bandes de couleurs, ici 1=> rouge, 2=> vert et 3 => bleu.

    Si tu veux voir son histogramme commence par tracer l'histogramme correpondant à chaque bandes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    >> doc hist
     
    >> doc bar
     
    >> doc plot

  5. #5
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    img = 'peppers.png';
    mat = rgb2gray(imread(img));
     
    ht = hist(double(mat)) ;
    plot(ht)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par défaut
    Re-bonjour !
    Merci pour vos réponses, toujours aussi rapide sur ce forum

    Je réponds d'abord à Michel : merci pour ton aide mais je préfèrerai éviter l'utilisation de la ToolBox vu que je ne sais pas pendant combien de temps je devrai manipuler ces images (je suis en stage de 6 mois...). A voir avec mon responsable de stage, qui est absent aujourd'hui.

    Entre-temps, j'ai plus ou moins réussi à faire ce que je voulais avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    matTmp = double(imread(img,'png'));
    [nl,nc,osf] = size(matTmp);
    mat = zeros(nl,nc);
    for i = 1:nl*nl
        mat(i) = matTmp(i);
    end
    
    % Affichage de l'image
    figure(1); imagesc(mat); colormap(gray);
    
    % Histogramme
    figure(2); hist(mat); colormap(gray); grid on;
    ...ce qui est le même code qu'avant (juste modif de la boucle for). Je me sers de l'histogramme pour faire des seuillages sur mon image, donc dans un premier temps, cette solution me convient.

    Citation Envoyé par kmaniche Voir le message
    Une image posséde 03 bandes de couleurs, ici 1=> rouge, 2=> vert et 3 => bleu.

    Si tu veux voir son histogramme commence par tracer l'histogramme correpondant à chaque bandes.
    Merci pour ces infos supplémentaires ! C'est bien ce que je me disais ^^ Mais je fais comment pour tracer l'histogramme correspondant à chaque bande ? Un truc du genre
    ?... Et ensuite, comment je peux l'utiliser ?

    Ah, et merci pour le bout de code (arrivé entretemps), mais je crois que je ne dispose pas de la fonction rgb2gray :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ??? Undefined function or method 'rgb2gray' for input arguments of type 'uint8'.
    Bon, je crois que je vais m'arrêter là pour aujourd'hui et voir demain ce que je peux tirer de tout ça... Merci en tout cas pour vos messages !

  7. #7
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    effectivement : rgb2gray fait partie de la toolbox. tu peux la remplacer par :

    rgb2gray converts RGB values to grayscale values by forming a weighted sum of the R, G, and B components:
    0.2989 * R + 0.5870 * G + 0.1140 * B
    Note that these are the same weights used by the rgb2ntsc function to compute the Y component.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Matgr = 0.2989.*mat(:,:,1) + 0.5870.*mat(:,:,2) + 0.1140.*mat(:,:,3);

  8. #8
    Membre éprouvé
    Avatar de mihaispr
    Inscrit en
    Décembre 2008
    Messages
    1 025
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 025
    Par défaut
    Example affichage pour les trois bandes R-rouge, G-vert B-bleu

    Example histogramme 2D:

    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
     
    % Initialisation script
        clc       ;
        clear all ;
        close all ;
     
     
    % Lis l'image
       variable_image= imread('poza1.jpg') ;
     
    %Afficher avec subplot chaque histogramme pour chaque bande
     
     subplot(1,3,1) ;
     imhist( variable_image(:,:,1)); 
     Title('Histogramme bande R') ;
     
     
     subplot(1,3,2) ; 
     imhist( variable_image(:,:,2));
     Title('Histogramme bande G');
     
     subplot(1,3,3) ;
     imhist( variable_image(:,:,3)); 
     Title('Histogramme bande B') ;
    Documentation suplimentaire:

    En command window:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>doc imhist
    >>docsearch histogram
    Amicalment,

    Michel

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Citation Envoyé par kmaniche Voir le message
    effectivement : rgb2gray fait partie de la toolbox. tu peux la remplacer par :
    Voir la : Comment convertir une image RGB en niveaux de gris ?

    A noter que depuis la version R2009a de MATLAB, la fonction RGB2IND est disponible directement avec MATLAB => Functions Previously Only Available in the Image Processing Toolbox Now Available in MATLAB

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par défaut
    Mince, pour une fois, j'ai oublié de regarder dans la FAQ avant... mais faut dire que je ne pensais pas avoir à convertir mon image, à la base.
    Merci pour les bouts de code, Michel et kmaniche ! Et puis, avec vos explications, c'est beaucoup plus clair pour moi maintenant

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/04/2010, 19h17
  2. Problème pour faire la rotation d'une image(Avec ImageJ)
    Par tadjara dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 12/04/2010, 12h48
  3. Problème pour faire la rotation d'une image(Avec ImageJ)
    Par tadjara dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 10/04/2010, 12h33
  4. [ImageMagick] Générer un texte sur une image
    Par kevinf dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 29/11/2007, 15h21
  5. problème pour faire un insert avec une image
    Par vbcasimir dans le forum Modules
    Réponses: 3
    Dernier message: 02/11/2005, 10h21

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