Come posso rilevare se un colore è grigio
Sto cercando di rilevare programmaticamente se un colore è "grigio" o meno.
La migliore misura del "grigiore" che ho trovato è stata la saturazione. Il problema che sto riscontrando è che le diverse tonalità sembrano più o meno grigie a seconda della loro tonalità e luminosità. Nella foto sotto uno appare decisamente grigio e l'altro rosso / marrone anche se entrambi hanno la stessa saturazione e luminosità.
Esiste uno spazio colore che rappresenti più accuratamente il "grigiore" di un colore?
Esiste un termine ufficiale per il concetto di "grigiore"?
Risposte
Con pieno merito a @Wolff per queste immagini. Come è stato discusso, il grigio è al 100% relativo all'illuminazione, ai colori circostanti, alla percezione e al metodo che stai misurando. Prendi queste immagini per esempio. L'immagine principale in realtà non contiene affatto "rosso". Se prendi un contagocce e misuri un'area che sembra rossa, in realtà sono tutte sfumature di grigio.
se prendi un'ala del pappagallo e la estrapoli dal contesto, sembra marrone e grigio.
Se rimetti lo stesso identico taglio sul pappagallo, apparirà di nuovo rosso nel contesto del blu / verde.
Ma detto questo, LCH o LAB sarebbero la soluzione migliore per misurare il grigio neutro.
@ La raccomandazione di Luciano di questo articolo: Teoria del colore: esiste una misurazione della "vivacità"? Ha alcune buone informazioni su ciò che stai cercando di fare.
RGB o effettivamente la saturazione nelle sue coordinate polari equivalenti è altamente non lineare quando si cerca di usarlo come misura per "quanto vicino al grigio questo colore RGB sembra essere quando guardato sullo schermo" Non tiene affatto conto dell'essere umano visione a colori, serve esclusivamente per controllare l'elettronica dello schermo. Hai sbattuto la testa a questo fatto.
Dovresti invece convertire i tuoi valori RGB nel sistema LCH ed estrarre C (= chroma) o nel sistema CIELAB (= Lab in Photoshop) e calcolare sqrt (a ^ 2 + b ^ 2). Questi sistemi sono sviluppati per essere più lineari nel prevedere ciò che si vede. Per il grigio C = 0 e a = b = 0. Questa è ovviamente una bugia se lo schermo non è calibrato per il colore.
AGGIUNGI i commenti dovuti: l'interrogante molto probabilmente crede che il suo programma non si lasci ingannare da nient'altro che ciò che ha visto, può concentrarsi su una singola combinazione RGB alla volta. Immagino che l'interrogante si aspetti qualcosa che possa aiutare il suo programma a prendere la stessa decisione che farebbe un colorimetro perfetto quando legge lo stesso RGB emesso da uno schermo sRGB impeccabile senza luci extra disturbanti.
Condivido la percezione del colore già accennata. Ci sono grigi caldi e grigi freddi, ma il più grigio di tutti sarebbe un grigio neutro.
Guardando i valori RGB, se tutti e 3 i numeri sono uguali, si tratta di grigio neutro, come R109 G109 B109 o R228 G228 B228. Se un numero è leggermente diverso, tonificherà il grigio sia freddo che caldo.
Guardando i valori HSB, a me sembra che non importi quale sia la HUE, finché la saturazione è 0 sarà grigio al 100%. Se aumenti la SATURAZIONE di una percentuale qualsiasi, otterrai un tono qualunque sia la tonalità.
Quindi, come grafico, direi che qualsiasi valore di SATURAZIONE inferiore al 4% sarebbe considerato grigio, ma potrebbe essere un grigio freddo o un grigio caldo a seconda del valore HUE (anche se è 0).
Il programmatore deve ancora fare l'ultima chiamata su ciò che è considerato grigio, a meno che tu non voglia che rilevi solo il 100% di grigio, quindi è facile.
HSL è il miglior spazio colore per rappresentare il grigio.
Il grigio può essere visto come una distanza S (saturazione), che è 0,0 se grigio puro e 1,0 se è il più lontano dal grigio.
Misura e percezione
Nei due campioni forniti ho misurato (con contagocce Photoshop): 0 10% 49% e 216 12% 51% che differisce un po 'da quello che hai affermato, forse a causa di un profilo colore che è caduto nel processo di pubblicazione.
Con un Eizo CG303w calibrato (120cd / m2 5000k 2.2), ho la sensazione che quello a sinistra tendano al rosso e quello a destra al blu. Ho abbassato la saturazione fino a quando ho avuto la sensazione che entrambi fossero grigi, ho raggiunto il 4% e il 5% di saturazione nello spazio HSL.
I miei 5000k per il punto di bianco sono un po 'caldi e vedo la macchia marrone più colorata di quella blu. Probabilmente un punto di bianco a 5500k-6500k sarebbe migliore e dovremmo anche assicurarci che la luce ambientale (idealmente una luce calibrata come Just) e il colore della parete (bianco, bianco sporco?) Siano nella gamma di grigio accettabile.
Discussione
In RGB, un colore è grigio quando R = G = B, ma l'operatore deve valutare diversi numeri per rispondere a "è grigio". È più difficile dare a noi stessi una distanza da R = G = B solo guardando i numeri.
Lo spazio colore HSL è più diretto poiché S (saturazione, nell'intervallo [0,1]) dà immediatamente la risposta: 0 è grigio o un valore al di sotto di una soglia viene scelto come grigio.
R' = R/max // normalization from [0-max] to [0.0-1.0]
G' = G/max // where max is 255 if the colors are 8 bits per channel
B' = B/max
Cmax = max(R', G', B') // find the maximum among R,G,B
Cmin = min(R', G', B') // find the minimum among R,G,B
Δ = Cmax - Cmin // gives the maximum difference
Eppure, L e S sono dati da:
L = (Cmax + Cmin) / 2
S = Δ/(1-|2L-1|)
Quindi puoi costruire un filtro indicatore che verrà visualizzato in verde puro quando i pixel sono grigio puro o abbastanza grigio; o che mostrerà in falsi colori tutti i pixel abbastanza grigi e destaturerà il resto. L'implementazione dipenderà dal software e dalla lingua dell'utente; puoi creare un filtro Matlab per Photoshop, ad esempio, che lo farà, o anche un plugin autonomo.
Riferimenti
- RapidTables RGB a HSL
- Photoshop Matlab
Come noti dalle risposte ottieni risultati molto diversi a seconda delle tue definizioni, alcune delle quali si contraddicono a vicenda. Nessuna delle risposte è sbagliata per vedere. Dipendono solo da diverse definizioni di colore e grigio.
Ora, poiché non sappiamo nulla del tuo problema di fondo, è difficile da dire. Dal punto di vista della scienza del colore non esiste davvero una risposta soddisfacente alla domanda su quanto grigio sia presente in un'immagine.
Certamente la scienza del colore dice che tutta questa elaborazione dovrebbe essere fatta in uno spazio colore assoluto, preferibilmente un derivato del CIE Lab possibilmente polare come Lch. Anche se questo lascia a desiderare poiché non vi è alcuna garanzia che un Lhc polare sia anche lontanamente uniforme nel modo necessario. In generale la scienza del colore evita questo tipo di riflessione evitando l'interpolazione del colore.
Comunque sarebbe probabilmente più accurato calcolare ΔE tra un colore neutro con lo stesso valore di luminosità. Questo avrebbe probabilmente il miglior merito scientifico per quanto riguarda il modo in cui funzionano i sensi umani nel tentativo di risolvere un problema abbastanza simile in modo che il numero abbia un significato più comprensibile.
Ma puoi anche eseguire una sorta di misurazione del colore da un'immagine, quindi l'Lch sarebbe di nuovo buono come sarebbe HSL, dipende un po 'da come presumi che sia il sensore della fotocamera. Quindi, se vuoi emulare un colorimetro, questo ha sicuramente un valore.
Ma in realtà, se vuoi una migliore visibilità di quando qualcosa è grigio o hai bisogno di indagare su ciò che gli umani considerano grigio, potresti semplicemente provare ad adattare i dati alla descrizione umana, il colorvsurvey XKCD ha alcuni buoni punti dati per indagare ulteriormente. La cosa buona di questo database è che il suo colore non è corretto. Ciò significa che se la tua applicazione è web, puoi raccogliere l'errore di un monitor medio non calibrato dall'aggregato statistico. Ma un male per la scienza del colore.
E così via ... Puoi scavare quanto vuoi.
la domanda è abbastanza vaga che non possiamo davvero rispondere alla domanda senza definire le cose per te.