/// <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))); }
/// <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"); } }
/// <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)); }