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 :

Réduire le nombre de couleurs d'une image via la méthode Fuzzy C-Mean


Sujet :

Images

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut Réduire le nombre de couleurs d'une image via la méthode Fuzzy C-Mean
    Bonjour,

    Voilà mon problème :

    Je dispose d'une image que j'ai chargée via la commande "imread" de Matlab.
    J'aimerai réduire cette image à 256 couleurs via la méthode des fuzzy c-means.

    Ma matrice Im ayant chargé mon image est de taille M*N*3 parce qu'elle est de base en mode RVB (je suppose avec la commande imread, non ?)

    Il s'avère que si je fais fcm(Im, 256), le logiciel m'indique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ??? Error using ==> mtimes
    Integers can only be combined with integers of the same
    class, or scalar doubles.
     
    Error in ==> stepfcm at 25
    center = mf*data./((ones(size(data, 2), 1)*sum(mf'))'); % new
    center
     
    Error in ==> fcm at 88
    	[U, center, obj_fcn(i)] = stepfcm(data, U, cluster_n,
        expo);
     
    Error in ==> Script_Main at 13
    fcm(picture,265)
    Je pense que c'est dû à mon image qui est de taille m*n*3, mais je ne sais comment faire autrement.

    L'objectif étant de réduire l'image en 256 couleurs via la fcm, ne devrais-je pas avant faire un histogramme des couleurs ?
    Si oui comment ? car je travaille sur la RVB.

    Si je me suis mal exprimé ou que vous avez besoin de plus d'explications, n'hésitez pas
    Merci d'avance

  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 165
    Points
    53 165
    Par défaut
    Les valeurs des pixels de l'image lue avec IMREAD sont codées dans une classe de type uint8 (ou semblable...) contenant des valeurs entières

    Or tu essaie de faire des opérations entre ces valeurs entières et d'autres définies sous MATLAB en classe Double définie pour les nombres réels. Ce qui entraine le message d'erreur.

    Une solution consiste à convertir les valeurs entières en valeurs réelles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    I = imread(...);
     
    I = double(I);
    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 à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Merci pour l'explication car je ne comprenais pas le message d'erreur.
    La matrice est bien de type double.
    Cependant il en apparaît un nouveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ??? Error using ==> mtimes
    Input arguments must be 2-D.
     
    Error in ==> stepfcm at 25
    center = mf*data./((ones(size(data, 2), 1)*sum(mf'))'); % new center
     
    Error in ==> fcm at 88
    	[U, center, obj_fcn(i)] = stepfcm(data, U, cluster_n, expo);
     
    Error in ==> Script_Main at 14
    fcm(picture,265) 
    >>
    Serait-ce mon utilisation de fcm qui est mauvaise ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    picture = imread('test.jpg');
    picture=double(picture);
    fcm(picture,256)

  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 165
    Points
    53 165
    Par défaut
    Ton image est une image en couleurs vraies. La couleur de chaque pixel est codée avec 3 valeurs, typiquement dans l'espace RGB. C'est pourquoi la matrice picture est de taille mxnx3

    Dans ton cas, soit tu appliques la multiplication à chaque couche de picture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fcm(picture(:,:,1),256);
    fcm(picture(:,:,2),256);
    fcm(picture(:,:,3),256);
    soit tu passes à une image en couleur indexées pour obtenir une matrice 2D mxn avec, par exemple, la fonction RGB2IND :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    picture = rgb2ind(picture);
    fcm(picture,256);
    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 à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par Dut Voir le message
    soit tu passes à une image en couleur indexées pour obtenir une matrice 2D mxn avec, par exemple, la fonction RGB2IND :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    picture = rgb2ind(picture);
    fcm(picture,256);
    J'ai le message d'erreur suivant, il semblerait qu'il faut que je donne un nombre de couleur en deuxième argument de rgb2ind, mais je ne sais pas comment le récolter puisque cela va dépendre de chacune de mes images.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ??? Error using ==> rgb2ind>parse_inputs at 131
    RGB2IND(RGB) is a deprecated syntax.
    Specify number of colors, tolerance, or colormap.
     
    Error in ==> rgb2ind at 50
    [RGB,m,dith] = parse_inputs(varargin{:});
     
    Error in ==> Script_Main at 21
    pict = rgb2ind(picture);

  6. #6
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Voilà l'évolution de la situation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function RunScript()
    global picture
     
    image(picture);
    [image_indexee, map] = rgb2ind(picture,65536);
    % Point 1
    figure()
    image_indexee=double(image_indexee);
    variable = fcm(map,256);
    image(image_indexee),colormap(variable);
    % Point 2
     
    end
    Voici l'image que j'ai au point 1


    Et celle que j'ai au point 2 :


    Lorsque je fais fcm(map,256), je réduis le nombre de couleurs (de l'indexe) à 256.
    Comment faire pour que les pixels de mon image pointent alors sur les bonnes couleurs ainsi réduites ? Parce que à la vue de l'image 2, il me semble que les pixels ne pointent pas sur les bonnes couleurs...

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    pourquoi utilises-tu fcm? C'est une méthode de clustering, il y a plus simple pour indéxer une image, non?

    Parce que à la vue de l'image 2, il me semble que les pixels ne pointent pas sur les bonnes couleurs...
    Oui, puisque tu n'as pas définis de colormap sur laquelle les indices doivent pointer.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  8. #8
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Voilà le code (mis en bloc donc moche mais c'est plus pratique à relire ici)

    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
     
    % on charge l'image et on l'affiche
    picture = imread('test3.JPG');
    image(picture);
     
    % On passe en image d'index et on l'affiche
    [image_indexee, map2] = rgb2ind(picture,65536);
    figure;
    image(image_indexee),colormap(map2);
     
    % application de la fcm
    [CENTER, Mat_flou, OBJ_FCN] = fcm(map2,256);
     
    [p,q] = size(Mat_flou);
    max_table_flou=cell(1,p);
     
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %  Récupération du maximum du flou du fcm %
    % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        for k=1:p
            [t,u]=max(Mat_flou(k,:));
            max_table_flou{k}=u;
        end
     
     
     
    % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %  Algorithme permettant de savoir à quelle classe ont été affectées les couleurs
    % et permet de remettre à jour l'index en conséquence
    % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    [m,n]=size(image_indexee);
    for i=1:m
        for j=1:n
            for indice=1:length(max_table_flou);
                if image_indexee(i,j)==max_table_flou{indice}
                image_indexee(i,j)=indice;
                end
            end
        end
    end
     
    % affichage de l'image réduite en couleur et réindexée
    figure;
    image(image_indexee),colormap(CENTER);
    Voilà les images en résultant (cf les "figure" dans le code)




    On voit bien qu'il y a un problème, ou à la ré indexation, ou à la méthode de fcm.
    Cette dernière serait elle inappropriée pour l'ensemble des couleurs ?

    Je commence à me perdre

Discussions similaires

  1. [Débutant] nombre de couleurs dans une image
    Par amal1410 dans le forum Images
    Réponses: 1
    Dernier message: 25/04/2013, 09h37
  2. nombre couleurs d'une image
    Par marko1587 dans le forum Traitement d'images
    Réponses: 13
    Dernier message: 06/02/2013, 17h46
  3. [Débutant] augmenter le nombre de colonne d'une image en couleur
    Par math_infomatique dans le forum Images
    Réponses: 3
    Dernier message: 23/11/2012, 19h06
  4. Réponses: 4
    Dernier message: 20/11/2007, 13h22
  5. [Image]Nombre de couleur d'une image
    Par daxuza dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 05/09/2005, 08h14

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