在OpenCV中将实验室数值转换为RGB数值

4
我想将Lab值转换为其对应的RGB值。我不想将Lab图像转换为RGB图像,只需要一些L a和b的值。函数cvCvtColor仅适用于图像。有人能告诉我如何做到这一点吗?
谢谢;
代码:
CvMat* rgb = cvCreateMat(centres->rows,centres->cols,centres->type);
cvCvtColor(centres,rgb,CV_Lab2BGR);
2个回答

10

我不知道如何在OpenCV中完成这件事,但如果使用其他工具可以的话,我已经使用C语言实现了它。请查看函数color_Lab_to_LinearRGBcolor_LinearRGB_to_RGB

以下是代码:

double L, a, b;
double X, Y, Z;
double R, G, B;

// Lab -> normalized XYZ (X,Y,Z are all in 0...1)

Y = L * (1.0/116.0) + 16.0/116.0;
X = a * (1.0/500.0) + Y;
Z = b * (-1.0/200.0) + Y;

X = X > 6.0/29.0 ? X * X * X : X * (108.0/841.0) - 432.0/24389.0;
Y = L > 8.0 ? Y * Y * Y : L * (27.0/24389.0);
Z = Z > 6.0/29.0 ? Z * Z * Z : Z * (108.0/841.0) - 432.0/24389.0;

// normalized XYZ -> linear sRGB (in 0...1)

R = X * (1219569.0/395920.0)     + Y * (-608687.0/395920.0)    + Z * (-107481.0/197960.0);
G = X * (-80960619.0/87888100.0) + Y * (82435961.0/43944050.0) + Z * (3976797.0/87888100.0);
B = X * (93813.0/1774030.0)      + Y * (-180961.0/887015.0)    + Z * (107481.0/93370.0);

// linear sRGB -> gamma-compressed sRGB (in 0...1)

R = R > 0.0031308 ? pow(R, 1.0 / 2.4) * 1.055 - 0.055 : R * 12.92;
G = G > 0.0031308 ? pow(G, 1.0 / 2.4) * 1.055 - 0.055 : G * 12.92;
B = B > 0.0031308 ? pow(B, 1.0 / 2.4) * 1.055 - 0.055 : B * 12.92;

RGB的范围在0到1之间。我猜你想要的是0到255?只需将每个分量乘以255即可。 - Cory Nelson

0

我认为你想要实现的唯一方法是:

  • 查看OpenCV源代码或cvCvtColor文档并自己实现方程(它们都在该页面上明确给出)
  • 创建一个虚拟图像,其中包含您想要转换的少数Lab值(例如1乘n乘3,其中n是您想要转换的值的数量),然后使用cvCvtColor进行转换。

谢谢您的回复。您能否解释一下这个问题?因为我已经使用了这个cvtColor函数,但是它给我报错了。我会附上我所使用的代码。 - ATG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接