예제 #1
0
        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));
        }
예제 #2
0
        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));
        }
예제 #3
0
        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));
        }
예제 #4
0
        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);
        }