2011-02-09 11 views
9

Attualmente sto provando a convertire i colori tra spazio colore RGB (rosso, verde, blu) e spazio colore RYB (rosso, giallo, blu) e viceversa.Conversione tra spazi colore RGB e RYB

In base ai dettagli del seguente articolo, sono in grado di convertire da RYB a RGB utilizzando l'interpolazione trilineare - dove le ponderazioni parametriche (s, t, u) sono i colori RYB ei vertici del cubo sono 3d punti nello spazio RGB.

Paint Inspired Color Mixing and Compositing for Visualisation - Gossett and Chen - Sezione 2.1 - Realizzazione Dettagli

mie difficoltà sono per invertire il processo di conversione.

Un secondo documento fa riferimento all'uso di questa tecnica e indica anche che la conversione inversa è stata ottenuta utilizzando il metodo di Newton. Ma non fornisce ulteriori dettagli. Ciò probabilmente indicherà il reperimento della radice nel risolvere le equazioni di interpolazione trilineare.

On the Transfer of Painting Style to Photographic Images through Attention to Colour Contrast - Xiaoyan Zhang; Constable, M.; Ying He;

Prima espando su questa questione con le equazioni, qualcuno ha visto o risolto questo in un linguaggio come Java/C/C++/C#?

Il mio approccio attuale è di assumere le equazioni di inoltro dell'interpolazione trilineare (da RYB a RGB), espandere e riorganizzare per fornire 3 equazioni simultanee per 3 incognite (le ponderazioni parametriche: s, t eu) quindi calcolare come trova le radici usando il metodo Newton-Raphson. Sto andando su questo nel modo giusto?

Elaborerò brevemente questa domanda per fornire le equazioni.

Molte grazie per il vostro tempo,

Ben

+0

Hai provato mathoverflow.com? – sje397

+0

@ sje397: ho dato un'occhiata a mathoverflow.com, ma non vedo nulla riguardo all'interpolazione trilineare o al suo processo inverso. - Ho appena realizzato che potresti anche voler provare a fare la domanda lì. – Ben

+0

Si noti che l'interpolazione trilineare tende ad essere una scelta terribilmente scarsa per l'interpolazione in cui sono interessate le coordinate RGB. Questo perché i neutri vivono sulla diagonale principale del cubo nello spazio RGB. Spesso vedi errori di interpolazione di grandi dimensioni, esattamente sul set di colori che il tuo cervello può vedere sottili errori di colore. –

risposta

3

sono riuscito a risolverlo alla fine.

Prendere le equazioni di interpolazione trilineare: wikipedia

sostituire il primo equazioni nel ultimo, l'espansione e raccogliere i coefficienti per: Xd, Yd, Zd, XdYd, XdZd, YdZd, ZdYdZd e la costante.

Quindi trovare la differenziazione parziale dell'equazione in ciascuna delle 3 dimensioni ciascuna rispetto a Xd, Yd e Zd. Usa queste nuove equazioni per popolare la matrice Jacobiana (3x3) e poi usa il metodo di Newton per risolvere nel software.

Newton-Raphson Method

+0

@SeinopSys Grazie per la modifica per risolvere il collegamento interrotto. – Ben

2

Ecco una categoria a UIColor che fa la stessa cosa, gli elementi tra RGB, RYB, e CMYK ritorno. Inoltre, puoi mescolare qualsiasi numero di colori nel rispettivo spazio colore (si mescolano in modo diverso, ovviamente, a seconda).

https://github.com/ddelruss/UIColor-Mixing

Godetevi,

Damien

1

ho trovato this JavaScript implementation della conversione RYB-> RGB sulla base di spline cubiche.Ecco la mia porta Lua (tutti i valori si trovano nell'intervallo 0-1):

local ryb2rgb = function(R, Y, B) 
    local R, Y, B = R*R*(3-R-R), Y*Y*(3-Y-Y), B*B*(3-B-B) 
    return 1.0 + B * (R * (0.337 + Y * -0.137) + (-0.837 + Y * -0.163)), 
    1.0 + B * (-0.627 + Y * 0.287) + R * (-1.0 + Y * (0.5 + B * -0.693) - B * (-0.627)), 
    1.0 + B * (-0.4 + Y * 0.6) - Y + R * (-1.0 + B * (0.9 + Y * -1.1) + Y) 
end 
+0

Come ha affermato, il problema è l'inverso, rgb -> ryb –

+0

http://nishitalab.org/user/UEI/publication/Sugita_IWAIT2015.pdf http://nishitalab.org/user/UEI/publication/Sugita_SIG2015. PDF – Krzycho