2012-08-22 23 views
5

Dato che in RGB possiamo rappresentare 256^3 combinazioni = 16.777.216 colori, e poiché l'occhio umano può distinguere solo approssimativamente 10.000.000, c'è ovviamente un surplus di 6.777.216 combinazioni RGB che cromaticamente sono indistinguibili dai colori della controparte .RGB Algoritmo di approssimazione dei colori

Gli algoritmi di compressione funzionano su questa base quando si approssima la differenza spaziale in intervalli cromatici su un frame, credo. Con questo in mente, come si può calcolare in modo affidabile se un determinato colore si trova in un intervallo di "somiglianza" con un altro?

Ovviamente, "similarità" sarà una sorta di parametro arbitrario/sintonizzabile che può essere modificato, ma si tratta comunque di un'approssimazione. Quindi qualsiasi suggerimento, pseudocodice, esempi di codice intuitivo, risorse là fuori per aiutarmi a modellare una funzione del genere?

Molte grazie per il vostro aiuto

+0

Si dice "un surplus di 6.777.216" come se quasi metà delle informazioni fosse sprecata. Non è il caso. Questi 6.777.216 colori rappresentano per '1-log2 (1000000)/24' ie. 3,11% delle informazioni. Non contare su quello per la compressione! –

+0

Anni dopo, questa domanda sembra ancora pertinente. Nel caso in cui aiuti qualcuno, ho trovato una soluzione diversa usando HSL che ho scritto di recente [qui] (https://medium.com/@dariushodaei/colour-coding-part-1-aa0d9910592) – ComethTheNerd

risposta

5

La differenza di colore percettiva può essere calcolata utilizzando lo CIEDE2000 Color-Difference Formula. Lo CIEDE2000 formula si basa sullo spazio colore LCH (Luminosità, Croma e Tonalità). Lo spazio colore LCH è rappresentato come un cilindro (vedere l'immagine here).

Un modello meno preciso (ma più gestibile), è la formula di differenza di colore CIE76, che è basata su Lab color space (L*a*b*). Non esistono semplici formule per la conversione tra valori RGB o CMYK e L * a * b *, poiché i modelli di colori RGB e CMYK dipendono dal dispositivo. I valori RGB o CMYK devono prima essere trasformati in uno spazio colore assoluto specifico, ad esempio sRGB o Adobe RGB. Questa regolazione dipenderà dal dispositivo, ma i dati risultanti dalla trasformazione saranno indipendenti dal dispositivo, consentendo di trasformare i dati nello spazio colore CIE 1931 e quindi trasformati in L * a * b *. L'articolo This spiega la procedura e le formule.

+0

Risorse eccellenti! Porta indietro i ricordi di un modulo grafico di undergrad che ho fatto sulla percezione dei colori. Grazie per i suggerimenti – ComethTheNerd

1

sistema di colori RGB è stato progettato in modo tale che se 2 colori hanno valori che sono vicini gli uni agli altri poi i colori sono anche percettivamente vicino.

Esempio:

colore definito dalle RGB = (100, 100, 100) è percettivamente quasi la stessa di colori RGB = (101, 101, 100), RGB = (98, 100, 99), ecc ...

+0

Quindi un grado di varianza forse n <5 in qualsiasi colonna non dovrebbe produrre una differenza cromatica percepibile allora? È un buon punto di partenza per i test, grazie – ComethTheNerd

+0

Sì. Prova questo strumento online per i test: [Schema colori] (http://www.colorschemer.com/online.html) –

+0

Nota che devi controllare la vicinanza dei valori * componente-saggio *, non puoi semplicemente andare (colore1 - color2) Thomas

9

Esistono molti modi per calcolare le distanze tra i colori, i più semplici vengono definiti sui componenti di colore in qualsiasi spazio colore. Questi sono comuni "distanze" o metriche tra colori RGB (r1, g1, b1) e (r2, g2, b2):

  • L : abs (r1-r2) + abs (g1-g2) + abs (b1-b2)
  • L : sqrt ((R1-R2) ² + (g1-g2) ² + (b1-b2) ²)
  • L : max (abs (r1-r2), abs (g1-g2), abs (b1-b2))

Questi però non tengono conto del fatto che la visione umana è les s sensibile al colore rispetto alla luminosità. Per risultati ottimali, è necessario convertire da RGB a uno spazio colore che codifica separatamente la luminosità e il colore. Quindi utilizzare una delle metriche di cui sopra nel nuovo spazio colore, probabilmente dando più peso al componente di luminosità e meno ai componenti del colore.

Le aree di colore indistinguibili tra loro si chiamano MacAdam ellipses.Le ellissi diventano quasi circolari negli spazi colore CIELUV e CIELAB, il che è ottimo per il calcolo, ma sfortunatamente passare da RGB a questi spazi colore non è così semplice.

JPEG converte i colori in YCbCr, dove Y è la luminosità e il colore di codifica di due C, e quindi dimezza la risoluzione dei componenti C. Si potrebbe fare lo stesso e quindi utilizzare una versione pesata di uno dei parametri di cui sopra, per esempio:

diff = sqrt(1.4*sqr(y1-y2) + .8*sqr(cb1-cb2) + .8*sqr(cr1-cr2)) 

L'articolo sulla color difference in Wikipedia ha altri esempi per i diversi spazi colore.

+0

Questo è davvero fantastico, e grazie per i suggerimenti. Affari ingannevoli che si avvicinano al colore! – ComethTheNerd