CIELab空间中的颜色输出

时间:2012-01-23 09:55:55

标签: c++ colors rgb

为了可视化某些数据,我应该使用着色。也就是说,我处理的C ++代码是使用cairo-graphics输出,并且该函数基于RGB空间。另一方面,我使用的数据应该利用CIELab色彩空间的“特定切片”。

问题是:用C ++做这个最合适的方法是什么?也许某些转换可能仍然依赖于cairo提供的RGB功能(虽然我怀疑这种替代方案,因为RGB依赖于设备)?

2 个答案:

答案 0 :(得分:4)

OpenCV有一些内置的颜色转换。您可以使用它们,或将它们用作您自己的颜色转换程序的灵感。 见the doc about color conversion in OpenCV (cv::cvtColor)

使用它的一种可能方法是:

#include <cv.h>
#include <highgui.h>
int main()
{
    cv::Mat imgRgb = cv::imread("file.bmp");
    cv::Mat imgLab;
    cv::cvtColor(imgRgb, imgLab, Cv::CV_BGR2Lab);

    //access Lab values
    int y = 50;
    int x = 20;
    double L = imgLab.at<double>(y,x)[0]; //beware the order : openCV treats images as matrixes, thus the y param come first
    double a = imgLab.at<double>(y,x)[1];
    double b = imgLab.at<double>(y,x)[2];   
}

注意:我没有测试或编译此代码,这只是一个草稿。

答案 1 :(得分:4)

我已经编译了上面的测试。以下是将RGB转换为CIELAB

的功能
#include <cv.h>
#include <highgui.h>
Mat BGR2CIELab(Mat const &rgb_src)
{
    Mat imgLab;
    cvtColor(rgb_src, imgLab, CV_BGR2Lab);

    //access Lab values
    int y = 50;
    int x = 20;
    Vec3d pix_bgr = imgLab.ptr<Vec3d>(y)[x]; //beware the order : openCV treats images as matrixes, thus the y param come first
    double L = pix_bgr.val[0];
    double a = pix_bgr.val[1];
    double b = pix_bgr.val[2];

    return imgLab;
}