blob: f4881ce0082c5b70bb5a3dcff138d2c90d5e44a0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tango.MachineStudio.RML.Models
{
public class BatchConversionCsvModelOut
{
public string Index { get; set; }
public double L { get; set; }
public double A { get; set; }
public double B { get; set; }
public double SuggestionL { get; set; }
public double SuggestionA { get; set; }
public double SuggestionB { get; set; }
public double SuggestionDeltaE { get; set; }
public double OutputL { get; set; }
public double OutputA { get; set; }
public double OutputB { get; set; }
public double OutputDeltaE { get; set; }
public double Cyan { get; set; }
public double Magenta { get; set; }
public double Yellow { get; set; }
public double Black { get; set; }
public double LightCyan { get; set; }
public double LightMagenta { get; set; }
public double LightYellow { get; set; }
public bool OutOfGamut { get; set; }
public static double MirtaDeltaE(double L1, double a1, double b1, double L2, double a2, double b2)
{
double h1 = Math.Atan2(b1, a1) * (180 / Math.PI);
if (h1 < 0)
h1 = h1 + 360;
double h2 = Math.Atan2(b2, a2) * (180 / Math.PI);
if (h2 < 0)
h2 = h2 + 360;
double refX_H = h1;
//chroma calculation
double refX_C = Math.Sqrt(a1 * a1 + b1 * b1);
//reference SL parameter
double refX_SL;
if (L1 <= 16)
refX_SL = 0.511;
else
refX_SL = L1 * 0.040975 / (1 + 0.01765 * L1);
//reference SC parameter
double refX_SC = (0.638 + 0.0638 * refX_C / (1 + 0.0131 * refX_C));
//reference CQ parameter
double refX_CQ = Math.Pow(refX_C, 4);
//reference F parameter
double refX_F = Math.Sqrt(refX_CQ / (refX_CQ + 1900));
// reference T parameter
double refX_T = 0;
if ((refX_H > 164) & (refX_H < 345))
refX_T = 0.56 + Math.Abs(0.2 * Math.Cos(Math.PI * (refX_H + 168) / 180));
else if ((refX_H >= 345) | (refX_H <= 164))
refX_T = 0.36 + Math.Abs(0.4 * Math.Cos(Math.PI * (refX_H + 35) / 180));
// reference SH parameter
double refX_SH = refX_SC * (refX_T * refX_F + 1 - refX_F);
//sample parameter calculations
//hue calculation
double samX_H = h2;
//chroma calculation
double samX_C = Math.Sqrt(a2 * a2 + b2 * b2);
double dL = L1 - L2;
double dC = samX_C - refX_C;
double da = a1 - a2;
double db = b1 - b2;
double dH = Math.Sqrt(Math.Max(da * da + db * db - dC * dC, 0.0));
double dECMC = Math.Sqrt(Math.Pow(dL / (2 * refX_SL), 2) + Math.Pow(dC / refX_SC, 2) + Math.Pow(dH / refX_SH, 2));
return dECMC;
}
}
}
|