From b7c2a210237402eb7b030e1bd20760f105b007ed Mon Sep 17 00:00:00 2001 From: Rubens Fernandes Date: Tue, 5 Jan 2016 22:51:29 +1030 Subject: [PATCH] Now tests match ColorMine. Former-commit-id: 230fc9b5be97d89cd2192a142d6b6d3f0292db1c Former-commit-id: bbf2282ee1f10635708894b4fbc6623f77d6d62d Former-commit-id: 6b394493a6b33248d6cd63ee55fa8b1200f85b3f --- src/ImageProcessor/Colors/ColorTransforms.cs | 9 +++- .../Colors/Colorspaces/CieLab.cs | 18 +++---- .../Colors/ColorConversionTests.cs | 47 +++++++++---------- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/ImageProcessor/Colors/ColorTransforms.cs b/src/ImageProcessor/Colors/ColorTransforms.cs index 7643db0b1..e085f35e8 100644 --- a/src/ImageProcessor/Colors/ColorTransforms.cs +++ b/src/ImageProcessor/Colors/ColorTransforms.cs @@ -192,11 +192,16 @@ namespace ImageProcessor float y3 = y * y * y; float z3 = z * z * z; - y = (y3 > 0.008856F) ? y3 : (y - 16F / 116F) / 7.787F; x = (x3 > 0.008856F) ? x3 : (x - 16F / 116F) / 7.787F; + y = (cieLabColor.L > 0.008856F * 903.3F) ? y3 : (cieLabColor.L / 903.3F); z = (z3 > 0.008856F) ? z3 : (z - 16F / 116F) / 7.787F; - // Then XYZ to RGB + x *= 0.95047F; + //y *= 1F; + z *= 1.08883F; + + // Then XYZ to RGB (multiplication by 100 was done above already) + float r = (x * 3.2406F) + (y * -1.5372F) + (z * -0.4986F); float g = (x * -0.9689F) + (y * 1.8758F) + (z * 0.0415F); float b = (x * 0.0557F) + (y * -0.2040F) + (z * 1.0570F); diff --git a/src/ImageProcessor/Colors/Colorspaces/CieLab.cs b/src/ImageProcessor/Colors/Colorspaces/CieLab.cs index 567937edb..6098d40f8 100644 --- a/src/ImageProcessor/Colors/Colorspaces/CieLab.cs +++ b/src/ImageProcessor/Colors/Colorspaces/CieLab.cs @@ -86,20 +86,16 @@ namespace ImageProcessor float y = (color.R * 0.2126F) + (color.G * 0.7152F) + (color.B * 0.0722F); float z = (color.R * 0.0193F) + (color.G * 0.1192F) + (color.B * 0.9505F); - x *= 100F; - y *= 100F; - z *= 100F; - // Now to LAB - x /= 95.047F; - y /= 100F; - z /= 108.883F; + x /= 0.95047F; + //y /= 1F; + z /= 1.08883F; - x = x > 0.008856 ? (float) Math.Pow(x, 1F / 3F) : (7.787F * x) + (16F / 116F); - y = y > 0.008856 ? (float) Math.Pow(y, 1F / 3F) : (7.787F * y) + (16F / 116F); - z = z > 0.008856 ? (float) Math.Pow(z, 1F / 3F) : (7.787F * z) + (16F / 116F); + x = x > 0.008856F ? (float) Math.Pow(x, 1F / 3F) : (903.3F * x + 16F) / 116F; + y = y > 0.008856F ? (float) Math.Pow(y, 1F / 3F) : (903.3F * y + 16F) / 116F; + z = z > 0.008856F ? (float) Math.Pow(z, 1F / 3F) : (903.3F * z + 16F) / 116F; - float l = (116F * y) - 16F; + float l = Math.Max(0, (116F * y) - 16F); float a = 500F * (x - y); float b = 200F * (y - z); diff --git a/tests/ImageProcessor.Tests/Colors/ColorConversionTests.cs b/tests/ImageProcessor.Tests/Colors/ColorConversionTests.cs index e68a7e74e..b219cd123 100644 --- a/tests/ImageProcessor.Tests/Colors/ColorConversionTests.cs +++ b/tests/ImageProcessor.Tests/Colors/ColorConversionTests.cs @@ -339,9 +339,6 @@ namespace ImageProcessor.Tests /// Tests the implicit conversion from to . /// Comparison values obtained from /// http://colormine.org/convert/rgb-to-lab - /// http://au.mathworks.com/help/images/ref/rgb2lab.html - /// http://www.colorhexa.com/00ffff - /// L seems to match quite well, A and B tend to drift from the converter results a bit more /// [Fact] public void ColorToCieLab() @@ -350,35 +347,37 @@ namespace ImageProcessor.Tests Color color = new Color(1, 1, 1); CieLab cielab = color; - Assert.Equal(100, cielab.L, 1); - Assert.Equal(0, cielab.A, 1); - Assert.Equal(0, cielab.B, 1); + Assert.Equal(100, cielab.L, 3); + Assert.Equal(0.005, cielab.A, 3); + Assert.Equal(-0.010, cielab.B, 3); // Black Color color2 = new Color(0, 0, 0); CieLab cielab2 = color2; - Assert.Equal(0, cielab2.L, 1); - Assert.Equal(0, cielab2.A, 1); - Assert.Equal(0, cielab2.B, 1); + Assert.Equal(0, cielab2.L, 3); + Assert.Equal(0, cielab2.A, 3); + Assert.Equal(0, cielab2.B, 3); //// Grey Color color3 = new Color(128 / 255f, 128 / 255f, 128 / 255f); CieLab cielab3 = color3; - Assert.Equal(53.6, cielab3.L, 1); - Assert.Equal(0, cielab3.A, 1); - Assert.Equal(0, cielab3.B, 1); + Assert.Equal(53.585, cielab3.L, 3); + Assert.Equal(0.003, cielab3.A, 3); + Assert.Equal(-0.006, cielab3.B, 3); //// Cyan Color color4 = new Color(0, 1, 1); CieLab cielab4 = color4; - Assert.Equal(91.1, cielab4.L, 1); - Assert.Equal(-48.1, cielab4.A, 1); - Assert.Equal(-14.1, cielab4.B, 1); + Assert.Equal(91.117, cielab4.L, 3); + Assert.Equal(-48.080, cielab4.A, 3); + Assert.Equal(-14.138, cielab4.B, 3); } /// /// Tests the implicit conversion from to . /// + /// Comparison values obtained from + /// http://colormine.org/convert/rgb-to-lab [Fact] public void CieLabToColor() { @@ -386,25 +385,25 @@ namespace ImageProcessor.Tests CieLab cielab = new CieLab(36.5492f, 33.3173f, -12.0615f); Color color = cielab; - Assert.Equal(color.R, 128 / 255f, 1); - Assert.Equal(color.G, 64 / 255f, 2); - Assert.Equal(color.B, 106 / 255f, 1); + Assert.Equal(color.R, 128 / 255f, 3); + Assert.Equal(color.G, 64 / 255f, 3); + Assert.Equal(color.B, 106 / 255f, 3); // Ochre CieLab cielab2 = new CieLab(58.1758f, 27.3399f, 56.8240f); Color color2 = cielab2; - Assert.Equal(color2.R, 204 / 255f, 1); - Assert.Equal(color2.G, 119 / 255f, 2); - Assert.Equal(color2.B, 34 / 255f, 1); + Assert.Equal(color2.R, 204 / 255f, 3); + Assert.Equal(color2.G, 119 / 255f, 3); + Assert.Equal(color2.B, 34 / 255f, 3); //// White CieLab cielab3 = new CieLab(0, 0, 0); Color color3 = cielab3; - Assert.Equal(color3.R, 0f, 1); - Assert.Equal(color3.G, 0f, 1); - Assert.Equal(color3.B, 0f, 1); + Assert.Equal(color3.R, 0f, 3); + Assert.Equal(color3.G, 0f, 3); + Assert.Equal(color3.B, 0f, 3); //// Check others. Random random = new Random(0);