diff --git a/tests/ImageSharp.Tests/ColorProfiles/CieLuvAndLmsConversionTests.cs b/tests/ImageSharp.Tests/ColorProfiles/CieLuvAndLmsConversionTests.cs
new file mode 100644
index 000000000..f2f5ada62
--- /dev/null
+++ b/tests/ImageSharp.Tests/ColorProfiles/CieLuvAndLmsConversionTests.cs
@@ -0,0 +1,72 @@
+// Copyright (c) Six Labors.
+// Licensed under the Six Labors Split License.
+
+using SixLabors.ImageSharp.ColorProfiles;
+
+namespace SixLabors.ImageSharp.Tests.ColorProfiles;
+
+///
+/// Tests - conversions.
+///
+public class CieLuvAndLmsConversionTests
+{
+ private static readonly ApproximateColorProfileComparer Comparer = new(.0002F);
+
+ [Theory]
+ [InlineData(0, 0, 0, 0, 0, 0)]
+ [InlineData(36.0555, 93.6901, 10.01514, 0.164352, 0.03267485, 0.0483408)]
+ public void Convert_CieLuv_to_Lms(float l, float u, float v, float l2, float m, float s)
+ {
+ // Arrange
+ CieLuv input = new(l, u, v);
+ Lms expected = new(l2, m, s);
+ ColorConversionOptions options = new() { WhitePoint = Illuminants.D65, TargetWhitePoint = Illuminants.D65 };
+ ColorProfileConverter converter = new(options);
+
+ Span inputSpan = new CieLuv[5];
+ inputSpan.Fill(input);
+
+ Span actualSpan = new Lms[5];
+
+ // Act
+ Lms actual = converter.Convert(input);
+ converter.Convert(inputSpan, actualSpan);
+
+ // Assert
+ Assert.Equal(expected, actual, Comparer);
+
+ for (int i = 0; i < actualSpan.Length; i++)
+ {
+ Assert.Equal(expected, actualSpan[i], Comparer);
+ }
+ }
+
+ [Theory]
+ [InlineData(0, 0, 0, 0, 0, 0)]
+ [InlineData(0.164352, 0.03267485, 0.0483408, 36.0555, 93.69009, 10.01514)]
+ public void Convert_Lms_to_CieLuv(float l2, float m, float s, float l, float u, float v)
+ {
+ // Arrange
+ Lms input = new(l2, m, s);
+ CieLuv expected = new(l, u, v);
+ ColorConversionOptions options = new() { WhitePoint = Illuminants.D65, TargetWhitePoint = Illuminants.D65 };
+ ColorProfileConverter converter = new(options);
+
+ Span inputSpan = new Lms[5];
+ inputSpan.Fill(input);
+
+ Span actualSpan = new CieLuv[5];
+
+ // Act
+ CieLuv actual = converter.Convert(input);
+ converter.Convert(inputSpan, actualSpan);
+
+ // Assert
+ Assert.Equal(expected, actual, Comparer);
+
+ for (int i = 0; i < actualSpan.Length; i++)
+ {
+ Assert.Equal(expected, actualSpan[i], Comparer);
+ }
+ }
+}
diff --git a/tests/ImageSharp.Tests/ColorProfiles/CieLuvAndRgbConversionTests.cs b/tests/ImageSharp.Tests/ColorProfiles/CieLuvAndRgbConversionTests.cs
new file mode 100644
index 000000000..b0106fc57
--- /dev/null
+++ b/tests/ImageSharp.Tests/ColorProfiles/CieLuvAndRgbConversionTests.cs
@@ -0,0 +1,72 @@
+// Copyright (c) Six Labors.
+// Licensed under the Six Labors Split License.
+
+using SixLabors.ImageSharp.ColorProfiles;
+
+namespace SixLabors.ImageSharp.Tests.ColorProfiles;
+
+///
+/// Tests - conversions.
+///
+public class CieLuvAndRgbConversionTests
+{
+ private static readonly ApproximateColorProfileComparer Comparer = new(.0002F);
+
+ [Theory]
+ [InlineData(0, 0, 0, 0, 0, 0)]
+ [InlineData(36.0555, 93.6901, 10.01514, 0.6444615, 0.1086071, 0.2213444)]
+ public void Convert_CieLuv_to_Rgb(float l, float u, float v, float r, float g, float b)
+ {
+ // Arrange
+ CieLuv input = new(l, u, v);
+ Rgb expected = new(r, g, b);
+ ColorConversionOptions options = new() { WhitePoint = Illuminants.D65, TargetWhitePoint = Illuminants.D65 };
+ ColorProfileConverter converter = new(options);
+
+ Span inputSpan = new CieLuv[5];
+ inputSpan.Fill(input);
+
+ Span actualSpan = new Rgb[5];
+
+ // Act
+ Rgb actual = converter.Convert(input);
+ converter.Convert(inputSpan, actualSpan);
+
+ // Assert
+ Assert.Equal(expected, actual, Comparer);
+
+ for (int i = 0; i < actualSpan.Length; i++)
+ {
+ Assert.Equal(expected, actualSpan[i], Comparer);
+ }
+ }
+
+ [Theory]
+ [InlineData(0, 0, 0, 0, 0, 0)]
+ [InlineData(0.6444615, 0.1086071, 0.2213444, 36.0555, 93.69012, 10.01514)]
+ public void Convert_Rgb_to_CieLuv(float r, float g, float b, float l, float u, float v)
+ {
+ // Arrange
+ Rgb input = new(r, g, b);
+ CieLuv expected = new(l, u, v);
+ ColorConversionOptions options = new() { WhitePoint = Illuminants.D65, TargetWhitePoint = Illuminants.D65 };
+ ColorProfileConverter converter = new(options);
+
+ Span inputSpan = new Rgb[5];
+ inputSpan.Fill(input);
+
+ Span actualSpan = new CieLuv[5];
+
+ // Act
+ CieLuv actual = converter.Convert(input);
+ converter.Convert(inputSpan, actualSpan);
+
+ // Assert
+ Assert.Equal(expected, actual, Comparer);
+
+ for (int i = 0; i < actualSpan.Length; i++)
+ {
+ Assert.Equal(expected, actualSpan[i], Comparer);
+ }
+ }
+}
diff --git a/tests/ImageSharp.Tests/ColorProfiles/CieLuvAndYCbCrConversionTests.cs b/tests/ImageSharp.Tests/ColorProfiles/CieLuvAndYCbCrConversionTests.cs
new file mode 100644
index 000000000..6fdb440d7
--- /dev/null
+++ b/tests/ImageSharp.Tests/ColorProfiles/CieLuvAndYCbCrConversionTests.cs
@@ -0,0 +1,72 @@
+// Copyright (c) Six Labors.
+// Licensed under the Six Labors Split License.
+
+using SixLabors.ImageSharp.ColorProfiles;
+
+namespace SixLabors.ImageSharp.Tests.ColorProfiles;
+
+///
+/// Tests - conversions.
+///
+public class CieLuvAndYCbCrConversionTests
+{
+ private static readonly ApproximateColorProfileComparer Comparer = new(.0002F);
+
+ [Theory]
+ [InlineData(0, 0, 0, 0, 128, 128)]
+ [InlineData(36.0555, 93.6901, 10.01514, 71.8283, 119.3174, 193.9839)]
+ public void Convert_CieLuv_to_YCbCr(float l, float u, float v, float y, float cb, float cr)
+ {
+ // Arrange
+ CieLuv input = new(l, u, v);
+ YCbCr expected = new(y, cb, cr);
+ ColorConversionOptions options = new() { WhitePoint = Illuminants.D65, TargetWhitePoint = Illuminants.D65 };
+ ColorProfileConverter converter = new(options);
+
+ Span inputSpan = new CieLuv[5];
+ inputSpan.Fill(input);
+
+ Span actualSpan = new YCbCr[5];
+
+ // Act
+ YCbCr actual = converter.Convert(input);
+ converter.Convert(inputSpan, actualSpan);
+
+ // Assert
+ Assert.Equal(expected, actual, Comparer);
+
+ for (int i = 0; i < actualSpan.Length; i++)
+ {
+ Assert.Equal(expected, actualSpan[i], Comparer);
+ }
+ }
+
+ [Theory]
+ [InlineData(0, 128, 128, 0, 0, 0)]
+ [InlineData(71.8283, 119.3174, 193.9839, 36.00565, 93.44593, 10.2234)]
+ public void Convert_YCbCr_to_CieLuv(float y, float cb, float cr, float l, float u, float v)
+ {
+ // Arrange
+ YCbCr input = new(y, cb, cr);
+ CieLuv expected = new(l, u, v);
+ ColorConversionOptions options = new() { WhitePoint = Illuminants.D65, TargetWhitePoint = Illuminants.D65 };
+ ColorProfileConverter converter = new(options);
+
+ Span inputSpan = new YCbCr[5];
+ inputSpan.Fill(input);
+
+ Span actualSpan = new CieLuv[5];
+
+ // Act
+ CieLuv actual = converter.Convert(input);
+ converter.Convert(inputSpan, actualSpan);
+
+ // Assert
+ Assert.Equal(expected, actual, Comparer);
+
+ for (int i = 0; i < actualSpan.Length; i++)
+ {
+ Assert.Equal(expected, actualSpan[i], Comparer);
+ }
+ }
+}