Пример #1
0
        /// <summary>
        /// Get the difference between two colors
        /// </summary>
        /// <param name="Color1">First color</param>
        /// <param name="Color2">Second color</param>
        /// <param name="DiffMethod">The specific way to calculate the difference</param>
        /// <returns>The difference between Color1 and Color2</returns>
        public double GetDeltaE_CMC(ColorLab Color1, ColorLab Color2, CMCDifferenceMethod DiffMethod)
        {
            if (Color1.ReferenceWhite.Name != WhitepointName.D65)
            {
                nLab1 = Converter.ToLab(Color1, nw);
            }
            else
            {
                nLab1 = Color1;
            }
            if (Color2.ReferenceWhite.Name != WhitepointName.D65)
            {
                nLab2 = Converter.ToLab(Color2, nw);
            }
            else
            {
                nLab2 = Color2;
            }

            var1  = (DiffMethod == CMCDifferenceMethod.Acceptability) ? 2 : 1;
            var2  = Math.Sqrt(Math.Pow(nLab1.a, 2) + Math.Pow(nLab1.b, 2));                                                                                                                                                                                            //C1
            var3  = Math.Sqrt(Math.Pow(nLab2.a, 2) + Math.Pow(nLab2.b, 2));                                                                                                                                                                                            //C2
            var4  = Math.Pow(nLab1.a - nLab2.a, 2) + Math.Pow(nLab1.b - nLab2.b, 2) - Math.Pow(var2 - var3, 2);
            var5  = (var4 < 0) ? 0 : Math.Sqrt(var4);                                                                                                                                                                                                                  //Delta H
            var6  = (nLab1.L < 16) ? 0.511 : (nLab1.L * 0.040975) / (1 + nLab1.L * 0.01765);                                                                                                                                                                           //SL
            var7  = ((0.0638 * var2) / (1 + 0.0131 * var2)) + 0.638;                                                                                                                                                                                                   //SC
            var8  = Math.Atan2(nLab1.b, nLab1.a);                                                                                                                                                                                                                      //H1
            var8  = (var8 < 0) ? var8 + Pi2 : (var8 >= Pi2) ? var8 - Pi2 : var8;
            var9  = (var8 <= 6.0213859193804370403867331512857 && var8 >= 2.8623399732707005061548528603213) ? 0.56 + Math.Abs(0.2 * Math.Cos(var8 + 2.9321531433504736892318004910609)) : 0.36 + Math.Abs(0.4 * Math.Cos(var8 + 0.61086523819801535192329176897101)); //T
            var10 = Math.Sqrt(Math.Pow(var2, 4) / (Math.Pow(var2, 4) + 1900));                                                                                                                                                                                         //F
            var11 = var7 * (var10 * var9 + 1 - var10);                                                                                                                                                                                                                 //SH

            return(Math.Sqrt(Math.Pow((nLab1.L - nLab2.L) / (var1 * var6), 2) + Math.Pow((var2 - var3) / var7, 2) + Math.Pow(var5 / var11, 2)));
        }
Пример #2
0
        /// <summary>
        /// Calculate the difference between two colors
        /// </summary>
        /// <param name="DiffMethod">The specific way to calculate the difference</param>
        /// <returns>The difference between Color1 and Color2</returns>
        public double DeltaE(CMCDifferenceMethod DiffMethod)
        {
            switch (DiffMethod)
            {
            case CMCDifferenceMethod.Acceptability:
                return(DeltaE(2, 1));

            case CMCDifferenceMethod.Perceptibility:
                return(DeltaE(1, 1));

            default:
                throw new ArgumentException("Not a valid enum value");
            }
        }
Пример #3
0
        /// <summary>
        /// Get the difference between two colors
        /// </summary>
        /// <param name="Color1">First color</param>
        /// <param name="Color2">Second color</param>
        /// <param name="DiffMethod">The specific way to calculate the difference</param>
        /// <returns>The difference between Color1 and Color2</returns>
        public static double GetDeltaE_CMC(ColorLab Color1, ColorLab Color2, CMCDifferenceMethod DiffMethod)
        {
            if (Color1.ReferenceWhite.Name != WhitepointName.D65) nLab1 = Converter.ToLab(Color1, nw);
            if (Color2.ReferenceWhite.Name != WhitepointName.D65) nLab2 = Converter.ToLab(Color2, nw);

            var1 = (DiffMethod == CMCDifferenceMethod.Acceptability) ? 2 : 1;
            var2 = Math.Sqrt(Math.Pow(nLab1.a, 2) + Math.Pow(nLab1.b, 2));   //C1
            var3 = Math.Sqrt(Math.Pow(nLab2.a, 2) + Math.Pow(nLab2.b, 2));   //C2
            var4 = Math.Pow(nLab1.a - nLab2.a, 2) + Math.Pow(nLab1.b - nLab2.b, 2) - Math.Pow(var2 - var3, 2);
            var5 = (var4 < 0) ? 0 : Math.Sqrt(var4);   //Delta H
            var6 = (nLab1.L < 16) ? 0.511 : (nLab1.L * 0.040975) / (1 + nLab1.L * 0.01765);   //SL
            var7 = ((0.0638 * var2) / (1 + 0.0131 * var2)) + 0.638;   //SC
            var8 = Math.Atan2(nLab1.b, nLab1.a);   //H1
            var8 = (var8 < 0) ? var8 + Pi2 : (var8 >= Pi2) ? var8 - Pi2 : var8;
            var9 = (var8 <= 6.0213859193804370403867331512857 && var8 >= 2.8623399732707005061548528603213) ? 0.56 + Math.Abs(0.2 * Math.Cos(var8 + 2.9321531433504736892318004910609)) : 0.36 + Math.Abs(0.4 * Math.Cos(var8 + 0.61086523819801535192329176897101));   //T
            var10 = Math.Sqrt(Math.Pow(var2, 4) / (Math.Pow(var2, 4) + 1900));  //F
            var11 = var7 * (var10 * var9 + 1 - var10);  //SH

            return Math.Sqrt(Math.Pow((nLab1.L - nLab2.L) / (var1 * var6), 2) + Math.Pow((var2 - var3) / var7, 2) + Math.Pow(var5 / var11, 2));
        }