2017-10-08 9 views
0

Je dois être capable de convertir une couleur Lab en une couleur XYZ. J'ai suivi l'explication de cette page, basée sur la recommandation que j'ai trouvée sur la question de quelqu'un d'autre: http://www.brucelindbloom.com/index.html?Eqn_Lab_to_XYZ.htmlConvertir le laboratoire en XYZ

Je l'ai suivi, mais mes valeurs X et Z sont loin, mais le Y est correct (je l'ai testé contre un couple de convertisseurs en ligne (qui ne montrent pas comment ils le convertissent ...)). J'ai regardé ce laboratoire sur le site XYZ pendant un moment, essayant de trouver une erreur avec mes maths.

La couleur Lab je teste avec: Lab[41, 48, -19]

Les valeurs XYZ je reçois: XYZ[5676.0352, 0.1186, 4845.2021] (le site dit que les résultats devraient être dans la gamme [0, 1]

Le referenceX, referenceY et referenceZ sont ma référence blanche . Les valeurs de couleurs

Voici mon code (Java):

// https://www.mathworks.com/help/images/ref/whitepoint.html 
    // a: 1.0985, 1, 0.3556 
    // c: 0.9807, 1, 1.1822 
    // e: 1,1, 1 
    // d50: 0.9642, 1, 0.8251 
    // d55: 0.9568, 1, 0.9214 
    // d65: 0.9504, 1, 1.0888 
    // icc: 0.9642, 1, 0.8249 (what we're using) 
    double referenceX = 0.9642; 
    double referenceY = 1; 
    double referenceZ = 0.8249; 

    double fy = (this.lightness + 16)/116; 
    double fx = this.a/500 + fy; 
    double fz = fy - this.b/200; 
    //todo make these constants 
    double kappa = 216/24389.0; 
    double epsilon = 24389/27.0; 

    double fx3 = fx * fx * fx; 
    double fz3 = fz * fz * fz; 
    double xr = fx3 > epsilon ? fx3 : (116 * fx - 16)/kappa; 
    double yr = this.lightness > kappa * epsilon ? Math.pow((this.lightness + 16)/116, 3) : this.lightness/kappa; 
    double zr = fz3 > epsilon ? fz3 : (116 * fz - 16)/kappa; 

    double X = xr * referenceX; 
    double Y = yr * referenceY; 
    double Z = zr * referenceZ; 

Donc, je suppose que ma question est bien sûr, qu'est-ce qui ne va pas avec mes maths? Ou quelqu'un peut-il trouver un autre site Web avec un moyen de faire la conversion (je n'arrive pas à en trouver)?

Merci. Si vous avez besoin d'éclaircissements ou avez des questions s'il vous plaît demander.

+2

Vous avez échangé les valeurs de 'kappa' et' epsilon'. –

Répondre

0

Vous ne savez pas ce qui s'est passé ici (si quelqu'un sait, s'il vous plaît dites!), Mais j'ai fini par utiliser la conversion de Wikipedia (https://en.wikipedia.org/wiki/Lab_color_space#RGB_and_CMYK_conversions, voir Reverse Transformation). Je ne sais pas pourquoi je n'ai pas vu ça au début.

+0

Il semble que la formule sur le site de Bruce Lindbloom est erronée. –

+1

Comme Peter Occil l'a souligné, vous avez inversé les deux constantes, votre implémentation semble bien dans le cas contraire. @Erwin Bolwidt: Que pensez-vous qu'il est incorrect sur la référence de Bruce Lindbloom? Il devrait être bien et intègre réellement les constantes fournissant point de jonction parfait pour CIE L *: http://www.brucelindbloom.com/index.html?LContinuity.html –

+0

@KelSolaar Oui, merci. Je ne peux pas croire que je n'ai pas vu ça. La formule fonctionne correctement, au moins selon deux convertisseurs en ligne avec lesquels j'ai testé. (De même que la version wikipedia) – MCMastery