private static double CompareCmc1984(ColorSpace color1, ColorSpace color2) { const double defaultLightness = 2.0; const double defaultChroma = 1.0; var lab1 = color1.ToColorSpace <Lab>(); var lab2 = color2.ToColorSpace <Lab>(); var deltaL = lab1.L - lab2.L; var h = System.Math.Atan2(lab1.B, lab1.A); var c1 = System.Math.Sqrt(lab1.A * lab1.A + lab1.B * lab1.B); var c2 = System.Math.Sqrt(lab2.A * lab2.A + lab2.B * lab2.B); var c1A = System.Math.Pow(c1, 4); var deltaC = c1 - c2; var deltaH = System.Math.Sqrt( (lab1.A - lab2.A) * (lab1.A - lab2.A) + (lab1.B - lab2.B) * (lab1.B - lab2.B) - deltaC * deltaC); var t = 164 <= h || h >= 345 ? 0.56 + System.Math.Abs(0.2 * System.Math.Cos(h + 168.0)) : 0.36 + System.Math.Abs(0.4 * System.Math.Cos(h + 35.0)); var f = System.Math.Sqrt(c1A / (c1A + 1900.0)); var sL = lab1.L < 16 ? 0.511 : 0.040975 * lab1.L / (1.0 + 0.01765 * lab1.L); var sC = 0.0638 * c1 / (1.0 + 0.0131 * c1) + 0.638; var sH = sC * (f * t + 1.0 - f); var diff = System.Math.Pow(deltaL / (defaultLightness * sL), 2) + System.Math.Pow(deltaC / (defaultChroma * sC), 2) + System.Math.Pow(deltaH / sH, 2); return(System.Math.Sqrt(diff)); }
private static double CompareCie1994(ColorSpace color1, ColorSpace color2) { const double kl = 1.0; const double k1 = 0.045; const double k2 = 0.015; const double sl = 1.0; const double kc = 1.0; const double kh = 1.0; var lab1 = color1.ToColorSpace <Lab>(); var lab2 = color2.ToColorSpace <Lab>(); var deltaL = lab1.L - lab2.L; var deltaA = lab1.A - lab2.A; var deltaB = lab1.B - lab2.B; var c1 = System.Math.Sqrt(lab1.A * lab1.A + lab1.B * lab1.B); var c2 = System.Math.Sqrt(lab2.A * lab2.A + lab2.B * lab2.B); var deltaC = c1 - c2; var deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC; deltaH = deltaH < 0 ? 0 : System.Math.Sqrt(deltaH); var sc = 1.0 + k1 * c1; var sh = 1.0 + k2 * c1; var deltaL1 = deltaL / (kl * sl); var deltaC1 = deltaC / (kc * sc); var deltaH1 = deltaH / (kh * sh); var i = deltaL1 * deltaL1 + deltaC1 * deltaC1 + deltaH1 * deltaH1; return(i < 0 ? 0 : System.Math.Sqrt(i)); }
private static double CompareCie1976(ColorSpace color1, ColorSpace color2) { var lab1 = color1.ToColorSpace <Lab>(); var lab2 = color2.ToColorSpace <Lab>(); var diff = (lab1.L - lab2.L) * (lab1.L - lab2.L) + (lab1.A - lab2.A) * (lab1.A - lab2.A) + (lab1.B - lab2.B) * (lab1.B - lab2.B); return(System.Math.Sqrt(diff)); }
private static double CompareCie2000(ColorSpace color1, ColorSpace color2) { const double kl = 1.0; const double kc = 1.0; const double kh = 1.0; var lab1 = color1.ToColorSpace <Lab>(); var lab2 = color2.ToColorSpace <Lab>(); var lBar = (lab1.L + lab2.L) / 2.0; var c1 = System.Math.Sqrt(lab1.A * lab1.A + lab1.B * lab1.B); var c2 = System.Math.Sqrt(lab2.A * lab2.A + lab2.B * lab2.B); var cBar = (c1 + c2) / 2.0; var cBarInPower7 = cBar * cBar * cBar; cBarInPower7 *= cBarInPower7 * cBar; var g = 1 - System.Math.Sqrt(cBarInPower7 / (cBarInPower7 + 6103515625)); var aPrime1 = lab1.A + lab1.A / 2.0 * g; var aPrime2 = lab2.A + lab2.A / 2.0 * g; var cPrime1 = System.Math.Sqrt(aPrime1 * aPrime1 + lab1.B * lab1.B); var cPrime2 = System.Math.Sqrt(aPrime2 * aPrime2 + lab2.B * lab2.B); var cBarPrime = (cPrime1 + cPrime2) / 2.0; var hPrime1 = System.Math.Atan2(lab1.B, aPrime1) % 360; var hPrime2 = System.Math.Atan2(lab2.B, aPrime2) % 360; var hBar = System.Math.Abs(hPrime1 - hPrime2); double deltaHPrime; if (hBar <= 180) { deltaHPrime = hPrime2 - hPrime1; } else if (hBar > 180 && hPrime2 <= hPrime1) { deltaHPrime = hPrime2 - hPrime1 + 360.0; } else { deltaHPrime = hPrime2 - hPrime1 - 360.0; } var deltaLPrime = lab2.L - lab1.L; var deltaCPrime = cPrime2 - cPrime1; deltaHPrime = 2 * System.Math.Sqrt(cPrime1 * cPrime2) * System.Math.Sin(deltaHPrime / 2.0); var hBarPrime = hBar > 180 ? (hPrime1 + hPrime2 + 360) / 2.0 : (hPrime1 + hPrime2) / 2.0; var t = 1 - .17 * System.Math.Cos(hBarPrime - 30) + .24 * System.Math.Cos(2 * hBarPrime) + .32 * System.Math.Cos(3 * hBarPrime + 6) - .2 * System.Math.Cos(4 * hBarPrime - 63); var lBarMinus50Sqr = (lBar - 50) * (lBar - 50); var sl = 1 + .015 * lBarMinus50Sqr / System.Math.Sqrt(20 + lBarMinus50Sqr); var sc = 1 + .045 * cBarPrime; var sh = 1 + .015 * cBarPrime * t; var cBarPrimeInPower7 = cBarPrime * cBarPrime * cBarPrime; cBarPrimeInPower7 *= cBarPrimeInPower7 * cBarPrime; var rt = -2 * System.Math.Sqrt(cBarPrimeInPower7 / (cBarPrimeInPower7 + 6103515625)) // 25 ^ 7 * System.Math.Sin(60.0 * System.Math.Exp(-((hBarPrime - 275.0) / 25.0))); var deltaLPrimeDivklsl = deltaLPrime / (kl * sl); var deltaCPrimeDivkcsc = deltaCPrime / (kc * sc); var deltaHPrimeDivkhsh = deltaHPrime / (kh * sh); var deltaE = System.Math.Sqrt( deltaLPrimeDivklsl * deltaLPrimeDivklsl + deltaCPrimeDivkcsc * deltaCPrimeDivkcsc + deltaHPrimeDivkhsh * deltaHPrimeDivkhsh + rt * (deltaCPrime / (kc * kh)) * (deltaHPrime / (kh * sh))); return(deltaE); }