Détection de couleurs ?

cs_fabiano13 Messages postés 262 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 27 février 2012 - 18 oct. 2011 à 11:47
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 20 oct. 2011 à 20:07
Bonjour,

D'un côté j'ai une palette de couleurs par défaut.

De l'autre je récupère en un point précis une couleur.

Le but recherché c'est de trouver parmi la palette de couleurs par défaut la couleur la plus ressemblante.

Je n'ai aucune idée de comment y parvenir.

Avez-vous une idée ?

D'avance merci.
Fabiano

31 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 oct. 2011 à 07:24
Question posée à fabiano13, donc :
De quelle palette parles-tu exactement ?
Veux-tu bien nous le préciser, s'il te plait ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_fabiano13 Messages postés 262 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 27 février 2012
20 oct. 2011 à 09:14
Merci pour vos réponses.

Voici le code que j'ai écris, mais ne marche pas bien surtout les couleurs avoisinantes du rouge.

Pouvez-vous m'aider à perfectionner ce code ?

Pour info, la palette de couleurs est un tableau avec des couleurs référencées.

D'avance merci pour votre aide.
Fabiano


Dim tableauCouleurs As New List(Of Color)({Color.FromArgb(0, 63, 154), Color.FromArgb(0, 108, 154), Color.FromArgb(76, 159, 172), Color.FromArgb(0, 63, 0), Color.FromArgb(56, 119, 0), Color.FromArgb(101, 76, 25), Color.FromArgb(207, 35, 0), Color.FromArgb(237, 73, 0), Color.FromArgb(141, 63, 154), Color.FromArgb(227, 63, 154), Color.FromArgb(105, 105, 105), Color.FromArgb(0, 0, 0)})

Private Function SearchColorNearest(ByVal couleurPipette As Color) As Color
        Dim couleurPlusProche As Color
        Dim plusPetitEcart As Decimal = 255 * 3 * toleranceH * toleranceS * toleranceV + 1
        Dim iCounter As Integer = 0
        Dim ecart As Decimal
        For i = 0 To tableauCouleurs.Count - 1
            Dim currentCouleur As Color = tableauCouleurs(i)
            ecart = getEcart(couleurPipette, currentCouleur)
            If (ecart < plusPetitEcart) Then
                plusPetitEcart = ecart
                couleurPlusProche = currentCouleur
                iCounter = i
            ElseIf (ecart = 0) Then
                plusPetitEcart = ecart
                couleurPlusProche = currentCouleur
                iCounter = i
                Exit For
            End If
            Application.DoEvents()
        Next
        Return couleurPlusProche
    End Function

Private Function getEcart(ByVal couleurA As Color, ByVal couleurB As Color) As Decimal
        Dim HA As Decimal = getTeinte(couleurA)
        Dim SA As Decimal = getSaturation(couleurA)
        Dim VA As Decimal = getLuminosite(couleurA)

        Dim HB As Decimal = getTeinte(couleurB)
        Dim SB As Decimal = getSaturation(couleurB)
        Dim VB As Decimal = getLuminosite(couleurB)

        Dim DeltaHBase As Decimal = Math.Abs(HA - HB) * toleranceH
        Dim MaxH As Decimal = 360 'A Verifier
        Dim DeltaHModulo As Decimal = Math.Abs((HA + MaxH) - HB) * toleranceH

        Dim DeltaH As Decimal

        If (DeltaHBase < DeltaHModulo) Then
            DeltaH = DeltaHBase
        Else
            DeltaH = DeltaHModulo
        End If

        Dim DeltaS As Decimal = Math.Abs(SA - SB) * toleranceS
        Dim DeltaV As Decimal = Math.Abs(VA - VB) * toleranceV

        Dim ecart As Decimal = DeltaH + DeltaS + DeltaV

        Return ecart
    End Function

    Private Function getTeinte(ByVal isColor As Color) As Decimal
        Dim h As Decimal = isColor.GetHue()
        Return h
    End Function

    Private Function getSaturation(ByVal isColor As Color) As Decimal
        Dim s As Decimal = isColor.GetSaturation()
        Return s
    End Function

    Private Function getLuminosite(ByVal isColor As Color) As Decimal
        Dim v As Decimal = isColor.GetBrightness()
        Return v
    End Function


     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        
        Dim sColor As Color = Color.FromArgb(0, 63, 154)
        PctBoxOldColor.BackColor = sColor
        PctBoxNewColor.BackColor = SearchColorNearest(sColor)

    End Sub


0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 oct. 2011 à 10:14
Ce n'est donc pas une "palette par défaut", mais une liste définies de couleurs.

Et je comprends maintenant mieux ton problème. Et il n'est en effet dans ce cas pas soluble par getnearestcolor ni par l'exemple VB6 avec utilisation de l'opérateur Or, puisqu'il ne s'agit pas de la palette par défaut liée à un "device" de sortie.

Et dans cette "affaire", tu es tout simplement en train de "toucher du doigt" ce dont je parlais dans un précédent message. Le cumul des "écarts" ne saurait représenter les proportions (par rapport à l'ensemble) de chacune des composantes de la couleur.
Signé le peintre.



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 oct. 2011 à 10:43
Pour que tu comprennes mieux : rien ne vaut un exemple .
Je p(rends ici 3 couleu(rs :
le rouge absolu (255,0,0) et deux couleurs de ton "tableau" ( RGB(207, 35, 0) & RGB(237, 73, 0))

et j'analyse leur composition :

rougle absolu (255,0,0) :
100 % de rouge (R) , 0 % de vert (G) , 0 % de bleu (B)

rougle RGB(207,35,0) :
85,53719 % de rouge (R) , 14,46281 % de vert (G) , 0 % de bleu (B)

rougle RGB(237,73,0) :
76,45161 % de rouge (R) , 23,54839 % de vert (G) , 0 % de bleu (B)

RGB(207,35,0) est plus rouge que RGB(237,73,0).

Et même ainsi, le peintre n'est pas d"'accord à 100%. Il serait mieux, mais toujours pas totalement parfait, de traiter avec les valeurs dse CYMK*

Voilà.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_fabiano13 Messages postés 262 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 27 février 2012
20 oct. 2011 à 10:49
Je vais travailler dans ce sens.

Je vous tiens au courant.

Encore merci.
Fabiano
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 oct. 2011 à 10:49
Ah ouui ===>> pourquoi "le peintre" n'est-il pas "d'accord à 100%" avec RGB ? ===>> parce qu'il y a du bleu, dans le vert
Et dire alors que bleu = 0% ne veut plus rien dire pour le "peintre"


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 oct. 2011 à 17:14
Je vais travailler dans ce sens.


Ce sera un bon début pour éviter le piège d'un calcul par les écarts
Car regarde à quoi arrivait un calcul du cumul des valeurs absolues des 3 composantes :

On mesure ici l'écart par rapport à RGB(255,0,0), soit le rouge absolu.

1) RGB(207,35,5) :
83,80567 % de rouge (R) , 14,17004 % de vert (G) , 2,024292 % de bleu (B)
écart = 88

2) RGB(235,50,15) :
78,33334 % de rouge (R) , 16,66667 % de vert (G) , 5 % de bleu (B)
écart = 85

On voit bien que la couleur 1 est la plus rouge des deux, avec un pourcentage de rouge de prés de 84% (et l'autre à peine 78,33 %)
Et que voit-on ? Que le cumul d'écart est plus petit pour la couleur 2 (85) que pour la couleur 1 (83)

Le plus grave est que, de surcroît, la composante verte est plus importante pour la couleur 2 ! Or, le vert est ... la complémentaire du rouge (ouille ! circonstance aggravante) !

Mais je rappelle et insiste : il sera moins malheureux de passer par les proportions en CMYK (et( même ainsi, il y aura des difficultés à certains tournants)

Je vous tiens au courant.


Je veux bien. Mais ne t'attends pas à un travail simple, car les choses ne le sont pas, loin de là ... Mais tu vas découvrir seul les multiples obstacles à affronter et que les calculs seront simples, eux, mais pas les comparaisons ensuite, du moins de manière simple.

Bon courage, en tout cas.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
20 oct. 2011 à 18:48
Bonsoir ucfoutu,

Maintenant que nous avons le code de la fameuse palette, je suis d'accord avec toi : les distances ne fonctionneront pas car les couleurs sont trop proches (et n'occupent pas le "spectre RGB" entier).

Très bonne analyse de ta part sur ton dernier post
J'en apprends tous les jours.

Bonne soirée.
0
Utilisateur anonyme
20 oct. 2011 à 18:56
mais en comparant les longs obtenus, représentatifs, sous VB6, des couleurs.

Tu peux juste expliquer ceci et peut-être nous dire si il n'y a pas moyen d'exploiter cette solution ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 oct. 2011 à 19:54
Bonsoir, banana32
mais en comparant les longs obtenus, représentatifs, sous VB6, des couleurs

cela voulait tout simplement dire que j'acceptais de mettre en doute ma propre acuité perceptive, raison pour laquelle je ne répugnais pas à la vérifier. Et je ne connais pas d'autre méthode que celle de décomposer une couleur en ses composantes.
Pourquoi des "longs" ? Simplement parce-que ce sont des longs qui, en VB6, déterminent une couleur et que c'est à partir de ces longs que l'on extrait les composantes RGB de la couleur qu'ils représentent. Et c'est parce que je ne connais pas VB.Net, que j'ai précisé "longs" et "VB6", c'est tout


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 oct. 2011 à 20:07
Ah oui : pardon !
Pour le reste (exploiter les "longs" plus utilement) : ===>> non ===>> je suis hélas aussi malheureux et démuni que toi.
Ne restent que mes tripes de peintre (hé oui, j'en suis un à mes heures), qui lui, n'erst toujours pas capable, malgré ses efforts, der raisonner autrement qu'en pourcentages (dans la couleur considérée) de bleu (cyan), de jaune (yellow) et de rouge (magenta). Et le Noir, dans tout cela (le K de cymk) ? Il n'est là que pour permettre de définir l'intensité. Mais lui-même reste quelque peu malheureux car le noir n'existe pas ===>> le noir n'est jamais qu'une couleur portée à son extrême (raison pour laquelle un peintre fait très attention au "noir" qu'il choisit parmi les différents "noirs"). Il en va de même en ce qui concerne le blanc !
En résumé et pour conclure : tu me vois très pauvre et très démuni face aux "raccourcis" et aux "approximations" de l'approche graphique en informatique. Je n'en ai pas honte. Je suis simplement obligé d'admettre, d'accepter, de "faire avec" ... ( c'est presque de la prostitution, à mon sens. Mais elle n''est pas volontaire).
Voilà : je me suis mis "à poil". Et toi avec, d'une certaine manière.
Amitiés
Jacques


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Rejoignez-nous