C# LAB-to-XYZ和XYZ-to-RGB颜色空间转换算法

C# LAB-to-XYZ和XYZ-to-RGB颜色空间转换算法,c#,image-processing,rgb,cielab,xyz,C#,Image Processing,Rgb,Cielab,Xyz,我尝试将CIE-LAB颜色空间转换为RGB颜色空间。但这是一个错误 输入实验室值=(46.41,-39.24,33.51) 接收到的结果XYZ值=(-2641482,1557358,-5368798) 接收结果RGB值=(-79145571358615,-2715485) XYZ值应为(9.22,15.58,5.54) RGB值应为(50125,50) 我从中检查了这些值 我在哪里犯了错误 如果您检查以下代码并回答我。我会很高兴的。谢谢 我将RGB转换为XYZ,并将XYZ转换为实验室颜色空间

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

  • 输入实验室值=(46.41,-39.24,33.51)
  • 接收到的结果XYZ值=(-2641482,1557358,-5368798)
  • 接收结果RGB值=(-79145571358615,-2715485)
XYZ值应为(9.22,15.58,5.54) RGB值应为(50125,50)

我从中检查了这些值

我在哪里犯了错误

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

我将RGB转换为XYZ,并将XYZ转换为实验室颜色空间。你可以查一下 使用以下链接


我只更改了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]);
        }

publicstaticvector4labtoxyz(vector4color)
{
float[]xyz=新的float[3];
float[]col=new float[]{color[0],color[1],color[2],color[3]};
xyz[1]=(col[0]+16.0f)/116.0f;
xyz[0]=(列[1]/500.0f)+xyz[1];
xyz[2]=xyz[1](列[2]/200.0f);
对于(int i=0;i<3;i++)
{
浮动功率=xyz[i]*xyz[i]*xyz[i];
浮动比率=(6.0f/29.0f);
if(xyz[i]>比率)
{
xyz[i]=功率;
}
其他的
{
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;
返回新矢量4(xyz[0],xyz[1],xyz[2],颜色[3]);
}

请参阅:对于其他计算

为什么不调试代码直到发现异常?我反复检查代码,但没有发现任何错误。也许我错了,但我认为这段代码可能是真的。系数可能有问题。如果从实验室得到错误的RGB值,首先要检查是否有正确的XZY值。我在你的帖子里没有看到这个信息。谢谢,我做了编辑。您可以在我的帖子中看到有关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);

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]);
        }