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:
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.
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:
la source
Réponses:
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 à laa
coordonnée vous donne les informations les plus, mais vous devriez probablement faire une analyse en composantes principales sura
etb
et 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
a
les 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.
la source
Dans un esprit de brainstorming, je vais partager quelques idées que vous pourriez essayer:
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.
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.
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.
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.
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.
la source
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.
la source