/// <summary> /// /// </summary> /// <param name="l"></param> /// <param name="a"></param> /// <param name="b"></param> /// <param name="Illuminant"></param> /// <returns></returns> public static Rgba ToRgba(double l, double a, double b, Illuminant Illuminant = Illuminant.Default) { double theta = 6.0 / 29.0; double fy = (l + 16.0) / 116.0; double fx = fy + (a / 500.0); double fz = fy - (b / 200.0); var mx = Xyz.Max[Xyz.Component.X, Illuminant]; var my = Xyz.Max[Xyz.Component.Y, Illuminant]; var mz = Xyz.Max[Xyz.Component.Z, Illuminant]; var x = (fx > theta ? mx * (fx * fx * fx) : (fx - 16.0 / 116.0) * 3.0 * (theta * theta) * mx).Coerce(mx); var y = (fy > theta ? my * (fy * fy * fy) : (fy - 16.0 / 116.0) * 3.0 * (theta * theta) * my).Coerce(my); var z = (fz > theta ? mz * (fz * fz * fz) : (fz - 16.0 / 116.0) * 3.0 * (theta * theta) * mz).Coerce(mz); double[] Clinear = new double[3]; Clinear[0] = x * 3.2410 - y * 1.5374 - z * 0.4986; //R Clinear[1] = -x * 0.9692 + y * 1.8760 - z * 0.0416; //G Clinear[2] = x * 0.0556 - y * 0.2040 + z * 1.0570; //B for (int i = 0; i < 3; i++) { Clinear[i] = (Clinear[i] <= 0.0031308) ? 12.92 * Clinear[i] : (1.0 + 0.055) * Math.Pow(Clinear[i], (1.0 / 2.4)) - 0.055; Clinear[i] = Math.Min(Clinear[i], 1); Clinear[i] = Math.Max(Clinear[i], 0); Clinear[i] *= 255.0; Clinear[i] = Clinear[i].Coerce(255.0); } return(new Rgba(Clinear[0].ToInt32(), Clinear[1].ToInt32(), Clinear[2].ToInt32())); }
public RgbWorkingSpace(string name, Illuminant refwhite, double[,] xyz_to_rgb, double[,] rgb_to_xyz) { this.Name = name; this.ReferenceWhite = refwhite; this.XyztoRgbMatrix = xyz_to_rgb; this.RgbtoxyzMatrix = rgb_to_xyz; }
public RGBWorkingSpace(string name, Illuminant refwhite, double[,] xyz_to_rgb, double[,] rgb_to_xyz) { this.Name = name; this.ReferenceWhite = refwhite; this.XYZToRGBMatrix = xyz_to_rgb; this.RGBTOXYZMatrix = rgb_to_xyz; }
/// <summary> /// /// </summary> /// <param name="Xyz"></param> /// <param name="Observer"></param> /// <param name="Illuminant"></param> public Luv(Xyz Xyz, ObserverAngle Observer = ObserverAngle.Two, Illuminant Illuminant = Illuminant.Default) : this(0, 0, 0, Observer, Illuminant) { var w = Xyz.X + (15d * Xyz.Y) + (3d * Xyz.Z); var u = (4d * Xyz.X) / w; var v = (9d * Xyz.Y) / w; var y = Xyz.Y / 100d; y = Xyz.Y > 0.008856 ? Math.Pow(Xyz.Y, 1d / 3d) : (7.787 * Xyz.Y) + (16d / 116d); var mx = Xyz.Max[Xyz.Component.X, Observer, Illuminant].Shift(2); var my = Xyz.Max[Xyz.Component.Y, Observer, Illuminant].Shift(2); var mz = Xyz.Max[Xyz.Component.Z, Observer, Illuminant].Shift(2); var rl = mx + (15d * my) + (3d * mz); var ru = (4d * mx) / rl; var rv = (9d * my) / rl; var l = (116d * y) - 16d; u = 13d * l * (u - ru); v = 13d * l * (v - rv); L = l; U = u; V = v; }
public static void Initialize(KnownIlluminant sourceIlluminant, KnownIlluminant destIlluminant, ChromaticAdaptionMethod method = ChromaticAdaptionMethod.BradFord) { Illuminant src = Illuminant.GetIlluminant(sourceIlluminant); Illuminant dest = Illuminant.GetIlluminant(destIlluminant); GetCATMatrix(src, dest, method); }
/// <summary> /// /// </summary> /// <param name="Value"></param> protected virtual void OnIlluminantChanged(Illuminant Value) { if (ColorSpace != null) { ColorSpace.Illuminant = Value; } }
public static void GetCATMatrix(Illuminant source, Illuminant dest, ChromaticAdaptionMethod method = ChromaticAdaptionMethod.BradFord) { GetMatrix(method, ref Ma, ref MaPrime); double[] prb_source = Matrix.Dot(Ma, source.GetXYZ()); double[] prb_dest = Matrix.Dot(Ma, dest.GetXYZ()); double[,] prb = Matrix.Diagonal(3, Elementwise.Divide(prb_dest, prb_source)); M = Matrix.Dot(Matrix.Dot(MaPrime, prb), Ma); }
/// <summary> /// Creates an instance of the <see cref="Xyz"/> structure. /// </summary> /// <param name="X"></param> /// <param name="Y"></param> /// <param name="Z"></param> /// <param name="Illuminant"></param> public Xyz(double X, double Y, double Z, Illuminant Illuminant = Illuminant.Default) { illuminant = Illuminant; x = X.Coerce(Max[Component.X, Illuminant], MinValue.X); y = Y.Coerce(Max[Component.Y, Illuminant], MinValue.Y); z = Z.Coerce(Max[Component.Z, Illuminant], MinValue.Z); }
/// <summary> /// Initializes a new instance of the <see cref="Xyz"/> structure. /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="z"></param> /// <param name="observer"></param> /// <param name="illuminant"></param> public Xyz(double x, double y, double z, ObserverAngle observer = ObserverAngle.Two, Illuminant illuminant = Illuminant.Default) : this() { Observer = observer; Illuminant = illuminant; X = x; Y = y; Z = z; }
/// <summary> /// Initializes a new instance of the <see cref="Luv"/> structure. /// </summary> /// <param name="l"></param> /// <param name="u"></param> /// <param name="v"></param> /// <param name="observer"></param> /// <param name="illuminant"></param> public Luv(double l, double u, double v, ObserverAngle observer = ObserverAngle.Two, Illuminant illuminant = Illuminant.Default) : this() { Observer = observer; Illuminant = illuminant; L = l; U = u; V = v; }
/// <summary> /// Initializes a new instance of the <see cref="Lch"/> structure. /// </summary> /// <param name="l"></param> /// <param name="c"></param> /// <param name="h"></param> /// <param name="observer"></param> /// <param name="illuminant"></param> public Lch(double l, double c, double h, ObserverAngle observer = ObserverAngle.Two, Illuminant illuminant = Illuminant.Default) : this() { Observer = observer; Illuminant = illuminant; L = l; C = c; H = h; }
/// <summary> /// /// </summary> /// <param name="Rgba"></param> /// <param name="Observer"></param> /// <param name="Illuminant"></param> public Xyz(Rgba Rgba, ObserverAngle Observer = ObserverAngle.Two, Illuminant Illuminant = Illuminant.Default) : this(0, 0, 0, Observer, Illuminant) { var Rgb = new double[3]; Rgb[0] = Rgba.Linear(Rgba.R); Rgb[1] = Rgba.Linear(Rgba.G); Rgb[2] = Rgba.Linear(Rgba.B); for (int i = 0; i < 3; i++) { Rgb[i] = Rgb[i] > 0.04045 ? Math.Pow((Rgb[i] + 0.055) / 1.055, 2.4) : Rgb[i] / 12.92; } X = Rgb[0] * 0.4124 + Rgb[1] * 0.3576 + Rgb[2] * 0.1805; Y = Rgb[0] * 0.2126 + Rgb[1] * 0.7152 + Rgb[2] * 0.0722; Z = Rgb[0] * 0.0193 + Rgb[1] * 0.1192 + Rgb[2] * 0.9505; }
/// <summary> /// /// </summary> /// <param name="Lab"></param> /// <param name="Observer"></param> /// <param name="Illuminant"></param> public Lch(Lab Lab, ObserverAngle Observer = ObserverAngle.Two, Illuminant Illuminant = Illuminant.Default) : this(0, 0, 0, Observer, Illuminant) { double l, c, h = Math.Atan2(Lab.B, Lab.A); if (h > 0d) { h = (h / Math.PI) * 180d; } else { h = 360d - (h.Abs() / Math.PI) * 180d; } l = Lab.L; c = Math.Sqrt(Math.Pow(Lab.A, 2d) + Math.Pow(Lab.B, 2d)); L = l; C = c; H = h; }
/// <summary> /// /// </summary> /// <param name="Rgba"></param> /// <param name="Observer"></param> /// <param name="Illuminant"></param> public Lab(Rgba Rgba, ObserverAngle Observer = ObserverAngle.Two, Illuminant Illuminant = Illuminant.Default) : this(0, 0, 0, Observer, Illuminant) { var RLinear = Rgba.R.ToDouble() / 255d; var GLinear = Rgba.G.ToDouble() / 255d; var BLinear = Rgba.B.ToDouble() / 255d; RLinear = (RLinear > 0.04045) ? Math.Pow((RLinear + 0.055) / (1 + 0.055), 2.2) : (RLinear / 12.92); GLinear = (GLinear > 0.04045) ? Math.Pow((GLinear + 0.055) / (1 + 0.055), 2.2) : (GLinear / 12.92); BLinear = (BLinear > 0.04045) ? Math.Pow((BLinear + 0.055) / (1 + 0.055), 2.2) : (BLinear / 12.92); double x = RLinear * 0.4124 + GLinear * 0.3576 + BLinear * 0.1805; double y = RLinear * 0.2126 + GLinear * 0.7152 + BLinear * 0.0722; double z = RLinear * 0.0193 + GLinear * 0.1192 + BLinear * 0.9505; var mx = Xyz.Max[Xyz.Component.X, Observer, Illuminant]; var my = Xyz.Max[Xyz.Component.Y, Observer, Illuminant]; var mz = Xyz.Max[Xyz.Component.Z, Observer, Illuminant]; L = 116d * Xyz.Fxyz(y / my) - 16d; A = 500d * (Xyz.Fxyz(x / mx) - Xyz.Fxyz(y / my)); B = 200d * (Xyz.Fxyz(y / my) - Xyz.Fxyz(z / mz)); }
/// <summary> /// /// </summary> /// <param name="L"></param> /// <param name="U"></param> /// <param name="V"></param> /// <param name="Illuminant"></param> /// <returns></returns> public static Xyz ToXyz(double L, double U, double V, Illuminant Illuminant = Illuminant.Default) { var y = (L + 16.0) / 116.0; y = Math.Pow(y, 3.0) > 0.008856 ? Math.Pow(y, 3) : (y - 16.0 / 116) / 7.787; var mx = Xyz.Max[Xyz.Component.X, Illuminant]; var my = Xyz.Max[Xyz.Component.Y, Illuminant]; var mz = Xyz.Max[Xyz.Component.Z, Illuminant]; var rl = mx.Shift(2) + (15.0 * my.Shift(2)) + (3.0 + mz.Shift(2)); var ru = (4.0 * mx.Shift(2)) / rl; var rv = (9.0 * my.Shift(2)) / rl; var u = U / (13.0 * L) + ru; var v = V / (13.0 * L) + rv; y *= 100.0; var x = -(9.0 * y * u) / ((u - 4.0) * v - u * v); var z = (9 * y - (15.0 * v * y) - (v * x)) / (3.0 * v); return(new Xyz(x, y, z)); }
/// <summary> /// /// </summary> /// <param name="X"></param> /// <param name="Y"></param> /// <param name="Z"></param> /// <param name="Illuminant"></param> /// <returns></returns> public static Luv FromXyz(double X, double Y, double Z, Illuminant Illuminant = Illuminant.Default) { var w = X + (15d * Y) + (3d * Z); var u = (4d * X) / w; var v = (9d * Y) / w; var y = Y > 0.008856 ? Math.Pow(Y, 1d / 3d) : (7.787 * Y) + (16d / 116d); var mx = Xyz.Max[Xyz.Component.X, Illuminant]; var my = Xyz.Max[Xyz.Component.Y, Illuminant]; var mz = Xyz.Max[Xyz.Component.Z, Illuminant]; var rl = mx.Shift(2) + (15.0 * my.Shift(2)) + (3.0 * mz.Shift(2)); var ru = (4.0 * mx.Shift(2)) / rl; var rv = (9.0 * my.Shift(2)) / rl; var l = (116d * y) - 16d; u = 13d * l * (u - ru); v = 13d * l * (v - rv); return(new Luv(l.Divide(MaxValue.L), u.Divide(MaxValue.U), v.Divide(MaxValue.V))); }
/// <summary> /// /// </summary> /// <param name="R"></param> /// <param name="G"></param> /// <param name="B"></param> /// <param name="A"></param> /// <returns></returns> public static Lab FromRgba(byte R, byte G, byte B, byte A = 255, Illuminant Illuminant = Illuminant.Default) { var RLinear = R.ToDouble() / 255d; var GLinear = G.ToDouble() / 255d; var BLinear = B.ToDouble() / 255d; RLinear = (RLinear > 0.04045) ? Math.Pow((RLinear + 0.055) / (1 + 0.055), 2.2) : (RLinear / 12.92); GLinear = (GLinear > 0.04045) ? Math.Pow((GLinear + 0.055) / (1 + 0.055), 2.2) : (GLinear / 12.92); BLinear = (BLinear > 0.04045) ? Math.Pow((BLinear + 0.055) / (1 + 0.055), 2.2) : (BLinear / 12.92); double x = RLinear * 0.4124 + GLinear * 0.3576 + BLinear * 0.1805; double y = RLinear * 0.2126 + GLinear * 0.7152 + BLinear * 0.0722; double z = RLinear * 0.0193 + GLinear * 0.1192 + BLinear * 0.9505; var mx = Xyz.Max[Xyz.Component.X, Illuminant]; var my = Xyz.Max[Xyz.Component.Y, Illuminant]; var mz = Xyz.Max[Xyz.Component.Z, Illuminant]; double l = 116d * Xyz.Fxyz(y / my) - 16d; double a = 500d * (Xyz.Fxyz(x / mx) - Xyz.Fxyz(y / my)); double b = 200d * (Xyz.Fxyz(y / my) - Xyz.Fxyz(z / mz)); return(new Lab(l, a, b)); }
/// <summary> /// /// </summary> /// <param name="Component"></param> /// <param name="Illuminant"></param> /// <returns></returns> public double this[Component Component, Illuminant Illuminant] { get { switch (Illuminant) { case Illuminant.A: switch (Component) { case Component.X: return(1.0985); case Component.Y: return(1d); case Component.Z: return(0.3558); } break; case Illuminant.C: switch (Component) { case Component.X: return(0.9807); case Component.Y: return(1d); case Component.Z: return(1.1822); } break; case Illuminant.E: switch (Component) { case Component.X: return(1d); case Component.Y: return(1d); case Component.Z: return(1d); } break; case Illuminant.D50: switch (Component) { case Component.X: return(0.9642); case Component.Y: return(1d); case Component.Z: return(0.8251); } break; case Illuminant.D55: switch (Component) { case Component.X: return(0.9568); case Component.Y: return(1d); case Component.Z: return(0.9214); } break; case Illuminant.ICC: switch (Component) { case Component.X: return(0.962); case Component.Y: return(1d); case Component.Z: return(0.8249); } break; case Illuminant.D65: default: switch (Component) { case Component.X: return(0.95047); case Component.Y: return(1d); case Component.Z: return(1.08883); } break; } return(0d); } }
public static void Initialize(Illuminant sourceIlluminant, Illuminant destIlluminant, ChromaticAdaptionMethod method = ChromaticAdaptionMethod.BradFord) { GetCATMatrix(sourceIlluminant, destIlluminant, method); }
/// <summary> /// /// </summary> /// <param name="Color"></param> /// <param name="Observer"></param> /// <param name="Illuminant"></param> public Luv(Color Color, ObserverAngle Observer = ObserverAngle.Two, Illuminant Illuminant = Illuminant.Default) : this(new Rgba(Color), Observer, Illuminant) { }
/// <summary> /// /// </summary> /// <param name="Rgba"></param> /// <param name="Observer"></param> /// <param name="Illuminant"></param> public Luv(Rgba Rgba, ObserverAngle Observer = ObserverAngle.Two, Illuminant Illuminant = Illuminant.Default) : this(new Xyz(Rgba), Observer, Illuminant) { }
private void cbBoxFrom_SelectionChanged(object sender, SelectionChangedEventArgs e) { KnownIlluminant src = (KnownIlluminant)cbBoxFrom.SelectedIndex; SourceIlluminant = Illuminant.GetIlluminant(src); }
/// <summary> /// /// </summary> /// <param name="Value"></param> protected virtual void OnIlluminantChanged(Illuminant Value) { UpdatePlane(SelectedComponent.GetValue(Color).Round().ToInt32()); SelectedComponent.UpdateSlider(NormalPane, Color); }
private void cbBoxTo_SelectionChanged(object sender, SelectionChangedEventArgs e) { KnownIlluminant dest = (KnownIlluminant)cbBoxTo.SelectedIndex; DestIlluminant = Illuminant.GetIlluminant(dest); }
public static double[] CATTransform <T>(T[] inputValue, Illuminant source, Illuminant dest, ChromaticAdaptionMethod method = ChromaticAdaptionMethod.BradFord) { Initialize(source, dest, method); return(CATTransform(inputValue)); }
public static Chromacity IlluminantToWhitePoint(Illuminant i) { switch (i) { case Illuminant.A: return(new Chromacity { X = 0.44757f, Y = 0.40744f }); case Illuminant.B: return(new Chromacity { X = 0.34840f, Y = 0.35160f }); case Illuminant.C: return(new Chromacity { X = 0.31006f, Y = 0.31615f }); case Illuminant.D50: return(new Chromacity { X = 0.34567f, Y = 0.35850f }); case Illuminant.D55: return(new Chromacity { X = 0.33242f, Y = 0.34743f }); case Illuminant.D65: return(new Chromacity { X = 0.31273f, Y = 0.32902f }); case Illuminant.D75: return(new Chromacity { X = 0.29902f, Y = 0.31485f }); case Illuminant.I9300K: return(new Chromacity { X = 0.28480f, Y = 0.29320f }); case Illuminant.E: return(new Chromacity { X = 0.33333f, Y = 0.33333f }); case Illuminant.F2: return(new Chromacity { X = 0.37207f, Y = 0.37512f }); case Illuminant.F7: return(new Chromacity { X = 0.31285f, Y = 0.32918f }); case Illuminant.F11: return(new Chromacity { X = 0.38054f, Y = 0.37691f }); } return(new Chromacity { X = 0.31273f, Y = 0.32902f }); }
protected PixelDouble ReadPixs(Illuminant i, Register r, FileType f, Area a) { string filename = "current_dir" + IllDic[i] + RegDic[r] + FileDic[f]; return(AreaDic[a](PixelStream.ReadTxtDouble(filename, 1408, 1032))); }
/// <summary> /// Initializes a new instance of the <see cref="Lab"/> structure. /// </summary> /// <param name="l"></param> /// <param name="a"></param> /// <param name="b"></param> /// <param name="observer"></param> /// <param name="illuminant"></param> public Lab(double l, double a, double b, ObserverAngle observer = ObserverAngle.Two, Illuminant illuminant = Illuminant.Default) : this() { Observer = Observer; Illuminant = Illuminant; L = l; A = a; B = b; }