Détection de couleurs ?

Messages postés
262
Date d'inscription
mardi 26 février 2002
Statut
Membre
Dernière intervention
27 février 2012
- - Dernière réponse : ucfoutu
Messages postés
18039
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
Afficher la suite 

20/31 réponses

0
Merci
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
Commenter la réponse de Utilisateur anonyme
Messages postés
262
Date d'inscription
mardi 26 février 2002
Statut
Membre
Dernière intervention
27 février 2012
0
Merci
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

Commenter la réponse de cs_fabiano13
Messages postés
3251
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
16 octobre 2019
46
0
Merci
Salut

Quel est le but de ton prog ?
je veux dire que veux tu faire avec ton prog ?
Commenter la réponse de cs_ShayW
0
Merci
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
Commenter la réponse de Utilisateur anonyme
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
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
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
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
Commenter la réponse de ucfoutu
0
Merci
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
Commenter la réponse de Utilisateur anonyme
0
Merci
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
Commenter la réponse de Utilisateur anonyme
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
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
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
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
Commenter la réponse de ucfoutu
0
Merci
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
Commenter la réponse de Utilisateur anonyme
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
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
Commenter la réponse de ucfoutu
0
Merci
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
Commenter la réponse de Utilisateur anonyme
Messages postés
3251
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
16 octobre 2019
46
0
Merci
Salut

Et si le programmeur est daltonien
Commenter la réponse de cs_ShayW
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
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
Commenter la réponse de ucfoutu
0
Merci
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
Commenter la réponse de Utilisateur anonyme
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
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
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
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
Commenter la réponse de ucfoutu
0
Merci
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.
Commenter la réponse de Utilisateur anonyme
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
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
Commenter la réponse de ucfoutu