Qual è il modo più preciso per determinare il colore di un oggetto?


33

Ho scritto un programma per computer in grado di rilevare monete in un'immagine statica (.jpeg, .png, ecc.) Usando alcune tecniche standard per la visione computerizzata (sfocatura gaussiana, soglia, trasformazione di Hough ecc.). Utilizzando i rapporti delle monete prelevate da una determinata immagine, posso stabilire con certezza quali sono le monete. Tuttavia, desidero aggiungere ai miei livelli di confidenza e anche determinare se una moneta che deduco essere di tipo A (dai rapporti di raggio) è anche del colore corretto. Il problema è che per le monete britanniche et al. (rame, argento, oro), i rispettivi colori (in particolare rame-oro) sono molto simili.

Ho una routine che estrae il colore medio di una determinata moneta in termini di "spazio-colore" di RedGreenBlue (RGB) e routine per convertire questo colore in "spazio-colore" di HueSaturationBrightness (HSB o HSV).

RGB non è molto carino con cui tentare di distinguere tra i tre colori delle monete (vedere l'immagine allegata [di base] per un esempio). Ho i seguenti intervalli e valori tipici per i colori dei diversi tipi di monete:

Nota: il valore tipico qui è quello selezionato usando una media 'pixel-saggia' di un'immagine reale.

**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) 

Per prima cosa ho cercato di utilizzare la "distanza euclidea" tra un determinato colore medio della moneta (usando RGB) e i valori tipici per ciascun tipo di moneta sopra indicato trattando i valori RGB come un vettore; per il rame avremmo:

Dcopper=((RtypeRcopper)2+(GtypeGcopper)2+(BtypeBcopper)2)

dove il valore più piccolo della differenza ( ) ci direbbe quale tipo di moneta data è più probabile. Questo metodo si è dimostrato molto impreciso.D

Ho anche provato a confrontare la tonalità delle monete con i valori tipici dei tipi forniti sopra. Sebbene teoricamente ciò fornisca uno "spazio colore" molto migliore per gestire i diversi livelli di luminosità e saturazione delle immagini, anche questo non era abbastanza preciso.

Domanda: Qual è il metodo migliore per determinare un tipo di moneta basato sul colore (da un'immagine statica)?

Grazie mille per il tuo tempo.

Colori tipici delle monete

Modifica 1

Nota: ho provato tutte le idee discusse di seguito e non ho raggiunto quasi nulla. La varianza delle condizioni di illuminazione (anche all'interno della stessa immagine) rende questo problema molto difficile e dovrebbe essere preso in considerazione.

Modifica 2 (riepilogo dei risultati)

Grazie per le tue risposte. Ulteriori mie ricerche (comprese le tue risposte e i tuoi commenti) hanno evidenziato quanto sia difficile affrontare questo problema nel caso generico di illuminazione arbitraria, telecamera arbitraria (dispositivo mobile), fluttuazione del colore della moneta (anche per la stessa specie / tipo) ecc. Ho prima considerato il riconoscimento del colore della pelle (un campo di ricerca molto attivo) come punto di partenza e ci sono ancora numerosi problemi anche con il riconoscimento del colore della pelle per i soli caucasici (vedi questo documento per una revisione delle tecniche attuali), e il fatto che questo problema contenga tre oggetti di colore distinti, ognuno dei quali può avere cromie continue e variabili, rende questo argomento di visione artificiale molto difficile da classificare e trattare di conseguenza (in effetti si potrebbe fare un buon dottorato su di esso !).

Ho esaminato il metodo di vincolo gamut dal post molto utile di DW di seguito. Questo è stato a prima vista molto promettente come una fase di pre-elaborazione per trasformare l'immagine e gli oggetti moneta separati in colori indipendenti dalle condizioni di illuminazione. Tuttavia, anche questa tecnica non funziona perfettamente (e coinvolge una libreria di immagini / istogrammi per le mappature - che non voglio approfondire) e nemmeno le metodologie molto più complesse di Neural Network Architecture. In effetti questo documento afferma in astratto che:

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

Questo non vuol dire che non ci siano molti documenti più aggiornati su questo argomento, ma non riesco a trovarli e al momento non sembra essere un'area di ricerca molto attiva.

Anche la risposta di AVB è stata utile e ho esaminato brevemente 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."

Da quello che ho letto, la trasformazione in questo spazio colore per le mie immagini dipendenti dal dispositivo sarà complicata, ma esaminerò in dettaglio questo (in vista di una sorta di implementazione) quando avrò un po 'più di tempo.

Non trattengo il respiro per una soluzione concreta a questo problema e dopo il tentativo con L A B * trascurerò il colore della moneta e cercherò di mettere in sicurezza i miei attuali algoritmi di rilevamento geometrico (accurata trasformazione ellittica di Hough ecc.).

Grazie a tutti voi. E come nota finale di questa domanda, ecco la stessa immagine con un nuovo algoritmo di rilevamento geometrico, che non ha riconoscimento del colore:

inserisci qui la descrizione dell'immagine


1
Le immagini avranno sempre lo stesso colore di sfondo? Oppure puoi introdurre qualche altro oggetto "standard di colore" nell'immagine? In tal caso, hai la possibilità di regolarti per variare l'illuminazione. In caso contrario, potrebbe essere difficile ..
attesa del

2
Ovviamente non è solo luce colorata. Sono abbastanza sicuro che la luce solare, la luce fluorescente e la luce incandescente hanno colori abbastanza diversi da confondere la corrispondenza dei colori HSB, anche se i nostri occhi in qualche modo si adattano in modo da non percepire le cose che cambiano colore.
Peter Shor,

2
(+1) La domanda è interessante e stimolante. Sento che ha bisogno di un po 'di raffinatezza per avere buone possibilità di una buona risposta. Come attualmente affermato, confina con l'essere mal posto. Per una soluzione pratica, è necessario fornire ulteriori dettagli sulla gamma di ambienti in cui si desidera essere in grado di eseguire questa classificazione. Di che colore sono possibili gli sfondi? Sempre lo stesso numero di monete? Avrai sempre un'immagine a colori? Buona illuminazione ambientale? Conoscere questo tipo di caratteristiche può fornire indicazioni per una soluzione.
cardinale il

2
Penso che il problema che stai affrontando sia quello della "costanza del colore", Altri termini di ricerca sarebbero "attualizzare l'illuminante" o "attualizzare lo sfondo". È un problema irrisolto nella scienza della visione.
Caracal,

1
Vorrei poter fare +1 di nuovo per il bel follow-up! Roba molto interessante.
Matt Parker,

Risposte:


6

Due cose, per cominciare.

Uno, definitivamente non funziona in RGB. L'impostazione predefinita dovrebbe essere lo spazio colore Lab (aka CIE L * a * b *). Elimina L. Dalla vostra immagine sembra che la acoordinata ti dà la maggior parte delle informazioni, ma probabilmente dovrebbe fare un'analisi delle componenti principali su ae be il lavoro lungo la prima componente (più importante), solo per mantenere le cose semplici. Se questo non funziona, puoi provare a passare a un modello 2D.

Solo per aaverne un'idea , nelle tre monete giallastre hanno MST inferiori a 6 e i mezzi di 137 ("oro"), 154 e 162 - dovrebbero essere distinguibili.

In secondo luogo, il problema dell'illuminazione. Qui dovrai definire attentamente il tuo problema. Se vuoi distinguere i colori ravvicinati sotto qualsiasi illuminazione e in qualsiasi contesto, non puoi, non così, comunque. Se sei solo preoccupato per le variazioni locali di luminosità, Lab si occuperà principalmente di questo. Se vuoi essere in grado di lavorare sia alla luce del giorno che a luce incandescente, puoi garantire uno sfondo bianco uniforme, come nella tua immagine di esempio? In generale, quali sono le tue condizioni di illuminazione?

Inoltre, la tua immagine è stata scattata con una fotocamera abbastanza economica, dal suo aspetto. Probabilmente ha una sorta di funzione di bilanciamento del bianco automatico, che incasina i colori piuttosto male - spegnilo se puoi. Sembra anche che l'immagine sia stata codificata in YCbCr ad un certo punto (succede molto se si tratta di una videocamera) o in una variante simile di JPG; le informazioni sul colore sono fortemente sottocampionate. Nel tuo caso potrebbe effettivamente essere buono - significa che la fotocamera ha fatto un po 'di denoising per te nei canali di colore. D'altra parte, probabilmente significa che ad un certo punto anche le informazioni sul colore sono state quantizzate più forti della luminosità - non è così buono. La cosa principale qui è: la fotocamera è importante e ciò che fai dovrebbe dipendere dalla fotocamera che intendi utilizzare.

Se qualcosa qui non ha senso - lascia un commento.


Grazie per la tua risposta. Non posso garantire nulla di quanto sopra. Questo è per un'applicazione mobile che conta monete (una quantità arbitraria di monete) con un clic di un pulsante (ed è molto veloce!). Pertanto, l'illuminazione può variare in modo selvaggio e non esiste nemmeno uno sfondo coerente. Credo che non sia possibile classificare i tipi di moneta in base al colore (come fai notare). Tuttavia, mi piace che tu risponda dell'utilizzo di L A B * e credo che sia la migliore risposta offerta. Alla luce di questo hai la risposta e la generosità. Grazie ancora.
MoonKnight,

6

Nello spirito del brainstorming, condividerò alcune idee che potresti provare:

  1. Prova di più? Sembra che Hue ti abbia dato un discreto discriminatore tra argento e rame / oro, sebbene non tra rame e oro, almeno nel singolo esempio che hai mostrato qui. Hai esaminato usando la Tonalità in modo più dettagliato, per vedere se potrebbe essere una caratteristica praticabile distinguere l'argento dal rame / oro?

    Potrei iniziare raccogliendo un gruppo di immagini di esempio, che hai etichettato manualmente, e calcolando la tonalità di ogni moneta in ogni immagine. Quindi potresti provare a istogrammarli, per vedere se Hue sembra un modo plausibile per discriminare. Potrei anche provare a guardare la tonalità media di ogni moneta, per una manciata di esempi come quello che hai presentato qui. Potresti anche provare a saturare, dato che potrebbe anche essere utile.

    Se questo non riesce, potresti voler modificare la tua domanda per mostrare cosa hai provato e dare alcuni esempi per illustrare in modo conciso perché questo è difficile o dove fallisce.

  2. Altri spazi colore? Allo stesso modo, potresti provare a trasformare in rg chromacity e poi a sperimentare per vedere se il risultato è utile per distinguere l'argento dal rame / oro. È possibile che ciò possa aiutare a regolare la variazione di illuminazione, quindi vale la pena provare.

  3. Controllare le differenze relative tra le monete, piuttosto che guardare ogni moneta in isolamento? Capisco che, in base al rapporto tra dimensioni delle monete (raggi), hai un'ipotesi iniziale per il tipo di ogni moneta. Se hai monete, questo è un vettore. Vi suggerisco di testare questa ipotesi tutta composito in un unico movimento, piuttosto che volte prova la tua ipotesi per ogni moneta da solo.nnn

    Perché questo potrebbe essere d'aiuto? Bene, potrebbe permetterti di sfruttare le tonalità relative delle monete tra loro, che dovrebbero essere più vicine agli invarianti rispetto all'illuminazione (assumendo un'illuminazione relativamente uniforme) rispetto alla tonalità individuale di ogni moneta. Ad esempio, per ogni coppia di monete, puoi calcolare la differenza delle loro tonalità e verificare se ciò corrisponde a quello che ti aspetteresti dare la tua ipotesi sulle loro due identità. Oppure, potresti generare un -vector con le tonalità previste per le monete; calcolare un -vettore con le tonalità osservate per le monete; raggruppare ciascuno; e controlla che ci sia una corrispondenza uno a uno tra le tonalità. Oppure, dati i vettorip n n o n p , o T o T ( p ) o iT ( p i ) Tnpnnonp,o , potresti verificare se esiste una semplice trasformazione tale che , ovvero, vale per ogni i. Potrebbe essere necessario sperimentare diverse possibilità per la classe di che si consente. Una classe di esempio è l'insieme di funzioni , in cui la costante oscilla su tutte le possibilità.ToT(p)oiT(pi)TT(x)=x+c(mod360)c

  4. Confronta con immagini di riferimento? Invece di usare il colore della moneta, potresti considerare di provare a abbinare ciò che è stampato sulla moneta. Ad esempio, supponiamo che tu abbia rilevato una moneta nell'immagine e ipotizzi che sia una moneta da una sterlina. Si potrebbe fare un'immagine di riferimento di una moneta da un chilo e verificare se sembra corrispondere .CRRC

    Dovrai tenere conto delle differenze di posa. Vorrei iniziare supponendo che tu abbia un'immagine frontale della moneta, come nella tua foto di esempio. Quindi la cosa principale di cui devi tener conto è la rotazione: non sai a priori di quanto viene ruotato. Un approccio semplice potrebbe essere quello di spazzare su una gamma di eventuale rotazione angoli , rotazione da , e controllare se sembra corrispondere . Per testare una corrispondenza, è possibile utilizzare una semplice metrica diff basata su pixel: ovvero, per ciascuna coordinata , calcolare (la differenza tra il valore del pixel inCθRθRθC(x,y)D(x,y)=Rθ(x,y)C(x,y)Rθe il valore in pixel in ); quindi usa una norma (somma dei quadrati) o somesuch per combinare tutti i valori della differenza in una singola metrica di quanto vicino hai una corrispondenza (ovvero, ). Dovrai utilizzare un incremento di passo sufficientemente piccolo da consentire al pixel diff di funzionare. Ad esempio, nell'immagine di esempio, la moneta da una sterlina ha un raggio di circa 127 pixel; se passi sopra i valori di , aumentando di gradi ad ogni passo, dovrai solo provare circa 1460 valori di rotazione diversi e l'errore alla circonferenza della moneta con l'approssimazione più vicina al veroCL2(x,y)D(x,y)2θ0.25θ dovrebbe essere al massimo di circa un quarto di pixel, che è abbastanza piccolo da consentire al pixel diff di funzionare correttamente.

    Potresti voler sperimentare più varianti su questa idea. Ad esempio, potresti lavorare con una versione in scala di grigi dell'immagine; RGB completo e usa una norma su tutte e tre le differenze R, G, B; l'HSB completo e usa una norma su tutte e tre le differenze H, S, B; oppure lavora solo con il piano Tonalità, Saturazione o Luminosità. Inoltre, un'altra possibilità potrebbe essere prima di eseguire un rilevatore di bordi su e , quindi abbinare l'immagine risultante dei bordi.L2L2RC

    Per robustezza, potresti avere più immagini di riferimento diverse per ogni moneta (in effetti, ogni lato di ogni moneta) e provare tutte le immagini di riferimento per trovare la corrispondenza migliore.

    Se le immagini delle monete non vengono prese direttamente frontalmente, come primo passo potresti voler calcolare l'ellisse che rappresenta il perimetro della moneta nell'immagine e inferire l'angolo in cui la moneta viene visualizzata. Ciò ti consentirà di calcolare l' aspetto di in quell'angolo, prima di eseguire la corrispondenza.CR

  5. Verifica come il colore varia in funzione della distanza dal centro? Ecco un possibile passaggio intermedio tra "il colore medio della moneta" (un singolo numero, cioè 0-dimensionale) e "l'intera immagine della moneta" (un'immagine bidimensionale). Per ogni moneta, puoi calcolare un vettore monodimensionale o la funzione , dove rappresenta il colore medio dei pixel a distanza approssimativamente dal centro della moneta. Potresti quindi provare ad abbinare il vettore per una moneta nell'immagine con il vettore per un'immagine di riferimento di quella moneta.ff(r)rfCCfRR

    Ciò potrebbe consentire di correggere le differenze di illuminazione. Ad esempio, potresti essere in grado di lavorare in scala di grigi o in un solo bitplane (ad es. Tonalità o Saturazione o Luminosità). Oppure potresti essere in grado di normalizzare prima la funzione sottraendo la media: , dove è il colore medio della moneta - quindi prova a far corrispondere a .fg(r)=f(r)μμgCgR

    La cosa bella di questo approccio è che non è necessario dedurre quanto la moneta è stata ruotata: la funzione è invariante alla rotazione.f

    Se vuoi sperimentare questa idea, calcolerei la funzione per una varietà di immagini di esempio diverse e le rappresenterei graficamente. Quindi dovresti essere in grado di ispezionarli visivamente per vedere se la funzione sembra avere una forma relativamente coerente, indipendentemente dall'illuminazione. Potrebbe essere necessario provare questo per molteplici diverse possibilità (scala di grigi, ciascuno dei bitplani HSB, ecc.).fC

    Se la moneta potrebbe non essere stata fotografata direttamente, ma forse da un angolo, dovrai prima tracciare l'ellisse del perimetro di per dedurre l'angolo da cui è stata fotografata e quindi correggere per quello in il calcolo di .CCf

  6. Guarda gli algoritmi di visione per la costanza del colore. La comunità della visione artificiale ha studiato la costanza del colore , il problema della correzione di una fonte di illuminazione sconosciuta; vedere, ad esempio, questa panoramica . Potresti esplorare alcuni degli algoritmi derivati ​​da questo problema; tentano di inferire la fonte di illuminazione e quindi di correggerla, per ricavare l'immagine che si sarebbe ottenuta se la foto fosse stata scattata con la sorgente di illuminazione di riferimento.

  7. Guarda l'indicizzazione del colore costante del colore. L'idea di base di CCCI , a quanto ho capito, è prima di tutto cancellare la fonte di illuminazione sconosciuta sostituendo il valore R di ogni pixel con il rapporto tra il suo valore R e uno dei valori R vicini; e similmente per gli aerei G e B. L'idea è che (si spera) questi rapporti dovrebbero ora essere per lo più indipendenti dalla fonte di illuminazione. Quindi, una volta ottenuti questi rapporti, calcoli un istogramma dei rapporti presenti nell'immagine e lo usi come firma dell'immagine. Ora, se vuoi confrontare l'immagine della moneta con un'immagine di riferimento , puoi confrontare le loro firme per vedere se sembrano corrispondere. Nel tuo caso, potresti anche dover regolare l'angolazione se l'immagine della monetaCRC non è stata presa di persona, ma sembra che ciò possa aiutare a ridurre la dipendenza dalla fonte di illuminazione.

Non so se qualcuno di questi abbia la possibilità di lavorare, ma sono alcune idee che potresti provare.


3

Problema interessante e buon lavoro.

Prova a utilizzare i valori di colore mediani anziché la media. Ciò sarà più robusto rispetto ai valori anomali a causa della luminosità e della saturazione. Prova a utilizzare solo uno dei componenti RGB anziché tutti e tre. Scegli il componente che meglio distingue i colori. Potresti provare a tracciare istogrammi dei valori dei pixel (ad esempio uno dei componenti RGB) per darti un'idea delle proprietà della distribuzione dei pixel. Ciò potrebbe suggerire una soluzione che non è immediatamente ovvia. Prova a tracciare i componenti RGB nello spazio 3D per vedere se seguono uno schema, ad esempio potrebbero trovarsi vicino a una linea che indica che una combinazione lineare dei componenti RGB potrebbe essere un classificatore migliore di un singolo.


Buon grido con la mediana, infatti ho anche codificato questo e anche questo in termini di scarsa definizione del colore corretto. Con l'approccio dell'istogramma, sono consapevole delle spese computazionali; non appena inizierò a scorrere i pixel in 2D, dovrò sostenere delle spese! Nondimeno, varrebbe la pena che io inserissi qualcosa del genere (come fai notare) per stabilire eventuali correlazioni. Ho prodotto tutti i tipi di grafici per i componenti RGB e, a causa delle diverse condizioni di illuminazione (una conseguenza della ripresa di foto in luoghi diversi), i valori RGB possono sovrapporsi pesantemente per tutti e tre i tipi di monete.
MoonKnight,

Ho anche cercato di adattare un modello per stimare una probabilità posteriore di un punto dello spazio colore di appartenere a un certo tipo di moneta. Ho anche esaminato la modellizzazione della miscela gaussiana, ma non mi sono ancora allontanato molto da questo. Sono stato anche informato di un altro approccio (un po 'arbitrario, ma più semplice), e cioè di usare qualcosa come l'interpolazione del vicino più vicino. Grazie per il tuo tempo.
MoonKnight,

1
Su una traccia completamente diversa, un'altra differenza tra le monete è il design sul fronte / retro (anche se alcuni possono avere lo stesso design su un lato) Che ne dite di correlare in modo incrociato l'insieme dei modelli di design con i pixel delle monete (o usando le informazioni reciproche) per determinare quale moneta stai guardando. Con una combinazione di rapporti, colore dei pixel e questa corrispondenza del design, sarai probabilmente in grado di ridurre la percentuale di falsi rilevamenti.
martino,

Ci ho pensato, ma questo richiede troppo all'attuale software di riconoscimento e sarebbe un lavoro enorme scrivere da zero (OCR ??). Inoltre c'è una grande variazione nella grafica di tali monete che rendono tale implementazione un incubo di manutenzione. Più tardi proverò a suonare - riferirò ciò che trovo. Grazie ancora.
MoonKnight,

Perché il downvote? Se c'è un problema con la risposta, sarebbe utile segnalarlo - non riesco a vederne uno
martino,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.