RGB / XYZ and XYZ-LAB color space conversion algorithm(RGB/XYZ和XYZ-LAB颜色空间转换算法)
本文介绍了RGB/XYZ和XYZ-LAB颜色空间转换算法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我尝试将RGB颜色空间转换为CIE-LAB颜色空间。但这其中有一个错误。
- 输入RGB值=(50,125,50)
- 收到的化验值=(41,-38,34)
实验值应为(46.41,-39.24,33.51)
我检查了http://colorizer.org/中的这些值我哪里搞错了?
如果您检查以下代码并回答我。我会很高兴的。谢谢。
public static Vector4 RGBToLab(Vector4 color)
{
float[] xyz = new float[3];
float[] lab = new float[3];
float[] rgb = new float[] { color[0], color[1], color[2], color[3] };
rgb[0] = color[0] / 255.0f;
rgb[1] = color[1] / 255.0f;
rgb[2] = color[2] / 255.0f;
if (rgb[0] > .04045f)
{
rgb[0] = (float)Math.Pow((rgb[0] + .0055) / 1.055, 2.4);
}
else
{
rgb[0] = rgb[0] / 12.92f;
}
if (rgb[1] > .04045f)
{
rgb[1] = (float)Math.Pow((rgb[1] + .0055) / 1.055, 2.4);
}
else
{
rgb[1] = rgb[1] / 12.92f;
}
if (rgb[2] > .04045f)
{
rgb[2] = (float)Math.Pow((rgb[2] + .0055) / 1.055, 2.4);
}
else
{
rgb[2] = rgb[2] / 12.92f;
}
rgb[0] = rgb[0] * 100.0f;
rgb[1] = rgb[1] * 100.0f;
rgb[2] = rgb[2] * 100.0f;
xyz[0] = ((rgb[0] * .412453f) + (rgb[1] * .357580f) + (rgb[2] * .180423f));
xyz[1] = ((rgb[0] * .212671f) + (rgb[1] * .715160f) + (rgb[2] * .072169f));
xyz[2] = ((rgb[0] * .019334f) + (rgb[1] * .119193f) + (rgb[2] * .950227f));
xyz[0] = xyz[0] / 95.047f;
xyz[1] = xyz[1] / 100.0f;
xyz[2] = xyz[2] / 108.883f;
if (xyz[0] > .008856f)
{
xyz[0] = (float)Math.Pow(xyz[0], (1.0 / 3.0));
}
else
{
xyz[0] = (xyz[0] * 7.787f) + (16.0f / 116.0f);
}
if (xyz[1] > .008856f)
{
xyz[1] = (float)Math.Pow(xyz[1], 1.0 / 3.0);
}
else
{
xyz[1] = (xyz[1] * 7.787f) + (16.0f / 116.0f);
}
if (xyz[2] > .008856f)
{
xyz[2] = (float)Math.Pow(xyz[2], 1.0 / 3.0);
}
else
{
xyz[2] = (xyz[2] * 7.787f) + (16.0f / 116.0f);
}
lab[0] = (116.0f * xyz[1]) - 16.0f;
lab[1] = 500.0f * (xyz[0] - xyz[1]);
lab[2] = 200.0f * (xyz[1] - xyz[2]);
Debug.Log("L:" + (int)lab[0]);
Debug.Log("A:" + (int)lab[1]);
Debug.Log("B:" + (int)lab[2]);
Debug.Log("W:" + (int)color[3]);
return new Vector4(lab[0], lab[1], lab[2], color[3]);
}
推荐答案
,而不是.0055
,应该是0.055
。
逆伽马运算错误:
rgb[0] = (float)Math.Pow((rgb[0] + .0055) / 1.055, 2.4);
应为:
rgb[0] = (float)Math.Pow((rgb[0] + .055) / 1.055, 2.4);
参见:sRGB reverse gamma transformation
这篇关于RGB/XYZ和XYZ-LAB颜色空间转换算法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:RGB/XYZ和XYZ-LAB颜色空间转换算法
基础教程推荐
猜你喜欢
- c# Math.Sqrt 实现 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- rabbitmq 的 REST API 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- 如何激活MC67中的红灯 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- SSE 浮点算术是否可重现? 2022-01-01