none
Detecter les couleurs d'une image RRS feed

  • Question

  • Bonjour,

    Dans mon programme, gestion philatelique.

    J'aimerai faire un utilitaire qui me permete de detecter la/les couleurs(s) d'une image (timbre)

    Je n'ai pas la moindre idée de comme lire le code couleur (R G B).

    Merci de votre aide

    Cordialement

    Salva

    jeudi 6 septembre 2012 10:47

Réponses

  • Bonjour Salva,

    En me basant sur la référence de Patrice, voici un exemple:

    namespace CouleurPredominante
    {
      using System;
      using System.Collections.Generic;
      using System.Drawing;
      using System.Linq;
      using System.Windows.Forms;
    
      public partial class Form1 : Form
      {
        public Form1()
        {
          this.InitializeComponent();
        }
    
        private void ButtonGetColorClick(object sender, EventArgs e)
        {
          // Create a Bitmap object from an image file.
          Bitmap myBitmap = new Bitmap("forest.jpg");
    
          // Get the color of a pixel within myBitmap.
          Color pixelColor = myBitmap.GetPixel(50, 50);
          var dico = new Dictionary<Color, int>();
          for (int i = 1; i < myBitmap.Height; i++)
          {
            for (int j = 1; j < myBitmap.Width; j++)
            {
              pixelColor = myBitmap.GetPixel(j, i);
              if (dico.ContainsKey(pixelColor))
              {
                dico[pixelColor]++;
              }
              else
              {
                dico.Add(pixelColor, 1);
              }
            }
          }
    
          MessageBox.Show("La couleur dominante est: " + this.CouleurDominante(dico));
          IOrderedEnumerable<KeyValuePair<Color, int>> DicoTrie = dico.OrderByDescending(x => x.Value);
    
          MessageBox.Show(
            string.Format(
              "les trois premières valeurs sont: \n{0}\n{1}\n{2}",
              DicoTrie.First(),
              DicoTrie.ElementAt(1),
              DicoTrie.ElementAt(2)));
        }
    
        private Color CouleurDominante(Dictionary<Color, int> dic)
        {
          Color result = new Color();
          int plusGrandNombre = 0;
          foreach (var item in dic)
          {
            if (item.Value > plusGrandNombre)
            {
              plusGrandNombre = item.Value;
              result = item.Key;
            }
          }
    
          return result;
        }
      }
    }



    fred on youTube

    fred



    • Modifié fred75 vendredi 7 septembre 2012 13:22
    • Proposé comme réponse fred75 dimanche 9 septembre 2012 12:52
    • Marqué comme réponse Florin CiucaModerator vendredi 14 septembre 2012 14:25
    vendredi 7 septembre 2012 12:41

Toutes les réponses

  • Bonjour,

    La couleur de l'image est-elle unie ?

    ou bien désires-tu connaitre la couleur prépondérante ?

    Si c'est une couleur de timbre représentant un portrait (comme Simenon) quelle couleur dirais-tu que c'est ?


    fred on youTube

    fred

    jeudi 6 septembre 2012 21:57
  • Bonjour Fred75,

    Un timbre peu avoir plusieurs couleurs ou nuances de couleur.

    Ce que je veux faire c'est détecter les couleur/nuances et afficher les 3 couleurs dominantes, s'il y a plus de 3 couleurs.

    Cordialement

    Salva

    vendredi 7 septembre 2012 07:04
  • Bonjour,

    Techniquement voir http://msdn.microsoft.com/fr-fr/library/system.drawing.bitmap.getpixel.aspx si le problème de départ est de lire la couleur d'un point.

    Si c'est le calcul lui-même, je pense que créer des tranches de couleur et classez chaque pixel dans sa tranche pour prendre ensuite les tranches avec l'effectif le plus grand (sinon je crois que c'est souvent gérer avec des histogrammes de couleur mais ce n'est peut-être pas assez synthétique comme info dans ce cas).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    vendredi 7 septembre 2012 11:45
    Modérateur
  • Bonjour,
     
    Et peut-être travailler avec le codage HSV des couleurs plutôt que le RGB.
    (Si besoin j'ai des fonctions de conversion mais en vb)
     

    Fred
    vendredi 7 septembre 2012 12:03
  • Bonjour Salva,

    En me basant sur la référence de Patrice, voici un exemple:

    namespace CouleurPredominante
    {
      using System;
      using System.Collections.Generic;
      using System.Drawing;
      using System.Linq;
      using System.Windows.Forms;
    
      public partial class Form1 : Form
      {
        public Form1()
        {
          this.InitializeComponent();
        }
    
        private void ButtonGetColorClick(object sender, EventArgs e)
        {
          // Create a Bitmap object from an image file.
          Bitmap myBitmap = new Bitmap("forest.jpg");
    
          // Get the color of a pixel within myBitmap.
          Color pixelColor = myBitmap.GetPixel(50, 50);
          var dico = new Dictionary<Color, int>();
          for (int i = 1; i < myBitmap.Height; i++)
          {
            for (int j = 1; j < myBitmap.Width; j++)
            {
              pixelColor = myBitmap.GetPixel(j, i);
              if (dico.ContainsKey(pixelColor))
              {
                dico[pixelColor]++;
              }
              else
              {
                dico.Add(pixelColor, 1);
              }
            }
          }
    
          MessageBox.Show("La couleur dominante est: " + this.CouleurDominante(dico));
          IOrderedEnumerable<KeyValuePair<Color, int>> DicoTrie = dico.OrderByDescending(x => x.Value);
    
          MessageBox.Show(
            string.Format(
              "les trois premières valeurs sont: \n{0}\n{1}\n{2}",
              DicoTrie.First(),
              DicoTrie.ElementAt(1),
              DicoTrie.ElementAt(2)));
        }
    
        private Color CouleurDominante(Dictionary<Color, int> dic)
        {
          Color result = new Color();
          int plusGrandNombre = 0;
          foreach (var item in dic)
          {
            if (item.Value > plusGrandNombre)
            {
              plusGrandNombre = item.Value;
              result = item.Key;
            }
          }
    
          return result;
        }
      }
    }



    fred on youTube

    fred



    • Modifié fred75 vendredi 7 septembre 2012 13:22
    • Proposé comme réponse fred75 dimanche 9 septembre 2012 12:52
    • Marqué comme réponse Florin CiucaModerator vendredi 14 septembre 2012 14:25
    vendredi 7 septembre 2012 12:41
  • Bonjour,

    Merci pour vos réponses.

    Je vais lire et appliquer ce que vous me conseillé.

    Cordialement

    Salva

    samedi 8 septembre 2012 05:39