Je ne pensais pas faire de l’optique aujourd’hui, mais dans le cadre de l’installation de notre logiciel Phoenix chez un client, j’ai dû réaliser une méthode de conversion CIELAB (L*a*b*) vers les valeurs tristimulus XYZ (CIE 1931).J’avais développé le logiciel Phoenix en 1999 pour le Centre Technique du Champignon pour leur permettre de réceptionner les données issues d’un colorimètre. Le principe est qu’ils font des essais sur la culture de différentes souches de champignons et que l’un des critères mesurés est la couleur (les consommateurs veulent que les champignons de paris soient BLANCS !). Du coup ils utilisent un colorimètre comme celui-ci : Cet appareil fonctionne sur port série et renvoit la couleur à chaque mesure prise. Phoenix fonctionnait jusque maintenant avec les valeurs L*a*b*, mais apparemment les nouveaux colorimètres Konica-Minolta fonctionnent à la norme XYZ.Pour ceux que cela intéresse, voici la méthode de conversion en langage C des valeurs tristimulus XYZ en valeurs CIELAB (L*a*b*) :
\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n
\r\n
1\r\n 2\r\n 3\r\n 4\r\n 5\r\n 6\r\n 7\r\n 8\r\n 9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24\r\n25\r\n26\r\n27\r\n28\r\n29\r\n30\r\n31\r\n32\r\n33\r\n34\r\n35\r\n36\r\n37\r\n38\r\n39\r\n40\r\n41\r\n42\r\n43\r\n44\r\n45\r\n46\r\n47\r\n48\r\n49 \r\n |
\r\n
double TransformXYZ(String retVal, double nX, double nY, double nZ)\r\n{\r\n const double YN = 100, XN = 98.0740000, ZN = 118.232000;\r\n double ret = 0;\r\n\r\n if (retVal == "L") {\r\n double d6 = (nY / YN);\r\n if (d6 > 0.008856) {\r\n ret = (116.0 * pow(d6, 1.0/3.0)) - 16;\r\n }\r\n else {\r\n ret = (903.29 * d6);\r\n }\r\n }\r\n else if (retVal == "a") {\r\n double c6 = (nX / XN);\r\n double d6 = (nY / YN);\r\n double val1, val2;\r\n if (c6 > 0.008856)\r\n val1 = pow(c6, 1.0/3.0);\r\n else\r\n val1 = (7.787 * c6) + (16.0/116.0);\r\n\r\n if (d6 > 0.008856)\r\n val2 = pow(d6, 1.0/3.0);\r\n else\r\n val2 = (7.787 * d6) + (16.0/116.0);\r\n\r\n ret = 500.0 * (val1 - val2);\r\n }\r\n else if (retVal == "b") {\r\n double d6 = (nY / YN);\r\n double e6 = (nZ / ZN);\r\n double val1, val2;\r\n if (d6 > 0.008856)\r\n val1 = pow(d6, 1.0/3.0);\r\n else\r\n val1 = (7.787 * d6) + (16.0/116.0);\r\n\r\n if (e6 > 0.008856)\r\n val2 = pow(e6, 1.0/3.0);\r\n else\r\n val2 = (7.787 * e6) + (16.0/116.0);\r\n\r\n ret = 200.0 * (val1 - val2);\r\n }\r\n\r\n return (ret);\r\n} \r\n |
\r\n
Pour aller plus loin sur ce sujet :