Quel est le moyen le plus précis de déterminer la couleur d'un objet?


33

J'ai écrit un programme informatique capable de détecter des pièces de monnaie dans une image statique (.jpeg, .png, etc.) à l'aide de certaines techniques standard de vision par ordinateur (flou gaussien, seuillage, transformation de Hough, etc.). En utilisant les ratios des pièces capturées à partir d'une image donnée, je peux établir avec certitude quelles pièces sont lesquelles. Cependant, je souhaite ajouter à mes niveaux de confiance et également déterminer si une pièce que je déduis comme étant du type A (à partir des ratios de rayon) a également la bonne couleur. Le problème est que pour les pièces britanniques et al. (cuivre, argent, or), les couleurs respectives (en particulier du cuivre au doré) sont très similaires.

J'ai une routine qui extrait la couleur moyenne d'une pièce donnée en termes de «l'espace de couleurs» RedGreenBlue (RGB) et des routines pour convertir cette couleur en «espace de couleurs» HueSaturationBrightness (HSB ou HSV).

RGB n’est pas très agréable à utiliser pour tenter de différencier les trois couleurs de pièce (voir l’image ci-jointe [de base] pour un exemple). J'ai les plages et les valeurs typiques suivantes pour les couleurs des différents types de pièces:

Remarque: la valeur typique est celle sélectionnée en utilisant une moyenne "en pixels" d'une image réelle.

**Copper RGB/HSB:** typicalRGB = (153, 117, 89)/(26, 0.42, 0.60).

**Silver RGB/HSB:** typicalRGB = (174, 176, 180)/(220, 0.03, 0.71).

**Gold RGB/HSB:** typicalRGB = (220, 205, 160)/(45, 0.27, 0.86) 

J'ai d'abord essayé d'utiliser la «distance euclidienne» entre une couleur de pièce moyenne donnée (en utilisant RVB) et les valeurs typiques pour chaque type de pièce donné ci-dessus, traitant les valeurs RVB comme un vecteur; pour le cuivre on aurait:

copper=((Rtype-Rcopper)2+(gtype-gcopper)2+(Btype-Bcopper)2)

où la plus petite valeur de la différence ( ) nous indiquerait le type le plus probable de la pièce donnée. Cette méthode s'est révélée très imprécise.

J'ai également essayé de comparer la teinte des pièces avec les valeurs typiques des types fournis ci-dessus. Bien que théoriquement, cela fournisse un "espace couleur" bien meilleur pour gérer les niveaux de luminosité et de saturation variables des images, il n'était pas assez précis.

Question: Quelle est la meilleure méthode pour déterminer un type de pièces basé sur la couleur (à partir d’une image statique)?

Merci beaucoup pour votre temps.

Couleurs de pièces typiques

Modifier 1

Remarque: j'ai essayé toutes les idées abordées ci-dessous et je n'ai presque rien réalisé. La variance des conditions d'éclairage (même au sein d'une même image) rend ce problème très difficile et doit être prise en compte.

Éditer 2 (résumé des résultats)

Merci pour vos réponses. Mes propres recherches (y compris vos réponses et vos commentaires) ont montré à quel point il est difficile de résoudre ce problème dans le cas générique d’éclairage arbitraire, de caméra arbitraire (appareil mobile), de fluctuation de la couleur de la pièce (même pour les mêmes espèces / types) etc. Je me suis d'abord intéressé à la reconnaissance de la couleur de la peau (un domaine de recherche très actif) et les problèmes restent nombreux, même en ce qui concerne la reconnaissance de la couleur de la peau chez les Caucasiens uniquement (voir cet article pour un aperçu des techniques actuelles), et le fait que ce problème contienne trois objets de couleur distincts, qui peuvent tous avoir des chromacités continues et variables, rend ce sujet de la vision par ordinateur très difficile à classer et à traiter en conséquence (vous pourriez même faire un bon doctorat à ce sujet. !)

Je regardais dans la Gamut Méthode Constraint de la très utile après par DW ci - dessous. À première vue, cette opération était très prometteuse pour transformer l’image et les objets séparés en pièces de monnaie en couleurs indépendantes des conditions d’éclairage. Cependant, même cette technique ne fonctionne pas parfaitement (et implique une bibliothèque d'images / histogrammes pour les mappages - ce que je ne souhaite pas aborder), pas plus que les méthodologies beaucoup plus complexes d'Architecture de réseau neuronal. En fait, cet article énonce dans l'abstrait que:

"current machine colour constancy algorithms are not good enough for colour-based 
 object recognition.".

Cela ne veut pas dire qu'il n'y a pas beaucoup plus d'articles à jour sur ce sujet, mais je ne les trouve pas et cela ne semble pas être un domaine de recherche très actif pour le moment.

La réponse d'AVB était également utile et j'ai brièvement examiné L A B *.

"The nonlinear relations for L*, a*, and b* are intended to mimic the nonlinear
response of the eye. Furthermore, uniform changes of components in the L*a*b* colour
space aim to correspond to uniform changes in perceived colour, so the relative 
perceptual differences between any two colours in L*a*b* can be approximated by 
treating each colour as a point in a three dimensional space."

D'après ce que j'ai lu, la transformation de cet espace colorimétrique pour les images dépendantes de mon appareil sera délicate - mais j'examinerai cela en détail (dans la perspective d'une sorte de mise en œuvre) lorsque j'aurai un peu plus de temps.

Je ne retiens pas mon souffle pour trouver une solution concrète à ce problème et, après la tentative avec L A B *, je négligerai la couleur de la pièce et chercherai à mettre en sécurité mes algorithmes de détection géométriques actuels (Elliptic Hough Transform, etc.).

Merci à tous. Et comme note finale à cette question, voici la même image avec un nouvel algorithme de détection géométrique, qui n’a pas de reconnaissance de couleur:

entrez la description de l'image ici


1
Les images auront-elles toujours le même fond de couleur? Ou pouvez-vous introduire un autre objet "couleur standard" dans l'image? Si tel est le cas, vous avez la possibilité de vous ajuster en fonction de la luminosité. Si non, pourrait être difficile ..
onestop

2
Ce n'est pas seulement une lumière colorée évidente. Je suis à peu près sûr que la lumière du soleil, la lumière fluorescente et la lumière incandescente ont des couleurs suffisamment différentes pour gâcher la correspondance des couleurs HSB, même si nos yeux s’adaptent pour ne pas percevoir les changements de couleur.
Peter Shor

2
(+1) La question est intéressante et stimulante. Je pense qu’il faut un peu de raffinement pour avoir une bonne chance de donner une bonne réponse. Comme indiqué à l’heure actuelle, elle frise le fait d’être mal posée. Pour une solution pratique, vous devrez fournir des informations plus détaillées sur la gamme d’environnements dans lesquels vous souhaitez pouvoir effectuer cette classification. Quelles couleurs de fond sont possibles? Toujours le même nombre de pièces? Aurez-vous toujours une image en couleur? Bon éclairage ambiant? La connaissance de ces types de caractéristiques peut fournir des indications pour une solution.
cardinal

2
Je pense que le problème que vous rencontrez est celui de la "constance des couleurs". Les autres termes de recherche seraient "remise de l'illuminant" ou "réduction de l'arrière-plan". C'est un problème non résolu en science de la vision.
Caracal

1
Si seulement je pouvais encore +1 pour le bon suivi! Des choses très intéressantes.
Matt Parker

Réponses:


6

Deux choses, pour commencer.

Un, ne fonctionne définitivement pas en RVB. Votre couleur par défaut devrait être l'espace colorimétrique Lab (alias CIE L * a * b *). Jeter L. De votre image , il ressemble à la acoordonnée vous donne les informations les plus, mais vous devriez probablement faire une analyse en composantes principales sur aet bet le travail le long de la première ( le plus important) composant, juste pour garder les choses simples de. Si cela ne fonctionne pas, vous pouvez essayer de passer à un modèle 2D.

Juste pour avoir une idée, dans ales trois pièces jaunâtres ont des MST inférieurs à 6, et des moyennes de 137 ("or"), 154 et 162 - doivent être distinguées.

Deuxièmement, le problème de l'éclairage. Ici, vous devrez définir votre problème avec soin. Si vous voulez distinguer les couleurs proches sous n'importe quel éclairage et dans n'importe quel contexte, vous ne pouvez pas, pas comme ça, de toute façon. Si vous ne vous inquiétez que des variations locales de luminosité, Lab s'occupera principalement de cela. Si vous voulez pouvoir travailler à la fois à la lumière du jour et à la lumière incandescente, pouvez-vous garantir un fond blanc uniforme, comme dans votre exemple? En général, quelles sont vos conditions d'éclairage?

En outre, votre image a été prise avec un appareil photo assez bon marché, à en juger par son apparence. Il possède probablement une sorte de fonction de balance des blancs automatique, qui gâche les couleurs - désactivez-la si vous le pouvez. Il semble également que l'image ait été codée dans YCbCr à un moment donné (cela arrive souvent s'il s'agit d'une caméra vidéo) ou dans une variante similaire de JPG; les informations de couleur sont gravement sous-échantillonnées. En fait, dans votre cas, cela pourrait être bon - cela signifie que la caméra a effectué un peu de débruitage pour vous dans les canaux de couleur. D'un autre côté, cela signifie probablement qu'à un moment donné, les informations de couleur ont également été quantifiées plus puissantes que la luminosité, ce qui n'est pas très bon. La chose principale ici est - la caméra est importante, et ce que vous faites devrait dépendre de la caméra que vous allez utiliser.

Si quelque chose n'a pas de sens, laissez un commentaire.


Merci pour votre réponse. Je ne peux assurer aucune de ces réponses. Ceci est pour une application mobile qui compte des pièces (une quantité arbitraire de pièces) en un clic sur un bouton (et est très rapide!). L'éclairage peut donc varier énormément et il n'y a pas non plus d'arrière-plan cohérent. Je pense qu'il est impossible de classer les types de pièces via la couleur de cette manière (comme vous l'avez indiqué). Cependant, j'aime bien votre réponse en utilisant L A B * et je pense que c'est la meilleure réponse offerte. À la lumière de cela, vous avez la réponse et la prime. Merci encore.
MoonKnight

6

Dans un esprit de brainstorming, je vais partager quelques idées que vous pourriez essayer:

  1. Essayez Hue plus? Il semble que Hue vous ait donné un assez bon discriminateur entre l'argent et le cuivre / or, mais pas entre le cuivre et l'or, du moins dans le seul exemple que vous avez montré ici. Avez-vous examiné l'utilisation de la teinte plus en détail afin de déterminer si la distinction entre l'argent et le cuivre / or pourrait constituer une fonction viable?

    Je pourrais commencer par rassembler une série d’exemples d’images, que vous avez étiquetés manuellement, puis par calculer la teinte de chaque pièce de monnaie sur chaque image. Vous pouvez ensuite essayer de les histogrammer pour voir si Hue ressemble à un moyen plausible de discriminer. Je pourrais aussi essayer de regarder la teinte moyenne de chaque pièce, pour quelques exemples comme celui que vous avez présenté ici. Vous pouvez également essayer la saturation, car cela semble utile.

    Si cela échoue, vous pouvez modifier votre question pour montrer ce que vous avez essayé et donner quelques exemples pour illustrer de manière concise pourquoi c'est difficile ou ce qui échoue.

  2. Autres espaces colorimétriques? De même, vous pouvez essayer de transformer en chromacité rg , puis d’expérimenter pour voir si le résultat est utile pour distinguer l’argent du cuivre / or. Il est possible que cela aide à ajuster la variation de l'éclairage, cela vaut donc la peine d'essayer.

  3. nnn

    npnnonp,oToT(p)oiT(pi)TT(x)=x+c(mod360)c

  4. CRRC

    CθRθRθC(x,y)D(x,y)=Rθ(x,y)C(x,y)RθCL2(x,y)D(x,y)2θ0.25θ

    L2L2RC

    Pour plus de robustesse, vous pouvez avoir plusieurs images de référence différentes pour chaque pièce (en fait, chaque face de chaque pièce) et essayer toutes les images de référence pour trouver la meilleure correspondance.

    CR

  5. ff(r)rfCCfRR

    fg(r)=f(r)μμgCgR

    f

    fC

    CCf

  6. Regardez les algorithmes de vision pour la constance des couleurs. La communauté de la vision par ordinateur a étudié la constance des couleurs , le problème de la correction d'une source d'éclairage inconnue; voir, par exemple, cet aperçu . Vous pouvez explorer certains des algorithmes dérivés de ce problème. ils tentent de déduire la source d'éclairage, puis de la corriger, pour obtenir l'image que vous auriez obtenue si la photo avait été prise avec la source d'éclairage de référence.

  7. CRC

Je ne sais pas si l'un d'entre eux a une chance de fonctionner, mais ce sont des idées que vous pouvez essayer.


3

Problème intéressant et bon travail.

Essayez d’utiliser des valeurs de couleur médianes plutôt que moyennes. Ce sera plus robuste contre les valeurs aberrantes dues à la luminosité et à la saturation. Essayez d’utiliser un seul des composants RVB au lieu des trois. Choisissez le composant qui distingue le mieux les couleurs. Vous pouvez essayer de tracer des histogrammes des valeurs de pixels (par exemple, l’un des composants RVB) pour vous donner une idée des propriétés de la distribution des pixels. Cela pourrait suggérer une solution qui n’est pas immédiatement évidente. Essayez de tracer les composants RVB dans un espace 3D pour voir s'ils suivent un modèle quelconque. Par exemple, ils peuvent se trouver près d'une ligne indiquant qu'une combinaison linéaire des composants RVB peut être un meilleur classifieur qu'un particulier.


Bon cri avec la médiane, en fait, j'ai aussi codé ceci et cela aussi pour établir la couleur correcte. Avec l’approche histogramme, je suis conscient des frais de calcul; dès que je commence à boucler à travers des pixels en 2D, je vais devoir payer des frais! Néanmoins, cela pourrait valoir la peine de mettre quelque chose comme ceci dans (comme vous le signalez) pour établir des corrélations. J'ai produit toutes sortes de graphiques pour les composants RVB et, en raison des conditions d'éclairage variables (conséquence de la prise de photos à des endroits différents), les valeurs RVB peuvent se chevaucher considérablement pour les trois types de pièces.
MoonKnight

J'ai également cherché à adapter un modèle pour estimer la probabilité postérieure qu'un point de l'espace colorimétrique appartienne à un certain type de pièce. J'ai aussi examiné la modélisation des mélanges gaussiens, mais je ne suis pas encore bien allé là-dessus. J'ai également été informé d'une autre approche (quelque peu arbitraire, mais plus simple), qui consiste à utiliser quelque chose comme une interpolation du plus proche voisin. Merci pour votre temps.
MoonKnight

1
Sur une piste complètement différente, une autre différence entre les pièces réside dans le dessin recto / verso (même si certaines peuvent avoir le même motif d'un côté). Qu'en est-il de la corrélation croisée de l'ensemble des motifs avec les pixels (ou en utilisant des informations mutuelles) pour aider à déterminer quelle pièce vous regardez. Avec une combinaison de ratios, de couleur de pixel et de cette correspondance de conception, vous pourrez probablement réduire le taux de fausse découverte.
martino

J'ai pensé à cela - mais cela demande trop du logiciel de reconnaissance actuel et ce serait un travail énorme d'écrire à partir de rien (OCR ??). En outre, les graphismes de ces pièces varient énormément, ce qui en fait un cauchemar de maintenance. Je vais jouer une pièce plus tard - je vais rapporter ce que je trouve. Merci encore.
MoonKnight

Pourquoi le vote négatif? S'il y a un problème avec la réponse, il serait utile de le signaler - je ne peux pas en voir un
martino
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.