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

Traitement d'images Discussion :

Réduction du nombre de couleurs d'une image


Sujet :

Traitement d'images

  1. #1
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 943
    Points : 1 290
    Points
    1 290
    Par défaut Réduction du nombre de couleurs d'une image
    Bonjour,

    Je cherche un algorithme de réduction du nombre de couleurs dans une image pour un besoin particulier.

    Il faut que l'image obtenue comporte des formes bien nettes, sans couleurs intermédiaires.

    Je vais prendre un exemple, ce sera plus parlant :

    Nom : Exemple.jpg
Affichages : 67
Taille : 27,4 Ko

    Cette image est en 24 bits, donc du fait de l'anti aliasing, il y a pas mal de pixels de couleurs intermédiaires entre les formes.

    L'objectif est d'obtenir une image "pixelisée" en cinq couleurs, comme si l'image avait été dessinée sans anti-aliasing avec une ancienne version de Paint.

    Précision importante : dans mon application, c'est l'utilisateur qui va choisir les couleurs à conserver.
    Dans l'exemple donné, l'utilisateur choisira de conserver le blanc, le rouge, le jaune, l'orange et le bleu.

    L'algorithme n'a donc pas à déterminer par le calcul le nombre de couleur à obtenir, ni la valeur de ces couleurs.
    L'algorithme devra faire avec les couleurs imposées.

    Un traitement sur la palette posera un problème au niveau de la frontière entre le cercle jaune et le rectangle rouge, car des pixels intermédiaires seront inévitablement reconnus comme orange qui est une couleur utilisée par une autre forme de l'image.

    J'ai pu trouver toutes sortes d'algorithmes de réduction de couleurs (k-moyennes, k-moyennes++, Floyd-Steinberg, ...) mais ces algorithmes ont été élaborés pour du traitement d'image "classique" destiné à réduire le nombre de couleurs d'une photo en conservant le mieux possible son aspect esthétique pour l'œil humain.

    Ca ne correspond pas à ce que je souhaite faire.

    Auriez vous connaissance d'un type d'algorithme adapté à mon besoin ?

    Je pensais procéder par "passes successives", c'est à dire :
    - En faisant d'abord une conversion noir et blanc pour chaque couleur imposée, avec un seuil assez sévère pour que seuls les pixels très proches de la couleur voulue soient blancs et tous les autres noirs;
    - Ensuite, j'effectue un filtrage pour éliminer les éventuels pixels blancs "isolés";
    - On obtient une série d'images en noir et blanc pour chaque couleur (un peu comme des calques).
    - Enfin, on peut ensuite recombiner ces "calques" pour obtenir l'image finale, en peignant successivement de la bonne couleur les zones blanches de chaque image en noir et blanc.

    Mais je crains de me retrouver avec des "artefacts" dans l'image finale, car les "calques" risquent de ne pas bien se recouvrir

    Ou alors il faut procéder par "couches", chaque couleur de l'image finale étant classée dans un certain ordre, et ensuite :
    - le premier "calque" détecte tous les pixels de la couleur n°1
    - le 2e "calque" détecte tous les pixels de la couleur n°1 ou de la couleur n°2
    - le 3e "calque" détecte tous les pixels de la couleur n°1 ou de la couleur n°2 ou n°3
    - le 4e "calque" détecte tous les pixels de la couleur n°1 ou de la couleur n°2 ou n°3 ou n°4

    En quelque sorte, on élimine chaque couleur au fur et à mesure
    Il faudra du filtrage là aussi

    Ensuite, on peint sans anti aliasing l'image finale dans l'ordre inverse :
    - d'abord la couleur n°5 en couleur de fond
    - puis la couleur n°4 avec le calque n°4
    - puis la couleur n°3 avec le calque n°3
    - puis la couleur n°2 avec le calque n°2
    - puis la couleur n°1 avec le calque n°1

    A bientôt
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  2. #2
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 436
    Points : 4 577
    Points
    4 577
    Par défaut
    Bonjour,

    Sauf erreur de compréhension, le problème est plus simple que les algorithmes cités puisque c'est l'utilisateur qui fixe les couleurs.
    Le travail qui reste à faire consiste pour chaque point lui affecter la couleur la plus proche. Cela se résume donc à des calculs de distance (beaucoup).

    Quelle distance utiliser ? Bien sûr cela dépend de l'objectif visé. J'utilise fréquemment une distance euclidienne pondérée (enfin sa forme quadratique car la racine carré ne change rien aux relations d'ordre et consomme du temps) mais les espaces perceptuels peuvent être intéressants même s'ils demandent plus de calculs (donc sont plus longs).

    Il y a deux approches de calcul : pixel par pixel (w*h*nbrCouleur calculs de distances) ou création de clusters à partir de la palette (nbrCouleur² calculs de distances + w*h affectations de cluster). Le choix dépend des tailles en jeu sachant que la deuxième approche est souvent plus rapide mais plus difficile à mettre en œuvre.

    Il y a aussi à décider ce qu'on fait des erreurs. L'affectation des couleurs de la palette laisse des résidus. Soit on ne les conserve pas soit on propage l'erreur (comme Floyd-Steinberg). Ne pas s'en occuper est plus simple mais les créneaux sont bien visibles et propager les erreurs est mieux visuellement mais fait apparaître des moustiques de points parasites (dont la moyenne se rapproche de la valeur moyenne d'origine). Là encore l'objectif incitera à un choix ou l'autre

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  3. #3
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 943
    Points : 1 290
    Points
    1 290
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Bonjour,

    Sauf erreur de compréhension, le problème est plus simple que les algorithmes cités puisque c'est l'utilisateur qui fixe les couleurs.
    Le travail qui reste à faire consiste pour chaque point lui affecter la couleur la plus proche. Cela se résume donc à des calculs de distance (beaucoup).

    Quelle distance utiliser ? Bien sûr cela dépend de l'objectif visé. J'utilise fréquemment une distance euclidienne pondérée (enfin sa forme quadratique car la racine carré ne change rien aux relations d'ordre et consomme du temps) mais les espaces perceptuels peuvent être intéressants même s'ils demandent plus de calculs (donc sont plus longs).

    Il y a deux approches de calcul : pixel par pixel (w*h*nbrCouleur calculs de distances) ou création de clusters à partir de la palette (nbrCouleur² calculs de distances + w*h affectations de cluster). Le choix dépend des tailles en jeu sachant que la deuxième approche est souvent plus rapide mais plus difficile à mettre en œuvre.

    Il y a aussi à décider ce qu'on fait des erreurs. L'affectation des couleurs de la palette laisse des résidus. Soit on ne les conserve pas soit on propage l'erreur (comme Floyd-Steinberg). Ne pas s'en occuper est plus simple mais les créneaux sont bien visibles et propager les erreurs est mieux visuellement mais fait apparaître des moustiques de points parasites (dont la moyenne se rapproche de la valeur moyenne d'origine). Là encore l'objectif incitera à un choix ou l'autre

    Salutations
    Bonjour,

    Merci pour ta réponse

    Mais l'approche que tu décris est toujours celle du traitement d'images "photo", qui ne correspond pas à mon besoin.

    En particulier, cela ne résoud pas le problème que j'ai soulevé dans l'exemple de mon message initial au niveau de la frontière entre le cercle jaune et le rectangle rouge, car des pixels intermédiaires seront inévitablement reconnus comme orange qui est une couleur utilisée par une autre forme de l'image.

    Ce que je cherches à faire c'est, en quelque sorte, "annuler" l'antialiasing pour retrouver une image avec des formes pixelisées "nettes" sans pixel intermédiaire

    Voici une autre illustration du problème, avec un "zoom" pour mieux comprendre :

    image de départ avec anti aliasing :

    Nom : ImageDeDepart.jpg
Affichages : 22
Taille : 51,4 Ko

    L'utilisateur choisi de conserver les couleurs jaune, vert, bleu, orange et violet

    image désirée en sortie :

    Nom : ImageDesiree.jpg
Affichages : 21
Taille : 54,5 Ko

    A bientôt
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  4. #4
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 943
    Points : 1 290
    Points
    1 290
    Par défaut
    Bonjour

    je vais reprendre l'exemple de départ avec un zoom, ce sera plus explicite

    image de départ :

    Nom : ImageDeDepart.jpg
Affichages : 21
Taille : 54,9 Ko

    L'utilisateur sélectionne les couleurs ROUGE, JAUNE, ORANGE et BLEU

    Image finale :

    Nom : ImageDesiree.jpg
Affichages : 22
Taille : 45,1 Ko

    Un logiciel comme Paint.NET arrive presque à le faire via sa fonction "Quantize" du menu "Effet" -> "Couleurs" en mettant le niveau de tramage à zéro
    En réalité ça ne fonctionne pas, il faut mettre le nombre de couleurs à 3, puis peindre manuellement le cercle en haut à droite en orange manuellement.

    A bientôt !
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  5. #5
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 943
    Points : 1 290
    Points
    1 290
    Par défaut
    Bonsoir

    il me vient une autre idée :

    Puisque mon besoin consiste en fait à "annuler" l'antialiasing, le traitement des pixels pourrait se faire en plusieurs étapes :
    - les pixels identiques (ou vraiement très proches) d'une couleur sélectionnés sont identifiés comme étant de cette couleur sélectionnée
    - un filtrage détecte les pixels "isolés" c'est à dire avec trop de différences avec leurs 8 voisins, et les reclasse comme étant "non identifiés" (le fameux problème de la zone frontière entre le cercle rouge et le cercle jaune dans mon exemple)
    - les pixels non identifiés sont affectés à la couleur des pixels "identifiés" les plus proches et majoritaires géographiquement

    la pixelisation serait probablement un peu plus "sèche" mais on évite ainsi les artefacts

    A bientôt
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  6. #6
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 625
    Points : 1 385
    Points
    1 385
    Par défaut
    Salut tout le monde,

    Quand tu parcours ton image horizontalement (ou verticalement, peu importe) tu tombes sur des pixels qui se suivent sur un dégradé de couleurs (color gradient), disons du rouge au jaune. En quantifiant les couleurs des pixels de transition, tu sais s'ils tiennent plus du rouge ou du jaune et tu modifies leurs couleurs en conséquence.

    Je me demande aussi si une conversion au format vectoriel (détection de contours, vectorisation) puis à nouveau au format matriciel (rastérisation) (mais sans anticrénelage (antialiasing)) permettrait d'obtenir ce que tu souhaites.

    Enfin, as-tu regardé si GIMP ou Imagemagick ont une fonction ou un filtre qui fait le job, ou quelque chose qui s'en rapprocherait, la netteté par exemple (Sharpen) ?

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: 7
    Dernier message: 30/06/2010, 16h56
  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