Esiste un algoritmo per il mixaggio dei colors che funzioni come mescolare i colors reali?

La mescolanza comune dei colors RGB è molto diversa dalla miscelazione dei colors per i dipinti, è la miscelazione della luce e la miscelazione dei pigmenti.

Per esempio:

Blue (0,0,255) + Yellow (255,255,0) = Grey (128,128,128) 

(Dovrebbe essere blu + giallo = verde)

Esiste un algoritmo noto per il mixaggio del colore che funzioni come mescolare i colors reali?


Il mio approccio

Ho già provato a seguire:

Conversione di entrambi i colors in HSV e tonalità di miscelazione (moltiplicato per il coefficiente calcolato dalla saturazione) e una media semplice per i canali di saturazione e valore. Poi ho calcolato la luminanza media di entrambi i colors e ho regolato il colore risultante per abbinare questa luminanza. Questo ha funzionato abbastanza bene, ma la miscelazione della tonalità a volte era sbagliata, ad esempio:

 Red (Hue 0°) + Blue (Hue 240°) = Green (Hue 120°) 

Ho capito che a volte ho bisogno di spostare il valore della tonalità di 360 ° (quando la differenza tra le tinte è maggiore di 180 °).

 Red (Hue 360°) + Blue (Hue 240°) = Magenta/fuchsia (Hue 300°) 

Ma questo cambiamento non è stato molto buono, ad esempio:

 Cyan (Hue 179°) + Red (Hue 0°) = Hue 89.5° Cyan (Hue 181°) + Red (Hue 0°) --> shifting is performsd (the difference is greater than 180°) Cyan (Hue 181°) + Red (Hue 360°) = Hue 270.5° 

(Tonalità 179 + Rosso) e (Tonalità 181 + Rosso) risultano in due colors completamente diversi.


Poi ho provato lo spazio colore CIE Lab (come in Photoshop), che è stato progettato per essere più vicino a come gli esseri umani percepiscono i colors.

Ho usato solo una media semplice per ciascun canale corrispondente, ma i risultati non sono stati soddisfacenti, ad esempio, ho ottenuto il rosa (64, 26, -9,5) dal blu (98, -16, 93) e giallo (30, 68, -112). Questi coefficienti sono stati presi da Photoshop.

Forse se usassi qualche operazione diversa dalla media, potrebbe funzionare, ma non so cosa.


Anche CMYK non ha funzionato , i risultati sono come in RGB o LAB.


Sembra che né l’additivo banale né la miscelazione cromatica sottrtriggers in nessuno di questi spazi cromatici producano risultati naturali.


Implementazioni di lavoro

Krita – Mixer pittorico

L’editor di grafica razionale Krita ha avuto un’implementazione funzionante di un mix di colors più realistico a un certo punto: http://commit-digest.org/issues/2007-08-12/ (plugin per mixer Painterly)

Dicono che è la prima applicazione pubblica che implementa una tecnologia speciale utilizzando le equazioni di Kubelka e Munk che descrivono il comportamento dei pigmenti.

Ecco un video di mixaggio dei colors di Krita: https://www.youtube.com/watch?v=lyLPZDVdQiQ

Carta di FiftyThree

C’è anche un articolo sulla fusione dei colors nell’app Paper per iOS sviluppata da FiftyThree . Descrivono come innovano e sperimentano nell’area e offrono anche campioni di miscelazione blu e giallo che risultano in verde. Tuttavia, l’effettivo processo o algoritmo non è realmente descritto lì.

citando:

“Nella ricerca di un buon algoritmo di fusione, inizialmente abbiamo provato a interpolare su vari spazi colore: RGB, HSV e HSL, quindi CieLAB e CieLUV, i risultati sono stati deludenti”, afferma Chen. “Sappiamo che il rosso e il giallo dovrebbero produrre arancione, o che il rosso e il blu dovrebbero diventare viola, ma non c’è alcun modo per arrivare a questi colors, non importa quale spazio colore usi. C’è un assioma ingegneristico: fai la cosa più semplice che potrebbe funzionare. Bene, ora avevamo provato gli approcci più facili possibili e non si sentivano nemmeno lontanamente a posto. ”

Sembra lo stesso di Krita, Paper implementa il modello di Kubelka-Munk:

[…] il modello Kubelka-Munk aveva almeno sei valori per ogni colore, compresi i valori di riflessione e assorbimento per ciascuno dei colors RGB. “Mentre l’aspetto di un colore su uno schermo può essere descritto in tre dimensioni, la fusione del colore sta effettivamente avvenendo in uno spazio a sei dimensioni”, spiega Georg Petschnigg, cofondatore e CEO di FiftyThree. La carta Kubelka-Munk aveva permesso al team di tradurre un problema estetico in un quadro matematico. […]

Da tutte queste informazioni, sembra che l’ implementazione basata sul modello Kubelka-Munk potrebbe essere la via da seguire e offrire risultati molto più vicini alla realtà.

Anche se sembra un processo complicato, non ho ancora visto molte buone informazioni su come implementare qualcosa di simile.


Domande correlate

Queste domande sono state postate dopo questa tutte relative alla stessa cosa.

Nessuno di loro ha davvero la risposta.

  • Calcolo di un colore misto in RGB
  • Algoritmo per trovare il colore tra gli altri due – nello spazio colore dei colors dipinti
  • Implementare Kubelka-Munk come Krita per mescolare colors come la pittura

Altri collegamenti e risorse correlati

  • Ricerca Kubelka-Munk su Twitter
  • Mixing paints (!! Con 2016) di Diana Liao
    • scivoli
    • video
  • Paint Inspired Color Mixing e Compositing for Visualization (N. Gossett, B. Chen)

La risposta corretta è NO, perché non esiste un modello funzionante corretto di come “il mixing dei colors nel mondo reale” funzioni davvero. È FAR troppo complesso e condizionato e non proprio come la semplice roba Rosso-Blu-Giallo che abbiamo imparato a scuola (richiede infatti tutta la Chimica e un sacco di Fisica e Biologia da risolvere).

Tuttavia, la risposta semplicistica è: SÌ, usa la miscelazione sottrtriggers piuttosto che la miscelazione additiva .

La miscelazione del colore che abbiamo imparato nella scuola elementare si basa su combinazioni di pigmenti che sono una forma di miscelazione cromatica sottrtriggers (molto semplicisticamente). Questo è il numero di colors che aggiungiamo insieme, più scuro diventa perché ogni pigmento sottrae un po ‘più di luce.

D’altra parte, quasi tutte le combinazioni di colors per computer sono additive in quanto sono basate sulla combinazione di onde luminose (molto semplicisticamente), quindi diventano più luminose, perché ogni colore aggiunge un po ‘più di luce.

Lo schema RGB + è in qualche modo l’additivo complementare allo schema sottrattivo che abbiamo imparato nella maggior parte delle scuole elementari statunitensi (che è RBY-). Tuttavia, non corrispondono esattamente e può essere difficile da convertire tra di loro (ricerca ora …)


OK, se si desidera passare da combinazioni additive in RGB a quelle sottrattive, è ansible utilizzare la seguente formula di tipo bayesan inverso per combinare due colors:

 NewColor.R = (Color1.R * Color2.R)/255 NewColor.G = (Color1.G * Color2.G)/255 NewColor.B = (Color1.B * Color2.B)/255 

La regolazione per la differenza dei poli cromatici (da G a Y, quindi di nuovo a G) è molto più difficile …


È stato fatto notare che questo produce Nero per il problema di esempio e tecnicamente questo è corretto per un vero sistema sottrattivo, tuttavia, se si desidera un sistema più diluito / sottrattivo, si potrebbe provare invece:

 NewColor.R = 255 - SQRT(((255-Color1.R)^2 + (255-Color2.R)^2)/2) NewColor.G = 255 - SQRT(((255-Color1.G)^2 + (255-Color2.G)^2)/2) NewColor.B = 255 - SQRT(((255-Color1.B)^2 + (255-Color2.B)^2)/2) 

Questo produce un grigio scuro anziché nero. Ma per ottenere Giallo o qualcosa di simile, devi ancora risolvere il problema dell’allineamento dei poli del sistema di colors.

ci sono due diverse possibilità che combinano i colors:

  1. miscelazione additiva (come RGB)

  2. miscelazione sottrtriggers (come CMYK)

Quindi, in un mix di colors sottrattivi il risultato è quello che ti aspettavi, ma non c’è il blu, invece c’è il ciano:

Giallo + ciano = verde

In generale, la miscelazione dei colors sottrattivi è semplicemente “togliere” (filtraggio) dal bianco mentre la miscelazione del colore additivo si aggiunge dal nero. (i colors di base di sottrazione sono inversi dall’additivo: rosso -> ciano; verde-> magenta; blu-> giallo)

Quindi, se inizi a applicare filtri bianchi sullo schermo:

min (bianco (255,255,255), giallo (255,255,0), ciano (0,255,255)) = verde (0,255,0)

C’è un codice per mescolare i colors in modo realistico in krita: https://projects.kde.org/projects/calligra/repository/revisions/master/show/krita/plugins/extensions/painterlyframework .

Si noti che il codice che include il file degli illuminanti è GPLv2 +. Può convertire da RGB a lunghezze d’onda, fare composizione e riconvertire.

Penso che il tuo problema con la combinazione di tonalità sia che lo stai facendo sumndo i due angoli e dividendo per due. Come hai notato, il risultato spesso non ha senso. Penso che sarebbe meglio convertire gli angoli in coordinate cartesiane sul cerchio unitario, facendo una media di questi e trovando l’angolo del punto risultante (ignorando la magnitudine).

Un modo per eseguire una combinazione sottrtriggers di colors RGB è innanzitutto convertire i colors RGB in curve di riflettanza spettrale. La conversione è abbastanza semplice e una volta eseguita, puoi eseguire una vera e propria combinazione sottrtriggers delle curve di riflettanza e quindi convertire il risultato in RGB. C’è un’altra domanda simile: stackoverflow.com/questions/10254022/ , dove questo processo è discusso in modo più dettagliato.

Chiedersi se il calcolo dell’inversione del valore RGB funziona. Dal momento che si tratta di sottrarre le luci, tecnicamente la parte di sottrazione può essere calcasting con una semplice matematica.

Per esempio ciano + giallo

cyan = 0x00ffff yellow = 0xffff00

Le loro inversioni sono 0xff0000 e 0x0000ff, il che significa che hanno assorbito completamente le luci rosse e blu. La loro miscela 1: 1 dovrebbe assorbire metà delle luci rosse e blu (poiché l’altra metà della miscela può ancora riflettere una luce rossa e blu), che è coerente con (0xff0000 + 0x00ffff) / 2 = 0x7f007f. Ora sottraiamo il valore da 0xffffff abbiamo 0x80ff80 che è verde!

Controlla questa implementazione per gli algoritmi additivi, sottrattivi e di miscelazione.

È perfettamente funzionante (scritto in java), quindi puoi testare tutti i colors che devi mixare e vedere se soddisfa le tue esigenze.

Come indicato da altre risposte, Blu + Giallo (esattamente Ciano + Giallo ) è Verde su alghoritm CMYK sottrattivo. Vedi da solo