LAB到XYZ和XYZ到RGB颜色空间转换算法

问题描述 投票:0回答:2

我试图将CIE-LAB颜色空间转换为RGB颜色空间。但是有一个错误。

  • 输入LAB值=(46.41,-39.24,33.51)
  • 接收结果XYZ值=(-2,641482,15,57358,-5,368798)
  • 接收结果RGB值=(-791,4557,135,8615,-271,5485)

XYZ值应为(9.22,15.58,5.54)RGB值应为(50,125,50)

我从http://colorizer.org/中检查了这些值

我在哪里弄错了?

如果您检查以下代码并回答我。我会很高兴。谢谢。

我将RGB转换为XYZ,将XYZ转换为LAB颜色空间。你可以检查一下使用以下链接。

RGB / XYZ and XYZ-LAB color space conversion algorithm

public static Vector4 LabToXYZ(Vector4 color)
        {
            float[] xyz = new float[3];
            float[] col = new float[] { color[0], color[1], color[2], color[3]};


            xyz[1] = (col[0] + 16.0f) / 116.0f;
            xyz[0] = (col[1] / 500.0f) + xyz[0];
            xyz[2] = xyz[0] - (col[2] / 200.0f);

            for (int i = 0; i < 3; i++)
            {
                float pow = xyz[i] * xyz[i] * xyz[i];
                if (pow > .008856f)
                {
                    xyz[i] = pow;
                }
                else
                {
                    xyz[i] = (xyz[i]- 16.0f / 116.0f) / 7.787f;
                }
            }

            xyz[0] = xyz[0] * (95.047f);
            xyz[1] = xyz[1] * (100.0f);
            xyz[2] = xyz[2] * (108.883f);

            return new Vector4(xyz[0], xyz[1], xyz[2], color[3]);
        }

public static Vector4 XYZToRGB(Vector4 color)
        {
            float[] rgb = new float[3];
            float[] xyz = new float[3];
            float[] col = new float[] { color[0], color[1], color[2] };



            for (int i = 0; i < 3; i++)
            {
                xyz[i] = col[i] / 100.0f;
            }

            rgb[0] = (xyz[0] * 3.240479f) + (xyz[1] * -1.537150f) + (xyz[2] * -.498535f);
            rgb[1] = (xyz[0] * -.969256f) + (xyz[1] *  1.875992f) + (xyz[2] * .041556f);
            rgb[2] = (xyz[0] * .055648f) +  (xyz[1] * -.204043f) + (xyz[2] * 1.057311f);

            for (int i = 0; i < 3; i++)
            {
                if (rgb[i] > .0031308f)
                {
                    rgb[i] = (1.055f * (float)Math.Pow(rgb[i], (1.0f / 2.4f))) - .055f;
                }
                else
                {
                    rgb[i] = rgb[i] * 12.92f;
                }
            }

            rgb[0] = rgb[0] * 255.0f;
            rgb[1] = rgb[1] * 255.0f;
            rgb[2] = rgb[2] * 255.0f;



            return new Vector4(rgb[0], rgb[1], rgb[2], color[3]);
        }

public static Vector4 LabToRGB(Vector4 color)
        {
            Vector4 xyz = LabToXYZ(color);
            Vector4 rgb = XYZToRGB(xyz);

            Debug.Log("R: " + rgb[0]);
            Debug.Log("G: " + rgb[1]);
            Debug.Log("B: " + rgb[2]);
            Debug.Log("A: " + color[3]);

            return new Vector4 (rgb[0],rgb[1],rgb[2]);
        }
c# image-processing rgb cielab xyz
2个回答
0
投票

我只更改了LabToXYZ函数中的XYZ计算,并且收到了正确的值。有一个小错误。

xyz[1] = (col[0] + 16.0f) / 116.0f;
xyz[0] = (col[1] / 500.0f) + xyz[0];
xyz[2] = xyz[0] - (col[2] / 200.0f);

不正确。这应该如下所示

xyz[1] = (col[0] + 16.0f) / 116.0f;
xyz[0] = (col[1] / 500.0f) + xyz[1];
xyz[2] = xyz[1] - (col[2] / 200.0f);

此外,您可以像以下功能一样更改为LabToXYZ功能。

public static Vector4 LabToXYZ(Vector4 color)
        {
            float[] xyz = new float[3];
            float[] col = new float[] { color[0], color[1], color[2], color[3]};

            xyz[1] = (col[0] + 16.0f) / 116.0f;
            xyz[0] = (col[1] / 500.0f) + xyz[1];
            xyz[2] = xyz[1] - (col[2] / 200.0f);

             for (int i = 0; i < 3; i++)
            {
                float pow = xyz[i] * xyz[i] * xyz[i];
                float ratio = (6.0f / 29.0f);
                if (xyz[i] > ratio)
                {
                    xyz[i] = pow;
                }
                else
                {
                    xyz[i] = (3.0f * (6.0f / 29.0f) * (6.0f / 29.0f) * (xyz[i] - (4.0f / 29.0f)));
                }
            }
            xyz[0] = xyz[0] * 95.047f;
            xyz[1] = xyz[1] * 100.0f;
            xyz[2] = xyz[2] * 108.883f;

            return new Vector4(xyz[0], xyz[1], xyz[2], color[3]);
        }

请参阅:https://en.wikipedia.org/wiki/CIELAB_color_space#RGB_and_CMYK_conversions了解其他计算


-1
投票

您的XYZ值错误。您无法从中获得正确的RGB值。甚至您的预期XYZ值也相差10倍。

 xyz[1] = (col[0] + 16.0f) / 116.0f;
 xyz[0] = (col[1] / 500.0f) + xyz[0];
 xyz[2] = xyz[0] - (col[2] / 200.0f);

没关系

for (int i = 0; i < 3; i++)
{
  float pow = xyz[i] * xyz[i] * xyz[i];
  if (pow > .008856f)
  {
    xyz[i] = pow;
  }
  else
  {
    xyz[i] = (xyz[i]- 16.0f / 116.0f) / 7.787f;
  }
}

不正常。

您不能对XY和Z使用相同的公式。我将不进一步详细说明您声称一遍又一遍地检查代码的说法显然不正确。

请参阅

https://en.wikipedia.org/wiki/CIELAB_color_space#RGB_and_CMYK_conversions

http://www.brucelindbloom.com/index.html?Eqn_XYZ_to_Lab.html

或任何其他在线资源。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.