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 :

descripteur de couleurs dominantes


Sujet :

Images

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 158
    Points : 64
    Points
    64
    Par défaut descripteur de couleurs dominantes
    Bonjour,

    Je souhaite implémenté un descripteur de k couleurs dominantes d'une image RGB. Alors, j'ai essayé d'extraire les couleurs d'une images RGB en utilisant la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uRGB = unique(reshape(I,[],3),'rows');
    cette fonction a permit de retrouver la palette de couleur de l'image puis je l'ai utilisé pour construire une image RGB indexé en utilisant la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        [X1,map1] = rgb2ind(I,uRGB(1:65536,:));
    et puis j'ai calculé l'histogramme de couleurs de l'image indexé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [counts1,x1] = imhist(X1,map1);
    enfin j'ai trié les valeurs de l'histogramme pour extraire les 5 premiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        [sortedValues1,sortIndex1] = sort(counts1(:),'descend');      maxIndex1 = sortIndex1(1:5);
    mais après avoir testé tout ça, je n'obtient un bon résultat

    Est ce qu'il y a quelque chose qui ne va pas dans cette démarche.

    Merci de m'aider.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Combien y-a-t-il de couleurs dans l'image ?

    Que renvoie ceci ?

    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    Re,

    La taille varie d'une image à une autre. Pour certaine ça dépasse 65536.

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Dans ce cas, pourquoi ne pas faire simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [X1,map1] = rgb2ind(I,65536);
    Sinon, tu laisses des triplets RGB de coté.
    Ceux correspondant aux indices 65537 et plus

    D'ailleurs, le terme couleur est ambigu. A une couleur donnée, comme le rouge par exemple, correspond une gamme de triplet RGB (255,0,0), (255,1,0),(255,1,1)...

    Dans ton cas, une couleur "dominante" est-elle un triplet unique RGB ou bien une nuance de couleur ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    Il paraît que j'ai trop de choses à comprendre.

    J'ai cru qu'on faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uRGB = unique(reshape(I,[],3),'rows');
    et puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     [X1,map1] = rgb2ind(I,uRGB(1:65536,:));
    je vais créer une palette de couleur à partir des couleurs de l'image.
    Et comme la fonction rgb2ind nécessite une map de 65536, je prends uniquement les 65536 premiers couleurs.

    Est ce que c'est faux ce que j'ai comprit??

    deuxièmement, quel est la différence entre une couleur dominante et une nuance de couleur? Une nuance de couleur n'est t elle pas aussi un triplet de couleurs unique??

    Mercu

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Avant de commencer une explication, pourrais-tu me dire ce que retourne ceci ?

    et

    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 158
    Points : 64
    Points
    64

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Citation Envoyé par mar1985 Voir le message
    deuxièmement, quel est la différence entre une couleur dominante et une nuance de couleur? Une nuance de couleur n'est t elle pas aussi un triplet de couleurs unique??
    Prenons un exemple simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    R = [255 255 ; 255 255];
    G = [  0  10 ;   5   5];
    B = [  0   0 ;  10   5];
     
    RGB = cat(3,R,G,B);
     
    image(RGB/255)
    axis image off
    L'image affichée (voir image attachée) contient 4 pixels de couleur "rouge" avec 4 triplets de valeur RGB différents. Donc la couleur dominante est bien le rouge, mais pour quel triplet RGB ?

    Dans ton cas, vu le nombre de triplets RGB uniques dans ton image, je pense que tu devrais plutôt utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [X,map] = rgb2ind(RGB, n)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [X,map] = rgb2ind(RGB, tol)
    A toi de régler le second argument de rgb2ind selon ton problème.

    Prend le temps de lire la documentation de rgb2ind
    Images attachées Images attachées  
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  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 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Pour ta question principale, le mieux est de partir d'un exemple très simple (voir l'image attachée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    R = [255   0 255 ;   0   0   0 ; 255 255 255];
    G = [  0   0   0 ;   0 255   0 ;   0 255   0];
    B = [  0 255   0 ; 255   0 255 ;   0   0   0];
     
    RGB = cat(3,R,G,B);
     
    image(RGB/255)
    axis image off
    Voici comment déterminer la fréquence d’apparition de chaque triplet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [X,map] = rgb2ind(RGB,4);
     
    [c,x] = imhist(X,map);
     
    [map c]
    ce qui renvoie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         1     0     0     4
         0     0     1     3
         0     1     0     1
         1     1     0     1
    ou d'une manière alternative :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [uRGB,a,b] = unique([R(:) G(:) B(:)],'rows');
     
    n = histc(b,1:max(b));
    qui renvoie bien aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         0     0   255     3
         0   255     0     1
       255     0     0     4
       255   255     0     1
    (il suffit de diviser les trois premières colonnes par 255)
    Images attachées Images attachées  
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  10. #10
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    Bonjour,

    merci pour tes explications, je suis entrain de revoir la définition de la fonction rgb2ind et de voir les tests que tu as fait. Mais j'ai une question : dans ton dernier code, tu as mit comme deuxième argument de la fonction rgb2ind la valeur 4. Pourquoi?

  11. #11
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Simplement parce qu'il y a 4 couleurs dans l'image (rouge, vert, bleu et jaune)
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  12. #12
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    Regardez, en testant le code avec l'image attachée (où c'est très visible de la couleur dominante est le rouge).

    en voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    R = [ 255 0 255; 255 0 255]
    G = [10 255 20; 30 255 0]
    B = [20 0 20; 10 0 30]
    mais comme il y a l'unique triplet RGB (green) qui apparaît dans deux pixels alors que les autres ton du rouge apparaissent chacun dans un seul pixel donc la couleur dominante qui a été retrouvé c'est plutôt le vert
    Images attachées Images attachées  

  13. #13
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Avant tout, j'ai fait une erreur dans les exemples d'utilisation de rgb2ind que j'ai écris précédemment
    Si la variable RGB est de classe Double, il faut diviser ces valeurs par 255 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [X,map] = rgb2ind(RGB/255,2);
    ou bien passer en classe uint8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [X,map] = rgb2ind(uint8(RGB),2);
    Mais cela ne change rien à ton problème.

    Citation Envoyé par mar1985 Voir le message
    mais comme il y a l'unique triplet RGB (green) qui apparaît dans deux pixels alors que les autres ton du rouge apparaissent chacun dans un seul pixel donc la couleur dominante qui a été retrouvé c'est plutôt le vert
    C'est ce que j'essaye de t'expliquer.

    Dans cet exemple, on peut considérer qu'il n'y a en fait que 2 couleurs (rouge et vert).

    On peut donc faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    R = [255   0 255 ; 255   0 255];
    G = [ 10 255  20 ;  30 255   0];
    B = [ 20   0  20 ;  10   0  30];
     
    RGB = cat(3,R,G,B);
     
    [X,map] = rgb2ind(RGB/255,2);
     
    [c,x] = imhist(X,map);
     
    [map c]
    ce qui renvoi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
             0    1.0000         0    2.0000
        1.0000    0.0588    0.0784    4.0000
    La couleur dominante est donc bien le rouge (4 pixels) mais la valeur du triplet correspondant n'est pas (1,0,0) mais (1,0.0588,0.0784).

    Donc ton problème consiste donc à bien choisir la valeurs du second argument de rgb2ind
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  14. #14
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    Justement, c'est exactement ça mon problème.

    Le choix du deuxième argument est très important. Comme je ne connais pas à priori le nombre de couleur dans mon image, j'ai essayé de calculer la palette de couleur de l'image et puis d'utiliser cette palette comme deuxième argument de la fonction rgb2ind.

    Je croyais qu'on utilisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    uRGB = unique(reshape(I,[],3),'rows');
    je pourrai retrouver une palette de couleurs ce qui ne correspond pas exactement à mon problème
    car là ce que rend cette fonction c'est plutôt les triples RGB unique.

  15. #15
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Citation Envoyé par mar1985 Voir le message
    Le choix du deuxième argument est très important.
    Exactement, et malheureusement, on ne peut pas vraiment t'aider plus sur le forum MATLAB.

    A part de dire de lire la documentation de rgb2ind et particulièrement le bloc "More about" (en cliquant sur Tips) tout en bas de cette page et éventuellement de lire ceci : Color quantization

    C'est un problème d'algorithmique/méthode, tu peux poser ta question dans le forum Algorithmique > Images
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  16. #16
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    ok, merci

Discussions similaires

  1. descripteur de couleurs dominantes
    Par mar1985 dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 28/02/2013, 22h57
  2. [XL-2003] Faire apparaître une couleur dominante dans une barre de progression.
    Par Ledaf dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 22/09/2010, 11h24
  3. couleur dominante ?
    Par automa dans le forum Images
    Réponses: 12
    Dernier message: 21/03/2010, 06h45
  4. la couleur dominante d'une image RGB
    Par aichaeside dans le forum Images
    Réponses: 7
    Dernier message: 25/06/2009, 15h56
  5. [ImageMagick] Couleur dominante d'une image
    Par matique dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 03/07/2006, 15h24

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