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

Utilisateur anonyme
18 oct. 2011 à 12:53
Salut,
A mon avis tu vas avoir besoin de travailler avec le FromArgb...
Exemple le R, le G et le B à 255 ça fait le blanc:
me.BackColor = Color.FromArgb(255, 255, 255)


Si tu as le R à 250 par exemple ça sera plus foncé etc...

Bon courage


CF2i - Guadeloupe
Ingénierie Informatique
0
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 à 14:20
Voici la mon code, a tester...

Merci pour ton aide.

Fabiano


    Dim toleranceH As Decimal = 1
    Dim toleranceS As Decimal = 1
    Dim toleranceV As Decimal = 1

    Private Function SearchColor(ByVal couleurPipette As Color) As Color
        Dim indexCouleurPlusProche As Decimal = 0
        Dim couleurPlusProche As Color
        Dim tableauCouleurs As New List(Of Color)({Color.Yellow, Color.Aqua, Color.DarkOrange, Color.DarkViolet, Color.Gray, Color.Beige, Color.BlueViolet, Color.Chartreuse, Color.Green, Color.Indigo, Color.Lime})
        Dim plusPetitEcart As Integer = 255 * 3 * toleranceH * toleranceS * toleranceV + 1
        Dim iCounter As Integer = 0
        For Each CurrColorInArray In tableauCouleurs
            Dim currentCouleur As Color = CurrColorInArray
            Dim ecart As Integer = getEcart(couleurPipette, currentCouleur)
            If (ecart < plusPetitEcart) Then
                plusPetitEcart = ecart
                indexCouleurPlusProche = iCounter
                couleurPlusProche = currentCouleur
            ElseIf (ecart = 0) Then
                plusPetitEcart = ecart
                indexCouleurPlusProche = iCounter
                couleurPlusProche = currentCouleur
                Exit For
            End If
            iCounter += 1
            Application.DoEvents()
        Next
        Return couleurPlusProche
    End Function

    Private Function getEcart(ByVal couleurA As Color, ByVal couleurB As Color)
        Dim HA As Integer = getTeinte(couleurA)
        Dim SA As Integer = getSaturation(couleurA)
        Dim VA As Integer = getLuminosite(couleurA)
        Dim HB As Integer = getTeinte(couleurB)
        Dim SB As Integer = getSaturation(couleurB)
        Dim VB As Integer = getLuminosite(couleurB)
        Dim DeltaH As Decimal = Math.Abs(HA - HB) * toleranceH
        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 Integer
        Dim h As Single = isColor.GetHue()
        Return h
    End Function

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

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

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim TempColor As Color = Color.FromArgb(100, 20, 100, 0)
        PctBoxOldColor.BackColor = TempColor
        PctBoxNewColor.BackColor = SearchColor(TempColor)
    End Sub

0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
18 oct. 2011 à 18:37
Salut

Quel est le but de ton prog ?
je veux dire que veux tu faire avec ton prog ?
0
Utilisateur anonyme
18 oct. 2011 à 20:18
Bonsoir,

J'ai trouvé un petit code sur le net qui compare une couleur choisie aléatoirement à celles de la palette système.
Peut être pourras-tu t'en inspirer.
Avant le test, le plus long sera de créer les 5 contrôles requis sur un formulaire et de les nommer

Public Class Form1
    Structure ColorName
        Public Color As Color
        Public Name As String
        Public Distance As Integer
    End Structure

    Public Function FindNearestKnown(ByVal c As Color) As ColorName
        Dim best As ColorName

        best.Name = Nothing

        For Each colorName As String In [Enum].GetNames(GetType(KnownColor))
            Dim known As Color = Color.FromName(colorName)
            Dim dist As Integer

            dist = Math.Abs(CInt(c.R) - known.R) + Math.Abs(CInt(c.G) - known.G) + Math.Abs(CInt(c.B) - known.B)

            If best.Name Is Nothing OrElse dist < best.Distance Then
                best.Color = known
                best.Name = colorName
                best.Distance = dist
            End If
        Next
        Return best
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim R As New Random
        Dim randColor As Color = Color.FromArgb(R.Next(0, 255), R.Next(0, 255), R.Next(0, 255))

        Me.RandomColorBox.BackColor = randColor
        Me.RandomColorLabel.Text = randColor.ToString

        '// now match to nearest known color
        Dim nearest As ColorName = FindNearestKnown(randColor)

        Me.KnownColorLabel.Text = nearest.Name
        Me.NearestColorBox.BackColor = nearest.Color
    End Sub
End Class
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 oct. 2011 à 20:54
Bonjour,

Moi, j'ai une question de peintre à vous poser :
Quelle couleur est la plus proche de :


RGB(200, 200, 200)


Réponse 1 : RGB(150, 150, 150)

réponse 2 = RGB(180, 200, 200)

Ne répondez pas trop vite, hein . Essayez, regardez et dites-moi comment vous "percevez ces choses-là, vous.

____________________
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
18 oct. 2011 à 20:59
et j'ai été assez doux pour ne pas vous proposer en réponse 2 :
RGB(180, 210, 200)

Ce n'est pas le seul écart des valeurs de R, G et B qui compte (et encore moins le total de ces écarts) !
Ce qui compte plus, ce sont les proportions des trois composantes par rapport à l'ensemble


____________________
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
18 oct. 2011 à 23:09
Bonsoir ucfoutu,

Il est évident que l'oeil du peintre y verra une énorme différence puisque le système .NET propose 200 couleurs et des bananes contre 16 millions de couleurs à comparer.

Bonne nuit
0
Utilisateur anonyme
18 oct. 2011 à 23:15
Ah et pour répondre à ta question, avec un rapport de 200 contre 16 millions alors oui la distance s'approche réellement de la couleur la plus proche
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 oct. 2011 à 07:35
A banana32 :
Tu n'as pourtant pas répondu !
Réponse 1 ou réponse 2 , selon ta perception ?


____________________
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
19 oct. 2011 à 07:58
Car pour moi (mon oeil et ma perception des couleurs ) :
La couleur de la réponse 1, bien que de "distance" (comme tu dis) beaucoup plus élevée, est nettement plus proche de la couleur testée que ne l'est la couleur de la réponse 2 (avec, pourtant, sa "distance" significativement plus petite).
Tu sais ? Les conséquences de ces "perceptions" ne sont pas simplement et innocemment des "chichis". Elles vont beaucoup plus loin en matière de traitements graphiques (je pense, entre autres et dans un ordre prioritaire décroissant , à la "postérisation" , à l'"effet mosaïque" et, bien que dans une moindre mesure, à la pastélisation) .

Mais je pense également à d'autres domaines, tels certaines formes de "captchas". Et là, la sensibilité et la perception de l'utilisateur (qui aurait à choisir sur une "palette", la couleur "la plus proche" de celle qui lui est "présentée") seront bel et bien le facteur déterminant.


____________________
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
19 oct. 2011 à 13:00
Salut tout le monde,
A mon avis c'est pas simple...
c'est pourquoi je l'ai souhaité 'bon courage'

Il faut tenir compte de tous les cas de figure, couleur par couleur.

Il faudrait créer d'abord un groupe de variables, ou du moins des plages de valeurs, qui correspondent aux couleurs que l'oeil et la perception des couleurs (comme dit UC) considère comme similaires.

C'est un vrai défi...





CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 oct. 2011 à 13:07
Bonjour acive :
Oui ! C'est un défi ...
Et il faudra passer par une transposition de RGB en CYMK
et ce ne sera toujours pas suffisant, de cette manière (comparaison des pourcentages)
et cela prendra à ce point du temps (même avec une "préparation" à partir de la palette "par défaut") que si l'on ne laisse que peu de temps à l'utilisateur pour y choisir la couleur la plus "rapprochée" ===>> il l'aura "in the baba"


____________________
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
19 oct. 2011 à 14:20
UC: Oui...
Sans parler que:

S'il s'agit d’analyser une image avec une couleur unie ça va, sinon le fait d'analyser la couleur d'un seul pixel ne suffira pas.
Il va falloir analyser toute une région et créer une moyenne.

Fabiano: j'espère qu'on te fait pas peur..

Sinon j'ai trouvé un petit prog qui permettra de faire mieux les essais regarde:
http://www.vbfrance.com/codes/ANALYSE-COULEUR_33130.aspx


CF2i - Guadeloupe
Ingénierie Informatique
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
19 oct. 2011 à 16:13
Salut

Et si le programmeur est daltonien
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 oct. 2011 à 16:38
Salut, ShayW

Cela ne changera rien pour lui (pour sa perception), sauf dans les cas (tels les "captchas") où on lui demandera de cliquer sur la couleur la plus "proche"


____________________
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
19 oct. 2011 à 16:39
Le daltonisme est une anomalie dans laquelle un ou plusieurs des trois types de cônes de la rétine oculaire, responsables de la perception des couleurs sont déficients.

Il suffit de changer les cônes...




CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 oct. 2011 à 17:17
Maintenant et puisque l'on est sous VB.Net :
Quelqu'un a-t-il essayé d'utiliser CECI ?
Je ne peux le faire, n'étant pas VBNettiste.
Et ne sais donc pas non plus quelle peut en être l'efficacité (résultat).


____________________
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
19 oct. 2011 à 20:00
En tout état de cause, j'obtiens (sans calculs) ce que je veux sous VB6, avec deux résultatds de couleur possibles :
méthode 1 : utilisation de la fonction GetNearestColor de la librairie gdi32 de l'Api de Windows
méthode 2 :
utilisation de l'opérateur logique Or
couleur_rapprochee_PaletteRGB = &H2000000 Or couleur_recherchee

Simple, non ?
Le plus étonnant ? ===>> les deux couleurs ainsi obtenues (l'une par fonction de l'Api et l'autre avec l'opérateur Or), bien que différentes à la fois de la couleur recherchée et entre elles, sont en effet si proches de la couleur recherchée que la différence est imperceptible à l'oeil nu !

____________________
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
19 oct. 2011 à 21:10
Bonsoir à tous,

@ucfoutu
Fais un tour sur l'article des KnownColor
Ce sont des couleurs prédéfinies.
Je ne sais pas si le principe existe avec vb6.

Le bout de code que j'ai proposé au début et que j'ai trouvé sur la toile permet de s'approcher de l'une de ces couleurs. (environ 200)

J'ai testé la fonction Graphics.GetNearestColor en prenant soin de choisir une couleur qui ne figure pas parmi les "knowncolors" et j'avoue n'avoir pas compris l'utilité puisque ceci me donne strictement la même couleur de départ.
Donc, rien à voir avec la question du demandeur.

Bonne soirée.
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 à 07:14
Bonjour banana32

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.

1) je ne vois pas trop ce que viennent faire ici les couleurs système. (celles pré-choisies pour les appliquer à différents éléments)
2) je ne peux que répéter ce que j'ai d"éjà écrit dans mon message précédent :
Le plus étonnant ? ===>> les deux couleurs ainsi obtenues (l'une par fonction de l'Api et l'autre avec l'opérateur Or), bien que différentes à la fois de la couleur recherchée et entre elles, sont en effet si proches de la couleur recherchée que la différence est imperceptible à l'oeil nu !

Voilà ce que je constate avec VB6. Et je le constate : non à "vue", mais en comparant les longs obtenus, représentatifs, sous VB6, des couleurs.
Je ne peux tester sous VB.Net, mais serais étonné de ce que le résultat fût autre !
____________________
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