From 96146b237e480ddce9be3d4a7ca6b73f812cb43f Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 19 Apr 2017 12:30:59 +1000 Subject: [PATCH] All tests now pass! --- .../Lms/CieXyzAndLmsConverter.cs | 2 +- .../Implementation/Lms/LmsAdaptationMatrix.cs | 28 +++++++------- .../Rgb/LinearRgbAndCieXyzConverterBase.cs | 3 +- .../CieXyzAndCieLabConversionTest.cs | 13 +++---- .../CieXyzAndHunterLabConversionTest.cs | 28 +++++++------- .../Colorspaces/CieXyzAndLmsConversionTest.cs | 16 ++++---- .../Colorspaces/ColorConverterAdaptTest.cs | 38 +++++++++---------- .../Colorspaces/RgbAndCieXyzConversionTest.cs | 27 +++++++------ 8 files changed, 77 insertions(+), 78 deletions(-) diff --git a/src/ImageSharp/Colors/Spaces/Conversion/Implementation/Lms/CieXyzAndLmsConverter.cs b/src/ImageSharp/Colors/Spaces/Conversion/Implementation/Lms/CieXyzAndLmsConverter.cs index 2b597ba42..cc8809574 100644 --- a/src/ImageSharp/Colors/Spaces/Conversion/Implementation/Lms/CieXyzAndLmsConverter.cs +++ b/src/ImageSharp/Colors/Spaces/Conversion/Implementation/Lms/CieXyzAndLmsConverter.cs @@ -40,7 +40,7 @@ namespace ImageSharp.Colors.Spaces.Conversion.Implementation.Lms /// public CieXyzAndLmsConverter(Matrix4x4 transformationMatrix) { - this.TransformationMatrix = Matrix4x4.Transpose(transformationMatrix); + this.TransformationMatrix = transformationMatrix; } /// diff --git a/src/ImageSharp/Colors/Spaces/Conversion/Implementation/Lms/LmsAdaptationMatrix.cs b/src/ImageSharp/Colors/Spaces/Conversion/Implementation/Lms/LmsAdaptationMatrix.cs index 97fb6eebc..3a0d818d4 100644 --- a/src/ImageSharp/Colors/Spaces/Conversion/Implementation/Lms/LmsAdaptationMatrix.cs +++ b/src/ImageSharp/Colors/Spaces/Conversion/Implementation/Lms/LmsAdaptationMatrix.cs @@ -17,7 +17,7 @@ namespace ImageSharp.Colors.Spaces.Conversion.Implementation.Lms /// Two New von Kries Based Chromatic Adaptation Transforms Found by Numerical Optimization /// S. Bianco, R. Schettini /// DISCo, Department of Informatics, Systems and Communication, University of Milan-Bicocca, viale Sarca 336, 20126 Milan, Italy - /// http://www.ivl.disco.unimib.it/papers2003/CRA-CAT.pdf + /// https://web.stanford.edu/~sujason/ColorBalancing/Papers/Two%20New%20von%20Kries%20Based%20Chromatic%20Adaptation.pdf /// public static class LmsAdaptationMatrix { @@ -25,77 +25,77 @@ namespace ImageSharp.Colors.Spaces.Conversion.Implementation.Lms /// Von Kries chromatic adaptation transform matrix (Hunt-Pointer-Estevez adjusted for D65) /// public static readonly Matrix4x4 VonKriesHPEAdjusted - = new Matrix4x4 + = Matrix4x4.Transpose(new Matrix4x4 { M11 = 0.40024F, M12 = 0.7076F, M13 = -0.08081F, M21 = -0.2263F, M22 = 1.16532F, M23 = 0.0457F, M31 = 0, M32 = 0, M33 = 0.91822F, M44 = 1F // Important for inverse transforms. - }; + }); /// /// Von Kries chromatic adaptation transform matrix (Hunt-Pointer-Estevez for equal energy) /// public static readonly Matrix4x4 VonKriesHPE - = new Matrix4x4 + = Matrix4x4.Transpose(new Matrix4x4 { M11 = 0.3897F, M12 = 0.6890F, M13 = -0.0787F, M21 = -0.2298F, M22 = 1.1834F, M23 = 0.0464F, M31 = 0, M32 = 0, M33 = 1F, M44 = 1F - }; + }); /// /// XYZ scaling chromatic adaptation transform matrix /// - public static readonly Matrix4x4 XYZScaling = Matrix4x4.Identity; + public static readonly Matrix4x4 XYZScaling = Matrix4x4.Transpose(Matrix4x4.Identity); /// /// Bradford chromatic adaptation transform matrix (used in CMCCAT97) /// public static readonly Matrix4x4 Bradford - = new Matrix4x4 + = Matrix4x4.Transpose(new Matrix4x4 { M11 = 0.8951F, M12 = 0.2664F, M13 = -0.1614F, M21 = -0.7502F, M22 = 1.7135F, M23 = 0.0367F, M31 = 0.0389F, M32 = -0.0685F, M33 = 1.0296F, M44 = 1F - }; + }); /// /// Spectral sharpening and the Bradford transform /// public static readonly Matrix4x4 BradfordSharp - = new Matrix4x4 + = Matrix4x4.Transpose(new Matrix4x4 { M11 = 1.2694F, M12 = -0.0988F, M13 = -0.1706F, M21 = -0.8364F, M22 = 1.8006F, M23 = 0.0357F, M31 = 0.0297F, M32 = -0.0315F, M33 = 1.0018F, M44 = 1F - }; + }); /// /// CMCCAT2000 (fitted from all available color data sets) /// public static readonly Matrix4x4 CMCCAT2000 - = new Matrix4x4 + = Matrix4x4.Transpose(new Matrix4x4 { M11 = 0.7982F, M12 = 0.3389F, M13 = -0.1371F, M21 = -0.5918F, M22 = 1.5512F, M23 = 0.0406F, M31 = 0.0008F, M32 = 0.239F, M33 = 0.9753F, M44 = 1F - }; + }); /// /// CAT02 (optimized for minimizing CIELAB differences) /// public static readonly Matrix4x4 CAT02 - = new Matrix4x4 + = Matrix4x4.Transpose(new Matrix4x4 { M11 = 0.7328F, M12 = 0.4296F, M13 = -0.1624F, M21 = -0.7036F, M22 = 1.6975F, M23 = 0.0061F, M31 = 0.0030F, M32 = 0.0136F, M33 = 0.9834F, M44 = 1F - }; + }); } } \ No newline at end of file diff --git a/src/ImageSharp/Colors/Spaces/Conversion/Implementation/Rgb/LinearRgbAndCieXyzConverterBase.cs b/src/ImageSharp/Colors/Spaces/Conversion/Implementation/Rgb/LinearRgbAndCieXyzConverterBase.cs index e5bd1fc77..bc43403ff 100644 --- a/src/ImageSharp/Colors/Spaces/Conversion/Implementation/Rgb/LinearRgbAndCieXyzConverterBase.cs +++ b/src/ImageSharp/Colors/Spaces/Conversion/Implementation/Rgb/LinearRgbAndCieXyzConverterBase.cs @@ -55,7 +55,8 @@ namespace ImageSharp.Colors.Spaces.Conversion.Implementation.Rgb Vector3 vector = Vector3.Transform(workingSpace.WhitePoint.Vector, inverseXyzMatrix); - // TODO: Is there a built in method for this? + // Use transposed Rows/Coloumns + // TODO: Is there a built in method for this multiplication? return new Matrix4x4 { M11 = vector.X * mXr, M21 = vector.Y * mXg, M31 = vector.Z * mXb, diff --git a/tests/ImageSharp.Tests/Colors/Colorspaces/CieXyzAndCieLabConversionTest.cs b/tests/ImageSharp.Tests/Colors/Colorspaces/CieXyzAndCieLabConversionTest.cs index 105e06b28..539085477 100644 --- a/tests/ImageSharp.Tests/Colors/Colorspaces/CieXyzAndCieLabConversionTest.cs +++ b/tests/ImageSharp.Tests/Colors/Colorspaces/CieXyzAndCieLabConversionTest.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using ImageSharp.Colors.Spaces; using ImageSharp.Colors.Spaces.Conversion; - using ImageSharp.Tests.TestUtilities; using Xunit; @@ -40,9 +39,9 @@ CieXyz output = converter.ToCieXyz(input); // Assert - Assert.Equal(output.X, x, FloatRoundingComparer); - Assert.Equal(output.Y, y, FloatRoundingComparer); - Assert.Equal(output.Z, z, FloatRoundingComparer); + Assert.Equal(x, output.X, FloatRoundingComparer); + Assert.Equal(y, output.Y, FloatRoundingComparer); + Assert.Equal(z, output.Z, FloatRoundingComparer); } /// @@ -65,9 +64,9 @@ CieLab output = converter.ToCieLab(input); // Assert - Assert.Equal(output.L, l, FloatRoundingComparer); - Assert.Equal(output.A, a, FloatRoundingComparer); - Assert.Equal(output.B, b, FloatRoundingComparer); + Assert.Equal(l, output.L, FloatRoundingComparer); + Assert.Equal(a, output.A, FloatRoundingComparer); + Assert.Equal(b, output.B, FloatRoundingComparer); } } } \ No newline at end of file diff --git a/tests/ImageSharp.Tests/Colors/Colorspaces/CieXyzAndHunterLabConversionTest.cs b/tests/ImageSharp.Tests/Colors/Colorspaces/CieXyzAndHunterLabConversionTest.cs index afcb2d719..575e330d3 100644 --- a/tests/ImageSharp.Tests/Colors/Colorspaces/CieXyzAndHunterLabConversionTest.cs +++ b/tests/ImageSharp.Tests/Colors/Colorspaces/CieXyzAndHunterLabConversionTest.cs @@ -15,10 +15,10 @@ /// public class CieXyzAndHunterLabConversionTest { - private static readonly IEqualityComparer FloatComparer = new ApproximateFloatComparer(4); + private static readonly IEqualityComparer FloatRoundingComparer = new FloatRoundingComparer(4); /// - /// Tests conversion from to (). + /// Tests conversion from to (). /// [Theory] [InlineData(0, 0, 0, 0, 0, 0)] @@ -33,13 +33,13 @@ CieXyz output = converter.ToCieXyz(input); // Assert - Assert.Equal(output.X, x, FloatComparer); - Assert.Equal(output.Y, y, FloatComparer); - Assert.Equal(output.Z, z, FloatComparer); + Assert.Equal(x, output.X, FloatRoundingComparer); + Assert.Equal(y, output.Y, FloatRoundingComparer); + Assert.Equal(z, output.Z, FloatRoundingComparer); } /// - /// Tests conversion from to (). + /// Tests conversion from to (). /// [Theory] [InlineData(0, 0, 0, 0, 0, 0)] @@ -54,17 +54,17 @@ CieXyz output = converter.ToCieXyz(input); // Assert - Assert.Equal(output.X, x, FloatComparer); - Assert.Equal(output.Y, y, FloatComparer); - Assert.Equal(output.Z, z, FloatComparer); + Assert.Equal(x, output.X, FloatRoundingComparer); + Assert.Equal(y, output.Y, FloatRoundingComparer); + Assert.Equal(z, output.Z, FloatRoundingComparer); } /// - /// Tests conversion from () to . + /// Tests conversion from () to . /// [Theory] [InlineData(0, 0, 0, 0, 0, 0)] - [InlineData(0.95047, 1, 1.08883, 100, 0, 0)] // D65 white point is HunerLab 100, 0, 0 (adaptation to C performed) + [InlineData(0.95047, 1, 1.08883, 100, 0, 0)] // D65 white point is HunterLab 100, 0, 0 (adaptation to C performed) public void Convert_XYZ_D65_to_HunterLab(float x, float y, float z, float l, float a, float b) { // Arrange @@ -75,9 +75,9 @@ HunterLab output = converter.ToHunterLab(input); // Assert - Assert.Equal(output.L, l, FloatComparer); - Assert.Equal(output.A, a, FloatComparer); - Assert.Equal(output.B, b, FloatComparer); + Assert.Equal(l, output.L, FloatRoundingComparer); + Assert.Equal(a, output.A, FloatRoundingComparer); + Assert.Equal(b, output.B, FloatRoundingComparer); } } } \ No newline at end of file diff --git a/tests/ImageSharp.Tests/Colors/Colorspaces/CieXyzAndLmsConversionTest.cs b/tests/ImageSharp.Tests/Colors/Colorspaces/CieXyzAndLmsConversionTest.cs index a329d2d44..bcac07087 100644 --- a/tests/ImageSharp.Tests/Colors/Colorspaces/CieXyzAndLmsConversionTest.cs +++ b/tests/ImageSharp.Tests/Colors/Colorspaces/CieXyzAndLmsConversionTest.cs @@ -14,7 +14,7 @@ /// public class CieXyzAndLmsConversionTest { - private static readonly IEqualityComparer FloatComparer = new ApproximateFloatComparer(6); + private static readonly IEqualityComparer FloatRoundingComparer = new FloatRoundingComparer(5); /// /// Tests conversion from () to . @@ -29,16 +29,16 @@ public void Convert_Lms_to_CieXyz(float l, float m, float s, float x, float y, float z) { // Arrange - Lms input = new Lms(x, y, z); + Lms input = new Lms(l, m, s); ColorSpaceConverter converter = new ColorSpaceConverter(); // Act CieXyz output = converter.ToCieXyz(input); // Assert - Assert.Equal(output.X, l, FloatComparer); - Assert.Equal(output.Y, m, FloatComparer); - Assert.Equal(output.Z, s, FloatComparer); + Assert.Equal(x, output.X, FloatRoundingComparer); + Assert.Equal(y, output.Y, FloatRoundingComparer); + Assert.Equal(z, output.Z, FloatRoundingComparer); } /// @@ -61,9 +61,9 @@ Lms output = converter.ToLms(input); // Assert - Assert.Equal(output.L, l, FloatComparer); - Assert.Equal(output.M, m, FloatComparer); - Assert.Equal(output.S, s, FloatComparer); + Assert.Equal(l, output.L, FloatRoundingComparer); + Assert.Equal(m, output.M, FloatRoundingComparer); + Assert.Equal(s, output.S, FloatRoundingComparer); } } } \ No newline at end of file diff --git a/tests/ImageSharp.Tests/Colors/Colorspaces/ColorConverterAdaptTest.cs b/tests/ImageSharp.Tests/Colors/Colorspaces/ColorConverterAdaptTest.cs index 91acb1d93..ac9a87ce1 100644 --- a/tests/ImageSharp.Tests/Colors/Colorspaces/ColorConverterAdaptTest.cs +++ b/tests/ImageSharp.Tests/Colors/Colorspaces/ColorConverterAdaptTest.cs @@ -10,7 +10,7 @@ namespace ImageSharp.Tests public class ColorConverterAdaptTest { - private static readonly IEqualityComparer FloatComparer = new ApproximateFloatComparer(4); + private static readonly IEqualityComparer FloatRoundingComparer = new FloatRoundingComparer(3); [Theory] [InlineData(0, 0, 0, 0, 0, 0)] @@ -28,9 +28,9 @@ namespace ImageSharp.Tests // Assert Assert.Equal(expectedOutput.WorkingSpace, output.WorkingSpace); - Assert.Equal(output.R, expectedOutput.R, FloatComparer); - Assert.Equal(output.G, expectedOutput.G, FloatComparer); - Assert.Equal(output.B, expectedOutput.B, FloatComparer); + Assert.Equal(expectedOutput.R, output.R, FloatRoundingComparer); + Assert.Equal(expectedOutput.G, output.G, FloatRoundingComparer); + Assert.Equal(expectedOutput.B, output.B, FloatRoundingComparer); } [Theory] @@ -49,9 +49,9 @@ namespace ImageSharp.Tests // Assert Assert.Equal(expectedOutput.WorkingSpace, output.WorkingSpace); - Assert.Equal(output.R, expectedOutput.R, FloatComparer); - Assert.Equal(output.G, expectedOutput.G, FloatComparer); - Assert.Equal(output.B, expectedOutput.B, FloatComparer); + Assert.Equal(expectedOutput.R, output.R, FloatRoundingComparer); + Assert.Equal(expectedOutput.G, output.G, FloatRoundingComparer); + Assert.Equal(expectedOutput.B, output.B, FloatRoundingComparer); } [Theory] @@ -68,9 +68,9 @@ namespace ImageSharp.Tests CieLab output = converter.Adapt(input); // Assert - Assert.Equal(output.L, expectedOutput.L, FloatComparer); - Assert.Equal(output.A, expectedOutput.A, FloatComparer); - Assert.Equal(output.B, expectedOutput.B, FloatComparer); + Assert.Equal(expectedOutput.L, output.L, FloatRoundingComparer); + Assert.Equal(expectedOutput.A, output.A, FloatRoundingComparer); + Assert.Equal(expectedOutput.B, output.B, FloatRoundingComparer); } [Theory] @@ -90,9 +90,9 @@ namespace ImageSharp.Tests CieXyz output = converter.Adapt(input, Illuminants.D65); // Assert - Assert.Equal(output.X, expectedOutput.X, FloatComparer); - Assert.Equal(output.Y, expectedOutput.Y, FloatComparer); - Assert.Equal(output.Z, expectedOutput.Z, FloatComparer); + Assert.Equal(expectedOutput.X, output.X, FloatRoundingComparer); + Assert.Equal(expectedOutput.Y, output.Y, FloatRoundingComparer); + Assert.Equal(expectedOutput.Z, output.Z, FloatRoundingComparer); } [Theory] @@ -113,9 +113,9 @@ namespace ImageSharp.Tests CieXyz output = converter.Adapt(input, Illuminants.D65); // Assert - Assert.Equal(output.X, expectedOutput.X, FloatComparer); - Assert.Equal(output.Y, expectedOutput.Y, FloatComparer); - Assert.Equal(output.Z, expectedOutput.Z, FloatComparer); + Assert.Equal(expectedOutput.X, output.X, FloatRoundingComparer); + Assert.Equal(expectedOutput.Y, output.Y, FloatRoundingComparer); + Assert.Equal(expectedOutput.Z, output.Z, FloatRoundingComparer); } [Theory] @@ -136,9 +136,9 @@ namespace ImageSharp.Tests CieXyz output = converter.Adapt(input, Illuminants.D65); // Assert - Assert.Equal(output.X, expectedOutput.X, FloatComparer); - Assert.Equal(output.Y, expectedOutput.Y, FloatComparer); - Assert.Equal(output.Z, expectedOutput.Z, FloatComparer); + Assert.Equal(expectedOutput.X, output.X, FloatRoundingComparer); + Assert.Equal(expectedOutput.Y, output.Y, FloatRoundingComparer); + Assert.Equal(expectedOutput.Z, output.Z, FloatRoundingComparer); } } } \ No newline at end of file diff --git a/tests/ImageSharp.Tests/Colors/Colorspaces/RgbAndCieXyzConversionTest.cs b/tests/ImageSharp.Tests/Colors/Colorspaces/RgbAndCieXyzConversionTest.cs index 182ba3037..4f18d2621 100644 --- a/tests/ImageSharp.Tests/Colors/Colorspaces/RgbAndCieXyzConversionTest.cs +++ b/tests/ImageSharp.Tests/Colors/Colorspaces/RgbAndCieXyzConversionTest.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using ImageSharp.Colors.Spaces; using ImageSharp.Colors.Spaces.Conversion; - using ImageSharp.Tests.TestUtilities; using Xunit; @@ -16,7 +15,7 @@ /// public class RgbAndCieXyzConversionTest { - private static readonly IEqualityComparer FloatComparerPrecision = new FloatRoundingComparer(6); + private static readonly IEqualityComparer FloatRoundingComparer = new FloatRoundingComparer(6); /// /// Tests conversion from () @@ -40,9 +39,9 @@ // Assert Assert.Equal(output.WorkingSpace, Rgb.DefaultWorkingSpace); // TODO: Change Assert.Equal to the correct order, first the expected, then the current value - Assert.Equal(output.R, r, FloatComparerPrecision); - Assert.Equal(output.G, g, FloatComparerPrecision); - Assert.Equal(output.B, b, FloatComparerPrecision); + Assert.Equal(output.R, r, FloatRoundingComparer); + Assert.Equal(output.G, g, FloatRoundingComparer); + Assert.Equal(output.B, b, FloatRoundingComparer); } /// @@ -68,9 +67,9 @@ // Assert Assert.Equal(output.WorkingSpace, Rgb.DefaultWorkingSpace); - Assert.Equal(output.R, r, FloatComparerPrecision); - Assert.Equal(output.G, g, FloatComparerPrecision); - Assert.Equal(output.B, b, FloatComparerPrecision); + Assert.Equal(output.R, r, FloatRoundingComparer); + Assert.Equal(output.G, g, FloatRoundingComparer); + Assert.Equal(output.B, b, FloatRoundingComparer); } /// @@ -94,9 +93,9 @@ CieXyz output = converter.ToCieXyz(input); // Assert - Assert.Equal(output.X, x, FloatComparerPrecision); - Assert.Equal(output.Y, y, FloatComparerPrecision); - Assert.Equal(output.Z, z, FloatComparerPrecision); + Assert.Equal(output.X, x, FloatRoundingComparer); + Assert.Equal(output.Y, y, FloatRoundingComparer); + Assert.Equal(output.Z, z, FloatRoundingComparer); } /// @@ -120,9 +119,9 @@ CieXyz output = converter.ToCieXyz(input); // Assert - Assert.Equal(output.X, x, FloatComparerPrecision); - Assert.Equal(output.Y, y, FloatComparerPrecision); - Assert.Equal(output.Z, z, FloatComparerPrecision); + Assert.Equal(output.X, x, FloatRoundingComparer); + Assert.Equal(output.Y, y, FloatRoundingComparer); + Assert.Equal(output.Z, z, FloatRoundingComparer); } } } \ No newline at end of file